[gnu.g++.bug] ld++ for the Sequent Symmetry

jw@sics.se (Johan Widen) (02/04/89)

Enclosed is a patch for ld.c to make it work on the Sequent Symmetry.
ld++ still does not know about shared memory.

There are almost certainly some problems remaining with the port, but I have
managed to compile and run successfully many (but not all) of the testfiles
in libg++.

The following line should be put in the Makefile for compiling crt0.c on
a Sequent Symmetry.

	$(CC) -D"CRT0_DUMMIES=bogus_fp," -DDOT_GLOBAL_START -g -c crt0.c

First a patch for crt0.c.

*** /tmp/src-g++/crt0.c	Sun Dec 11 02:36:59 1988
--- crt0.c	Thu Jan 26 17:34:52 1989
***************
*** 192,197
  char **environ;
  #endif
  
  #if defined(orion) || defined(pyramid) || defined(celerity) || defined(ALLIANT)
  
  #ifdef ALLIANT

--- 192,202 -----
  char **environ;
  #endif
  
+ #if defined(sequent)
+ 	asm("	.globl _387_flt");
+ 	asm("	.set	_387_flt,0");
+ #endif
+ 
  #if defined(orion) || defined(pyramid) || defined(celerity) || defined(ALLIANT)
  
  #ifdef ALLIANT
*** ../g++-1.32/ld.c~	Sun Dec 11 00:51:48 1988
--- ld.c	Thu Feb  2 23:48:28 1989
***************
*** 129,134
  #define	N_PAGSIZ(x) PAGSIZ
  #define	N_SEGSIZ(x) SEGSIZ
  #endif vax
  #endif
  
  #ifndef N_TXTADDR

--- 129,140 -----
  #define	N_PAGSIZ(x) PAGSIZ
  #define	N_SEGSIZ(x) SEGSIZ
  #endif vax
+ #ifdef sequent
+ #define PAGSIZ 4096
+ #define SEGSIZ PAGSIZ
+ 
+ #define	N_PAGSIZ(x) PAGSIZ
+ #define	N_SEGSIZ(x) SEGSIZ
  #endif
  #endif
  
***************
*** 130,135
  #define	N_SEGSIZ(x) SEGSIZ
  #endif vax
  #endif
  
  #ifndef N_TXTADDR
  #ifdef vax

--- 136,142 -----
  #define	N_PAGSIZ(x) PAGSIZ
  #define	N_SEGSIZ(x) SEGSIZ
  #endif
+ #endif
  
  #ifndef N_TXTADDR
  #ifdef vax
***************
*** 135,142
  #ifdef vax
  #define	TXTRELOC	0
  #define N_TXTADDR(x) TXTRELOC
- #endif vax
- 
  #define N_DATADDR(x) \
  	(((x).a_magic==OMAGIC)? (N_TXTADDR(x)+(x).a_text) \
  	: (N_SEGSIZ(x)+((N_TXTADDR(x)+(x).a_text-1) & ~(N_SEGSIZ(x)-1))))

--- 142,147 -----
  #ifdef vax
  #define	TXTRELOC	0
  #define N_TXTADDR(x) TXTRELOC
  #define N_DATADDR(x) \
  	(((x).a_magic==OMAGIC)? (N_TXTADDR(x)+(x).a_text) \
  	: (N_SEGSIZ(x)+((N_TXTADDR(x)+(x).a_text-1) & ~(N_SEGSIZ(x)-1))))
***************
*** 140,145
  #define N_DATADDR(x) \
  	(((x).a_magic==OMAGIC)? (N_TXTADDR(x)+(x).a_text) \
  	: (N_SEGSIZ(x)+((N_TXTADDR(x)+(x).a_text-1) & ~(N_SEGSIZ(x)-1))))
  
  #define N_BSSADDR(x)  (N_DATADDR(x)+(x).a_data)
  #endif

--- 145,158 -----
  #define N_DATADDR(x) \
  	(((x).a_magic==OMAGIC)? (N_TXTADDR(x)+(x).a_text) \
  	: (N_SEGSIZ(x)+((N_TXTADDR(x)+(x).a_text-1) & ~(N_SEGSIZ(x)-1))))
+ #endif vax
+ #ifdef sequent
+ #define	N_TXTADDR(x) \
+   (N_ADDRADJ(x))
+ #define N_DATADDR(x) \
+ 	(((x).a_magic==OMAGIC)? (N_TXTADDR(x)+(x).a_text) \
+ 	: (N_SEGSIZ(x)+(((x).a_text-1) & ~(N_SEGSIZ(x)-1))))
+ #endif sequent
  
  #define N_BSSADDR(x)  (N_DATADDR(x)+(x).a_data)
  #endif
***************
*** 788,793
  
    /* Now check some option settings for consistency.  */
  
    if ((magic == ZMAGIC || magic == NMAGIC)
        && (text_start - text_start_alignment) & (page_size - 1))
      fatal ("-T argument not multiple of page size, with sharable output", 0);

