gdb/jit: skip jit symbol lookup if already detected the symbols don't exist
authorSimon Marchi <simon.marchi@polymtl.ca>
Wed, 22 Jul 2020 13:56:08 +0000 (15:56 +0200)
committerTankut Baris Aktemur <tankut.baris.aktemur@intel.com>
Wed, 22 Jul 2020 13:56:08 +0000 (15:56 +0200)
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.

gdb/ChangeLog
gdb/jit.c
gdb/objfiles.h

index 77fee925b14d75312bdf51743242961853de894a..a768df0d76c0a57a42b24e275fd5750744956ab2 100644 (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>
 
index 4fe2acc2f944043ee9b5d34206bf971d36839717..024c66e7add34c5b2183871e88a95db9da9169d1 100644 (file)
--- 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);
index 3fbc6da07960c3d0d3a9f4b56d9d66ac170de899..549977ad2570f0bdb4260364f8fa8337347c0970 100644 (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.  */