Callgraph nodes are not necessarily written out in such an order that an inlined function can always locate the function that inlines it. Sometimes, the function that inlines it has not yet been read. This patch addresses that by deferring node lookup by reference until all of the callgraph nodes have been read, and fixes the following: extern inline void __attribute__((__always_inline__)) func(void) { } void f(void) { func(); } $ gcc -c -fwhopr -o f.o f.c $ gcc -shared -fwhopr -o f.so f.o lto1: internal compiler error: vector VEC(cgraph_node_ptr,base) index domain error, in input_node at lto/lto-lang.c:1216 gcc/lto/ChangeLog 2008-10-23 Simon Baldwin * lto-lang.c: (input_node): Save the node reference, rather than the node pointer, in node->inlined_to. (input_cgraph_1): Convert node references into node pointers. Index: gcc/lto/lto-lang.c =================================================================== --- gcc/lto/lto-lang.c (revision 141320) +++ gcc/lto/lto-lang.c (working copy) @@ -1185,10 +1185,10 @@ input_node (struct lto_file_decl_data* f node->global.estimated_stack_size = estimated_stack_size; node->global.stack_frame_offset = stack_frame_offset; node->global.insns = insns; - if (ref != LCC_NOT_FOUND) - node->global.inlined_to = VEC_index (cgraph_node_ptr, nodes, ref); - else - node->global.inlined_to = NULL; + + /* Store a reference for now, and fix up later to be a pointer. */ + node->global.inlined_to = (cgraph_node_ptr) ref; + node->global.estimated_growth = estimated_growth; node->global.inlined = inlined; } @@ -1302,7 +1302,7 @@ input_cgraph_1 (struct lto_file_decl_dat LTO_DEBUG_INDENT (tag); if (tag == LTO_cgraph_edge) - input_edge (ib, nodes); + input_edge (ib, nodes); else { node = input_node (file_data, ib, tag, nodes); @@ -1315,6 +1315,20 @@ input_cgraph_1 (struct lto_file_decl_dat tag = lto_input_uleb128 (ib); } + if (flag_ltrans) + { + for (node = cgraph_nodes; node; node = node->next) + { + const int ref = (int) node->global.inlined_to; + + /* Fixup inlined_to from reference to pointer. */ + if (ref != LCC_NOT_FOUND) + node->global.inlined_to = VEC_index (cgraph_node_ptr, nodes, ref); + else + node->global.inlined_to = NULL; + } + } + for (node = cgraph_nodes; node; node = node->next) { tree prevailing = lto_symtab_prevailing_decl (node->decl);