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