aboutsummaryrefslogtreecommitdiff
path: root/gcc/lto
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2011-06-11 15:01:53 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2011-06-11 13:01:53 +0000
commit39e2db00dad38d188a235308d53a2963925bdd85 (patch)
treec6e4afcefa6681889da1ab377bb53466f789c2ff /gcc/lto
parentc44ddf96154254b489122754237ecde53cdf7987 (diff)
downloadgcc-39e2db00dad38d188a235308d53a2963925bdd85.zip
gcc-39e2db00dad38d188a235308d53a2963925bdd85.tar.gz
gcc-39e2db00dad38d188a235308d53a2963925bdd85.tar.bz2
lto-symtab.c (lto_cgraph_replace_node): Kill same body alias code.
* lto-symtab.c (lto_cgraph_replace_node): Kill same body alias code. (lto_symtab_resolve_can_prevail_p): Likewise. (lto_symtab_merge_cgraph_nodes): Update merging of aliases. * cgraph.c (same_body_aliases_done): New global var. (cgraph_same_body_alias_1): Rename to ... (cgraph_create_function_alias): ... this one; reorg to new representation. (cgraph_same_body_alias): Use cgraph_create_function_alias; record references when asked to. (cgraph_add_thunk): Fix formating. (cgraph_get_node): Kill same body alias code. (cgraph_node_for_asm): Likewise. (cgraph_remove_same_body_alias): Remove. (cgraph_remove_node): Kill same body alias code. (cgraph_mark_address_taken_node): Mark also the aliased function as having address taken. (dump_cgraph_node): Dump same body aliases. (cgraph_for_node_thunks_and_aliases): Update for new alias representation. (cgraph_for_node_and_aliases): Likewise. * cgraph.h (same_body): Kll pointer. (same_body_alias): Update comment. (same_body_aliases_done): Declare. (cgraph_remove_same_body_alias): Remove declaration. (cgraph_create_function_alias): Declare. (cgraph_process_same_body_aliases): Declare. (cgraph_function_with_gimple_body_p): Check for alias. (cgraph_can_remove_if_no_direct_calls_p): Look for aliases. (cgraph_alias_aliased_node): New function. (cgraph_function_node): Update for new aliases. (cgraph_function_or_thunk_node): Likewise. * ipa-inline-transform.c (can_remove_node_now_p): Look for aliases. (inline_call): Remove dead aliases. * cgraphunit.c (cgraph_decide_is_function_needed): Disable assembler name hack for same body aliases. (clone_of_p): Look through aliases. (verify_cgraph_node): Verify aliases. (cgraph_analyze_function): Analyze aliases; fixup C++ bugs. (cgraph_process_same_body_aliases): New function. (process_function_and_variable_attributes): Disable weakref warning on alias. (cgraph_analyze_functions): Handle aliases. (cgraph_mark_functions_to_output): Handle aliases same way as thunks. (assemble_thunks): Rename to ... (assemble_thunks_and_aliases): ... this one; handle aliases, too. (cgraph_expand_function): Remove alias output code. (cgraph_output_in_order): Skip aliases. (cgraph_preserve_function_body_p): Aliases don't need preserving. * ipa-ref.c (ipa_ref_use_name): Add alias reference. (ipa_record_reference): Do not assert on alias references. (ipa_ref_has_aliases_p): New function. * ipa-ref.h (enum ipa_ref_use): Add IPA_REF_ALIAS. (ipa_ref_has_aliases_p): Declare. * lto-cgraph.c (lto_output_node): Handle aliases. (input_node): Likewise. * lto-streamer-out.c (lto_output): Skip aliases. (produce_symtab): Kill same_body_alias code. * ipa-utils.c (ipa_reverse_postorder): Add FIXME. (ipa_reverse_postorder): Use cgraph_only_called_directly_or_aliased_p. * ipa-inline.c (update_caller_keys): Walk aliases. (inline_small_functions): Fix thinko in previous patch. * ipa.c (cgraph_externally_visible_p): Do not walk aliases. (function_and_variable_visibility): Do not walk same body aliases. * tree-ssa-structalias.c (associate_varinfo_to_alias): New function. (ipa_pta_execute): Use it. * lto.c (add_cgraph_node_to_partition_1): Break out from ... (add_cgraph_node_to_partition) ... here; walk aliases. (lto_1_to_1_map): Remove same body alias code. (promote_fn): Likewise. (lto_promote_cross_file_statics): Update comment. * decl2.c (cp_write_global_declarations): Process aliases; look trhough same body aliases. From-SVN: r174952
Diffstat (limited to 'gcc/lto')
-rw-r--r--gcc/lto/ChangeLog9
-rw-r--r--gcc/lto/lto.c76
2 files changed, 51 insertions, 34 deletions
diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog
index 44265df..9956d79 100644
--- a/gcc/lto/ChangeLog
+++ b/gcc/lto/ChangeLog
@@ -1,3 +1,12 @@
+2011-06-11 Jan Hubicka <jh@suse.cz>
+
+ * lto.c (add_cgraph_node_to_partition_1): Break out from ...
+ (add_cgraph_node_to_partition) ... here; walk aliases.
+ (lto_1_to_1_map): Remove same body alias code.
+ (promote_fn): Likewise.
+ (lto_promote_cross_file_statics): Update comment.
+
+
2011-06-07 Diego Novillo <dnovillo@google.com>
* lto.c (uniquify_nodes): Move code to register decls to
diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c
index 6e49ee7..f13ee0e 100644
--- a/gcc/lto/lto.c
+++ b/gcc/lto/lto.c
@@ -1319,7 +1319,7 @@ add_references_to_partition (ltrans_partition part, struct ipa_ref_list *refs)
for (i = 0; ipa_ref_list_reference_iterate (refs, i, ref); i++)
{
if (ref->refered_type == IPA_REF_CGRAPH
- && DECL_COMDAT (ipa_ref_node (ref)->decl)
+ && DECL_COMDAT (cgraph_function_node (ipa_ref_node (ref), NULL)->decl)
&& !cgraph_node_in_set_p (ipa_ref_node (ref), part->cgraph_set))
add_cgraph_node_to_partition (part, ipa_ref_node (ref));
else
@@ -1330,6 +1330,34 @@ add_references_to_partition (ltrans_partition part, struct ipa_ref_list *refs)
}
}
+/* Worker for add_cgraph_node_to_partition. */
+
+static bool
+add_cgraph_node_to_partition_1 (struct cgraph_node *node, void *data)
+{
+ ltrans_partition part = (ltrans_partition) data;
+
+ /* non-COMDAT aliases of COMDAT functions needs to be output just once. */
+ if (!DECL_COMDAT (node->decl)
+ && !node->global.inlined_to
+ && node->aux)
+ {
+ gcc_assert (node->thunk.thunk_p || node->alias);
+ return false;
+ }
+
+ if (node->aux)
+ {
+ node->in_other_partition = 1;
+ if (cgraph_dump_file)
+ fprintf (cgraph_dump_file, "Node %s/%i now used in multiple partitions\n",
+ cgraph_node_name (node), node->uid);
+ }
+ node->aux = (void *)((size_t)node->aux + 1);
+ cgraph_node_set_add (part->cgraph_set, node);
+ return false;
+}
+
/* Add NODE to partition as well as the inline callees and referred comdats into partition PART. */
static void
@@ -1337,42 +1365,34 @@ add_cgraph_node_to_partition (ltrans_partition part, struct cgraph_node *node)
{
struct cgraph_edge *e;
cgraph_node_set_iterator csi;
+ struct cgraph_node *n;
+
+ /* We always decide on functions, not associated thunks and aliases. */
+ node = cgraph_function_node (node, NULL);
/* If NODE is already there, we have nothing to do. */
csi = cgraph_node_set_find (part->cgraph_set, node);
if (!csi_end_p (csi))
return;
+ cgraph_for_node_thunks_and_aliases (node, add_cgraph_node_to_partition_1, part, true);
+
part->insns += inline_summary (node)->self_size;
- if (node->aux)
- {
- node->in_other_partition = 1;
- if (cgraph_dump_file)
- fprintf (cgraph_dump_file, "Node %s/%i now used in multiple partitions\n",
- cgraph_node_name (node), node->uid);
- }
- node->aux = (void *)((size_t)node->aux + 1);
cgraph_node_set_add (part->cgraph_set, node);
- /* Thunks always must go along with function they reffer to. */
- if (node->thunk.thunk_p)
- add_cgraph_node_to_partition (part, node->callees->callee);
- for (e = node->callers; e; e = e->next_caller)
- if (e->caller->thunk.thunk_p)
- add_cgraph_node_to_partition (part, e->caller);
-
for (e = node->callees; e; e = e->next_callee)
- if ((!e->inline_failed || DECL_COMDAT (e->callee->decl))
+ if ((!e->inline_failed
+ || DECL_COMDAT (cgraph_function_node (e->callee, NULL)->decl))
&& !cgraph_node_in_set_p (e->callee, part->cgraph_set))
add_cgraph_node_to_partition (part, e->callee);
add_references_to_partition (part, &node->ref_list);
- if (node->same_comdat_group
- && !cgraph_node_in_set_p (node->same_comdat_group, part->cgraph_set))
- add_cgraph_node_to_partition (part, node->same_comdat_group);
+ if (node->same_comdat_group)
+ for (n = node->same_comdat_group; n != node; n = n->same_comdat_group)
+ add_cgraph_node_to_partition (part, n);
}
/* Add VNODE to partition as well as comdat references partition PART. */
@@ -1500,7 +1520,6 @@ lto_1_to_1_map (void)
continue;
file_data = node->local.lto_file_data;
- gcc_assert (!node->same_body_alias);
if (file_data)
{
@@ -1900,17 +1919,6 @@ promote_fn (struct cgraph_node *node)
TREE_PUBLIC (node->decl) = 1;
DECL_VISIBILITY (node->decl) = VISIBILITY_HIDDEN;
DECL_VISIBILITY_SPECIFIED (node->decl) = true;
- if (node->same_body)
- {
- struct cgraph_node *alias;
- for (alias = node->same_body;
- alias; alias = alias->next)
- {
- TREE_PUBLIC (alias->decl) = 1;
- DECL_VISIBILITY (alias->decl) = VISIBILITY_HIDDEN;
- DECL_VISIBILITY_SPECIFIED (alias->decl) = true;
- }
- }
if (cgraph_dump_file)
fprintf (cgraph_dump_file,
"Promoting function as hidden: %s/%i\n",
@@ -1944,8 +1952,8 @@ lto_promote_cross_file_statics (void)
set = part->cgraph_set;
vset = part->varpool_set;
- /* If node has either address taken (and we have no clue from where)
- or it is called from other partition, it needs to be globalized. */
+ /* If node called or referred to from other partition, it needs to be
+ globalized. */
for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
{
struct cgraph_node *node = csi_node (csi);