[gnu.gcc.bug] GCC doesn't compile itself correctly on sun4 without -g

dave@CS.WISC.EDU (Dave Cohrs) (08/08/89)

I really wish I could give you more detail on this one, but it's tough.
If there's anything I can do to help out on this, let me know.  This'll
be a toughy, because it only shows up when you don't use "-g".

Environment:
	Sun4/110, SunOS 4.0.1
	gcc version 1.35 (no patches; the raw distribution from prep.)
	    configured with config.gcc for "sun4-os4"

Description:
	By default, gcc compiles itself with "-g -O".  On a lark, I
	decided to take out the "-g", and went through the compilation
	steps, including the verification step.  I did the following:

	% make ; make stage1
	% make CC="stage1/gcc -Bstage1/" CFLAGS="-O"
	% make stage2
	% make CC="stage2/gcc -Bstage2/" CFLAGS="-O"
	% foreach file ( *.o )
	> cmp $file stage2/$file
	> end

	The "cmp"'s showed various files that were different, namely:

	    caller-save.o stage2/caller-save.o differ: char 8, line 2
	    cccp.o stage2/cccp.o differ: char 7, line 1
	    cexp.o stage2/cexp.o differ: char 8, line 1
	    cse.o stage2/cse.o differ: char 7, line 1
	    explow.o stage2/explow.o differ: char 8, line 1
	    expmed.o stage2/expmed.o differ: char 8, line 1
	    expr.o stage2/expr.o differ: char 8, line 1
	    fold-const.o stage2/fold-const.o differ: char 7, line 1
	    loop.o stage2/loop.o differ: char 8, line 1
	    stmt.o stage2/stmt.o differ: char 8, line 1
	    stor-layout.o stage2/stor-layout.o differ: char 7, line 1
	    toplev.o stage2/toplev.o differ: char 8, line 1
	    tree.o stage2/tree.o differ: char 8, line 1
	    varasm.o stage2/varasm.o differ: char 7, line 1

	Which, of course, means their sizes are different, which
	means that the stage1 and stage2 compilers are different.

	Oh, when I compiled gcc with "-O -g", the stage1 and stage2
	output were identical (i.e. the cmp's didn't complain).

Example:

I just happen to have a small example procedure that tickles at
least one bug.  Here it is, along with the output of two version
of gcc.  The first output is a gcc compiled with "-O -g", the
second, with just "-O".

int
hash(s)
    register char *s;
{
    register hval = 0;

    /* simple shift and add hash... */
    while(*s)
	hval = (hval<<1)+(*s++);

    return (hval%521); /* return hash mod the table size (odd) */
}

**Output of "gcc -B$HOME/src/gcc/ -S -g -c /tmp/foo.c" ($HOME/src/gcc
contains a version of the gcc executables compiled with "-O -g").

gcc_compiled.:
	.stabs "/tmp/foo.c",100,0,0,Ltext
Ltext:
.stabs "int:t1=r1;-2147483648;2147483647;",128,0,0,0
.stabs "char:t2=r2;0;127;",128,0,0,0
.stabs "long int:t3=r1;-2147483648;2147483647;",128,0,0,0
.stabs "unsigned int:t4=r1;0;-1;",128,0,0,0
.stabs "long unsigned int:t5=r1;0;-1;",128,0,0,0
.stabs "short int:t6=r1;-32768;32767;",128,0,0,0
.stabs "long long int:t7=r1;0;-1;",128,0,0,0
.stabs "short unsigned int:t8=r1;0;65535;",128,0,0,0
.stabs "long long unsigned int:t9=r1;0;-1;",128,0,0,0
.stabs "signed char:t10=r1;-128;127;",128,0,0,0
.stabs "unsigned char:t11=r1;0;255;",128,0,0,0
.stabs "float:t12=r1;4;0;",128,0,0,0
.stabs "double:t13=r1;8;0;",128,0,0,0
.stabs "long double:t14=r1;8;0;",128,0,0,0
.stabs "void:t15=15",128,0,0,0
.text
	.align 4
.global _hash
	.proc 1
_hash:
.stabn 68,0,5,LM1
LM1:
	!#PROLOGUE# 0
	save %sp,-112,%sp
	!#PROLOGUE# 1
	mov %i0,%l0
