diff options
author | Richard Guenther <rguenther@suse.de> | 2009-10-05 14:05:54 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2009-10-05 14:05:54 +0000 |
commit | 1a735925e30877491ac12ca78612e4de29c4bf0f (patch) | |
tree | 666c7b939b006e039aeec82b1397690b52070e18 /gcc/lto-cgraph.c | |
parent | e9d85fa6a7fdd48c00c02b8ad915a75d3b025708 (diff) | |
download | gcc-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.c | 49 |
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); } |