ports/devel/gdb/files/commit-f5424cfa7e
John Baldwin 8113892617 Update port to GDB 8.3.
New features in GDB 8.3 include support for DWARF index caches and
styling (colors) in the CLI and TUI.  Source code styling is also
available via the new SOURCE_HIGHLIGHT option (enabled by default).
GDB 8.3 also adds support for FreeBSD/riscv64.

In addition, kgdb has been updated for changes in 8.3 along with
support for FreeBSD/riscv64 kernels.

The libc++ helpers have been updated to a newer version which adds
support for std::list<> and std::forward_list<>.  The helpers now
also support Python 3.

Finally, a few post-8.3 patches have been backported which add suport
for TLS (Thread Local Storage) variables on FreeBSD amd64, i386,
powerpc, and riscv architectures.  Note that amd64 and i386 do not
support examining TLS variables in core dumps currently.  This support
along with support for additional architectures require kernel changes
and will be added in the future once the kernel has been updated.

Reviewed by:	pizzamig (maintainer)
Differential Revision:	https://reviews.freebsd.org/D20403
2019-06-01 00:44:08 +00:00

63 lines
2.2 KiB
Text

commit f5424cfa7e9337a6cb02a1f83c9feea0995c5350
Author: John Baldwin <jhb@FreeBSD.org>
Date: Tue Mar 12 13:39:02 2019 -0700
Support TLS variables on FreeBSD/amd64.
Use the fs_base register to fetch the address of a thread's tcb and
calculate the address of the DTV array. This value is then passed to
fbsd_get_thread_local_address to compute the final variable address.
Note that fs_base is currently only available via the native target as
core dumps on FreeBSD do not store the value of fs_base.
gdb/ChangeLog:
* amd64-fbsd-tdep.c (amd64fbsd_get_thread_local_address): New.
(amd64fbsd_init_abi): Install gdbarch
"fetch_tls_load_module_address" and "get_thread_local_address"
methods.
diff --git gdb/amd64-fbsd-tdep.c gdb/amd64-fbsd-tdep.c
index 403e65022d..7e2e9edf21 100644
--- gdb/amd64-fbsd-tdep.c
+++ gdb/amd64-fbsd-tdep.c
@@ -204,6 +204,26 @@ amd64fbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
&amd64fbsd_xstateregset, "XSAVE extended state", cb_data);
}
+/* Implement the get_thread_local_address gdbarch method. */
+
+static CORE_ADDR
+amd64fbsd_get_thread_local_address (struct gdbarch *gdbarch, ptid_t ptid,
+ CORE_ADDR lm_addr, CORE_ADDR offset)
+{
+ struct regcache *regcache;
+
+ regcache = get_thread_arch_regcache (ptid, gdbarch);
+
+ target_fetch_registers (regcache, AMD64_FSBASE_REGNUM);
+
+ ULONGEST fsbase;
+ if (regcache->cooked_read (AMD64_FSBASE_REGNUM, &fsbase) != REG_VALID)
+ error (_("Unable to fetch %%fsbase"));
+
+ CORE_ADDR dtv_addr = fsbase + gdbarch_ptr_bit (gdbarch) / 8;
+ return fbsd_get_thread_local_address (gdbarch, dtv_addr, lm_addr, offset);
+}
+
static void
amd64fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
{
@@ -241,6 +261,11 @@ amd64fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
/* FreeBSD uses SVR4-style shared libraries. */
set_solib_svr4_fetch_link_map_offsets
(gdbarch, svr4_lp64_fetch_link_map_offsets);
+
+ set_gdbarch_fetch_tls_load_module_address (gdbarch,
+ svr4_fetch_objfile_link_map);
+ set_gdbarch_get_thread_local_address (gdbarch,
+ amd64fbsd_get_thread_local_address);
}
void