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.
This commit is contained in:
parent
cd250a1898
commit
6e056c8178
@ -1,3 +1,11 @@
|
|||||||
|
2019-03-12 John Baldwin <jhb@FreeBSD.org>
|
||||||
|
|
||||||
|
* 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.
|
||||||
|
|
||||||
2019-03-12 John Baldwin <jhb@FreeBSD.org>
|
2019-03-12 John Baldwin <jhb@FreeBSD.org>
|
||||||
|
|
||||||
* target.h (target::get_thread_local_address): Update comment.
|
* target.h (target::get_thread_local_address): Update comment.
|
||||||
|
@ -251,6 +251,7 @@ struct gdbarch
|
|||||||
CORE_ADDR deprecated_function_start_offset;
|
CORE_ADDR deprecated_function_start_offset;
|
||||||
gdbarch_remote_register_number_ftype *remote_register_number;
|
gdbarch_remote_register_number_ftype *remote_register_number;
|
||||||
gdbarch_fetch_tls_load_module_address_ftype *fetch_tls_load_module_address;
|
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;
|
CORE_ADDR frame_args_skip;
|
||||||
gdbarch_unwind_pc_ftype *unwind_pc;
|
gdbarch_unwind_pc_ftype *unwind_pc;
|
||||||
gdbarch_unwind_sp_ftype *unwind_sp;
|
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 deprecated_function_start_offset, invalid_p == 0 */
|
||||||
/* Skip verify of remote_register_number, 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 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 frame_args_skip, invalid_p == 0 */
|
||||||
/* Skip verify of unwind_pc, invalid_p == 0 */
|
/* Skip verify of unwind_pc, invalid_p == 0 */
|
||||||
/* Skip verify of unwind_sp, 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,
|
fprintf_unfiltered (file,
|
||||||
"gdbarch_dump: get_syscall_number = <%s>\n",
|
"gdbarch_dump: get_syscall_number = <%s>\n",
|
||||||
host_address_to_string (gdbarch->get_syscall_number));
|
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,
|
fprintf_unfiltered (file,
|
||||||
"gdbarch_dump: gnu_triplet_regexp = <%s>\n",
|
"gdbarch_dump: gnu_triplet_regexp = <%s>\n",
|
||||||
host_address_to_string (gdbarch->gnu_triplet_regexp));
|
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;
|
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
|
CORE_ADDR
|
||||||
gdbarch_frame_args_skip (struct gdbarch *gdbarch)
|
gdbarch_frame_args_skip (struct gdbarch *gdbarch)
|
||||||
{
|
{
|
||||||
|
@ -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 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);
|
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 CORE_ADDR gdbarch_frame_args_skip (struct gdbarch *gdbarch);
|
||||||
extern void set_gdbarch_frame_args_skip (struct gdbarch *gdbarch, CORE_ADDR frame_args_skip);
|
extern void set_gdbarch_frame_args_skip (struct gdbarch *gdbarch, CORE_ADDR frame_args_skip);
|
||||||
|
|
||||||
|
@ -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.
|
# Fetch the target specific address used to represent a load module.
|
||||||
F;CORE_ADDR;fetch_tls_load_module_address;struct objfile *objfile;objfile
|
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
|
v;CORE_ADDR;frame_args_skip;;;0;;;0
|
||||||
m;CORE_ADDR;unwind_pc;struct frame_info *next_frame;next_frame;;default_unwind_pc;;0
|
m;CORE_ADDR;unwind_pc;struct frame_info *next_frame;next_frame;;default_unwind_pc;;0
|
||||||
|
13
gdb/target.c
13
gdb/target.c
@ -698,8 +698,9 @@ target_translate_tls_address (struct objfile *objfile, CORE_ADDR offset)
|
|||||||
{
|
{
|
||||||
volatile CORE_ADDR addr = 0;
|
volatile CORE_ADDR addr = 0;
|
||||||
struct target_ops *target = current_top_target ();
|
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;
|
ptid_t ptid = inferior_ptid;
|
||||||
|
|
||||||
@ -708,10 +709,14 @@ target_translate_tls_address (struct objfile *objfile, CORE_ADDR offset)
|
|||||||
CORE_ADDR lm_addr;
|
CORE_ADDR lm_addr;
|
||||||
|
|
||||||
/* Fetch the load module address for this objfile. */
|
/* 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);
|
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,
|
/* If an error occurred, print TLS related messages here. Otherwise,
|
||||||
throw the error to some higher catcher. */
|
throw the error to some higher catcher. */
|
||||||
@ -766,8 +771,6 @@ target_translate_tls_address (struct objfile *objfile, CORE_ADDR offset)
|
|||||||
}
|
}
|
||||||
END_CATCH
|
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
|
else
|
||||||
error (_("Cannot find thread-local variables on this target"));
|
error (_("Cannot find thread-local variables on this target"));
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user