--- 801,807 -----
  
    /* Now check some option settings for consistency.  */
  
+ #ifdef NMAGIC
    if ((magic == ZMAGIC || magic == NMAGIC)
  #else
    if ((magic == ZMAGIC)
***************
*** 789,794
    /* Now check some option settings for consistency.  */
  
    if ((magic == ZMAGIC || magic == NMAGIC)
        && (text_start - text_start_alignment) & (page_size - 1))
      fatal ("-T argument not multiple of page size, with sharable output", 0);
  

--- 803,811 -----
  
  #ifdef NMAGIC
    if ((magic == ZMAGIC || magic == NMAGIC)
+ #else
+   if ((magic == ZMAGIC)
+ #endif
        && (text_start - text_start_alignment) & (page_size - 1))
      fatal ("-T argument not multiple of page size, with sharable output", 0);
  
***************
*** 855,860
        magic = OMAGIC;
        return;
  
      case 'n':
        magic = NMAGIC;
        return;

--- 872,878 -----
        magic = OMAGIC;
        return;
  
+ #ifdef NMAGIC
      case 'n':
        magic = NMAGIC;
        return;
***************
*** 858,863
      case 'n':
        magic = NMAGIC;
        return;
  
      case 'o':
        output_filename = arg;

--- 876,882 -----
      case 'n':
        magic = NMAGIC;
        return;
+ #endif
  
      case 'o':
        output_filename = arg;
***************
*** 1351,1356
  	case N_BSS:
  	  reftype = "defined in BSS section";
  	  break;
  	}
  
        fprintf (stderr, "symbol %s %s in ", sp->name, reftype);

--- 1370,1397 -----
  	case N_BSS:
  	  reftype = "defined in BSS section";
  	  break;
+ 
+ #ifdef sequent
+ 	case N_FN:
+ 	  reftype = "filename";
+ 	  break;
+ 
+ 	case N_SHUNDF:
+ 	  reftype = "shared undf";
+ 	  break;
+ 
+ 	case N_SHDATA:
+ 	  reftype = "shared data";
+ 	  break;
+ 
+ 	case N_SHBSS:
+ 	  reftype = "shared BSS";
+ 	  break;
+ 
+ 	default:
+ 	  reftype = "I don't know this type";
+ 	  break;
+ #endif
  	}
  
        fprintf (stderr, "symbol %s %s in ", sp->name, reftype);
***************
*** 1886,1891
      }
  
    /* Do relocation.  Initialize invariant data.  */
  #if defined(sun) && (TARGET == SUN4)
    r1.r_addend = 0;
    r1.r_type = RELOC_32;

--- 1927,1934 -----
      }
  
    /* Do relocation.  Initialize invariant data.  */
+   bzero(&r1, sizeof(r1));
+   bzero(&r2, sizeof(r2));
  #if defined(sun) && (TARGET == SUN4)
    r1.r_type = RELOC_32;
    r1.r_extern   = 1;
***************
*** 1887,1893
  
    /* Do relocation.  Initialize invariant data.  */
  #if defined(sun) && (TARGET == SUN4)
-   r1.r_addend = 0;
    r1.r_type = RELOC_32;
    r1.r_extern   = 1;
    r2.r_addend = 0;

--- 1930,1935 -----
    bzero(&r1, sizeof(r1));
    bzero(&r2, sizeof(r2));
  #if defined(sun) && (TARGET == SUN4)
    r1.r_type = RELOC_32;
    r1.r_extern   = 1;
    r2.r_type = RELOC_32;
***************
*** 1890,1896
    r1.r_addend = 0;
    r1.r_type = RELOC_32;
    r1.r_extern   = 1;
-   r2.r_addend = 0;
    r2.r_type = RELOC_32;
    r2.r_extern   = 1;
  #else

--- 1932,1937 -----
  #if defined(sun) && (TARGET == SUN4)
    r1.r_type = RELOC_32;
    r1.r_extern   = 1;
    r2.r_type = RELOC_32;
    r2.r_extern   = 1;
  #else
***************
*** 1894,1900
    r2.r_type = RELOC_32;
    r2.r_extern   = 1;
  #else
-   r1.r_pcrel = 0;
    r1.r_length = 2;
    r1.r_extern = 1;
    r2.r_pcrel = 0;

--- 1935,1940 -----
    r2.r_type = RELOC_32;
    r2.r_extern   = 1;
  #else
    r1.r_length = 2;
    r1.r_extern = 1;
    r2.r_length = 2;
***************
*** 1897,1903
    r1.r_pcrel = 0;
    r1.r_length = 2;
    r1.r_extern = 1;
-   r2.r_pcrel = 0;
    r2.r_length = 2;
    r2.r_extern = 1;
  #endif

--- 1937,1942 -----
  #else
    r1.r_length = 2;
    r1.r_extern = 1;
    r2.r_length = 2;
    r2.r_extern = 1;
  #endif
