re PR lto/52722 (ICE in lto_output_varpool_node)

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.

From-SVN: r186252
This commit is contained in:
Jan Hubicka 2012-04-10 01:39:11 +02:00 committed by Jan Hubicka
parent 3cb2b15b6c
commit 3c56b037d3
6 changed files with 84 additions and 9 deletions

View File

@ -1,3 +1,15 @@
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.
2012-04-09 Uros Bizjak <ubizjak@gmail.com>
PR target/52883

View File

@ -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

View File

@ -1444,7 +1444,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)
{
@ -1453,15 +1454,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. */
@ -1501,9 +1532,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))
@ -1522,7 +1550,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)
@ -1535,8 +1570,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);
@ -1554,6 +1588,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

View File

@ -1,3 +1,11 @@
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.
2012-04-09 Uros Bizjak <ubizjak@gmail.com>
PR target/52883

View File

@ -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); }

View File

@ -0,0 +1,6 @@
int cfliteKeyCallBacks = 5;
extern int cfliteValueCallBacks __attribute__((alias("cfliteKeyCallBacks")));
void baz(void *ptr)
{
asm volatile (""::"r"(ptr));
}