Commit 38e55e5c by Jan Hubicka Committed by Jan Hubicka

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
parent eb51d2ff
2013-06-01 Jan Hubicka <jh@suse.cz> 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 PR middle-end/57467
* passes.c (for_per_function): Skip unanalyzed functions. * passes.c (for_per_function): Skip unanalyzed functions.
......
...@@ -1996,6 +1996,32 @@ compile (void) ...@@ -1996,6 +1996,32 @@ compile (void)
bitmap_obstack_release (NULL); bitmap_obstack_release (NULL);
mark_functions_to_output (); 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; cgraph_state = CGRAPH_STATE_EXPANSION;
if (!flag_toplevel_reorder) if (!flag_toplevel_reorder)
output_in_order (); output_in_order ();
......
...@@ -5560,13 +5560,6 @@ assemble_alias (tree decl, tree target) ...@@ -5560,13 +5560,6 @@ assemble_alias (tree decl, tree target)
if (alias == target) if (alias == target)
error ("weakref %q+D ultimately targets itself", decl); 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)) if (TREE_PUBLIC (decl))
error ("weakref %q+D must have static linkage", decl); error ("weakref %q+D must have static linkage", decl);
} }
......
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