diff options
Diffstat (limited to 'devel/gdb/files/commit-6e056c8178')
-rw-r--r-- | devel/gdb/files/commit-6e056c8178 | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/devel/gdb/files/commit-6e056c8178 b/devel/gdb/files/commit-6e056c8178 new file mode 100644 index 000000000000..591208fca418 --- /dev/null +++ b/devel/gdb/files/commit-6e056c8178 @@ -0,0 +1,166 @@ +commit 6e056c817845f3d736a1be6b68c69b439c6c6d25 +Author: John Baldwin <jhb@FreeBSD.org> +Date: Tue Mar 12 13:39:02 2019 -0700 + + Add a new gdbarch method to resolve the address of TLS variables. + + Permit TLS variable addresses to be resolved purely by an ABI rather + than requiring a target method. This doesn't try the target method if + the ABI function is present (even if the ABI function fails) to + simplify error handling. + + gdb/ChangeLog: + + * gdbarch.sh (get_thread_local_address): New method. + * gdbarch.h, gdbarch.c: Regenerate. + * target.c (target_translate_tls_address): Use + gdbarch_get_thread_local_address if present instead of + target::get_thread_local_address. + +diff --git gdb/gdbarch.c gdb/gdbarch.c +index 434ee3bfcf..2b3fcef004 100644 +--- gdb/gdbarch.c ++++ gdb/gdbarch.c +@@ -251,6 +251,7 @@ struct gdbarch + CORE_ADDR deprecated_function_start_offset; + gdbarch_remote_register_number_ftype *remote_register_number; + gdbarch_fetch_tls_load_module_address_ftype *fetch_tls_load_module_address; ++ gdbarch_get_thread_local_address_ftype *get_thread_local_address; + CORE_ADDR frame_args_skip; + gdbarch_unwind_pc_ftype *unwind_pc; + gdbarch_unwind_sp_ftype *unwind_sp; +@@ -613,6 +614,7 @@ verify_gdbarch (struct gdbarch *gdbarch) + /* Skip verify of deprecated_function_start_offset, invalid_p == 0 */ + /* Skip verify of remote_register_number, invalid_p == 0 */ + /* Skip verify of fetch_tls_load_module_address, has predicate. */ ++ /* Skip verify of get_thread_local_address, has predicate. */ + /* Skip verify of frame_args_skip, invalid_p == 0 */ + /* Skip verify of unwind_pc, invalid_p == 0 */ + /* Skip verify of unwind_sp, invalid_p == 0 */ +@@ -1073,6 +1075,12 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) + fprintf_unfiltered (file, + "gdbarch_dump: get_syscall_number = <%s>\n", + host_address_to_string (gdbarch->get_syscall_number)); ++ fprintf_unfiltered (file, ++ "gdbarch_dump: gdbarch_get_thread_local_address_p() = %d\n", ++ gdbarch_get_thread_local_address_p (gdbarch)); ++ fprintf_unfiltered (file, ++ "gdbarch_dump: get_thread_local_address = <%s>\n", ++ host_address_to_string (gdbarch->get_thread_local_address)); + fprintf_unfiltered (file, + "gdbarch_dump: gnu_triplet_regexp = <%s>\n", + host_address_to_string (gdbarch->gnu_triplet_regexp)); +@@ -3018,6 +3026,30 @@ set_gdbarch_fetch_tls_load_module_address (struct gdbarch *gdbarch, + gdbarch->fetch_tls_load_module_address = fetch_tls_load_module_address; + } + ++int ++gdbarch_get_thread_local_address_p (struct gdbarch *gdbarch) ++{ ++ gdb_assert (gdbarch != NULL); ++ return gdbarch->get_thread_local_address != NULL; ++} ++ ++CORE_ADDR ++gdbarch_get_thread_local_address (struct gdbarch *gdbarch, ptid_t ptid, CORE_ADDR lm_addr, CORE_ADDR offset) ++{ ++ gdb_assert (gdbarch != NULL); ++ gdb_assert (gdbarch->get_thread_local_address != NULL); ++ if (gdbarch_debug >= 2) ++ fprintf_unfiltered (gdb_stdlog, "gdbarch_get_thread_local_address called\n"); ++ return gdbarch->get_thread_local_address (gdbarch, ptid, lm_addr, offset); ++} ++ ++void ++set_gdbarch_get_thread_local_address (struct gdbarch *gdbarch, ++ gdbarch_get_thread_local_address_ftype get_thread_local_address) ++{ ++ gdbarch->get_thread_local_address = get_thread_local_address; ++} ++ + CORE_ADDR + gdbarch_frame_args_skip (struct gdbarch *gdbarch) + { +diff --git gdb/gdbarch.h gdb/gdbarch.h +index 75618376ab..abb72e752b 100644 +--- gdb/gdbarch.h ++++ gdb/gdbarch.h +@@ -649,6 +649,18 @@ typedef CORE_ADDR (gdbarch_fetch_tls_load_module_address_ftype) (struct objfile + extern CORE_ADDR gdbarch_fetch_tls_load_module_address (struct gdbarch *gdbarch, struct objfile *objfile); + extern void set_gdbarch_fetch_tls_load_module_address (struct gdbarch *gdbarch, gdbarch_fetch_tls_load_module_address_ftype *fetch_tls_load_module_address); + ++/* Return the thread-local address at OFFSET in the thread-local ++ storage for the thread PTID and the shared library or executable ++ file given by LM_ADDR. If that block of thread-local storage hasn't ++ been allocated yet, this function may throw an error. LM_ADDR may ++ be zero for statically linked multithreaded inferiors. */ ++ ++extern int gdbarch_get_thread_local_address_p (struct gdbarch *gdbarch); ++ ++typedef CORE_ADDR (gdbarch_get_thread_local_address_ftype) (struct gdbarch *gdbarch, ptid_t ptid, CORE_ADDR lm_addr, CORE_ADDR offset); ++extern CORE_ADDR gdbarch_get_thread_local_address (struct gdbarch *gdbarch, ptid_t ptid, CORE_ADDR lm_addr, CORE_ADDR offset); ++extern void set_gdbarch_get_thread_local_address (struct gdbarch *gdbarch, gdbarch_get_thread_local_address_ftype *get_thread_local_address); ++ + extern CORE_ADDR gdbarch_frame_args_skip (struct gdbarch *gdbarch); + extern void set_gdbarch_frame_args_skip (struct gdbarch *gdbarch, CORE_ADDR frame_args_skip); + +diff --git gdb/gdbarch.sh gdb/gdbarch.sh +index 48fcebd19a..63bfbad7d9 100755 +--- gdb/gdbarch.sh ++++ gdb/gdbarch.sh +@@ -602,6 +602,14 @@ m;int;remote_register_number;int regno;regno;;default_remote_register_number;;0 + + # Fetch the target specific address used to represent a load module. + F;CORE_ADDR;fetch_tls_load_module_address;struct objfile *objfile;objfile ++ ++# Return the thread-local address at OFFSET in the thread-local ++# storage for the thread PTID and the shared library or executable ++# file given by LM_ADDR. If that block of thread-local storage hasn't ++# been allocated yet, this function may throw an error. LM_ADDR may ++# be zero for statically linked multithreaded inferiors. ++ ++M;CORE_ADDR;get_thread_local_address;ptid_t ptid, CORE_ADDR lm_addr, CORE_ADDR offset;ptid, lm_addr, offset + # + v;CORE_ADDR;frame_args_skip;;;0;;;0 + m;CORE_ADDR;unwind_pc;struct frame_info *next_frame;next_frame;;default_unwind_pc;;0 +diff --git gdb/target.c gdb/target.c +index 8579c19d05..c27157d209 100644 +--- gdb/target.c ++++ gdb/target.c +@@ -698,8 +698,9 @@ target_translate_tls_address (struct objfile *objfile, CORE_ADDR offset) + { + volatile CORE_ADDR addr = 0; + struct target_ops *target = current_top_target (); ++ struct gdbarch *gdbarch = target_gdbarch (); + +- if (gdbarch_fetch_tls_load_module_address_p (target_gdbarch ())) ++ if (gdbarch_fetch_tls_load_module_address_p (gdbarch)) + { + ptid_t ptid = inferior_ptid; + +@@ -708,10 +709,14 @@ target_translate_tls_address (struct objfile *objfile, CORE_ADDR offset) + CORE_ADDR lm_addr; + + /* Fetch the load module address for this objfile. */ +- lm_addr = gdbarch_fetch_tls_load_module_address (target_gdbarch (), ++ lm_addr = gdbarch_fetch_tls_load_module_address (gdbarch, + objfile); + +- addr = target->get_thread_local_address (ptid, lm_addr, offset); ++ if (gdbarch_get_thread_local_address_p (gdbarch)) ++ addr = gdbarch_get_thread_local_address (gdbarch, ptid, lm_addr, ++ offset); ++ else ++ addr = target->get_thread_local_address (ptid, lm_addr, offset); + } + /* If an error occurred, print TLS related messages here. Otherwise, + throw the error to some higher catcher. */ +@@ -766,8 +771,6 @@ target_translate_tls_address (struct objfile *objfile, CORE_ADDR offset) + } + END_CATCH + } +- /* It wouldn't be wrong here to try a gdbarch method, too; finding +- TLS is an ABI-specific thing. But we don't do that yet. */ + else + error (_("Cannot find thread-local variables on this target")); + |