diff options
Diffstat (limited to 'devel/gdb/files/commit-ce25aa57a3')
-rw-r--r-- | devel/gdb/files/commit-ce25aa57a3 | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/devel/gdb/files/commit-ce25aa57a3 b/devel/gdb/files/commit-ce25aa57a3 new file mode 100644 index 000000000000..17e7c705bd0c --- /dev/null +++ b/devel/gdb/files/commit-ce25aa57a3 @@ -0,0 +1,64 @@ +commit ce25aa57a3cdd028be5868423e6e55506ccd1053 +Author: John Baldwin <jhb@FreeBSD.org> +Date: Tue Mar 12 13:39:02 2019 -0700 + + Support TLS variables on FreeBSD/i386. + + Derive the pointer to the DTV array from the gs_base register. As + with FreeBSD/amd64, gs_base is currently only available via the native + target. + + gdb/ChangeLog: + + * i386-fbsd-tdep.c (i386fbsd_get_thread_local_address): New. + (i386fbsd_init_abi): Install gdbarch + "fetch_tls_load_module_address" and "get_thread_local_address" + methods. + +diff --git gdb/i386-fbsd-tdep.c gdb/i386-fbsd-tdep.c +index ac57e7383d..f274847174 100644 +--- gdb/i386-fbsd-tdep.c ++++ gdb/i386-fbsd-tdep.c +@@ -320,6 +320,30 @@ i386fbsd_iterate_over_regset_sections (struct gdbarch *gdbarch, + "XSAVE extended state", cb_data); + } + ++/* Implement the get_thread_local_address gdbarch method. */ ++ ++static CORE_ADDR ++i386fbsd_get_thread_local_address (struct gdbarch *gdbarch, ptid_t ptid, ++ CORE_ADDR lm_addr, CORE_ADDR offset) ++{ ++ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); ++ struct regcache *regcache; ++ ++ if (tdep->fsbase_regnum == -1) ++ error (_("Unable to fetch %%gsbase")); ++ ++ regcache = get_thread_arch_regcache (ptid, gdbarch); ++ ++ target_fetch_registers (regcache, tdep->fsbase_regnum + 1); ++ ++ ULONGEST gsbase; ++ if (regcache->cooked_read (tdep->fsbase_regnum + 1, &gsbase) != REG_VALID) ++ error (_("Unable to fetch %%gsbase")); ++ ++ CORE_ADDR dtv_addr = gsbase + gdbarch_ptr_bit (gdbarch) / 8; ++ return fbsd_get_thread_local_address (gdbarch, dtv_addr, lm_addr, offset); ++} ++ + static void + i386fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) + { +@@ -418,6 +442,11 @@ i386fbsd4_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) + + set_gdbarch_core_read_description (gdbarch, + i386fbsd_core_read_description); ++ ++ set_gdbarch_fetch_tls_load_module_address (gdbarch, ++ svr4_fetch_objfile_link_map); ++ set_gdbarch_get_thread_local_address (gdbarch, ++ i386fbsd_get_thread_local_address); + } + + void |