public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* c++: Propagate assembler name from local-externs [PR 99508]
@ 2021-03-10 15:50 Nathan Sidwell
  0 siblings, 0 replies; only message in thread
From: Nathan Sidwell @ 2021-03-10 15:50 UTC (permalink / raw)
  To: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 1009 bytes --]


This is	another	place where our	one-true-decl representation breaks 
down.  The fix here propagates the assembly name to the ns-scope alias. 
that fixes the reported problem but changes the behaviour when the user 
has explicitly declared the entity in its namespace.  However, we didn't 
handle that case 'correctly' anyway before. Previously we'd also ignore 
the explicitly specified assembler name, now we propagate it.  It's not 
clear to me what the desired semantics would be in decorating just one 
of the local extern declarations this way.  I don't think we can really 
do better without propagating this aliasing property into the middle end 
(which is also needed for some constexpr handling, see PR97306).  I 
tried that before and it turned into a rat-hole.

         PR c++/99508
         gcc/cp/
         * decl.c (make_rtl_for_nonlocal_decl): Propagate local-extern's
         assembler name to the ns alias.
         gcc/testsuite/
         * g++.dg/ext/pr99508.C:	New.

-- 
Nathan Sidwell

[-- Attachment #2: pr99508.diff --]
[-- Type: text/x-patch, Size: 1239 bytes --]

diff --git c/gcc/cp/decl.c w/gcc/cp/decl.c
index 1742e286d9f..9c7f6e59bbb 100644
--- c/gcc/cp/decl.c
+++ w/gcc/cp/decl.c
@@ -7157,6 +7157,13 @@ make_rtl_for_nonlocal_decl (tree decl, tree init, const char* asmspec)
 	      && fndecl_built_in_p (decl, BUILT_IN_NORMAL))
 	    set_builtin_user_assembler_name (decl, asmspec);
 	  set_user_assembler_name (decl, asmspec);
+	  if (DECL_LOCAL_DECL_P (decl))
+	    if (auto ns_decl = DECL_LOCAL_DECL_ALIAS (decl))
+	      /* We have to propagate the name to the ns-alias.
+		 This is horrible, as we're affecting a
+		 possibly-shared decl.  Again, a one-true-decl
+		 model breaks down.  */
+	      set_user_assembler_name (ns_decl, asmspec);
 	}
     }
 
diff --git c/gcc/testsuite/g++.dg/ext/pr99508.C w/gcc/testsuite/g++.dg/ext/pr99508.C
new file mode 100644
index 00000000000..201a287bf61
--- /dev/null
+++ w/gcc/testsuite/g++.dg/ext/pr99508.C
@@ -0,0 +1,20 @@
+// PR 99508, local exerns with aliased names
+// { dg-do link }
+int foo()
+{
+  void bar() asm ("bar_assembler");
+  extern unsigned buzz asm("buzz_assembler");
+  bar();
+  return buzz;
+}
+
+void ALIASbar () asm ("bar_assembler");
+void ALIASbar ()
+{
+}
+
+unsigned ALIASbuz asm ("buzz_assembler") = 5;
+
+int main ()
+{
+}

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-03-10 15:50 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-10 15:50 c++: Propagate assembler name from local-externs [PR 99508] Nathan Sidwell

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).