***************
*** 2130,2135
    /* If necessary, pad text section to full page in the file.
       Include the padding in the text segment size.  */
  
    if (magic == NMAGIC || magic == ZMAGIC)
      {
        int text_end = text_size + N_TXTOFF (outheader);

--- 2169,2175 -----
    /* If necessary, pad text section to full page in the file.
       Include the padding in the text segment size.  */
  
+ #ifdef NMAGIC
    if (magic == NMAGIC || magic == ZMAGIC)
  #else
    if (magic == ZMAGIC)
***************
*** 2131,2136
       Include the padding in the text segment size.  */
  
    if (magic == NMAGIC || magic == ZMAGIC)
      {
        int text_end = text_size + N_TXTOFF (outheader);
        text_pad = ((text_end + page_size - 1) & (- page_size)) - text_end;

--- 2171,2179 -----
  
  #ifdef NMAGIC
    if (magic == NMAGIC || magic == ZMAGIC)
+ #else
+   if (magic == ZMAGIC)
+ #endif
      {
        int text_end = text_size + N_TXTOFF (outheader);
        text_pad = ((text_end + page_size - 1) & (- page_size)) - text_end;
***************
*** 2138,2143
      }
  
    outheader.a_text = text_size;
  
    /* Make the data segment address start in memory on a suitable boundary.  */
  

--- 2181,2189 -----
      }
  
    outheader.a_text = text_size;
+ #ifdef sequent
+   outheader.a_text += N_ADDRADJ (outheader);
+ #endif
  
    /* Make the data segment address start in memory on a suitable boundary.  */
  
***************
*** 2457,2462
    outheader.a_machtype = HP9000S200_ID;
  #endif
    outheader.a_text = text_size;
    outheader.a_data = data_size;
    outheader.a_bss = bss_size;
    outheader.a_entry = (entry_symbol ? entry_symbol->value

--- 2503,2511 -----
    outheader.a_machtype = HP9000S200_ID;
  #endif
    outheader.a_text = text_size;
+ #ifdef sequent
+   outheader.a_text += N_ADDRADJ (outheader);
+ #endif
    outheader.a_data = data_size;
    outheader.a_bss = bss_size;
    outheader.a_entry = (entry_symbol ? entry_symbol->value
***************
*** 2731,2736
  	  fatal_with_file ("nonexternal relocation code invalid in ", entry);
  	}
  
  #if defined(sun) && (TARGET == SUN4)
        if (p->r_type >= RELOC_DISP8 && p->r_type <= RELOC_WDISP22) 
  #else

--- 2780,2832 -----
  	  fatal_with_file ("nonexternal relocation code invalid in ", entry);
  	}
  
+ #if defined(sequent)
+       if (p->r_bsr)	/* BSR is a Balance CALL instruction... */
+ 	{
+ 	relocation -= pc_relocation;
+ 
+ 	switch (length)
+ 	  {
+ 	  case 0:
+ 	    *(char *) (data + addr) = relocation - *(char *) (data + addr);
+ 	    break;
+ 
+ 	  case 1:
+ 	    *(short *) (data + addr) = relocation - *(short *) (data + addr);
+ 	    break;
+ 
+ 	  case 2:
+ 	    *(int *) (data + addr) = relocation - *(int *) (data + addr);
+ 	    break;
+ 
+ 	  default:
+ 	    fatal_with_file ("invalid relocation field length in ", entry);
+ 	  }
+         }
+       else
+ 	{
+ 	if (p->r_pcrel)
+ 	  relocation -= pc_relocation;
+ 
+ 	switch (length)
+ 	  {
+ 	  case 0: 
+ 	    *(char *) (data + addr) += relocation;
+ 	    break;
+ 
+ 	  case 1:
+ 	    *(short *) (data + addr) += relocation;
+ 	    break;
+ 
+ 	  case 2:
+ 	    *(int *) (data + addr) += relocation;
+ 	    break;
+ 
+ 	  default:
+ 	    fatal_with_file ("invalid relocation field length in ", entry);
+ 	  }
+ 	}
+ #else
  #if defined(sun) && (TARGET == SUN4)
        if (p->r_type >= RELOC_DISP8 && p->r_type <= RELOC_WDISP22) 
  #else
***************
*** 2809,2814
  	default:
  	  fatal_with_file ("invalid relocation field length in ", entry);
  	}
  #endif
      }
  }

--- 2905,2911 -----
  	default:
  	  fatal_with_file ("invalid relocation field length in ", entry);
  	}
+ #endif
  #endif
      }
  }
--
Johan Widen
SICS, PO Box 1263, S-164 28 KISTA, SWEDEN
Tel: +46 8 752 15 32	Ttx: 812 61 54 SICS S	Fax: +46 8 751 72 30
Internet: jw@sics.se or {mcvax,munnari,ukc,unido}!enea!sics.se!jw