OSDN Git Service

* c-semantics.c (make_rtl_for_local_static): Don't clobber
[pf3gnuchains/gcc-fork.git] / gcc / c-semantics.c
index b349bd3..f852841 100644 (file)
@@ -281,14 +281,25 @@ make_rtl_for_local_static (decl)
   if (TREE_ASM_WRITTEN (decl))
     return;
 
-  if (DECL_ASSEMBLER_NAME (decl) != DECL_NAME (decl))
-    {
-      /* The only way this situaton can occur is if the
-        user specified a name for this DECL using the
-        `attribute' syntax.  */
-      asmspec = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
-      DECL_ASSEMBLER_NAME (decl) = DECL_NAME (decl);
-    }
+  /* If the DECL_ASSEMBLER_NAME is not the same as the DECL_NAME, then
+     either we already created RTL for this DECL (and since it was a
+     local variable, its DECL_ASSMEMBLER_NAME got hacked up to prevent
+     clashes with other local statics with the same name by a previous
+     call to make_decl_rtl), or the user explicitly requested a
+     particular assembly name for this variable, using the GNU
+     extension for this purpose:
+
+       int i asm ("j");
+
+     There's no way to know which case we're in, here.  But, it turns
+     out we're safe.  If there's already RTL, then
+     rest_of_decl_compilation ignores the ASMSPEC parameter, so we
+     may as well not pass it in.  If there isn't RTL, then we didn't
+     already create RTL, which means that the modification to
+     DECL_ASSEMBLER_NAME came only via the explicit extension.  */
+  if (DECL_ASSEMBLER_NAME (decl) != DECL_NAME (decl)
+      && !DECL_RTL (decl))
+    asmspec = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
 
   rest_of_decl_compilation (decl, asmspec, /*top_level=*/0, /*at_end=*/0);
 }