[gnu.gcc.bug] gcc 1.36

dc@UUNET.UU.NET (Dave Cornelius) (10/11/89)

The enclosed program causes gcc-1.36 to die with a fatal signal (11: SIGSEGV)
when the '-traditional' command line argument is given.  (Omitting
the '-traditional' allows the compilation to take place :-).

Environment:
 - Sun 4/260(sunos4.0.3) or Sun 3/150(sunos3.5)
 - 'cc' on that machine
 - config.h -> config/xm-sparc.h (or config/xm-m68k.h for the sun3/150)
 - aux-output.c -> config/out-m68k.c
 - md -> config/m68k.md
 - tm.h -> config/tm-sun3.h

Command line args:  -traditional

Cursory analysis (and some guesswork):

Building the trees for the embedded structure declarations causes
build_int to be invoked for the integers which are the sizes of
each of the structs.  build_int caches the constant trees built therein
via its static size_table.

At the end of the procedure block, something happens to these constant
blocks, such that the cached pointer is no longer valid.  Subsequent
calls to build_int find a cached entry, which is no longer valid.

I turned off the caching in build_int, and the crash does not occur.
I have no idea how awful the performance implications of disabling
this cache are :-(  ( It must have been thought to be important at some
point in time :-)!

Perhaps the trees need reference counts, and the destruction routines
can watch the ref count go to zero, and nuke the cache pointer if
the tree is really free?

I hope this helps isolate the problem and generate a fix; we'll
continue to operate with the cache turned off.
If there's any other info I can provide, do drop me a line!

We continue to be impressed with the quality of the gnu compiler!

	Yours,
-----------
Dave Cornelius				Network Computing Devices
					350 North Bernardo Ave
{uunet,ardent,mips}!lupine!dc		Mountain View, CA, 94043
 OR: dc@ncd.com				415-694-0675


================================
dbx session output:

dc@sheridan 189> dbx /u4/gnu/gcc-1.36/sun4/sun3/cc1
Reading symbolic information...
Read 49226 symbols

(dbx) run t.c -traditional

Running: /u4/gnu/gcc-1.36/sun4/sun3/cc1 t.c -traditional
 p1 p2 p3signal SEGV (segmentation violation) in expand_expr at line 2161 in file "gnu/gcc-1.36/expr.c"
2161     register enum machine_mode mode = TYPE_MODE (type);

(dbx) where

expand_expr(exp = 0x103400, target = (nil), tmode = VOIDmode,      \
	modifier = EXPAND_NORMAL), line 2161 in "gnu/gcc-1.36/expr.c"
variable_size(size = 0x103400), line 161 in "gnu/gcc-1.36/stor-layout.c"
layout_type(type = 0x103380), line 929 in "gnu/gcc-1.36/stor-layout.c"
finish_struct(t = 0x103380, fieldlist = 0x10ccb8),                 \
	line 3205 in "gnu/gcc-1.36/c-decl.c"
yyparse(), line 768 in "/gp/rms/cc/c-parse.y"
compile_file(name = 0xf7fff9eb "t.c"), line 1118 in "gnu/gcc-1.36/toplev.c"
main(argc = 3, argv = 0xf7fff96c, envp = 0xf7fff97c),              \
	line 1991 in "gnu/gcc-1.36/toplev.c"
(dbx)

============= t.c ============
int foo;

p1()
{
	struct overlay1 {
		int	i;
		char	*p;
		unsigned count;
	} *ovp = (struct overlay1 *)foo;
}

p2()
{
	struct overlay2 {
	} *ovp = (struct overlay2 *)foo;
}

p3()
{
	struct overlay3 {
		char	*p;
		int	i;
		unsigned count;
	} *ovp = (struct overlay3 *)foo;
}

james@raid.dell.com (James Van Artsdalen) (02/07/90)

In <1965@osc.COM>, rp@osc.COM (Rich Patterson) wrote:

> 	Here is a bug that I've found in gcc.

> Synopsis: GCC's (1.36 386 System V) builtin alloca function does not align
> 	  the stack.

> Description: When compiling GDB 3.4 with GCC 1.36 the program will
> 	core dump when starting up in tgetent.

Yes, this is a bug and not a performance issue.  This is also the
cause of a bug I have been trying to figure out in emacs for quite
some time.  The 386 (and presumably the 486) can misbehave when the
stack is not aligned.  I saw this last year in some ROM based code,
but did not get a chance to prove it with a logic analyzer.  Aligning
the stack has appeared to fix several mysterious problems.
--
James R. Van Artsdalen          james@raid.dell.com       "Live Free or Die"
Dell Computer Corporation  9505 Arboretum Blvd Austin TX 78759  512-338-8789

rfg@paris.ics.uci.edu (Ronald Guilmette) (02/26/90)

/* gcc 1.36 (and 1.36.93) bug 900226_01

  gcc issues an error message for the first member of the following pair
  of declarations.  I believe that this is legal ANSI C code.  The intent
  here is to "forward declare" a static array.

  At least one C "expert" has advised me that this should be legal.

*/

static int array[];		/* gets bogus error */
static int array[] = { 1,2,3 };

/*
  The error message says:

	storage size of `array' isn't known
*/