This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug middle-end/48395] New: [AVR] ICE: segmentation fault when compiling libgcc2.c, SVN trunk r171783
- From: "j at uriah dot heep.sax.de" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Thu, 31 Mar 2011 18:53:14 +0000
- Subject: [Bug middle-end/48395] New: [AVR] ICE: segmentation fault when compiling libgcc2.c, SVN trunk r171783
- Auto-submitted: auto-generated
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48395
Summary: [AVR] ICE: segmentation fault when compiling
libgcc2.c, SVN trunk r171783
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: major
Priority: P3
Component: middle-end
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: j@uriah.heep.sax.de
Created attachment 23842
--> http://gcc.gnu.org/bugzilla/attachment.cgi?id=23842
GDB transcript
trunk r171783 cannot compile its own libgcc2.c for the AVR target:
gmake[4]: Entering directory `/junk/gcc/trunk/build-avr/avr/avr25/libgcc'
# If this is the top-level multilib, build all the other
# multilibs.
/junk/gcc/trunk/build-avr/./gcc/xgcc -B/junk/gcc/trunk/build-avr/./gcc/
-B/junk/testroot/avr/bin/ -B/junk/testroot/avr/lib/ -isystem
/junk/testroot/avr/include -isystem /junk/testroot/avr/sys-include -g -O2
-mmcu=avr25 -O2 -g -O2 -DIN_GCC -DCROSS_DIRECTORY_STRUCTURE -W -Wall
-Wwrite-strings -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes
-Wold-style-definition -isystem ./include -DDF=SF -Dinhibit_libc
-mcall-prologues -Os -g -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED
-fno-stack-protector -Dinhibit_libc -I. -I. -I../../.././gcc
-I../../../../libgcc -I../../../../libgcc/. -I../../../../libgcc/../gcc
-I../../../../libgcc/../include -DHAVE_CC_TLS -DUSE_EMUTLS -o _negdi2.o -MT
_negdi2.o -MD -MP -MF _negdi2.dep -DL_negdi2 -c
../../../../libgcc/../gcc/libgcc2.c \
../../../../libgcc/../gcc/libgcc2.c: In function â__negdi2â:
../../../../libgcc/../gcc/libgcc2.c:68:17: internal compiler error:
Segmentation fault: 11
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.
gmake[4]: *** [_negdi2.o] Error 1
gmake[4]: Leaving directory `/junk/gcc/trunk/build-avr/avr/avr25/libgcc'
gmake[3]: *** [multi-do] Error 1
gmake[3]: Leaving directory `/junk/gcc/trunk/build-avr/avr/libgcc'
gmake[2]: *** [all-multi] Error 2
gmake[2]: Leaving directory `/junk/gcc/trunk/build-avr/avr/libgcc'
gmake[1]: *** [all-target-libgcc] Error 2
gmake[1]: Leaving directory `/junk/gcc/trunk/build-avr'
gmake: *** [all] Error 2
(Also attaching the GDB transcript separately for better readability.
See below for my conclusion about the nature of the bug.)
The debugger shows the following stack trace:
(gdb) bt
#0 scratch_operand (op=0x959, mode=HImode) at ../../gcc/recog.c:1078
#1 0x08375db4 in insn_operand_matches (icode=CODE_FOR_setmemhi, opno=4,
operand=0x959) at ../../gcc/optabs.c:6999
#2 0x083760d9 in maybe_legitimize_operands (icode=CODE_FOR_setmemhi, opno=0,
nops=5, ops=0xbfbfda2c) at ../../gcc/optabs.c:7074
#3 0x083762c3 in maybe_gen_insn (icode=CODE_FOR_setmemhi, nops=5,
ops=0xbfbfda2c) at ../../gcc/optabs.c:7124
#4 0x083764cf in maybe_expand_insn (icode=CODE_FOR_setmemhi, nops=5,
ops=0xbfbfda2c) at ../../gcc/optabs.c:7155
#5 0x08231f19 in set_storage_via_setmem (object=0x28b4f2dc, size=0x28a1b2f8,
val=0x28a1b2b8, align=Variable "align" is not available.
) at ../../gcc/expr.c:2738
#6 0x08246b41 in clear_storage_hints (object=0x28b4f2dc, size=0x28a1b2f8,
method=BLOCK_OP_NORMAL, expected_align=0,
expected_size=-1) at ../../gcc/expr.c:2579
#7 0x08246c7f in clear_storage (object=0x28b4f2dc, size=0x28a1b2f8,
method=BLOCK_OP_NORMAL) at ../../gcc/expr.c:2594
#8 0x08239a1d in store_constructor (exp=0x28b10848, target=0x28b4f2dc,
cleared=0, size=8) at ../../gcc/expr.c:5196
#9 0x0823a729 in expand_constructor (exp=0x28b10848, target=0x28b4f2dc,
modifier=EXPAND_NORMAL, avoid_temp_mem=0 '\0')
at ../../gcc/expr.c:7100
#10 0x0823d56a in expand_expr_real_1 (exp=0x28b10848, target=0x28b4f2dc,
tmode=BLKmode, modifier=EXPAND_NORMAL, alt_rtl=0xbfbfdd9c)
at ../../gcc/expr.c:8659
#11 0x08246d53 in store_expr (exp=0x28b10848, target=0x28b4f2dc,
call_param_p=0, nontemporal=0 '\0') at ../../gcc/expr.c:4653
#12 0x08236f47 in expand_assignment (to=0x28b2b120, from=0x28b10848,
nontemporal=Variable "nontemporal" is not available.
) at ../../gcc/expr.c:4441
#13 0x081950a1 in expand_gimple_stmt (stmt=0x28b2f6c0) at
../../gcc/cfgexpand.c:1972
#14 0x08195a98 in expand_gimple_basic_block (bb=0x28a926c0) at
../../gcc/cfgexpand.c:3637
#15 0x08197028 in gimple_expand_cfg () at ../../gcc/cfgexpand.c:4120
#16 0x08391a57 in execute_one_pass (pass=0x881b120) at ../../gcc/passes.c:1555
#17 0x08391e9d in execute_pass_list (pass=0x881b120) at ../../gcc/passes.c:1610
#18 0x0847174a in tree_rest_of_compilation (fndecl=0x28afea00) at
../../gcc/tree-optimize.c:422
#19 0x0861c209 in cgraph_expand_function (node=0x28b09f24) at
../../gcc/cgraphunit.c:1575
#20 0x0861f842 in cgraph_optimize () at ../../gcc/cgraphunit.c:1634
#21 0x0861fd2a in cgraph_finalize_compilation_unit () at
../../gcc/cgraphunit.c:1095
#22 0x080a3998 in c_write_global_declarations () at ../../gcc/c-decl.c:9879
#23 0x0840af90 in do_compile () at ../../gcc/toplev.c:591
#24 0x0840b73d in toplev_main (argc=83, argv=0xbfbfe240) at
../../gcc/toplev.c:1963
#25 0x08140292 in main (argc=Error accessing memory address 0x959: Bad address.
) at ../../gcc/main.c:36
By browsing through the individual functions, I eventually stumbled
upon set_storage_via_setmem() setting up the "ops" table which causes
the segfault:
(gdb) up 5
#5 0x08231f19 in set_storage_via_setmem (object=0x28b4f2dc, size=0x28a1b2f8,
val=0x28a1b2b8, align=Variable "align" is not available.
) at ../../gcc/expr.c:2738
2738 if (maybe_expand_insn (code, nops, ops))
(gdb) l set_storage_via_setmem
2689 /* Expand a setmem pattern; return true if successful. */
2690
2691 bool
2692 set_storage_via_setmem (rtx object, rtx size, rtx val, unsigned int
align,
2693 unsigned int expected_align, HOST_WIDE_INT
expected_size)
2694 {
2695 /* Try the most limited insn first, because there's no point
2696 including more than one in the machine description unless
2697 the more limited one has some advantage. */
2698
(gdb) l
2699 enum machine_mode mode;
2700
2701 if (expected_align < align)
2702 expected_align = align;
2703
2704 for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
2705 mode = GET_MODE_WIDER_MODE (mode))
2706 {
2707 enum insn_code code = direct_optab_handler (setmem_optab, mode);
2708
(gdb) l
2709 if (code != CODE_FOR_nothing
2710 /* We don't need MODE to be narrower than
2711 BITS_PER_HOST_WIDE_INT here because if SIZE is less than
2712 the mode mask, as it is returned by the macro, it will
2713 definitely be less than the actual mode mask. */
2714 && ((CONST_INT_P (size)
2715 && ((unsigned HOST_WIDE_INT) INTVAL (size)
2716 <= (GET_MODE_MASK (mode) >> 1)))
2717 || GET_MODE_BITSIZE (mode) >= BITS_PER_WORD))
2718 {
(gdb) l
2719 struct expand_operand ops[6];
2720 unsigned int nops;
2721
2722 nops = insn_data[(int) code].n_operands;
2723 /* ??? n_operands includes match_scratches; find some other
2724 way to select the 6 operand variant, or force all targets
2725 to have exactly 6 operands. */
2726 gcc_assert (nops >= 4 && nops <= 6);
2727
2728 create_fixed_operand (&ops[0], object);
(gdb) l
2729 /* The check above guarantees that this size conversion is
valid. */
2730 create_convert_operand_to (&ops[1], size, mode, true);
2731 create_convert_operand_from (&ops[2], val, byte_mode, true);
2732 create_integer_operand (&ops[3], align / BITS_PER_UNIT);
2733 if (nops == 6)
2734 {
2735 create_integer_operand (&ops[4], expected_align /
BITS_PER_UNIT);
2736 create_integer_operand (&ops[5], expected_size);
2737 }
2738 if (maybe_expand_insn (code, nops, ops))
(gdb) l
2739 return true;
2740 }
2741 }
2742
2743 return false;
2744 }
2745
2746 ^L
2747 /* Write to one of the components of the complex value CPLX. Write VAL
to
2748 the real part if IMAG_P is false, and the imaginary part if its
true. */
(gdb) p ops
$27 = {{type = EXPAND_FIXED, unsigned_p = 0, unused = 0, mode = VOIDmode, value
= 0x28b4f2dc}, {type = EXPAND_CONVERT_TO,
unsigned_p = 1, unused = 0, mode = HImode, value = 0x28a1b2f8}, {type =
EXPAND_CONVERT_FROM, unsigned_p = 1, unused = 0,
mode = QImode, value = 0x28a1b2b8}, {type = EXPAND_INTEGER, unsigned_p = 0,
unused = 0, mode = VOIDmode, value = 0x28a1b2c0}, {
type = 48, unsigned_p = 1, unused = 93, mode = 2140, value = 0x959}, {type
= 7, unsigned_p = 0, unused = 113, mode = 16068,
value = 0x2}}
(gdb) p nops
$28 = 5
Note that for nops == 5, the code in lines 2735/2736 is not executed,
so ops[4] and ops[5] remain undefined. The assertion in line 2726,
however, explicitly allows for nops being 4, 5, or 6.