bug in gcc-1.24 for the 3B1

Tom Tkacik tkacik at rphroy.UUCP
Thu Aug 25 04:43:02 AEST 1988


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
+ 
----------------------------------------------



More information about the Unix-pc.general mailing list