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