summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/c-semantics.c27
2 files changed, 24 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b27b1d307b4..876b6671baf 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 b349bd383e9..f8528415722 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);
}