Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [PATCH v3] Add TLS variable debug support for AIX [ 64-bit XCOFF files only]
@ 2026-09-03  8:55 Aditya Vidyadhar Kamath
  0 siblings, 0 replies; only message in thread
From: Aditya Vidyadhar Kamath @ 2026-09-03  8:55 UTC (permalink / raw)
  To: ulrich.weigand, simon.marchi, tom
  Cc: gdb-patches, Aditya.Kamath1, sangamesh.swamy

From: Aditya Kamath <Aditya.Kamath1@ibm.com>

This is a patch that adds TLS debug support for variables in AIX
for 64 bit XCOFF binaries only.

Currently in AIX, if we debug a TLS variable we get,
(gdb) print tls_counter
Cannot find thread-local variables on this target

This patch uses thread pointer in R13 plus adds the offset to get the TLS variable address.

Also adds the AIX specific gdbarch () methods.

After this patch we get,

gdb/gdb thread-local
GNU gdb (GDB) 18.0.50.20260728-git
Copyright (C) 2026 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "powerpc64-ibm-aix7.2.0.0".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.

+------------------------------------------------------------------------------+
| Find the GDB manual online at:                                               |
| http://www.gnu.org/software/gdb/documentation/.                              |
| For help, type "help".                                                       |
| Type "apropos word" to search for commands related to "word".                |
+------------------------------------------------------------------------------+

Reading symbols from thread-local...
(gdb) b 16
Breakpoint 1 at 0x10000894: file thread-local.c, line 16.
(gdb) r
Starting program: /home/aditya/binutils-gdb/thread-local
[New Thread 258 (tid 118292825) (id 2)]
[Switching to thread 2 (Thread 258 (tid 118292825))]

Thread 2 hit Breakpoint 1, thread_function (arg=0x1) at thread-local.c:16
16          sleep(1);
(gdb) p tls_counter
$1 = 100
(gdb) q

On AIX the thread pointer is in R13.  For variables defined in the
main executable (lm_addr == 0) the linker resolves them to local-exec
model: the XCOFF symbol value is a signed TP-relative offset baked in
at link time.  GDB reads R13 and returns tp + (int64_t)offset.

Shared-library TLS is not yet supported and returns an error.
---
 gdb/rs6000-aix-tdep.c | 61 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 61 insertions(+)

diff --git a/gdb/rs6000-aix-tdep.c b/gdb/rs6000-aix-tdep.c
index d823fea5645..76763f08e08 100644
--- a/gdb/rs6000-aix-tdep.c
+++ b/gdb/rs6000-aix-tdep.c
@@ -39,6 +39,7 @@
 #include "gdbsupport/xml-utils.h"
 #include "trad-frame.h"
 #include "frame-unwind.h"
+#include "inferior.h"
 
 /* If the kernel has to deliver a signal, it pushes a sigcontext
    structure on the stack and then calls the signal handler, passing
@@ -1355,6 +1356,59 @@ rs6000_aix_core_xfer_shared_libraries_aix (struct gdbarch *gdbarch,
 				    offset, len, 0);
 }
 
+/* For AIX, use the rs6000_aix_fetch_tls_load_module_address gdbarch method.  */
+
+static CORE_ADDR
+rs6000_aix_fetch_tls_load_module_address (struct objfile *objfile)
+{
+  /* TLS variables from shared libraries cannot be directly fetched
+     via the thread pointer if they were loaded by dlopen().  */
+  if (objfile->flags & OBJF_SHARED)
+    throw_error (TLS_GENERIC_ERROR,
+		 _("TLS lookup via thread pointer is not supported for "
+		   "shared library \"%s\"; full DTV-based lookup is not "
+		   "yet implemented for AIX"),
+		   objfile_name (objfile));
+
+  return 0;
+}
+
+/* Implement the get_thread_local_address gdbarch method for AIX.
+
+   On 64-bit AIX the thread pointer (TP) is in R13.  For variables in
+   the main executable (lm_addr == 0) the XCOFF symbol value is a
+   signed TP-relative offset baked in at link time:
+     address = tp + (int64_t) offset  */
+
+static CORE_ADDR
+rs6000_aix_get_thread_local_address (struct gdbarch *gdbarch, ptid_t ptid,
+				     CORE_ADDR lm_addr, CORE_ADDR offset)
+{
+  ppc_gdbarch_tdep *tdep = gdbarch_tdep<ppc_gdbarch_tdep> (gdbarch);
+
+  /* Only 64-bit AIX is supported.  */
+  if (tdep->wordsize != 8)
+    throw_error (TLS_GENERIC_ERROR,
+		 _("TLS lookup not yet supported for 32-bit AIX"));
+
+  int tp_regnum = PPC_R0_REGNUM + 13;
+  regcache *regcache
+    = get_thread_arch_regcache (current_inferior (), ptid, gdbarch);
+  target_fetch_registers (regcache, tp_regnum);
+
+  ULONGEST tp;
+  if (regcache->cooked_read (tp_regnum, &tp) != REG_VALID)
+    throw_error (TLS_GENERIC_ERROR,
+		 _("Unable to fetch thread pointer for TLS lookup"));
+
+  /* local-exec: XCOFF symbol value is a signed TP-relative offset.  */
+  if (lm_addr == 0)
+    return tp + (CORE_ADDR)(int64_t) offset;
+
+  throw_error (TLS_GENERIC_ERROR,
+	       _("TLS in shared libraries not yet supported on AIX"));
+}
+
 static void
 rs6000_aix_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
@@ -1411,6 +1465,13 @@ rs6000_aix_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch)
   set_gdbarch_auto_wide_charset (gdbarch, rs6000_aix_auto_wide_charset);
 
   set_gdbarch_make_solib_ops (gdbarch, make_aix_solib_ops);
+
+  set_gdbarch_get_thread_local_address
+    (gdbarch, rs6000_aix_get_thread_local_address);
+
+  set_gdbarch_fetch_tls_load_module_address
+    (gdbarch, rs6000_aix_fetch_tls_load_module_address);
+
   frame_unwind_append_unwinder (gdbarch, &aix_sighandle_frame_unwind);
 }
 
-- 
2.51.2


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

only message in thread, other threads:[~2026-09-03  8:56 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-03  8:55 [PATCH v3] Add TLS variable debug support for AIX [ 64-bit XCOFF files only] Aditya Vidyadhar Kamath

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox