aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@polymtl.ca>2020-07-22 15:56:08 +0200
committerTankut Baris Aktemur <tankut.baris.aktemur@intel.com>2020-07-22 15:56:08 +0200
commita7b4ff4f0a0e503414b6b9a4184365fdb1f00fbe (patch)
tree8d7c740bc940b30ba277f6b609baf9daa97f0f20
parent2340e834dfb3110a33e2867297469d5ff33013a4 (diff)
downloadgdb-a7b4ff4f0a0e503414b6b9a4184365fdb1f00fbe.zip
gdb-a7b4ff4f0a0e503414b6b9a4184365fdb1f00fbe.tar.gz
gdb-a7b4ff4f0a0e503414b6b9a4184365fdb1f00fbe.tar.bz2
gdb/jit: skip jit symbol lookup if already detected the symbols don't exist
To detect whether an objfile is a JITer, we lookup JIT interface symbols in the objfile. If an objfile does not have these symbols, we conclude that it is not a JITer. An objfile that does not have the symbols will never have them. Therefore, once we do a lookup and find out that the objfile does not have JIT symbols, just set a flag so that we can skip symbol lookup for that objfile the next time we reset JIT breakpoints. gdb/ChangeLog: 2020-07-22 Simon Marchi <simon.marchi@polymtl.ca> Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> * objfiles.h (struct objfile) <skip_jit_symbol_lookup>: New field. * jit.c (jit_breakpoint_re_set_internal): Use the `skip_jit_symbol_lookup` field.
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/jit.c15
-rw-r--r--gdb/objfiles.h6
3 files changed, 26 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 77fee92..a768df0 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,6 +1,13 @@
2020-07-22 Simon Marchi <simon.marchi@polymtl.ca>
Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
+ * objfiles.h (struct objfile) <skip_jit_symbol_lookup>: New field.
+ * jit.c (jit_breakpoint_re_set_internal): Use the
+ `skip_jit_symbol_lookup` field.
+
+2020-07-22 Simon Marchi <simon.marchi@polymtl.ca>
+ Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
+
* jit.c (jit_read_descriptor): Define the descriptor address once,
use twice.
(jit_breakpoint_deleted): Move the declaration of the loop variable
diff --git a/gdb/jit.c b/gdb/jit.c
index 4fe2acc..024c66e 100644
--- a/gdb/jit.c
+++ b/gdb/jit.c
@@ -893,19 +893,30 @@ jit_breakpoint_re_set_internal (struct gdbarch *gdbarch, program_space *pspace)
{
for (objfile *the_objfile : pspace->objfiles ())
{
+ if (the_objfile->skip_jit_symbol_lookup)
+ continue;
+
/* Lookup the registration symbol. If it is missing, then we
assume we are not attached to a JIT. */
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)
- continue;
+ {
+ /* No need to repeat the lookup the next time. */
+ the_objfile->skip_jit_symbol_lookup = true;
+ continue;
+ }
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)
- continue;
+ {
+ /* No need to repeat the lookup the next time. */
+ the_objfile->skip_jit_symbol_lookup = true;
+ continue;
+ }
jiter_objfile_data *objf_data
= get_jiter_objfile_data (reg_symbol.objfile);
diff --git a/gdb/objfiles.h b/gdb/objfiles.h
index 3fbc6da..549977a 100644
--- a/gdb/objfiles.h
+++ b/gdb/objfiles.h
@@ -706,6 +706,12 @@ public:
/* JIT-related data for this objfile, if the objfile is JITed;
that is, it was produced by a JITer. */
std::unique_ptr<jited_objfile_data> jited_data = nullptr;
+
+ /* A flag that is set to true if the JIT interface symbols are not
+ found in this objfile, so that we can skip the symbol lookup the
+ next time. If an objfile does not have the symbols, it will
+ never have them. */
+ bool skip_jit_symbol_lookup = false;
};
/* A deleter for objfile. */