aboutsummaryrefslogtreecommitdiff
path: root/gcc/lto
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2009-10-22 12:02:29 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2009-10-22 10:02:29 +0000
commitfb3f88cc0d34f3f03e81e2e6d0a7c2c56d87f13d (patch)
treedc0c5b1f5b9348db2afad23ab409cf18702d1173 /gcc/lto
parent34677bae651336700ad8a84f7218e080c435fafc (diff)
downloadgcc-fb3f88cc0d34f3f03e81e2e6d0a7c2c56d87f13d.zip
gcc-fb3f88cc0d34f3f03e81e2e6d0a7c2c56d87f13d.tar.gz
gcc-fb3f88cc0d34f3f03e81e2e6d0a7c2c56d87f13d.tar.bz2
ipa-cp.c (ipcp_write_summary, [...]): New functions.
* ipa-cp.c (ipcp_write_summary, ipcp_read_summary): New functions. (pass_ipa_cp): Register them. (ipcp_init_stage): Analyze all functions for whopr/lto. (ipcp_propagate_stage): Skip external calls. (ipcp_iterate_stage): Call ipa_update_after_lto_read if needed. * ipa-reference.c (write_node_summary_p): Fix thinko about availability. * cgraphunit.c (ipa_passes): When in lto, ne er produce new summaries; when in ltrans, skip executing of ipa passes since everything should've been done. * ipa-inline.c (cgraph_decide_inlining): Remove FIXMEs. (inline_generate_summary): Likewise. (inline_read_summary): New function. (inline_write_summary): New function. (pass_ipa_inline): Register new hooks. * ipa-prop.c: Inlcude lto-streamer.h (ipa_edge_args_vector): Update declaration. (ipa_count_arguments, ipa_compute_jump_functions, ipa_free_edge_args_substructures): Move ipa_edge_args_vector into ggc. (ipa_write_jump_function, ipa_read_jump_function, ipa_write_node_info, ipa_read_node_info): New static functions. (ipa_prop_write_jump_functions, ipa_prop_read_jump_functions): Update. (duplicate_array): Use xmalloc. (duplicate_ggc_array): New. (ipa_edge_duplication_hook): Use it. (ipa_update_after_lto_read): New function. * ipa-prop.h (ipa_prop_write_jump_functions, ipa_prop_read_jump_functions): Declare. (ipa_pass_through_data, ipa_ancestor_jf_data, ipa_member_ptr_cst, jump_func_value, ipa_member_ptr_cst, ipa_edge_args): Add GTY markers. (ipa_edge_args_vector): Move into GGC. (ipa_check_create_edge_args): Update. (ipa_update_after_lto_read): New. * passes.c (ipa_write_summaries_1): When in wpa, do not write summaries. (ipa_read_summaries): When in ltrans, so not read summaries. * lto-streamer.c (lto_get_section_name): Add LTO_section_jump_functions. * lto-streamer.h (LTO_section_jump_functions): New section. (produce_asm): Declare. * lto-cgraph.c (output_cgraph): Output edges in reverse order. * lto-streamer-out.c (produce_asm): Export. * lto-streamer-in.c: Include tree-pass.h (input_function): Free dominance info when done. (lto_read_body): Push ipa_inline in ltrans stage. * gengtype.c (open_base_files): Add ipa-prop.h into includes. * Makefile.in (GTFILES): Add ipa-prop.h * lto.c (lto_fixup_jump_functions): New function. (lto_fixup_decls): Use it. From-SVN: r153449
Diffstat (limited to 'gcc/lto')
-rw-r--r--gcc/lto/ChangeLog5
-rw-r--r--gcc/lto/lto.c49
2 files changed, 54 insertions, 0 deletions
diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog
index 938d32c..a53a8c0 100644
--- a/gcc/lto/ChangeLog
+++ b/gcc/lto/ChangeLog
@@ -1,3 +1,8 @@
+2009-10-22 Jan Hubicka <jh@suse.cz>
+
+ * lto.c (lto_fixup_jump_functions): New function.
+ (lto_fixup_decls): Use it.
+
2009-10-16 Richard Guenther <rguenther@suse.de>
PR lto/41715
diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c
index 2b674c1..a8ad9e3 100644
--- a/gcc/lto/lto.c
+++ b/gcc/lto/lto.c
@@ -1652,6 +1652,53 @@ free_decl (const void *p, void *data ATTRIBUTE_UNUSED)
return true;
}
+/* Fixup pointers in jump functions.
+ TODO: We need some generic solution that will allow tree pointers in
+ function summaries. */
+static void
+lto_fixup_jump_functions (lto_fixup_data_t * data)
+{
+ struct cgraph_node *node;
+ struct cgraph_edge *cs;
+
+ for (node = cgraph_nodes; node; node = node->next)
+ {
+ if (!node->analyzed)
+ continue;
+ for (cs = node->callees; cs; cs = cs->next_callee)
+ {
+ int i;
+ struct ipa_edge_args *args = IPA_EDGE_REF (cs);
+ for (i = 0; i < ipa_get_cs_argument_count (args); i++)
+ {
+ struct ipa_jump_func *jf = ipa_get_ith_jump_func (args, i);
+ switch (jf->type)
+ {
+ case IPA_JF_UNKNOWN:
+ break;
+ case IPA_JF_CONST:
+ walk_tree (&jf->value.constant, lto_fixup_tree, data, NULL);
+ break;
+ case IPA_JF_PASS_THROUGH:
+ walk_tree (&jf->value.pass_through.operand, lto_fixup_tree,
+ data, NULL);
+ break;
+ case IPA_JF_ANCESTOR:
+ walk_tree (&jf->value.ancestor.type, lto_fixup_tree, data,
+ NULL);
+ break;
+ case IPA_JF_CONST_MEMBER_PTR:
+ walk_tree (&jf->value.member_cst.pfn, lto_fixup_tree, data,
+ NULL);
+ walk_tree (&jf->value.member_cst.delta, lto_fixup_tree,
+ data, NULL);
+ break;
+ }
+ }
+ }
+ }
+}
+
/* Fix the decls from all FILES. Replaces each decl with the corresponding
prevailing one. */
@@ -1682,6 +1729,8 @@ lto_fixup_decls (struct lto_file_decl_data **files)
if (decl != saved_decl)
VEC_replace (tree, lto_global_var_decls, i, decl);
}
+ if (ipa_edge_args_vector)
+ lto_fixup_jump_functions (&data);
pointer_set_traverse (free_list, free_decl, NULL);
pointer_set_destroy (free_list);