]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR middle-end/57366
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 1 Jun 2013 16:49:47 +0000 (16:49 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 1 Jun 2013 16:49:47 +0000 (16:49 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@199583 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cgraphunit.c
gcc/varasm.c

index 2960cec864e5683d3222e9d3d3190bdfea83958e..3df45d8ad9204c839ddc6968321eac4fcc810f7e 100644 (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
index 76ef876aa4778e21b9e85694df5bd55aa5ef73fa..6143e8f3bbb5b7775ed449cda3b7f9f493fbdbaa 100644 (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 ();
index 72bff5a8b9a583527773dd4b7668aeb010a56526..5486e1518b14b3cb09d26dd0cd1fd8487e80b879 100644 (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);
     }