aboutsummaryrefslogtreecommitdiff
path: root/gcc/lto
diff options
context:
space:
mode:
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);