diff options
author | Jan Hubicka <jh@suse.cz> | 2010-04-29 09:10:38 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2010-04-29 07:10:38 +0000 |
commit | 2942c502ee147819b7e57dca78f7a2cf4831279f (patch) | |
tree | 517f6bc2231e5c3e319637f9c9277e4cc2e99ffb /gcc/lto-streamer-out.c | |
parent | 74ca33936f5a1c543a71033f32d59b8d2e0957a4 (diff) | |
download | gcc-2942c502ee147819b7e57dca78f7a2cf4831279f.zip gcc-2942c502ee147819b7e57dca78f7a2cf4831279f.tar.gz gcc-2942c502ee147819b7e57dca78f7a2cf4831279f.tar.bz2 |
* lto-symtab.c (lto_symtab_entry_def) Add vnode.
(lto_varpool_replace_node): New.
(lto_symtab_resolve_symbols): Resolve varpool nodes.
(lto_symtab_merge_decls_1): Prefer decls with varpool node.
(lto_symtab_merge_cgraph_nodes_1): Merge varpools.
* cgraph.h (varpool_node_ptr): New type.
(varpool_node_ptr): New vector.
(varpool_node_set_def): New structure.
(varpool_node_set): New type.
(varpool_node_set): New vector.
(varpool_node_set_element_def): New structure.
(varpool_node_set_element, const_varpool_node_set_element): New types.
(varpool_node_set_iterator): New type.
(varpool_node): Add prev pointers, add used_from_other_partition,
in_other_partition.
(varpool_node_set_new, varpool_node_set_find, varpool_node_set_add,
varpool_node_set_remove, dump_varpool_node_set, debug_varpool_node_set,
varpool_get_node, varpool_remove_node): Declare.
(vsi_end_p, vsi_next, vsi_node, vsi_start, varpool_node_in_set_p,
varpool_node_set_size): New inlines.
* cgraph.c (dump_cgraph_node): Dump asm names of aliases.
* tree-pass.h (varpool_node_set_def): Forward declare.
(ipa_opt_pass_d): Summary writting takes vnode sets too.
(ipa_write_optimization_summaries): Update prototype.
* ipa-cp.c (ipcp_write_summary): Update.
* ipa-reference.c (ipa_reference_write_summary): Update.
* lto-cgraph.c (lto_output_varpool_node): New static function.
(output_varpool): New function.
(input_varpool_node): New static function.
(input_varpool_1): New function.
(input_cgraph): Input varpool.
* ipa-pure-const.c (pure_const_write_summary): Update.
* lto-streamer-out.c (lto_output): Update, output varpool too.
(write_global_stream): Kill WPA hack.
(produce_asm_for_decls): Update.
(output_alias_pair_p): Handle variables.
(output_unreferenced_globals): Output only needed partition of varpool.
* ipa-inline.c (inline_write_summary): Update.
* lto-streamer-in.c (lto_input_tree_ref, lto_input_tree): Do not build cgraph.
* lto-section-in.c (lto_section_name): Add varpool and jump funcs.
* ipa.c (hash_varpool_node_set_element, eq_varpool_node_set_element,
varpool_node_set_new, varpool_node_set_add,
varpool_node_set_remove, varpool_node_set_find, dump_varpool_node_set,
debug_varpool_node_set): New functions.
* passes.c (rest_of_decl_compilation): when in LTO do not finalize.
(execute_one_pass): Process new decls too.
(ipa_write_summaries_2): Pass around vsets.
(ipa_write_summaries_1): Likewise.
(ipa_write_summaries): Build vset; be more selective about cgraph nodes
to add.
(ipa_write_optimization_summaries_1): Pass around vsets.
(ipa_write_optimization_summaries): Likewise.
* varpool.c (varpool_get_node): New.
(varpool_node): Update doubly linked lists.
(varpool_remove_node): New.
(dump_varpool_node): More dumping.
(varpool_enqueue_needed_node): Update doubly linked lists.
(decide_is_variable_needed): Kill ltrans hack.
(varpool_finalize_decl): Kill lto hack.
(varpool_assemble_decl): Skip decls in other partitions.
(varpool_assemble_pending_decls): Update doubly linkes lists.
(varpool_empty_needed_queue): Likewise.
(varpool_extra_name_alias): Likewise.
* lto-streamer.c (lto_get_section_name): Add vars section.
* lto-streamer.h (lto_section_type): Update.
(output_varpool, input_varpool): Declare.
* lto.c (lto_varpool_node_sets): New.
(lto_1_to_1_map): Partition varpool too.
(globalize_context_t, globalize_cross_file_statics,
lto_scan_statics_in_ref_table, lto_scan_statics_in_cgraph_node,
lto_scan_statics_in_remaining_global_vars): Remove.
(lto_promote_cross_file_statics): Rewrite.
(get_filename_for_set): Take vset argument.
(lto_wpa_write_files): Pass around vsets.
From-SVN: r158854
Diffstat (limited to 'gcc/lto-streamer-out.c')
-rw-r--r-- | gcc/lto-streamer-out.c | 81 |
1 files changed, 24 insertions, 57 deletions
diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c index 99a7da1..0c8544c 100644 --- a/gcc/lto-streamer-out.c +++ b/gcc/lto-streamer-out.c @@ -1930,22 +1930,14 @@ output_function (struct cgraph_node *node) the file processed by LTRANS. */ static bool -output_alias_pair_p (alias_pair *p, cgraph_node_set set) +output_alias_pair_p (alias_pair *p, cgraph_node_set set, varpool_node_set vset) { - cgraph_node_set_iterator csi; - struct cgraph_node *target_node; - - /* Always emit VAR_DECLs. FIXME lto, we should probably only emit - those VAR_DECLs that are instantiated in this file partition, but - we have no easy way of knowing this based on SET. */ if (TREE_CODE (p->decl) == VAR_DECL) - return true; + return varpool_node_in_set_p (varpool_node_for_asm (p->target), vset); /* Check if the assembler name for P->TARGET has its cgraph node in SET. */ gcc_assert (TREE_CODE (p->decl) == FUNCTION_DECL); - target_node = cgraph_node_for_asm (p->target); - csi = cgraph_node_set_find (set, target_node); - return (!csi_end_p (csi)); + return cgraph_node_in_set_p (cgraph_node_for_asm (p->target), set); } @@ -1953,7 +1945,7 @@ output_alias_pair_p (alias_pair *p, cgraph_node_set set) and labels. */ static void -output_unreferenced_globals (cgraph_node_set set) +output_unreferenced_globals (cgraph_node_set set, varpool_node_set vset) { struct output_block *ob; alias_pair *p; @@ -1974,40 +1966,28 @@ output_unreferenced_globals (cgraph_node_set set) symbols at link time if a file defines a global symbol but never references it. */ FOR_EACH_STATIC_VARIABLE (vnode) - { - tree var = vnode->decl; - - if (TREE_CODE (var) == VAR_DECL) - { - struct varpool_node *alias; - - /* Output the object in order to output references used in the - initialization. */ - lto_output_tree (ob, var, true); - - /* If it is public we also need a reference to the object itself. */ - if (TREE_PUBLIC (var)) - lto_output_tree_ref (ob, var); - - /* Also output any extra_name aliases for this variable. */ - for (alias = vnode->extra_name; alias; alias = alias->next) - { - lto_output_tree (ob, alias->decl, true); - output_record_start (ob, LTO_var_decl_alias); - lto_output_var_decl_index (ob->decl_state, ob->main_stream, - alias->decl); - lto_output_var_decl_index (ob->decl_state, ob->main_stream, - var); - } - } - } + if (vnode->needed && varpool_node_in_set_p (vnode, vset)) + { + tree var = vnode->decl; + + if (TREE_CODE (var) == VAR_DECL) + { + /* Output the object in order to output references used in the + initialization. */ + lto_output_tree (ob, var, true); + + /* If it is public we also need a reference to the object itself. */ + if (TREE_PUBLIC (var)) + lto_output_tree_ref (ob, var); + } + } output_zero (ob); /* Emit the alias pairs for the nodes in SET. */ for (i = 0; VEC_iterate (alias_pair, alias_pairs, i, p); i++) { - if (output_alias_pair_p (p, set)) + if (output_alias_pair_p (p, set, vset)) { lto_output_tree_ref (ob, p->decl); lto_output_tree_ref (ob, p->target); @@ -2091,7 +2071,7 @@ lto_writer_init (void) /* Main entry point from the pass manager. */ static void -lto_output (cgraph_node_set set) +lto_output (cgraph_node_set set, varpool_node_set vset) { struct cgraph_node *node; struct lto_out_decl_state *decl_state; @@ -2124,6 +2104,7 @@ lto_output (cgraph_node_set set) have been renumbered so that edges can be associated with call statements using the statement UIDs. */ output_cgraph (set); + output_varpool (vset); lto_bitmap_free (output); } @@ -2178,20 +2159,6 @@ write_global_stream (struct output_block *ob, t = lto_tree_ref_encoder_get_tree (encoder, index); if (!lto_streamer_cache_lookup (ob->writer_cache, t, NULL)) lto_output_tree (ob, t, false); - - if (flag_wpa) - { - /* In WPA we should not emit multiple definitions of the - same symbol to all the files in the link set. If - T had already been emitted as the pervailing definition - in one file, do not emit it in the others. */ - /* FIXME lto. We should check if T belongs to the - file we are writing to. */ - if (TREE_CODE (t) == VAR_DECL - && TREE_PUBLIC (t) - && !DECL_EXTERNAL (t)) - TREE_ASM_WRITTEN (t) = 1; - } } } @@ -2444,7 +2411,7 @@ produce_symtab (struct lto_streamer_cache_d *cache) recover these on other side. */ static void -produce_asm_for_decls (cgraph_node_set set) +produce_asm_for_decls (cgraph_node_set set, varpool_node_set vset) { struct lto_out_decl_state *out_state; struct lto_out_decl_state *fn_out_state; @@ -2462,7 +2429,7 @@ produce_asm_for_decls (cgraph_node_set set) /* Write out unreferenced globals, alias pairs and labels. We defer doing this until now so that we can write out only what is needed. */ - output_unreferenced_globals (set); + output_unreferenced_globals (set, vset); memset (&header, 0, sizeof (struct lto_decl_header)); |