llvm-gcc 4.2 assertion failed on linux x86_64

Hello,

Trying to get my machine building up-to-date, and a nightly going, i
ran into an assertion during the build of llvm-gcc 4.2:

$ make -j2
<snip!>
/home/chandlerc/code/compilers/build/llvm-gcc/./gcc/xgcc
-B/home/chandlerc/code/compilers/build/llvm-gcc/./gcc/
-B/home/chandlerc/code/compilers/install/llvm-gcc/x86_64-pc-linux-gnu/bin/
-B/home/chandlerc/code/compilers/install/llvm-gcc/x86_64-pc-linux-gnu/lib/
-isystem /home/chandlerc/code/compilers/install/llvm-gcc/x86_64-pc-linux-gnu/include
-isystem /home/chandlerc/code/compilers/install/llvm-gcc/x86_64-pc-linux-gnu/sys-include
-O2 -O2 -march=k8 -mfpmath=sse -pipe -DIN_GCC -W -Wall
-Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes
-Wold-style-definition -isystem ./include -fPIC -g
-DHAVE_GTHR_DEFAULT -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED -I. -I.
-I/home/chandlerc/code/compilers/llvm-gcc/gcc
-I/home/chandlerc/code/compilers/llvm-gcc/gcc/.
-I/home/chandlerc/code/compilers/llvm-gcc/gcc/../include
-I/home/chandlerc/code/compilers/llvm-gcc/gcc/../libcpp/include
-I/home/chandlerc/code/compilers/llvm-gcc/gcc/../libdecnumber
-I../libdecnumber -I/home/chandlerc/code/compilers/llvm/include
-I/home/chandlerc/code/compilers/build/llvm/include -DL_powitf2 -c
/home/chandlerc/code/compilers/llvm-gcc/gcc/libgcc2.c -o
libgcc/./_powitf2.o
cc1: /home/chandlerc/code/compilers/llvm-gcc/gcc/llvm-types.cpp:81:
const llvm::Type* llvm_set_type(tree_node*, const llvm::Type*):
Assertion `(!(__extension__ ({ const tree __t = (Tr); if
(tree_code_type[(int) (((enum tree_code) (__t)->common.code))] !=
(tcc_type)) tree_class_check_failed (__t, (tcc_type),
"/home/chandlerc/code/compilers/llvm-gcc/gcc/llvm-types.cpp", 81,
__FUNCTION__); __t; })->type.size) || !Ty->isSized() ||
!isInt64((__extension__ ({ const tree __t = (Tr); if
(tree_code_type[(int) (((enum tree_code) (__t)->common.code))] !=
(tcc_type)) tree_class_check_failed (__t, (tcc_type),
"/home/chandlerc/code/compilers/llvm-gcc/gcc/llvm-types.cpp", 81,
__FUNCTION__); __t; })->type.size), true) || getInt64((__extension__
({ const tree __t = (Tr); if (tree_code_type[(int) (((enum tree_code)
(__t)->common.code))] != (tcc_type)) tree_class_check_failed (__t,
(tcc_type), "/home/chandlerc/code/compilers/llvm-gcc/gcc/llvm-types.cpp",
81, __FUNCTION__); __t; })->type.size), true) ==
getTargetData().getABITypeSizeInBits(Ty)) && "LLVM type size doesn't
match GCC type size!"' failed.
/home/chandlerc/code/compilers/llvm-gcc/gcc/libgcc2.c: In function '__powixf2':
/home/chandlerc/code/compilers/llvm-gcc/gcc/libgcc2.c:1765: internal
compiler error: Aborted

My configure:
.../configure --host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu
--target=x86_64-pc-linux-gnu
--prefix=/home/chandlerc/code/compilers/install/llvm-gcc
--disable-multilib --disable-shared
--enable-llvm=/home/chandlerc/code/compilers/build/llvm
--program-prefix=llvm- --enable-languages=c,c++

If more information would help, just let me know.

-Chandler

Hi Chandler,

This looks like a FE error, so you probably won't be able to get an LLVM bitcode file for us. You could help by whittling the test case down to something managable. First get a preprocessed file. Then I would suggest following the instructions on this page to reduce the testcase:

  http://gcc.gnu.org/wiki/A_guide_to_testcase_reduction

That will help us a lot with the bug report.

-bw

Bam. This is about as reduced as it gets. I think I can spot the problem point:

chandlerc@osiris ~/code/compilers/build/llvm-gcc $ cat testcase.i
void
foo () {
  float x __attribute__ ((mode (XF)));
}
chandlerc@osiris ~/code/compilers/build/llvm-gcc $ ./gcc/cc1
-fpreprocessed -march=k8 testcase.i -o /dev/null
foocc1: /home/chandlerc/code/compilers/llvm-gcc/gcc/llvm-types.cpp:81:
const llvm::Type* llvm_set_type(tree_node*, const llvm::Type*):
Assertion `(!(__extension__ ({ const tree __t = (Tr); if
(tree_code_type[(int) (((enum tree_code) (__t)->common.code))] !=
(tcc_type)) tree_class_check_failed (__t, (tcc_type),
"/home/chandlerc/code/compilers/llvm-gcc/gcc/llvm-types.cpp", 81,
__FUNCTION__); __t; })->type.size) || !Ty->isSized() ||
!isInt64((__extension__ ({ const tree __t = (Tr); if
(tree_code_type[(int) (((enum tree_code) (__t)->common.code))] !=
(tcc_type)) tree_class_check_failed (__t, (tcc_type),
"/home/chandlerc/code/compilers/llvm-gcc/gcc/llvm-types.cpp", 81,
__FUNCTION__); __t; })->type.size), true) || getInt64((__extension__
({ const tree __t = (Tr); if (tree_code_type[(int) (((enum tree_code)
(__t)->common.code))] != (tcc_type)) tree_class_check_failed (__t,
(tcc_type), "/home/chandlerc/code/compilers/llvm-gcc/gcc/llvm-types.cpp",
81, __FUNCTION__); __t; })->type.size), true) ==
getTargetData().getABITypeSizeInBits(Ty)) && "LLVM type size doesn't
match GCC type size!"' failed.

