https://gcc.gnu.org/g:97d9016b230cca98a2d5fa1baa8af59bf96357df

commit r17-2093-g97d9016b230cca98a2d5fa1baa8af59bf96357df
Author: Srinath Parvathaneni <[email protected]>
Date:   Thu Jul 2 13:51:07 2026 +0000

    aarch64: Fix tls debuginfo missing location info [PR97344]
    
    This patch fixes the missing debuginfo for the TLS variables by emitting
    ".xword %dtprel(symbol)" along with DW_AT_location in .debug_info section.
    
    Support for the assembler directive ".xword %dtprel(symbol)" was recently
    introduced. To prevent assembler errors when building GCC with older
    versions of binutils, the patch adds a configure check that skips these
    changes if the assembler does not support ".xword %dtprel(symbol)".
    
    Related ABI changes are proposed here [1].
    [1] https://github.com/ARM-software/abi-aa/pull/330
    
    gcc/ChangeLog:
    
            PR target/97344
            * config.in: Re-generate.
            * config/aarch64/aarch64.cc (aarch64_output_dwarf_dtprel): Define
            function.
            (TARGET_ASM_OUTPUT_DWARF_DTPREL): Define macro.
            * configure: Re-generate.
            * configure.ac: Add assemler check for dtprel relocation.
    
    gcc/testsuite/ChangeLog:
    
            PR target/97344
            * gcc.target/aarch64/pr97344.c: New test.
            * lib/target-supports.exp (aarch64_gas_has_dtprel_reloc): Add new 
target
            check.

Diff:
---
 gcc/config.in                              |  6 ++++++
 gcc/config/aarch64/aarch64.cc              | 25 ++++++++++++++++++++++
 gcc/configure                              | 34 ++++++++++++++++++++++++++++++
 gcc/configure.ac                           |  6 ++++++
 gcc/testsuite/gcc.target/aarch64/pr97344.c | 26 +++++++++++++++++++++++
 gcc/testsuite/lib/target-supports.exp      | 11 ++++++++++
 6 files changed, 108 insertions(+)

diff --git a/gcc/config.in b/gcc/config.in
index b30eb6157e49..4d9780b61423 100644
--- a/gcc/config.in
+++ b/gcc/config.in
@@ -452,6 +452,12 @@
 #endif
 
 
+/* Define if your assembler supports DTPREL relocation. */
+#ifndef USED_FOR_TARGET
+#undef HAVE_AS_DTPREL_RELOC
+#endif
+
+
 /* Define if your assembler supports dwarf2 .file/.loc directives, and
    preserves file table indices exactly as given. */
 #ifndef USED_FOR_TARGET
diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index 72822ca621f5..3785a8e722d0 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -1567,6 +1567,26 @@ aarch64_debugger_regno (unsigned regno)
    return DWARF_FRAME_REGISTERS;
 }
 
+#if defined(HAVE_AS_TLS) && defined(HAVE_AS_DTPREL_RELOC)
+/* Implementation of TARGET_ASM_OUTPUT_DWARF_DTPREL.  */
+static void
+aarch64_output_dwarf_dtprel (FILE *f, int size, rtx x)
+{
+  /* The AArch64 ABI defines static DTPREL relocations only for 8-byte (.xword)
+     DWARF entries.  For any other size there is no valid dtprel(symbol)
+     encoding and rejecting the request.  */
+  if (size != 8)
+    {
+      error ("unsupported size %d for DTPREL relocation, allowed: 8", size);
+      return;
+    }
+  fputs ("\t.xword\t", f);
+  fputs ("%dtprel(", f);
+  output_addr_const (f, x);
+  fputs (")", f);
+}
+#endif
+
 /* Implement TARGET_DWARF_FRAME_REG_MODE.  */
 static machine_mode
 aarch64_dwarf_frame_reg_mode (int regno)
@@ -34087,6 +34107,11 @@ aarch64_libgcc_floating_mode_supported_p
 #undef TARGET_DWARF_FRAME_REG_MODE
 #define TARGET_DWARF_FRAME_REG_MODE aarch64_dwarf_frame_reg_mode
 
+#if defined(HAVE_AS_TLS) && defined(HAVE_AS_DTPREL_RELOC)
+#undef TARGET_ASM_OUTPUT_DWARF_DTPREL
+#define TARGET_ASM_OUTPUT_DWARF_DTPREL aarch64_output_dwarf_dtprel
+#endif
+
 #undef TARGET_OUTPUT_CFI_DIRECTIVE
 #define TARGET_OUTPUT_CFI_DIRECTIVE aarch64_output_cfi_directive
 
