diff options
author | Jan Hubicka <jh@suse.cz> | 2009-10-22 12:02:29 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2009-10-22 10:02:29 +0000 |
commit | fb3f88cc0d34f3f03e81e2e6d0a7c2c56d87f13d (patch) | |
tree | dc0c5b1f5b9348db2afad23ab409cf18702d1173 /gcc/lto/lto.c | |
parent | 34677bae651336700ad8a84f7218e080c435fafc (diff) | |
download | gcc-fb3f88cc0d34f3f03e81e2e6d0a7c2c56d87f13d.tar.gz |
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/lto.c')
-rw-r--r-- | gcc/lto/lto.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c index 2b674c176ac..a8ad9e369b9 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); |