Commit 9e0546ef by Jan Hubicka Committed by Jan Hubicka

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
parent 0277fabf
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> 2010-05-05 Laurynas Biveinis <laurynas.biveinis@gmail.com>
* Makefile.in (build/gengtype.o): Add $(HASHTAB_H) to * Makefile.in (build/gengtype.o): Add $(HASHTAB_H) to
......
...@@ -416,7 +416,13 @@ lto_symtab_resolve_can_prevail_p (lto_symtab_entry_t e) ...@@ -416,7 +416,13 @@ lto_symtab_resolve_can_prevail_p (lto_symtab_entry_t e)
/* A variable should have a size. */ /* A variable should have a size. */
else if (TREE_CODE (e->decl) == VAR_DECL) 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 (); gcc_unreachable ();
} }
...@@ -590,10 +596,22 @@ lto_symtab_merge_decls_1 (void **slot, void *data ATTRIBUTE_UNUSED) ...@@ -590,10 +596,22 @@ lto_symtab_merge_decls_1 (void **slot, void *data ATTRIBUTE_UNUSED)
while (!prevailing->node while (!prevailing->node
&& prevailing->next) && prevailing->next)
prevailing = 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) if (TREE_CODE (prevailing->decl) == VAR_DECL)
while (!prevailing->vnode {
&& prevailing->next) for (e = prevailing->next; e; e = e->next)
prevailing = prevailing->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. */ /* Move it first in the list. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment