bootstrap failure, x86: stage1 miscompiles gengenrtl
Zack Weinberg
zack@wolery.cumb.org
Thu Mar 30 16:28:00 GMT 2000
stage1/xgcc -Bstage1/ -B/work/inst/i686-pc-linux-gnu/bin/ -c -DIN_GCC
-W -Wall -Wtraditional -O2 -g -W -Wall -Wtraditional -DHAVE_CONFIG_H
-I. -I/work/src/hashtab.gcc/gcc -I/work/src/hashtab.gcc/gcc/config
-I/work/src/hashtab.gcc/gcc/../include
/work/src/hashtab.gcc/gcc/gengenrtl.c
stage1/xgcc -Bstage1/ -B/work/inst/i686-pc-linux-gnu/bin/ -DIN_GCC -W
-Wall -Wtraditional -O2 -g -W -Wall -Wtraditional -DHAVE_CONFIG_H
-o gengenrtl gengenrtl.o obstack.o
./gengenrtl -h >tmp-genrtl.h
Segmentation fault
$ catchsegv ./gengenrtl -h
...
extern rtx gen_rtx_fmt_uuuu PARAMS ((RTX_CODE, enum machine_mode mode,
rtx arg117, rtx arg117, rtx arg117,
rtx arg117));
*** Segmentation fault
Backtrace:
libc.so.6(_IO_vfprintf+0x17df)
libc.so.6(printf+0x2a)
gengenrtl.c:264(genmacro)
gengenrtl.c:344(genheader)
gengenrtl.c:405(main)
Line 264 of gengenrtl.c is
printf ("#define gen_rtx_%s%s(MODE",
special_rtx (idx) ? "raw_" : "", defs[idx].enumname);
corresponding to this hunk of assembly output:
movl 8(%ebp), %edi
.stabn 68,0,261,.LM74-genmacro
.LM74:
leal (%edi,%edi,2), %eax
leal 0(,%eax,4), %ebx
movl defs(%ebx), %eax
pushl %eax
subl $12, %esp
pushl %edi
call special_rtx
testl %eax, %eax
movl $.LC125, %eax
je .L362
movl $.LC340, %eax
.L362:
pushl %eax
.stabn 68,0,264,.LM75-genmacro
.LM75:
xorl %esi, %esi
.stabn 68,0,261,.LM76-genmacro
.LM76:
pushl $.LC341
call printf
...
.LC125:
.string ""
.LC340:
.string "raw_"
.LC341:
.string "#define gen_rtx_%s%s(MODE"
Given the recent sizing changes, I am inclined to suspect this chunk
of code:
movl 8(%ebp), %edi
leal (%edi,%edi,2), %eax
leal 0(,%eax,4), %ebx
movl defs(%ebx), %eax
pushl %eax
That's supposed to calculate defs[idx].enumname. The analogous code
generated by gcc 2.95 reads
movl 8(%ebp), %edi
addl %edi, %edi
movl 8(%ebp), %edx
leal (%edx,%edi), %eax
leal 0(,%eax,4), %esi
movl $defs, %ebx
pushl (%esi, %ebx)
I'm not exactly an x86 assembly expert, but it appears to me that the
code generated by 2.95 is multiplying idx by 3 before the
leal 0(,%eax,4) instruction, while the current tree is multiplying it
by 4. sizeof(*defs) is 12; both versions agree on that if explicitly
asked.
zw
More information about the Gcc-bugs
mailing list