Hi!

Appears that I'm too dumb to implement
<https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101544#c22>:

| We "simply" need to transform any symbol aliases into thunks calling the 
aliasee (or duplicate the bodies, if we must).

..., and implementing proper support for symbol aliases via the nvptx
'ld': <https://gcc.gnu.org/PR105018> "[nvptx] Need better alias support",
won't be complete any time soon, but fortunately there's a way to handle
the cases that we're concerned about here in an even simpler way, for
reasonably modern configurations; any comments before I push the attached
"nvptx: In offloading compilation, special-case certain host-setup symbol 
aliases [PR101544]"?
In particular, is the use of a new 'c++ cdtor alias' attribute OK?


Grüße
 Thomas


>From 9bc9f515ed26602e97ebbcac453f73cddb8afcc0 Mon Sep 17 00:00:00 2001
From: Thomas Schwinge <tschwi...@baylibre.com>
Date: Thu, 20 Mar 2025 14:21:26 +0100
Subject: [PATCH] nvptx: In offloading compilation, special-case certain
 host-setup symbol aliases [PR101544]

Namely, use PTX '.alias' even for (default) '-mno-alias' if the host made the
C++ "base and complete [cd]tor aliases".

	PR target/101544
	gcc/
	* config/nvptx/nvptx.cc (nvptx_asm_output_def_from_decls)
	[ACCEL_COMPILER]: Special-case certain host-setup symbol aliases.
	* varasm.cc (do_assemble_alias) [ACCEL_COMPILER]: Adjust.
	gcc/cp/
	* optimize.cc (maybe_clone_body): Tag 'clone's with
	'c++ cdtor alias' attribute.
---
 gcc/config/nvptx/nvptx.cc | 25 ++++++++++++++++++++++++-
 gcc/cp/optimize.cc        |  6 ++++++
 gcc/varasm.cc             |  7 ++++++-
 3 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/gcc/config/nvptx/nvptx.cc b/gcc/config/nvptx/nvptx.cc
index 95cc3da7876..418b9cca7e6 100644
--- a/gcc/config/nvptx/nvptx.cc
+++ b/gcc/config/nvptx/nvptx.cc
@@ -245,7 +245,7 @@ default_ptx_version_option (void)
      warp convergence.  */
   res = MAX (res, PTX_VERSION_6_0);
 
-  /* Pick at least 6.3.  */
+  /* Pick at least 6.3, to enable PTX '.alias'.  */
   res = MAX (res, PTX_VERSION_6_3);
 
   /* For sm_52+, pick at least 7.3, to enable PTX 'alloca'.  */
@@ -7713,6 +7713,27 @@ nvptx_asm_output_def_from_decls (FILE *stream, tree name,
 {
   if (nvptx_alias == 0 || !TARGET_PTX_6_3)
     {
+      /* Symbol aliases are not supported here.  */
+#ifdef ACCEL_COMPILER
+      if (lookup_attribute ("c++ cdtor alias", DECL_ATTRIBUTES (name)))
+	{
+	  /* ..., but are supported and used in the host system, via
+	     'gcc/cp/optimize.cc:can_alias_cdtor'.  */
+	  gcc_assert (!lookup_attribute ("weak", DECL_ATTRIBUTES (name)));
+	  gcc_assert (TREE_CODE (name) == FUNCTION_DECL);
+
+	  /* In this specific case, use PTX '.alias' even for (default)
+	     '-mno-alias'.  */
+	  if (TARGET_PTX_6_3)
+	    {
+	      DECL_ATTRIBUTES (name)
+		= tree_cons (get_identifier ("c++ cdtor alias handled"),
+			     NULL_TREE, DECL_ATTRIBUTES (name));
+	      goto emit_ptx_alias;
+	    }
+	}
+#endif
+
       /* Copied from assemble_alias.  */
       error_at (DECL_SOURCE_LOCATION (name),
 		"alias definitions not supported in this configuration");
@@ -7744,6 +7765,8 @@ nvptx_asm_output_def_from_decls (FILE *stream, tree name,
       return;
     }
 
+ emit_ptx_alias:
+
   cgraph_node *cnode = cgraph_node::get (name);
   if (!cnode->referred_to_p ())
     /* Prevent "Internal error: reference to deleted section".  */
diff --git a/gcc/cp/optimize.cc b/gcc/cp/optimize.cc
index 6f9a77f407a..0e1a07c4223 100644
--- a/gcc/cp/optimize.cc
+++ b/gcc/cp/optimize.cc
@@ -717,6 +717,12 @@ maybe_clone_body (tree fn)
 	    emit_associated_thunks (clone);
 	  /* We didn't generate a body, so remove the empty one.  */
 	  DECL_SAVED_TREE (clone) = void_node;
+
+	  /* Help '!TARGET_SUPPORTS_ALIASES' offload targets.  */
+	  if (flag_openacc || flag_openmp)
+	    DECL_ATTRIBUTES (clone)
+	      = tree_cons (get_identifier ("c++ cdtor alias"),
+			   NULL_TREE, DECL_ATTRIBUTES (clone));
 	}
       else
 	expand_or_defer_fn (clone);
diff --git a/gcc/varasm.cc b/gcc/varasm.cc
index eddfb6a3524..1198ca009aa 100644
--- a/gcc/varasm.cc
+++ b/gcc/varasm.cc
@@ -6525,7 +6525,12 @@ do_assemble_alias (tree decl, tree target)
 		  IDENTIFIER_POINTER (target));
 # endif
   /* If symbol aliases aren't actually supported...  */
-  if (!TARGET_SUPPORTS_ALIASES)
+  if (!TARGET_SUPPORTS_ALIASES
+# ifdef ACCEL_COMPILER
+      /* ..., and unless special-cased...  */
+      && !lookup_attribute ("c++ cdtor alias handled", DECL_ATTRIBUTES (decl))
+# endif
+      )
     /* ..., 'ASM_OUTPUT_DEF{,_FROM_DECLS}' better have raised an error.  */
     gcc_checking_assert (seen_error ());
 #elif defined (ASM_OUTPUT_WEAK_ALIAS) || defined (ASM_WEAKEN_DECL)
-- 
2.34.1

Reply via email to