diff options
Diffstat (limited to 'devel/gdb/files/commit-f5424cfa7e')
-rw-r--r-- | devel/gdb/files/commit-f5424cfa7e | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/devel/gdb/files/commit-f5424cfa7e b/devel/gdb/files/commit-f5424cfa7e new file mode 100644 index 000000000000..2dc05f554234 --- /dev/null +++ b/devel/gdb/files/commit-f5424cfa7e @@ -0,0 +1,63 @@ +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 |