mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-23 18:14:13 +08:00
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.
This commit is contained in:
parent
2340e834df
commit
a7b4ff4f0a
@ -1,3 +1,10 @@
|
||||
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>
|
||||
|
||||
|
15
gdb/jit.c
15
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);
|
||||
|
@ -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. */
|
||||
|
Loading…
Reference in New Issue
Block a user