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:
Simon Marchi 2020-07-22 15:56:08 +02:00 committed by Tankut Baris Aktemur
parent 2340e834df
commit a7b4ff4f0a
3 changed files with 26 additions and 2 deletions

View File

@ -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>

View File

@ -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);

View File

@ -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. */