mirror of
https://git.freebsd.org/ports.git
synced 2025-06-08 14:20:33 -04:00
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
63 lines
2.2 KiB
Text
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
|