diff options
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/lto-streamer.h | 8 | ||||
-rw-r--r-- | gcc/lto-symtab.c | 34 | ||||
-rw-r--r-- | gcc/lto/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/lto/lto.c | 37 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 |
6 files changed, 52 insertions, 46 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b44a1fe5c92..74b3f0ea217 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2012-10-06 Jan Hubicka <jh@suse.cz> + + PR lto/54790 + * lto-streamer.h (lto_symtab_register_decl, lto_symtab_get_resolution, + lto_mark_nothrow_fndecl, lto_fixup_nothrow_decls): Remove. + * lto-symtab.c (lto_symtab_register_decl): Remove. + 2012-10-06 Andreas Schwab <schwab@linux-m68k.org> PR rtl-optimization/54739 diff --git a/gcc/lto-streamer.h b/gcc/lto-streamer.h index 059959e737f..6625b741beb 100644 --- a/gcc/lto-streamer.h +++ b/gcc/lto-streamer.h @@ -860,12 +860,9 @@ lto_symtab_encoder_t compute_ltrans_boundary (lto_symtab_encoder_t encoder); /* In lto-symtab.c. */ -extern void lto_symtab_register_decl (tree, ld_plugin_symbol_resolution_t, - struct lto_file_decl_data *); extern void lto_symtab_merge_decls (void); extern void lto_symtab_merge_cgraph_nodes (void); extern tree lto_symtab_prevailing_decl (tree decl); -extern enum ld_plugin_symbol_resolution lto_symtab_get_resolution (tree decl); extern GTY(()) VEC(tree,gc) *lto_global_var_decls; @@ -873,11 +870,6 @@ extern GTY(()) VEC(tree,gc) *lto_global_var_decls; extern void lto_write_options (void); -/* In lto-wpa-fixup.c */ -void lto_mark_nothrow_fndecl (tree); -void lto_fixup_nothrow_decls (void); - - /* Statistics gathered during LTO, WPA and LTRANS. */ extern struct lto_stats_d lto_stats; diff --git a/gcc/lto-symtab.c b/gcc/lto-symtab.c index cd8ca67b0c0..25c0b22dc48 100644 --- a/gcc/lto-symtab.c +++ b/gcc/lto-symtab.c @@ -32,40 +32,6 @@ along with GCC; see the file COPYING3. If not see /* Vector to keep track of external variables we've seen so far. */ VEC(tree,gc) *lto_global_var_decls; -/* Registers DECL with the LTO symbol table as having resolution RESOLUTION - and read from FILE_DATA. */ - -void -lto_symtab_register_decl (tree decl, - ld_plugin_symbol_resolution_t resolution, - struct lto_file_decl_data *file_data) -{ - symtab_node node; - - /* Check that declarations reaching this function do not have - properties inconsistent with having external linkage. If any of - these asertions fail, then the object file reader has failed to - detect these cases and issue appropriate error messages. */ - gcc_assert (decl - && TREE_PUBLIC (decl) - && (TREE_CODE (decl) == VAR_DECL - || TREE_CODE (decl) == FUNCTION_DECL) - && DECL_ASSEMBLER_NAME_SET_P (decl)); - if (TREE_CODE (decl) == VAR_DECL - && DECL_INITIAL (decl)) - gcc_assert (!DECL_EXTERNAL (decl) - || (TREE_STATIC (decl) && TREE_READONLY (decl))); - if (TREE_CODE (decl) == FUNCTION_DECL) - gcc_assert (!DECL_ABSTRACT (decl)); - - node = symtab_get_node (decl); - if (node) - { - node->symbol.resolution = resolution; - gcc_assert (node->symbol.lto_file_data == file_data); - } -} - /* Replace the cgraph node NODE with PREVAILING_NODE in the cgraph, merging all edges and removing the old node. */ diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index 7c437d6c9e5..86acc2417d2 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,11 @@ +2012-10-06 Jan Hubicka <jh@suse.cz> + + PR lto/54790 + * lto.c (resolution_map): New static var. + (register_resolution): New function. + (lto_register_var_decl_in_symtab): Use it. + (read_cgraph_and_symbols): Copy resolutions into the symtab. + 2012-09-20 Martin Jambor <mjambor@suse.cz> * lto.c (lto_materialize_function): Call push_struct_function and diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c index 44718537b3c..c6b882d6941 100644 --- a/gcc/lto/lto.c +++ b/gcc/lto/lto.c @@ -1692,6 +1692,19 @@ get_resolution (struct data_in *data_in, unsigned index) return LDPR_UNKNOWN; } +/* Map assigning declarations their resolutions. */ +static pointer_map_t *resolution_map; + +/* We need to record resolutions until symbol table is read. */ +static void +register_resolution (tree decl, enum ld_plugin_symbol_resolution resolution) +{ + if (resolution == LDPR_UNKNOWN) + return; + if (!resolution_map) + resolution_map = pointer_map_create (); + *pointer_map_insert (resolution_map, decl) = (void *)(size_t)resolution; +} /* Register DECL with the global symbol table and change its name if necessary to avoid name clashes for static globals across @@ -1730,8 +1743,7 @@ lto_register_var_decl_in_symtab (struct data_in *data_in, tree decl) unsigned ix; if (!streamer_tree_cache_lookup (data_in->reader_cache, decl, &ix)) gcc_unreachable (); - lto_symtab_register_decl (decl, get_resolution (data_in, ix), - data_in->file_data); + register_resolution (decl, get_resolution (data_in, ix)); } } @@ -1789,8 +1801,7 @@ lto_register_function_decl_in_symtab (struct data_in *data_in, tree decl) unsigned ix; if (!streamer_tree_cache_lookup (data_in->reader_cache, decl, &ix)) gcc_unreachable (); - lto_symtab_register_decl (decl, get_resolution (data_in, ix), - data_in->file_data); + register_resolution (decl, get_resolution (data_in, ix)); } } @@ -2946,6 +2957,24 @@ read_cgraph_and_symbols (unsigned nfiles, const char **fnames) timevar_push (TV_IPA_LTO_CGRAPH_IO); /* Read the symtab. */ input_symtab (); + + /* Store resolutions into the symbol table. */ + if (resolution_map) + { + void **res; + symtab_node snode; + + FOR_EACH_SYMBOL (snode) + if (symtab_real_symbol_p (snode) + && (res = pointer_map_contains (resolution_map, + snode->symbol.decl))) + snode->symbol.resolution + = (enum ld_plugin_symbol_resolution)(size_t)*res; + + pointer_map_destroy (resolution_map); + resolution_map = NULL; + } + timevar_pop (TV_IPA_LTO_CGRAPH_IO); if (!quiet_flag) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 57580b571b8..793549bb297 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2012-10-06 Jan Hubicka <jh@suse.cz> + + * gcc.dg/lto/resolutions_0.c: New testcase. + 2012-10-06 Janus Weil <janus@gcc.gnu.org> PR fortran/45521 |