diff --git a/gcc/configure b/gcc/configure
index c71856868cf0..a8c4ca7b0b9d 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -28856,6 +28856,40 @@ if test $gcc_cv_as_aarch64_aeabi_build_attributes = 
yes; then
 
 $as_echo "#define HAVE_AS_AEABI_BUILD_ATTRIBUTES 1" >>confdefs.h
 
+fi
+
+    # Check if we have binutils support for DTPREL relocation.
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for support of 
DTPREL relocation" >&5
+$as_echo_n "checking assembler for support of DTPREL relocation... " >&6; }
+if ${gcc_cv_as_aarch64_dtprel_relocation+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  gcc_cv_as_aarch64_dtprel_relocation=no
+  if test x"$gcc_cv_as" != x; then
+    $as_echo '
+       .xword %dtprel(expr)
+    ' > conftest.s
+    if { ac_try='$gcc_cv_as $gcc_cv_as_flags  -o conftest.o conftest.s >&5'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }
+    then
+       gcc_cv_as_aarch64_dtprel_relocation=yes
+    else
+      echo "configure: failed program was" >&5
+      cat conftest.s >&5
+    fi
+    rm -f conftest.o conftest.s
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: 
$gcc_cv_as_aarch64_dtprel_relocation" >&5
+$as_echo "$gcc_cv_as_aarch64_dtprel_relocation" >&6; }
+if test $gcc_cv_as_aarch64_dtprel_relocation = yes; then
+
+$as_echo "#define HAVE_AS_DTPREL_RELOC 1" >>confdefs.h
+
 fi
 
     # Enable Branch Target Identification Mechanism and Return Address
diff --git a/gcc/configure.ac b/gcc/configure.ac
index 58b97f4e5252..08bf6317e2a0 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -4593,6 +4593,12 @@ case "$target" in
        .aeabi_attribute Tag_Feature_GCS, 1
     ],,[AC_DEFINE(HAVE_AS_AEABI_BUILD_ATTRIBUTES, 1,
        [Define if your assembler supports AEABI build attributes.])])
+    # Check if we have binutils support for DTPREL relocation.
+    gcc_GAS_CHECK_FEATURE([support of DTPREL relocation], 
gcc_cv_as_aarch64_dtprel_relocation,,
+    [
+       .xword %dtprel(expr)
+    ],,[AC_DEFINE(HAVE_AS_DTPREL_RELOC, 1,
+       [Define if your assembler supports DTPREL relocation.])])
     # Enable Branch Target Identification Mechanism and Return Address
     # Signing by default.
     AC_ARG_ENABLE(standard-branch-protection,
diff --git a/gcc/testsuite/gcc.target/aarch64/pr97344.c 
b/gcc/testsuite/gcc.target/aarch64/pr97344.c
new file mode 100644
index 000000000000..ff00e6d1b208
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/pr97344.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target aarch64_gas_has_dtprel_reloc } */
+/* { dg-options "-O0 -g" } */
+
+#include <stdio.h>
+
+__thread unsigned long rage = 1;
+__thread unsigned long ire = 2;
+
+void*
+increase_rage()
+{
+  ++rage;
+  ++ire;
+  printf ("Rage counter for: %lu/%lu\n", rage, ire);
+}
+
+int
+main ()
+{
+  increase_rage();
+  printf ("Rage counter %lu/%lu\n", rage, ire);
+}
+
+/* { dg-final { scan-assembler ".xword\t%dtprel\\(rage\\)" } } */
+/* { dg-final { scan-assembler ".xword\t%dtprel\\(ire\\)" } } */
diff --git a/gcc/testsuite/lib/target-supports.exp 
b/gcc/testsuite/lib/target-supports.exp
index fab707f07fd9..00605eb203f9 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -12892,6 +12892,17 @@ proc 
check_effective_target_aarch64_gas_has_build_attributes { } {
     }]
 }
 
+# Return 1 if Gas supports DTPREL Relocation on AArch64 target
+proc check_effective_target_aarch64_gas_has_dtprel_reloc { } {
+    if { ![istarget aarch64*-*-*] || ![check_effective_target_tls_native] } {
+       return 0
+    }
+    return [check_no_compiler_messages aarch64_gas_has_dtprel_reloc object {
+       /* Assembly */
+       .xword %dtprel(expr)
+    }]
+}
+
 # Create functions to check that the AArch64 assembler supports the
 # various architecture extensions via the .arch_extension pseudo-op.

Reply via email to