aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Schwinge <tschwinge@baylibre.com>2025-03-20 14:21:26 +0100
committerThomas Schwinge <tschwinge@baylibre.com>2025-03-24 09:39:21 +0100
commit65b31b3fff2fced015ded1026733605f34053796 (patch)
tree758786ed43b6e8a76b92cb555914ed0d72270d16
parent5450afcfb761834b7f4156022f1ec38f2226c193 (diff)
downloadgcc-65b31b3fff2fced015ded1026733605f34053796.zip
gcc-65b31b3fff2fced015ded1026733605f34053796.tar.gz
gcc-65b31b3fff2fced015ded1026733605f34053796.tar.bz2
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.
-rw-r--r--gcc/config/nvptx/nvptx.cc28
-rw-r--r--gcc/varasm.cc7
2 files changed, 33 insertions, 2 deletions
diff --git a/gcc/config/nvptx/nvptx.cc b/gcc/config/nvptx/nvptx.cc
index 5cd4b24..022037f 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,30 @@ 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 (DECL_CXX_CONSTRUCTOR_P (name)
+ || DECL_CXX_DESTRUCTOR_P (name))
+ {
+ /* ..., but symbol aliases 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', if available, even for
+ (default) '-mno-alias'. */
+ if (TARGET_PTX_6_3)
+ {
+ DECL_ATTRIBUTES (name)
+ = tree_cons (get_identifier ("symbol 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 +7768,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/varasm.cc b/gcc/varasm.cc
index eddfb6a..10c1d2e 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 ("symbol 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)