testcase.i: In function 'foo':
testcase.i:2: internal compiler error: Aborted

Hope that helps. =]

-Chandler

PS: delta hates me, and this test case, a lot. reduced it by hand.

Hi Chandler,

void
foo () {
  float x __attribute__ ((mode (XF)));
}

nice reduction. I don't see any problem on x86-32,
and I don't have access to an x86-64 box right now.
Can you please open a PR for this, and also run in
the debugger. When you hit the abort, use "up" to
go up a stack frame or two or three, and print out
the gcc types [use: call debug_tree(type) ] and the
LLVM type [use: call Ty->dump() ].

Thanks,

Duncan.

Here you go:

Starting program: /home/chandlerc/code/compilers/build/llvm-gcc/gcc/cc1 -fpreprocessed -march=k8 testcase.i -o /dev/null
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7fff0d5fe000
[Thread debugging using libthread_db enabled]
foocc1: /home/chandlerc/code/compilers/llvm-gcc/gcc/llvm-types.cpp:81: const llvm::Type* llvm_set_type(tree_node*, const llvm::Type*): Assertion `(!(extension ({ const tree __t = (Tr); if (tree_code_type[(int) (((enum tree_code) (__t)->common.code))] != (tcc_type)) tree_class_check_failed (__t, (tcc_type), “/home/chandlerc/code/compilers/llvm-gcc/gcc/llvm-types.cpp”, 81, FUNCTION); __t; })->type.size) || !Ty->isSized() || !isInt64((extension ({ const tree __t = (Tr); if (tree_code_type[(int) (((enum tree_code) (__t)->common.code))] != (tcc_type)) tree_class_check_failed (__t, (tcc_type), “/home/chandlerc/code/compilers/llvm-gcc/gcc/llvm-types.cpp”, 81, FUNCTION); __t; })->type.size), true) || getInt64((extension ({ const tree __t = (Tr); if (tree_code_type[(int) (((enum tree_code) (__t)->common.code))] != (tcc_type)) tree_class_check_failed (__t, (tcc_type), “/home/chandlerc/code/compilers/llvm-gcc/gcc/llvm-types.cpp”, 81, FUNCTION); __t; })->type.size), true) == getTargetData().getABITypeSizeInBits(Ty)) && “LLVM type size doesn’t match GCC type size!”’ failed.
[New Thread 0x2b709e7b8440 (LWP 15687)]

Program received signal SIGABRT, Aborted.
[Switching to Thread 0x2b709e7b8440 (LWP 15687)]
0x00002b709e48afa5 in raise () from /lib/libc.so.6
(gdb) up
#1 0x00002b709e48ca00 in abort () from /lib/libc.so.6
(gdb) up
#2 0x00002b709e4843df in __assert_fail () from /lib/libc.so.6
(gdb) up
#3 0x0000000000a84d3b in llvm_set_type (Tr=0x2b709d6f8790, Ty=0x166c210)
at /home/chandlerc/code/compilers/llvm-gcc/gcc/llvm-types.cpp:78
78 assert((!TYPE_SIZE(Tr) || !Ty->isSized() || !isInt64(TYPE_SIZE(Tr), true) ||
(gdb) Ty->dump()
Undefined command: “Ty->dump”. Try “help”.
(gdb) call Ty->dump()
x86_fp80
(gdb) call debug_tree(type)
No symbol “type” in current context.
(gdb) up
#4 0x0000000000a86501 in TypeConverter::ConvertType (this=0x16941a0, orig_type=0x2b709d6f8790)
at /home/chandlerc/code/compilers/llvm-gcc/gcc/llvm-types.cpp:756
756 case 80: return SET_TYPE_LLVM(type, Type::X86_FP80Ty);
(gdb) call debug_tree(type)
<real_type 0x2b709d6f8790 long double sizes-gimplified XF
size <integer_cst 0x2b709d6f39c0 type <integer_type 0x2b709d6e4370 bit_size_type> constant invariant 96>
unit size <integer_cst 0x2b709d6f39f0 type <integer_type 0x2b709d6e42c0 long unsigned int> constant invariant 12>
align 32 symtab 0 alias set -1 precision 80
pointer_to_this <pointer_type 0x2b709d6f89a0>>
(gdb)

Does this fix it?

Index: lib/Target/X86/X86Subtarget.h

Probably better to move the discussion to a bug?

Evan

Sure. Chandler, could you file a PR for this?

-bw