aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog16
-rw-r--r--gdb/jit.c171
-rw-r--r--gdb/testsuite/ChangeLog5
-rw-r--r--gdb/testsuite/gdb.base/jit-reader-simple.exp43
4 files changed, 126 insertions, 109 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 3a3866a..83f20ac 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,19 @@
+2020-07-22 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
+ Simon Marchi <simon.marchi@polymtl.ca>
+
+ * jit.c (struct jit_program_space_data): Remove.
+ (jit_program_space_key): Remove.
+ (jiter_objfile_data::~jiter_objfile_data): Remove program space
+ stuff.
+ (get_jit_program_space_data): Remove.
+ (jit_breakpoint_deleted): Iterate on all of the program space's
+ objfiles.
+ (jit_inferior_init): Likewise.
+ (jit_breakpoint_re_set_internal): Likewise. Also change return
+ type to void.
+ (jit_breakpoint_re_set): Pass current_program_space to
+ jit_breakpoint_re_set_internal.
+
2020-07-22 Simon Marchi <simon.marchi@polymtl.ca>
* jit.h (struct jiter_objfile_data) <cached_code_address,
diff --git a/gdb/jit.c b/gdb/jit.c
index 562c763..0e1cb20 100644
--- a/gdb/jit.c
+++ b/gdb/jit.c
@@ -239,30 +239,10 @@ jit_reader_unload_command (const char *args, int from_tty)
loaded_jit_reader = NULL;
}
-/* Per-program space structure recording which objfile has the JIT
- symbols. */
-
-struct jit_program_space_data
-{
- /* The objfile. This is NULL if no objfile holds the JIT
- symbols. */
-
- struct objfile *objfile = nullptr;
-};
-
-static program_space_key<jit_program_space_data> jit_program_space_key;
-
/* Destructor for jiter_objfile_data. */
jiter_objfile_data::~jiter_objfile_data ()
{
- jit_program_space_data *ps_data
- = jit_program_space_key.get (this->objfile->pspace);
-
- gdb_assert (ps_data != nullptr);
- gdb_assert (ps_data->objfile == this->objfile);
-
- ps_data->objfile = nullptr;
if (this->jit_breakpoint != nullptr)
delete_breakpoint (this->jit_breakpoint);
}
@@ -290,20 +270,6 @@ add_objfile_entry (struct objfile *objfile, CORE_ADDR entry)
objfile->jited_data.reset (new jited_objfile_data (entry));
}
-/* Return jit_program_space_data for current program space. Allocate
- if not already present. */
-
-static struct jit_program_space_data *
-get_jit_program_space_data ()
-{
- struct jit_program_space_data *ps_data;
-
- ps_data = jit_program_space_key.get (current_program_space);
- if (ps_data == NULL)
- ps_data = jit_program_space_key.emplace (current_program_space);
- return ps_data;
-}
-
/* Helper function for reading the global JIT descriptor from remote
memory. Returns true if all went well, false otherwise. */
@@ -908,15 +874,12 @@ jit_breakpoint_deleted (struct breakpoint *b)
for (iter = b->loc; iter != NULL; iter = iter->next)
{
- struct jit_program_space_data *ps_data;
-
- ps_data = jit_program_space_key.get (iter->pspace);
- if (ps_data != nullptr && ps_data->objfile != nullptr)
+ for (objfile *objf : iter->pspace->objfiles ())
{
- objfile *objf = ps_data->objfile;
jiter_objfile_data *jiter_data = objf->jiter_data.get ();
- if (jiter_data->jit_breakpoint == iter->owner)
+ if (jiter_data != nullptr
+ && jiter_data->jit_breakpoint == iter->owner)
{
jiter_data->cached_code_address = 0;
jiter_data->jit_breakpoint = nullptr;
@@ -925,62 +888,55 @@ jit_breakpoint_deleted (struct breakpoint *b)
}
}
-/* (Re-)Initialize the jit breakpoint if necessary.
- Return true if the jit breakpoint has been successfully initialized. */
+/* (Re-)Initialize the jit breakpoints for JIT-producing objfiles in
+ PSPACE. */
-static bool
-jit_breakpoint_re_set_internal (struct gdbarch *gdbarch,
- struct jit_program_space_data *ps_data)
+static void
+jit_breakpoint_re_set_internal (struct gdbarch *gdbarch, program_space *pspace)
{
- struct bound_minimal_symbol reg_symbol;
- struct bound_minimal_symbol desc_symbol;
jiter_objfile_data *objf_data;
- CORE_ADDR addr;
- if (ps_data->objfile == NULL)
+ for (objfile *the_objfile : pspace->objfiles ())
{
/* Lookup the registration symbol. If it is missing, then we
assume we are not attached to a JIT. */
- reg_symbol = lookup_bound_minimal_symbol (jit_break_name);
+ bound_minimal_symbol reg_symbol
+ = lookup_minimal_symbol (jit_break_name, nullptr, the_objfile);
if (reg_symbol.minsym == NULL
|| BMSYMBOL_VALUE_ADDRESS (reg_symbol) == 0)
- return false;
+ continue;
- desc_symbol = lookup_minimal_symbol (jit_descriptor_name, NULL,
- reg_symbol.objfile);
+ bound_minimal_symbol desc_symbol
+ = lookup_minimal_symbol (jit_descriptor_name, NULL, the_objfile);
if (desc_symbol.minsym == NULL
|| BMSYMBOL_VALUE_ADDRESS (desc_symbol) == 0)
- return false;
+ continue;
objf_data = get_jiter_objfile_data (reg_symbol.objfile);
objf_data->register_code = reg_symbol.minsym;
objf_data->descriptor = desc_symbol.minsym;
- ps_data->objfile = reg_symbol.objfile;
- }
- else
- objf_data = get_jiter_objfile_data (ps_data->objfile);
-
- addr = MSYMBOL_VALUE_ADDRESS (ps_data->objfile, objf_data->register_code);
-
- if (jit_debug)
- fprintf_unfiltered (gdb_stdlog,
- "jit_breakpoint_re_set_internal, "
- "breakpoint_addr = %s\n",
- paddress (gdbarch, addr));
+ CORE_ADDR addr = MSYMBOL_VALUE_ADDRESS (the_objfile,
+ objf_data->register_code);
- if (objf_data->cached_code_address == addr)
- return true;
+ if (jit_debug)
+ fprintf_unfiltered (gdb_stdlog,
+ "jit_breakpoint_re_set_internal, "
+ "breakpoint_addr = %s\n",
+ paddress (gdbarch, addr));
- /* Delete the old breakpoint. */
- if (objf_data->jit_breakpoint != nullptr)
- delete_breakpoint (objf_data->jit_breakpoint);
+ /* Check if we need to re-create the breakpoint. */
+ if (objf_data->cached_code_address == addr)
+ continue;
- /* Put a breakpoint in the registration symbol. */
- objf_data->cached_code_address = addr;
- objf_data->jit_breakpoint = create_jit_event_breakpoint (gdbarch, addr);
+ /* Delete the old breakpoint. */
+ if (objf_data->jit_breakpoint != nullptr)
+ delete_breakpoint (objf_data->jit_breakpoint);
- return true;
+ /* Put a breakpoint in the registration symbol. */
+ objf_data->cached_code_address = addr;
+ objf_data->jit_breakpoint = create_jit_event_breakpoint (gdbarch, addr);
+ }
}
/* The private data passed around in the frame unwind callback
@@ -1219,7 +1175,6 @@ jit_inferior_init (struct gdbarch *gdbarch)
{
struct jit_descriptor descriptor;
struct jit_code_entry cur_entry;
- struct jit_program_space_data *ps_data;
CORE_ADDR cur_entry_addr;
if (jit_debug)
@@ -1227,42 +1182,43 @@ jit_inferior_init (struct gdbarch *gdbarch)
jit_prepend_unwinder (gdbarch);
- ps_data = get_jit_program_space_data ();
- if (!jit_breakpoint_re_set_internal (gdbarch, ps_data))
- return;
+ jit_breakpoint_re_set_internal (gdbarch, current_program_space);
- /* There must be a JITer registered, otherwise we would exit early
- above. */
- objfile *jiter = ps_data->objfile;
+ for (objfile *jiter : current_program_space->objfiles ())
+ {
+ if (jiter->jiter_data == nullptr)
+ continue;
- /* Read the descriptor so we can check the version number and load
- any already JITed functions. */
- if (!jit_read_descriptor (gdbarch, &descriptor, jiter))
- return;
+ /* Read the descriptor so we can check the version number and load
+ any already JITed functions. */
+ if (!jit_read_descriptor (gdbarch, &descriptor, jiter))
+ continue;
- /* Check that the version number agrees with that we support. */
- if (descriptor.version != 1)
- {
- printf_unfiltered (_("Unsupported JIT protocol version %ld "
- "in descriptor (expected 1)\n"),
- (long) descriptor.version);
- return;
- }
+ /* Check that the version number agrees with that we support. */
+ if (descriptor.version != 1)
+ {
+ printf_unfiltered (_("Unsupported JIT protocol version %ld "
+ "in descriptor (expected 1)\n"),
+ (long) descriptor.version);
+ continue;
+ }
- /* If we've attached to a running program, we need to check the descriptor
- to register any functions that were already generated. */
- for (cur_entry_addr = descriptor.first_entry;
- cur_entry_addr != 0;
- cur_entry_addr = cur_entry.next_entry)
- {
- jit_read_code_entry (gdbarch, cur_entry_addr, &cur_entry);
+ /* If we've attached to a running program, we need to check the
+ descriptor to register any functions that were already
+ generated. */
+ for (cur_entry_addr = descriptor.first_entry;
+ cur_entry_addr != 0;
+ cur_entry_addr = cur_entry.next_entry)
+ {
+ jit_read_code_entry (gdbarch, cur_entry_addr, &cur_entry);
- /* This hook may be called many times during setup, so make sure we don't
- add the same symbol file twice. */
- if (jit_find_objf_with_entry_addr (cur_entry_addr) != NULL)
- continue;
+ /* This hook may be called many times during setup, so make sure
+ we don't add the same symbol file twice. */
+ if (jit_find_objf_with_entry_addr (cur_entry_addr) != NULL)
+ continue;
- jit_register_code (gdbarch, cur_entry_addr, &cur_entry);
+ jit_register_code (gdbarch, cur_entry_addr, &cur_entry);
+ }
}
}
@@ -1288,8 +1244,7 @@ jit_inferior_created_hook (void)
void
jit_breakpoint_re_set (void)
{
- jit_breakpoint_re_set_internal (target_gdbarch (),
- get_jit_program_space_data ());
+ jit_breakpoint_re_set_internal (target_gdbarch (), current_program_space);
}
/* This function cleans up any code entries left over when the
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 1f0861e..c83dc40 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2020-07-22 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
+
+ * gdb.base/jit-reader-simple.exp: Add a scenario for a binary that
+ loads two JITers.
+
2020-07-21 Andrew Burgess <andrew.burgess@embecosm.com>
* gdb.python/py-arch-reg-groups.exp: Additional tests.
diff --git a/gdb/testsuite/gdb.base/jit-reader-simple.exp b/gdb/testsuite/gdb.base/jit-reader-simple.exp
index 48bd326..a8f33c6 100644
--- a/gdb/testsuite/gdb.base/jit-reader-simple.exp
+++ b/gdb/testsuite/gdb.base/jit-reader-simple.exp
@@ -34,6 +34,7 @@ standard_testfile
set libname $testfile-jit
set srcfile_lib $srcdir/$subdir/$libname.c
set binfile_lib [standard_output_file $libname.so]
+set binfile_lib2 [standard_output_file ${libname}2.so]
# Build a standalone JIT binary.
@@ -53,12 +54,15 @@ proc build_standalone_jit {{options ""}} {
proc build_shared_jit {{options ""}} {
global testfile
- global srcfile_lib binfile_lib
+ global srcfile_lib binfile_lib binfile_lib2
lappend options "debug additional_flags=-fPIC"
if { [gdb_compile_shlib $srcfile_lib $binfile_lib $options] != "" } {
return -1
}
+ if { [gdb_compile_shlib $srcfile_lib $binfile_lib2 $options] != "" } {
+ return -1
+ }
return 0
}
@@ -83,6 +87,15 @@ if {[gdb_compile ${srcdir}/${subdir}/${srcfile_dl} $binfile_dl executable \
return -1
}
+# Build the program that loads *two* JIT libraries.
+set binfile_dl2 $binfile-dl2
+set options [list debug shlib=${binfile_lib} shlib=${binfile_lib2}]
+if {[gdb_compile ${srcdir}/${subdir}/${srcfile_dl} $binfile_dl2 executable \
+ $options] == -1 } {
+ untested "failed to compile two-jitter binary"
+ return -1
+}
+
# STANDALONE is true when the JIT reader is included directly in the
# main program. False when the JIT reader is in a separate shared
# library. If CHANGE_ADDR is true, force changing the JIT descriptor
@@ -160,3 +173,31 @@ foreach standalone {1 0} {
}
}
}
+
+# Now start the program that loads two JITer libraries and expect to
+# see JIT breakpoints defined for both.
+
+with_test_prefix "two JITers" {
+ clean_restart $binfile_dl2
+
+ if {![runto_main]} {
+ untested "could not run to main"
+ return -1
+ }
+
+ set num_bps 0
+ set ws "\[ \t\]+"
+ gdb_test_multiple "maint info breakpoints" "have two jit breakpoints" {
+ -re "jit events${ws}keep y${ws}$hex <__jit_debug_register_code> inf 1\r\n" {
+ incr num_bps
+ exp_continue
+ }
+ -re "$gdb_prompt $" {
+ if {$num_bps == 2} {
+ pass $gdb_test_name
+ } else {
+ fail $gdb_test_name
+ }
+ }
+ }
+}