From 2c21b2473c74b876e97469cf4a60abcc48739ae6 Mon Sep 17 00:00:00 2001
From: Mark Mitchell <mark@codesourcery.com>
Date: Sun, 29 Oct 2000 02:26:16 +0000
Subject: [PATCH] c-semantics.c (make_rtl_for_local_static): Don't clobber
 DECL_ASSEMBLER_NAME.

	* c-semantics.c (make_rtl_for_local_static): Don't clobber
	DECL_ASSEMBLER_NAME.

From-SVN: r37112
---
 gcc/ChangeLog     |  5 +++++
 gcc/c-semantics.c | 27 +++++++++++++++++++--------
 2 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b27b1d307b49..876b6671bafa 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2000-10-28  Mark Mitchell  <mark@codesourcery.com>
+
+	* c-semantics.c (make_rtl_for_local_static): Don't clobber
+	DECL_ASSEMBLER_NAME.
+
 2000-10-28  Joseph S. Myers  <jsm28@cam.ac.uk>
 
 	* configure.in: Determine and substitute gcc_version_full.
diff --git a/gcc/c-semantics.c b/gcc/c-semantics.c
index b349bd383e91..f85284157227 100644
--- a/gcc/c-semantics.c
+++ b/gcc/c-semantics.c
@@ -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);
 }
-- 
GitLab