mirror of
https://git.freebsd.org/ports.git
synced 2025-06-06 13:20:32 -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
166 lines
7.5 KiB
Text
166 lines
7.5 KiB
Text
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"));
|
|
|