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