re PR middle-end/57366 (gcc.dg/lto/attr-weakref-1 FAILs)

PR middle-end/57366
	* cgraphunit.c (compile): When weakref is not supported,
	set up transparent aliases before final output pass.
	* varasm.c (assemble_alias): Do not try to do it here.

From-SVN: r199583
This commit is contained in:
Jan Hubicka 2013-06-01 18:49:47 +02:00 committed by Jan Hubicka
parent eb51d2ff18
commit 38e55e5c36
3 changed files with 33 additions and 7 deletions

View File

@ -1,3 +1,10 @@
2013-06-01 Jan Hubicka <jh@suse.cz>
PR middle-end/57366
* cgraphunit.c (compile): When weakref is not supported,
set up transparent aliases before final output pass.
* varasm.c (assemble_alias): Do not try to do it here.
2013-06-01 Jan Hubicka <jh@suse.cz>
PR middle-end/57467

View File

@ -1996,6 +1996,32 @@ compile (void)
bitmap_obstack_release (NULL);
mark_functions_to_output ();
/* When weakref support is missing, we autmatically translate all
references to NODE to references to its ultimate alias target.
The renaming mechanizm uses flag IDENTIFIER_TRANSPARENT_ALIAS and
TREE_CHAIN.
Set up this mapping before we output any assembler but once we are sure
that all symbol renaming is done.
FIXME: All this uglyness can go away if we just do renaming at gimple
level by physically rewritting the IL. At the moment we can only redirect
calls, so we need infrastructure for renaming references as well. */
#ifndef ASM_OUTPUT_WEAKREF
symtab_node node;
FOR_EACH_SYMBOL (node)
if (node->symbol.alias
&& lookup_attribute ("weakref", DECL_ATTRIBUTES (node->symbol.decl)))
{
IDENTIFIER_TRANSPARENT_ALIAS
(DECL_ASSEMBLER_NAME (node->symbol.decl)) = 1;
TREE_CHAIN (DECL_ASSEMBLER_NAME (node->symbol.decl))
= (node->symbol.alias_target ? node->symbol.alias_target
: DECL_ASSEMBLER_NAME (symtab_alias_target (node)->symbol.decl));
}
#endif
cgraph_state = CGRAPH_STATE_EXPANSION;
if (!flag_toplevel_reorder)
output_in_order ();

View File

@ -5560,13 +5560,6 @@ assemble_alias (tree decl, tree target)
if (alias == target)
error ("weakref %q+D ultimately targets itself", decl);
else
{
#ifndef ASM_OUTPUT_WEAKREF
IDENTIFIER_TRANSPARENT_ALIAS (alias) = 1;
TREE_CHAIN (alias) = target;
#endif
}
if (TREE_PUBLIC (decl))
error ("weakref %q+D must have static linkage", decl);
}