lto-symtab.c (lto_symtab_resolve_can_prevail_p): Alias of variable with body can prevail.

* lto-symtab.c (lto_symtab_resolve_can_prevail_p): Alias of variable
	with body can prevail.

	* lto-symtab.c (lto_symtab_merge_decls_1): Prefer declarations with
	size.

From-SVN: r159061
This commit is contained in:
Jan Hubicka 2010-05-05 12:20:38 +02:00 committed by Jan Hubicka
parent 0277fabf2b
commit 9e0546efa3
2 changed files with 32 additions and 4 deletions

View file

@ -1,3 +1,13 @@
2010-05-05 Jan Hubicka <jh@suse.cz>
* lto-symtab.c (lto_symtab_resolve_can_prevail_p): Alias of variable
with body can prevail.
2010-05-05 Jan Hubicka <jh@suse.cz>
* lto-symtab.c (lto_symtab_merge_decls_1): Prefer declarations with
size.
2010-05-05 Laurynas Biveinis <laurynas.biveinis@gmail.com>
* Makefile.in (build/gengtype.o): Add $(HASHTAB_H) to

View file

@ -416,7 +416,13 @@ lto_symtab_resolve_can_prevail_p (lto_symtab_entry_t e)
/* A variable should have a size. */
else if (TREE_CODE (e->decl) == VAR_DECL)
return (e->vnode && e->vnode->finalized);
{
if (!e->vnode)
return false;
if (e->vnode->finalized)
return true;
return e->vnode->alias && e->vnode->extra_name->finalized;
}
gcc_unreachable ();
}
@ -590,10 +596,22 @@ lto_symtab_merge_decls_1 (void **slot, void *data ATTRIBUTE_UNUSED)
while (!prevailing->node
&& prevailing->next)
prevailing = prevailing->next;
/* For variables chose with a priority variant with vnode
attached (i.e. from unit where external declaration of
variable is actually used).
When there are multiple variants, chose one with size.
This is needed for C++ typeinfos, for example in
lto/20081204-1 there are typeifos in both units, just
one of them do have size. */
if (TREE_CODE (prevailing->decl) == VAR_DECL)
while (!prevailing->vnode
&& prevailing->next)
prevailing = prevailing->next;
{
for (e = prevailing->next; e; e = e->next)
if ((!prevailing->vnode && e->vnode)
|| ((prevailing->vnode != NULL) == (e->vnode != NULL)
&& !COMPLETE_TYPE_P (TREE_TYPE (prevailing->decl))
&& COMPLETE_TYPE_P (TREE_TYPE (e->decl))))
prevailing = e;
}
}
/* Move it first in the list. */