From 1a735925e30877491ac12ca78612e4de29c4bf0f Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Mon, 5 Oct 2009 14:05:54 +0000 Subject: re PR lto/41552 (Undefined references with -flto, dependent on object file ordering) 2009-10-05 Richard Guenther 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 --- gcc/lto-streamer-in.c | 102 +++++++++----------------------------------------- 1 file changed, 18 insertions(+), 84 deletions(-) (limited to 'gcc/lto-streamer-in.c') diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c index a8d2379..175a1e7 100644 --- a/gcc/lto-streamer-in.c +++ b/gcc/lto-streamer-in.c @@ -1347,44 +1347,8 @@ get_resolution (struct data_in *data_in, unsigned index) return ret; } else - { - /* Fake symbol resolution if no resolution file was provided. */ - tree t = lto_streamer_cache_get (data_in->reader_cache, index); - - gcc_assert (TREE_PUBLIC (t)); - - /* There should be no DECL_ABSTRACT in the middle end. */ - gcc_assert (!DECL_ABSTRACT (t)); - - /* If T is a weak definition, we select the first one we see to - be the prevailing definition. */ - if (DECL_WEAK (t)) - { - tree prevailing_decl; - if (DECL_EXTERNAL (t)) - return LDPR_RESOLVED_IR; - - /* If this is the first time we see T, it won't have a - prevailing definition yet. */ - prevailing_decl = lto_symtab_prevailing_decl (t); - if (prevailing_decl == t - || prevailing_decl == NULL_TREE - || DECL_EXTERNAL (prevailing_decl)) - return LDPR_PREVAILING_DEF; - else - return LDPR_PREEMPTED_IR; - } - else - { - /* For non-weak definitions, extern declarations are assumed - to be resolved elsewhere (LDPR_RESOLVED_IR), otherwise T - is a prevailing definition. */ - if (DECL_EXTERNAL (t)) - return LDPR_RESOLVED_IR; - else - return LDPR_PREVAILING_DEF; - } - } + /* Delay resolution finding until decl merging. */ + return LDPR_UNKNOWN; } @@ -2243,55 +2207,13 @@ lto_input_tree_pointers (struct lto_input_block *ib, struct data_in *data_in, } } -static VEC(tree, heap) *deferred_global_decls; - -/* Register the queued global decls with the symtab. DATA_IN contains - tables and descriptors for the file being read.*/ - -void -lto_register_deferred_decls_in_symtab (struct data_in *data_in) -{ - unsigned i; - tree decl; - - for (i = 0; VEC_iterate (tree, deferred_global_decls, i, decl); ++i) - { - enum ld_plugin_symbol_resolution resolution; - int ix; - - if (!lto_streamer_cache_lookup (data_in->reader_cache, decl, &ix)) - gcc_unreachable (); - - /* Register and adjust the decls type. */ - TREE_TYPE (decl) = gimple_register_type (TREE_TYPE (decl)); - - if (TREE_CODE (decl) == VAR_DECL) - { - gcc_assert (TREE_PUBLIC (decl)); - resolution = get_resolution (data_in, ix); - lto_symtab_merge_var (decl, resolution); - } - else if (TREE_CODE (decl) == FUNCTION_DECL) - { - gcc_assert (TREE_PUBLIC (decl) && !DECL_ABSTRACT (decl)); - resolution = get_resolution (data_in, ix); - lto_symtab_merge_fn (decl, resolution, data_in->file_data); - } - else - gcc_unreachable (); - } - - VEC_free (tree, heap, deferred_global_decls); - deferred_global_decls = NULL; -} - /* Register DECL with the global symbol table and change its name if necessary to avoid name clashes for static globals across different files. */ static void -lto_register_var_decl_in_symtab (tree decl) +lto_register_var_decl_in_symtab (struct data_in *data_in, tree decl) { /* Register symbols with file or global scope to mark what input file has their definition. */ @@ -2319,7 +2241,13 @@ lto_register_var_decl_in_symtab (tree decl) /* If this variable has already been declared, queue the declaration for merging. */ if (TREE_PUBLIC (decl)) - VEC_safe_push (tree, heap, deferred_global_decls, decl); + { + int ix; + if (!lto_streamer_cache_lookup (data_in->reader_cache, decl, &ix)) + gcc_unreachable (); + lto_symtab_register_decl (decl, get_resolution (data_in, ix), + data_in->file_data); + } } @@ -2380,7 +2308,13 @@ lto_register_function_decl_in_symtab (struct data_in *data_in, tree decl) /* If this variable has already been declared, queue the declaration for merging. */ if (TREE_PUBLIC (decl) && !DECL_ABSTRACT (decl)) - VEC_safe_push (tree, heap, deferred_global_decls, decl); + { + int ix; + if (!lto_streamer_cache_lookup (data_in->reader_cache, decl, &ix)) + gcc_unreachable (); + lto_symtab_register_decl (decl, get_resolution (data_in, ix), + data_in->file_data); + } } @@ -2481,7 +2415,7 @@ lto_read_tree (struct lto_input_block *ib, struct data_in *data_in, gcc_assert (!lto_stream_as_builtin_p (result)); if (TREE_CODE (result) == VAR_DECL) - lto_register_var_decl_in_symtab (result); + lto_register_var_decl_in_symtab (data_in, result); else if (TREE_CODE (result) == FUNCTION_DECL && !DECL_BUILT_IN (result)) lto_register_function_decl_in_symtab (data_in, result); -- cgit v1.1