LBB2:
.stabn 68,0,7,LM2
LM2:
	mov 0,%l1
.stabn 68,0,10,LM3
LM3:
L2:
	ldsb [%l0],%o0
	mov 0,%o1
	cmp %o0,%o1
	be L3
	nop
.stabn 68,0,11,LM4
LM4:
	sll %l1,1,%o0
	ldsb [%l0],%o1
	add %o0,%o1,%l1
	add %l0,1,%l0
	b L2
	nop
L3:
.stabn 68,0,13,LM5
LM5:
	mov %l1,%o0
	mov 521,%o1
	call .rem,0
	nop
	mov %o0,%o0
	mov %o0,%i0
	b L1
	nop
LBE2:
.stabn 68,0,14,LM6
LM6:
L1:
	ret
	restore
.stabs "hash:F1",36,0,0,_hash
.stabs "s:P16=*2",64,0,0,16
.stabs "hval:r1",64,0,0,17
.stabn 192,0,0,LBB2
.stabn 224,0,0,LBE2

**Output of "gcc -B$HOME/gcc-1.35/stage2/ -S -g -c /tmp/foo.c" (stage2
contains a version of the gcc executables compiled with "-O", no -g).

gcc_compiled.:
	.stabs "/tmp/foo.c",100,0,0,Ltext
Ltext:
.stabs "int:t1=r1;-2147483648;2147483647;",128,0,0,0
.stabs "char:t2=r2;0;127;",128,0,0,0
.stabs "long int:t3=r1;-2147483648;2147483647;",128,0,0,0
.stabs "unsigned int:t4=r1;0;-1;",128,0,0,0
.stabs "long unsigned int:t5=r1;0;-1;",128,0,0,0
.stabs "short int:t6=r1;-32768;32767;",128,0,0,0
.stabs "long long int:t7=r1;0;-1;",128,0,0,0
.stabs "short unsigned int:t8=r1;0;65535;",128,0,0,0
.stabs "long long unsigned int:t9=r1;0;-1;",128,0,0,0
.stabs "signed char:t10=r1;-128;127;",128,0,0,0
.stabs "unsigned char:t11=r1;0;255;",128,0,0,0
.stabs "float:t12=r1;4;0;",128,0,0,0
.stabs "double:t13=r1;8;0;",128,0,0,0
.stabs "long double:t14=r1;8;0;",128,0,0,0
.stabs "void:t15=15",128,0,0,0
.text
	.align 4
.global _hash
	.proc 1
_hash:
.stabn 68,0,5,LM1
LM1:
	!#PROLOGUE# 0
	save %sp,-112,%sp
	!#PROLOGUE# 1
	mov %i0,%l0
LBB2:
.stabn 68,0,7,LM2
LM2:
	mov 0,%l1
.stabn 68,0,10,LM3
LM3:
L2:
	ldsb [%l0],%o0
	mov 0,%o1
	cmp %o0,%o1
	be L3
	nop
.stabn 68,0,11,LM4
LM4:
	sll %l1,1,%o0
	ldsb [%l0],%o1
	add %o0,%o1,%l1
	add %l0,1,%l0
	b L2
	nop
L3:
.stabn 68,0,13,LM5
LM5:
	call .rem,0
	nop
	mov %o0,%o0
	mov %o0,%i0
	b L1
	nop
LBE2:
.stabn 68,0,14,LM6
LM6:
L1:
	ret
	restore
.stabs "hash:F1",36,0,0,_hash
.stabs "s:P16=*2",64,0,0,16
.stabs "hval:r1",64,0,0,17
.stabn 192,0,0,LBB2
.stabn 224,0,0,LBE2

**The difference between these is what the compiler generates for the
final "return" statement:

% diff -c foo.s.withg foo.s.stage2
*** foo.s.withg	Mon Aug  7 14:41:28 1989
--- foo.s.stage2	Mon Aug  7 14:42:07 1989
***************
*** 50,57 ****
  L3:
  .stabn 68,0,13,LM5
  LM5:
-       mov %l1,%o0
-       mov 521,%o1
        call .rem,0
        nop
        mov %o0,%o0
--- 50,55 ----

Dave Cohrs