aboutsummaryrefslogtreecommitdiff
path: root/gcc/lto-cgraph.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2009-10-05 14:05:54 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2009-10-05 14:05:54 +0000
commit1a735925e30877491ac12ca78612e4de29c4bf0f (patch)
tree666c7b939b006e039aeec82b1397690b52070e18 /gcc/lto-cgraph.c
parente9d85fa6a7fdd48c00c02b8ad915a75d3b025708 (diff)
downloadgcc-1a735925e30877491ac12ca78612e4de29c4bf0f.zip
gcc-1a735925e30877491ac12ca78612e4de29c4bf0f.tar.gz
gcc-1a735925e30877491ac12ca78612e4de29c4bf0f.tar.bz2
re PR lto/41552 (Undefined references with -flto, dependent on object file ordering)
2009-10-05 Richard Guenther <rguenther@suse.de> PR lto/41552 PR lto/41487 * lto-symtab.c (struct lto_symtab_base_def): Remove. (struct lto_symtab_identifier_def): Likewise. (struct lto_symtab_decl_def): Likewise. (struct lto_symtab_entry_def): New. (lto_symtab_identifier_t): Rename to ... (lto_symtab_entry_t): ... this. (lto_symtab_decls): Remove. (lto_symtab_base_hash): Rename to ... (lto_symtab_entry_hash): ... this. (lto_symtab_base_eq): Rename to ... (lto_symtab_entry_eq): ... this. (lto_symtab_base_marked_p): Rename to ... (lto_symtab_entry_marked_p): ... this. (lto_symtab_identifier_marked_p): Remove. (lto_symtab_decl_marked_p): Likewise. (lto_symtab_maybe_init_hash_tables): Rename to ... (lto_symtab_maybe_init_hash_table): ... this. (lto_symtab_set_resolution_and_file_data): Remove. (lto_symtab_register_decl): New function. (lto_symtab_get_identifier): Remove. (lto_symtab_get): New function. (lto_symtab_get_resolution): Adjust. (lto_symtab_get_identifier_decl): Remove. (lto_symtab_set_identifier_decl): Likewise. (lto_symtab_merge_decl): Rename to ... (lto_symtab_merge): ... this. Rewrite. (lto_symtab_merge_var): Remove. (lto_symtab_merge_fn): Likewise. (lto_symtab_prevailing_decl): Adjust. (lto_cgraph_replace_node): New function. (lto_symtab_merge_decls_2): Likewise. (lto_symtab_merge_decls_1): Likewise. (lto_symtab_fixup_var_decls): Likewise. (lto_symtab_resolve_symbols): Likewise. (lto_symtab_merge_decls): Likewise. (lto_symtab_prevailing_decl): Adjust. (lto_symtab_get_symtab_def): Remove. (lto_symtab_get_file_data): Likewise. (lto_symtab_clear_resolution): Adjust. (lto_symtab_clear_resolution): Likewise. * lto-cgraph.c (input_edge): Do not merge cgraph nodes here. (input_cgraph_1): Likewise. * lto-streamer-in.c (get_resolution): Do not provide fake symbol resolutions here. (deferred_global_decls): Remove. (lto_register_deferred_decls_in_symtab): Likewise. (lto_register_var_decl_in_symtab): Change signature, register variable via lto_symtab_register_decl. (lto_register_function_decl_in_symtab): Likewise. (lto_read_tree): Adjust. * lto-streamer.h (lto_register_deferred_decls_in_symtab): Remove. (lto_symtab_merge_var): Likewise. (lto_symtab_merge_fn): Likewise. (lto_symtab_register_decl): Declare. (lto_symtab_merge_decls): Likewise. lto/ * lto.c (lto_read_decls): Do not register deferred decls. (read_cgraph_and_symbols): Delay symbol and cgraph merging until after reading the IPA summaries. * g++.dg/lto/20091002-1_0.C: Adjust flags. * g++.dg/lto/20091004-1_0.C: New testcase. * g++.dg/lto/20091004-1_1.C: Likewise. * g++.dg/lto/20091004-2_0.C: Likewise. * g++.dg/lto/20091004-2_1.C: Likewise. * g++.dg/lto/20091004-3_0.C: Likewise. * g++.dg/lto/20091004-3_1.C: Likewise. From-SVN: r152450
Diffstat (limited to 'gcc/lto-cgraph.c')
-rw-r--r--gcc/lto-cgraph.c49
1 files changed, 3 insertions, 46 deletions
diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c
index b11483c..47ccccd 100644
--- a/gcc/lto-cgraph.c
+++ b/gcc/lto-cgraph.c
@@ -527,8 +527,6 @@ input_edge (struct lto_input_block *ib, VEC(cgraph_node_ptr, heap) *nodes)
unsigned int nest;
cgraph_inline_failed_t inline_failed;
struct bitpack_d *bp;
- tree prevailing_callee;
- tree prevailing_caller;
enum ld_plugin_symbol_resolution caller_resolution;
caller = VEC_index (cgraph_node_ptr, nodes, lto_input_sleb128 (ib));
@@ -539,8 +537,6 @@ input_edge (struct lto_input_block *ib, VEC(cgraph_node_ptr, heap) *nodes)
if (callee == NULL || callee->decl == NULL_TREE)
internal_error ("bytecode stream: no callee found while reading edge");
- caller_resolution = lto_symtab_get_resolution (caller->decl);
-
count = (gcov_type) lto_input_sleb128 (ib);
bp = lto_input_bitpack (ib);
@@ -550,37 +546,13 @@ input_edge (struct lto_input_block *ib, VEC(cgraph_node_ptr, heap) *nodes)
freq = (int) bp_unpack_value (bp, HOST_BITS_PER_INT);
nest = (unsigned) bp_unpack_value (bp, 30);
- /* If the caller was preempted, don't create the edge. */
+ /* If the caller was preempted, don't create the edge.
+ ??? Should we ever have edges from a preempted caller? */
+ caller_resolution = lto_symtab_get_resolution (caller->decl);
if (caller_resolution == LDPR_PREEMPTED_REG
|| caller_resolution == LDPR_PREEMPTED_IR)
return;
- prevailing_callee = lto_symtab_prevailing_decl (callee->decl);
-
- /* Make sure the caller is the prevailing decl. */
- prevailing_caller = lto_symtab_prevailing_decl (caller->decl);
-
- if (prevailing_callee != callee->decl)
- {
- struct lto_file_decl_data *file_data;
-
- /* We cannot replace a clone! */
- gcc_assert (callee == cgraph_node (callee->decl));
-
- callee = cgraph_node (prevailing_callee);
- gcc_assert (callee);
-
- /* If LGEN (cc1 or cc1plus) had nothing to do with the node, it
- might not have created it. In this case, we just created a
- new node in the above call to cgraph_node. Mark the file it
- came from. */
- file_data = lto_symtab_get_file_data (prevailing_callee);
- if (callee->local.lto_file_data)
- gcc_assert (callee->local.lto_file_data == file_data);
- else
- callee->local.lto_file_data = file_data;
- }
-
edge = cgraph_create_edge (caller, callee, NULL, count, freq, nest);
edge->lto_stmt_uid = stmt_id;
edge->inline_failed = inline_failed;
@@ -630,21 +602,6 @@ input_cgraph_1 (struct lto_file_decl_data *file_data,
node->global.inlined_to = NULL;
}
- for (i = 0; VEC_iterate (cgraph_node_ptr, nodes, i, node); i++)
- {
- tree prevailing = lto_symtab_prevailing_decl (node->decl);
-
- if (prevailing != node->decl)
- {
- cgraph_remove_node (node);
- VEC_replace (cgraph_node_ptr, nodes, i, NULL);
- }
- }
-
- for (i = 0; VEC_iterate (cgraph_node_ptr, nodes, i, node); i++)
- if (node && cgraph_decide_is_function_needed (node, node->decl))
- cgraph_mark_needed_node (node);
-
VEC_free (cgraph_node_ptr, heap, nodes);
}