I'm seeing a seg fault due to extending a vector in the middle of a vector iteration loop. This occurs during bootstrap on an i686-pc-linux-gnu system with the default vector length reduced to 2 and the vector length and alloc fields set to unsigned short.

It's very sensitive to the command line options, indeed the regular trick
of -save-temps and feeding the .i file into cc1 fails to elicit the fault.

run  -quiet -v -I. -I. -I../../gcc/gcc -I../../gcc/gcc/. -I../../gcc/gcc/../include
-I../../gcc/gcc/../libcpp/include -iprefix 
/home/nathan/egcs/HEAD/memory/gcc/stage1/../lib/gcc/i686-pc-linux-gnu/4.0.0/
 -isystem ./include -DIN_GCC -DHAVE_CONFIG_H ../../gcc/gcc/cfgloopmanip.c -quiet
 -dumpbase cfgloopmanip.c -mtune=pentiumpro -auxbase-strip cfgloopmanip.o -g -O2
 -W -Wall -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -pedantic
 -Wno-long-long -Wno-variadic-macros -Wold-style-definition -Werror -version
 -fomit-frame-pointer -fno-common

Here is the stack traceback,

#0  0x081d8bb0 in VEC_edge_reserve (vec_=0x403da16c, alloc_=-1, _loc_name=0x85eea2a 
"../../gcc/gcc/cfg.c", _loc_line=273,
    _loc_function=0x85eea8e "unchecked_make_edge") at ../../gcc/gcc/basic-block.h:177
#1  0x081d8a20 in VEC_edge_safe_insert (vec_=0x403da16c, ix_=0, obj_=0x409679d8, file_=0x85eea2a 
"../../gcc/gcc/cfg.c",
    line_=273, function_=0x85eea8e "unchecked_make_edge", _loc_name=0x85eea2a 
"../../gcc/gcc/cfg.c", _loc_line=273,
    _loc_function=0x85eea8e "unchecked_make_edge") at ../../gcc/gcc/basic-block.h:177
#2  0x081d67a8 in unchecked_make_edge (src=0x403da15c, dst=0x40360a6c, flags=1) at 
../../gcc/gcc/cfg.c:273
#3  0x081d6906 in cached_make_edge (edge_cache=0x0, src=0x403da15c, dst=0x40360a6c, 
flags=1) at ../../gcc/gcc/cfg.c:321
#4  0x081d6984 in make_edge (src=0x403da15c, dest=0x40360a6c, flags=1) at 
../../gcc/gcc/cfg.c:335
#5  0x081ec42b in force_nonfallthru_and_redirect (e=0x409c9a68, target=0x403ba488) at 
../../gcc/gcc/cfgrtl.c:1136
#6  0x081ec595 in rtl_redirect_edge_and_branch_force (e=0x409c9a68, target=0x403ba488) 
at ../../gcc/gcc/cfgrtl.c:1198
#7  0x084d1d54 in redirect_edge_and_branch_force (e=0x409c9a68, dest=0x403ba488) at 
../../gcc/gcc/cfghooks.c:296
#8  0x081dc443 in try_forward_edges (mode=41, b=0x403da15c) at 
../../gcc/gcc/cfgcleanup.c:590
#9  0x081df775 in try_optimize_cfg (mode=41) at ../../gcc/gcc/cfgcleanup.c:1986
#10 0x081df9b8 in cleanup_cfg (mode=41) at ../../gcc/gcc/cfgcleanup.c:2098
#11 0x084d9235 in rest_of_handle_jump2 () at ../../gcc/gcc/passes.c:1437
#12 0x084d963e in rest_of_compilation () at ../../gcc/gcc/passes.c:1651
#13 0x080fd69d in execute_one_pass (pass=0x8673c80) at 
../../gcc/gcc/tree-optimize.c:503
#14 0x080fd78a in execute_pass_list (pass=0x8673c80) at 
../../gcc/gcc/tree-optimize.c:538
#15 0x080fda46 in tree_rest_of_compilation (fndecl=0x407895e4, nested_p=0 '\0') at 
../../gcc/gcc/tree-optimize.c:638
#16 0x0806a450 in c_expand_body (fndecl=0x407895e4) at ../../gcc/gcc/c-decl.c:6323
#17 0x0850a24a in cgraph_expand_function (node=0x408095e4) at 
../../gcc/gcc/cgraphunit.c:1046
#18 0x0850deee in cgraph_expand_all_functions () at ../../gcc/gcc/cgraphunit.c:2728
#19 0x0850e2cb in cgraph_optimize () at ../../gcc/gcc/cgraphunit.c:2839
#20 0x0806cbe7 in c_write_global_declarations () at ../../gcc/gcc/c-decl.c:7293
#21 0x08497974 in compile_file () at ../../gcc/gcc/toplev.c:998
#22 0x08499341 in do_compile () at ../../gcc/gcc/toplev.c:2069
#23 0x084993a8 in toplev_main (argc=37, argv=0xbffff114) at ../../gcc/gcc/toplev.c:2101
#24 0x080d1e8a in main (argc=37, argv=0xbffff114) at ../../gcc/gcc/main.c:35


As you'll see cleanup_cfg is looping over the edges of a block using the edge iterators for (ei = ei_start (b->succs); (e = ei_safe_edge (ei)); ) { ...} but in that loop b->succs is reallocated, so the iterator ei ends up with a stale pointer.

If edge vectors can be reallocated in such loops, then the iterators need
redesigning.

nathan
--
Nathan Sidwell    ::   http://www.codesourcery.com   ::     CodeSourcery LLC
[EMAIL PROTECTED]    ::     http://www.planetfall.pwp.blueyonder.co.uk




Reply via email to