aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2013-06-01 18:49:47 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2013-06-01 16:49:47 +0000
commit38e55e5c36ae095d571ef7fec96e5a82d7c78c1c (patch)
treeac2dce5005e18ed4f36c52a77912850f89152318 /gcc
parenteb51d2ff187957e2e72fab9729529142b5d87fc3 (diff)
downloadgcc-38e55e5c36ae095d571ef7fec96e5a82d7c78c1c.zip
gcc-38e55e5c36ae095d571ef7fec96e5a82d7c78c1c.tar.gz
gcc-38e55e5c36ae095d571ef7fec96e5a82d7c78c1c.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/cgraphunit.c26
-rw-r--r--gcc/varasm.c7
3 files changed, 33 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2960cec..3df45d8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
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
* passes.c (for_per_function): Skip unanalyzed functions.
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index 76ef876..6143e8f 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -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 ();
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 72bff5a..5486e15 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -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);
}