summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2012-04-09 23:39:11 +0000
committerH.J. Lu <hjl.tools@gmail.com>2012-06-28 09:54:05 -0700
commit1dcff820d765036642bb3acc3c43cfa6b4ba0379 (patch)
treea5d72352d8081b360cbde993422bf8b79815026e
parent4d025e72b3cb3539fb3d8c152ab9597f547450d9 (diff)
downloadgcc-hjl/gcc-4_7-branch/pr53768.tar.gz
Backport revision 186252 to 4.7 branchhjl/gcc-4_7-branch/pr53768
PR lto/52722 PR lto/51765 PR lto/52634 * lto-cgraph.c (compute_ltrans_boundary): When alias is in the boundary, add its target too. * lto.c (add_references_to_partition): Add also aliased nodes. (add_cgraph_node_to_partition, add_varpool_node_to_partition): Work on nodes, not functions/variables; when adding alias, add also the aliased object. * gcc.dg/lto/pr52634_1.c: New testcase. * gcc.dg/lto/pr52634_0.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@186252 138bc75d-0d04-0410-961f-82ee72b054a4 Conflicts: gcc/ChangeLog gcc/testsuite/ChangeLog
-rw-r--r--gcc/ChangeLog.pr5376814
-rw-r--r--gcc/lto-cgraph.c2
-rw-r--r--gcc/lto/lto.c60
-rw-r--r--gcc/testsuite/ChangeLog.pr5376810
-rw-r--r--gcc/testsuite/gcc.dg/lto/pr52634_0.c5
-rw-r--r--gcc/testsuite/gcc.dg/lto/pr52634_1.c6
6 files changed, 88 insertions, 9 deletions
diff --git a/gcc/ChangeLog.pr53768 b/gcc/ChangeLog.pr53768
new file mode 100644
index 00000000000..5bf2ae4d1b0
--- /dev/null
+++ b/gcc/ChangeLog.pr53768
@@ -0,0 +1,14 @@
+2012-06-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ Backport from mainline
+ 2012-04-09 Jan Hubicka <jh@suse.cz>
+
+ PR lto/52722
+ PR lto/51765
+ PR lto/52634
+ * lto-cgraph.c (compute_ltrans_boundary): When alias is in the boundary,
+ add its target too.
+ * lto.c (add_references_to_partition): Add also aliased nodes.
+ (add_cgraph_node_to_partition,
+ add_varpool_node_to_partition): Work on nodes, not functions/variables;
+ when adding alias, add also the aliased object.
diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c
index 5e899bc5f10..f57028d07fb 100644
--- a/gcc/lto-cgraph.c
+++ b/gcc/lto-cgraph.c
@@ -799,6 +799,8 @@ compute_ltrans_boundary (struct lto_out_decl_state *state,
lto_set_varpool_encoder_encode_initializer (varpool_encoder, vnode);
add_references (encoder, varpool_encoder, &vnode->ref_list);
}
+ else if (vnode->alias || vnode->alias_of)
+ add_references (encoder, varpool_encoder, &vnode->ref_list);
}
/* Go over all the nodes again to include callees that are not in
diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c
index f267d2a4ec4..6bc9ee11954 100644
--- a/gcc/lto/lto.c
+++ b/gcc/lto/lto.c
@@ -1409,7 +1409,8 @@ free_ltrans_partitions (void)
VEC_free (ltrans_partition, heap, ltrans_partitions);
}
-/* See all references that go to comdat objects and bring them into partition too. */
+/* See all references that go to comdat objects and bring them into partition too.
+ Also see all aliases of the newly added entry and bring them, too. */
static void
add_references_to_partition (ltrans_partition part, struct ipa_ref_list *refs)
{
@@ -1418,15 +1419,45 @@ 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 (cgraph_function_node (ipa_ref_node (ref), NULL)->decl)
+ && (DECL_COMDAT (cgraph_function_node (ipa_ref_node (ref),
+ NULL)->decl)
+ || (ref->use == IPA_REF_ALIAS
+ && lookup_attribute
+ ("weakref", DECL_ATTRIBUTES (ipa_ref_node (ref)->decl))))
&& !cgraph_node_in_set_p (ipa_ref_node (ref), part->cgraph_set))
add_cgraph_node_to_partition (part, ipa_ref_node (ref));
else
if (ref->refered_type == IPA_REF_VARPOOL
- && DECL_COMDAT (ipa_ref_varpool_node (ref)->decl)
- && !varpool_node_in_set_p (ipa_ref_varpool_node (ref), part->varpool_set))
+ && (DECL_COMDAT (ipa_ref_varpool_node (ref)->decl)
+ || (ref->use == IPA_REF_ALIAS
+ && lookup_attribute
+ ("weakref",
+ DECL_ATTRIBUTES (ipa_ref_varpool_node (ref)->decl))))
+ && !varpool_node_in_set_p (ipa_ref_varpool_node (ref),
+ part->varpool_set))
add_varpool_node_to_partition (part, ipa_ref_varpool_node (ref));
}
+ for (i = 0; ipa_ref_list_refering_iterate (refs, i, ref); i++)
+ {
+ if (ref->refering_type == IPA_REF_CGRAPH
+ && ref->use == IPA_REF_ALIAS
+ && !cgraph_node_in_set_p (ipa_ref_refering_node (ref),
+ part->cgraph_set)
+ && !lookup_attribute ("weakref",
+ DECL_ATTRIBUTES
+ (ipa_ref_refering_node (ref)->decl)))
+ add_cgraph_node_to_partition (part, ipa_ref_refering_node (ref));
+ else
+ if (ref->refering_type == IPA_REF_VARPOOL
+ && ref->use == IPA_REF_ALIAS
+ && !varpool_node_in_set_p (ipa_ref_refering_varpool_node (ref),
+ part->varpool_set)
+ && !lookup_attribute ("weakref",
+ DECL_ATTRIBUTES
+ (ipa_ref_refering_varpool_node (ref)->decl)))
+ add_varpool_node_to_partition (part,
+ ipa_ref_refering_varpool_node (ref));
+ }
}
/* Worker for add_cgraph_node_to_partition. */
@@ -1466,9 +1497,6 @@ add_cgraph_node_to_partition (ltrans_partition part, struct cgraph_node *node)
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))
@@ -1487,7 +1515,14 @@ add_cgraph_node_to_partition (ltrans_partition part, struct cgraph_node *node)
&& !cgraph_node_in_set_p (e->callee, part->cgraph_set))
add_cgraph_node_to_partition (part, e->callee);
+ /* The only way to assemble non-weakref alias is to add the aliased object into
+ the unit. */
add_references_to_partition (part, &node->ref_list);
+ n = cgraph_function_node (node, NULL);
+ if (n != node
+ && !lookup_attribute ("weakref",
+ DECL_ATTRIBUTES (node->decl)))
+ add_cgraph_node_to_partition (part, n);
if (node->same_comdat_group)
for (n = node->same_comdat_group; n != node; n = n->same_comdat_group)
@@ -1500,8 +1535,7 @@ static void
add_varpool_node_to_partition (ltrans_partition part, struct varpool_node *vnode)
{
varpool_node_set_iterator vsi;
-
- vnode = varpool_variable_node (vnode, NULL);
+ struct varpool_node *v;
/* If NODE is already there, we have nothing to do. */
vsi = varpool_node_set_find (part->varpool_set, vnode);
@@ -1519,6 +1553,14 @@ add_varpool_node_to_partition (ltrans_partition part, struct varpool_node *vnode
}
vnode->aux = (void *)((size_t)vnode->aux + 1);
+ /* The only way to assemble non-weakref alias is to add the aliased object into
+ the unit. */
+ v = varpool_variable_node (vnode, NULL);
+ if (v != vnode
+ && !lookup_attribute ("weakref",
+ DECL_ATTRIBUTES (vnode->decl)))
+ add_varpool_node_to_partition (part, v);
+
add_references_to_partition (part, &vnode->ref_list);
if (vnode->same_comdat_group
diff --git a/gcc/testsuite/ChangeLog.pr53768 b/gcc/testsuite/ChangeLog.pr53768
new file mode 100644
index 00000000000..d59a4c67ef3
--- /dev/null
+++ b/gcc/testsuite/ChangeLog.pr53768
@@ -0,0 +1,10 @@
+2012-06-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ Backport from mainline
+ 2012-04-09 Jan Hubicka <jh@suse.cz>
+
+ PR lto/52722
+ PR lto/51765
+ PR lto/52634
+ * gcc.dg/lto/pr52634_1.c: New testcase.
+ * gcc.dg/lto/pr52634_0.c: New testcase.
diff --git a/gcc/testsuite/gcc.dg/lto/pr52634_0.c b/gcc/testsuite/gcc.dg/lto/pr52634_0.c
new file mode 100644
index 00000000000..27e075d4758
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/lto/pr52634_0.c
@@ -0,0 +1,5 @@
+/* { dg-lto-do link } */
+/* { dg-lto-options {{-flto -r -nostdlib -flto-partition=1to1}} */
+extern int cfliteValueCallBacks;
+void baz (int *);
+int main () { baz(&cfliteValueCallBacks); }
diff --git a/gcc/testsuite/gcc.dg/lto/pr52634_1.c b/gcc/testsuite/gcc.dg/lto/pr52634_1.c
new file mode 100644
index 00000000000..af4c43980d1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/lto/pr52634_1.c
@@ -0,0 +1,6 @@
+int cfliteKeyCallBacks = 5;
+extern int cfliteValueCallBacks __attribute__((alias("cfliteKeyCallBacks")));
+void baz(void *ptr)
+{
+ asm volatile (""::"r"(ptr));
+}