tkacik@rphroy.UUCP (Tom Tkacik) (08/25/88)
There is a bug in the gcc compiler for the AT&T 3B1. The 3B1 pcc is one of the few compilers that does not tack on an initial underscore to all global variables in any assembly code. Instead it places a '%' in all of the compiler generated labels. Gcc does not do this, so it is possible to get name conflicts between global variables and gcc generated labels and static variables. ---------------------------------------------- SYSTEM: AT&T 3B1 running SYS V.? (release 3.5) FILES: tm.h -----> tm-3b1.h md -----> m68k.md VERSION: GNU C version 1.24 (68k, SGS/AT&T unixpc syntax) compiled by GNU C version 1.24. ---------------------------------------------- The following very short program produces two errors. int L1, i___0; main() { static i; } ---------------------------------------------- The following output is from gcc -v -S bug.s, and will not assemble with as. lcomm i___0,4 <-- gcc generated static label text (should be i%__0) even global main main: link.w %a6,&0 L1: <-- gcc generated label (should be L%1:) unlk %a6 rts comm i___0,4 <-- global variable comm L1,4 <-- global variable (note: no leading '_') ---------------------------------------------- The version of gcc is $ gcc -v -S bug.c /usr/local/lib/gcc-cpp -v -undef -D__GNU__ -D__GNUC__ -Dmc68000 -Dmc68k -Dm68k -Dunix -Dunixpc bug.c /tmp/cca01091.cpp GNU CPP version 1.24 /usr/local/lib/gcc-cc1 /tmp/cca01091.cpp -quiet -dumpbase bug.c -version -o /tmp/cca01091.s GNU C version 1.24 (68k, SGS/AT&T unixpc syntax) compiled by GNU C version 1.24. ---------------------------------------------- The fix is in tm-3b1.h. All gcc generated labels and static variables need to have a '%' imbedded them somewhere, (this is what cc does). The following are my patches to tm-3b1.h to fix the problem, plus a couple of typos. I believe they fix all occurances of gcc generated labels and static variable names. Tom Tkacik ...!rphroy!tetnix!tet -------------------------------------------- *** tm-3b1.h.orig Thu Aug 4 22:07:50 1988 --- tm-3b1.h Sat Aug 20 19:05:54 1988 *************** *** 59,64 **** --- 59,65 ---- /* Define __HAVE_FPU__ in preprocessor if -m68881 is specified. This will control the use of inline 68881 insns in certain macros. */ + #undef CPP_SPEC #define CPP_SPEC "%{m68881:-D__HAVE_FPU__}" /* Names to predefine in the preprocessor for this target machine. */ *************** *** 76,81 **** --- 77,86 ---- #undef ASM_OUTPUT_SOURCE_LINE #undef PRINT_OPERAND_ADDRESS #undef ASM_OUTPUT_INTERNAL_LABEL + #undef ASM_OUTPUT_ADDR_VEC_ELT + #undef ASM_OUTPUT_ADDR_DIFF_ELT + #undef ASM_GENERATE_INTERNAL_LABEL + #undef ASM_FORMAT_PRIVATE_NAME #undef ASM_OUTPUT_OPCODE #undef ASM_OUTPUT_LOCAL #undef ASM_OUTPUT_LABELREF *************** *** 232,242 **** { scale = INTVAL (XEXP (ireg, 1)); \ ireg = XEXP (ireg, 0); } \ if (GET_CODE (ireg) == SIGN_EXTEND) \ ! fprintf (FILE, "LD%d(%%pc,%s.w", \ CODE_LABEL_NUMBER (XEXP (addr, 0)), \ reg_name[REGNO (XEXP (ireg, 0))]); \ else \ ! fprintf (FILE, "LD%d(%%pc,%s.l", \ CODE_LABEL_NUMBER (XEXP (addr, 0)), \ reg_name[REGNO (ireg)]); \ if (scale != 1) fprintf (FILE, ":%d", scale); \ --- 237,247 ---- { scale = INTVAL (XEXP (ireg, 1)); \ ireg = XEXP (ireg, 0); } \ if (GET_CODE (ireg) == SIGN_EXTEND) \ ! fprintf (FILE, "LD%%%d(%%pc,%s.w", \ CODE_LABEL_NUMBER (XEXP (addr, 0)), \ reg_name[REGNO (XEXP (ireg, 0))]); \ else \ ! fprintf (FILE, "LD%%%d(%%pc,%s.l", \ CODE_LABEL_NUMBER (XEXP (addr, 0)), \ reg_name[REGNO (ireg)]); \ if (scale != 1) fprintf (FILE, ":%d", scale); \ *************** *** 263,269 **** break; \ } \ else if (reg1 != 0 && GET_CODE (addr) == LABEL_REF) \ ! { fprintf (FILE, "LD%d(%%pc,%s.w)", \ CODE_LABEL_NUMBER (XEXP (addr, 0)), \ reg_name[REGNO (reg1)]); \ break; } \ --- 268,274 ---- break; \ } \ else if (reg1 != 0 && GET_CODE (addr) == LABEL_REF) \ ! { fprintf (FILE, "LD%%%d(%%pc,%s.w)", \ CODE_LABEL_NUMBER (XEXP (addr, 0)), \ reg_name[REGNO (reg1)]); \ break; } \ *************** *** 277,291 **** }} #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ ! fprintf (FILE, "%s%d:\n", PREFIX, NUM) #define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,TABLE) \ ! fprintf (FILE, "\tswbeg &%d\n%s%d:\n\tshort 0\n", \ XVECLEN (PATTERN (TABLE), 1) + 1, PREFIX, NUM) #define ASM_OUTPUT_CASE_END(FILE,NUM,TABLE) \ ! fprintf (FILE, "\tset LD%d,L%d-LI%d\n", NUM, NUM, NUM); #define ASM_OUTPUT_OPCODE(FILE, PTR) \ { if ((PTR)[0] == 'j' && (PTR)[1] == 'b') \ { ++(PTR); \ --- 282,309 ---- }} #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ ! fprintf (FILE, "%s%%%d:\n", PREFIX, NUM) + #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \ + fprintf (FILE, "\tlong L%%%d\n", VALUE) + + #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \ + fprintf (FILE, "\tshort L%%%d-L%%%d\n", VALUE, REL) + #define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,TABLE) \ ! fprintf (FILE, "\tswbeg &%d\n%s%%%d:\n\tshort 0\n", \ XVECLEN (PATTERN (TABLE), 1) + 1, PREFIX, NUM) #define ASM_OUTPUT_CASE_END(FILE,NUM,TABLE) \ ! fprintf (FILE, "\tset LD%%%d,L%%%d-LI%%%d\n", NUM, NUM, NUM) + #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \ + sprintf (LABEL, "*%s%%%d", PREFIX, NUM) + + #define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \ + ( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 12), \ + sprintf ((OUTPUT), "%s%%__%d", (NAME), (LABELNO))) + #define ASM_OUTPUT_OPCODE(FILE, PTR) \ { if ((PTR)[0] == 'j' && (PTR)[1] == 'b') \ { ++(PTR); \ *************** *** 326,328 **** --- 344,349 ---- #define ASM_OUTPUT_LABELREF(FILE,NAME) \ fprintf (FILE, "%s", NAME) + + #define SDB_DEBUGGING_INFO + ----------------------------------------------