gdb/jit: pass the jiter objfile as an argument to jit_event_handler
authorTankut Baris Aktemur <tankut.baris.aktemur@intel.com>
Wed, 22 Jul 2020 13:56:06 +0000 (15:56 +0200)
committerTankut Baris Aktemur <tankut.baris.aktemur@intel.com>
Wed, 22 Jul 2020 13:56:06 +0000 (15:56 +0200)
This is a refactoring that adds a new parameter to the `jit_event_handler`
function: the JITer objfile.  The goal is to distinguish which JITer
triggered the JIT event, in case there are multiple JITers -- a capability
that is added in a subsequent patch.

gdb/ChangeLog:
2020-07-22  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>

* jit.h: Forward-declare `struct objfile`.
(jit_event_handler): Add a second parameter, the JITer objfile.
* jit.c (jit_read_descriptor): Change the signature to take the
JITer objfile as an argument instead of the jit_program_space_data.
(jit_inferior_init): Update the call to jit_read_descriptor.
(jit_event_handler): Use the new JITer objfile argument when calling
jit_read_descriptor.
* breakpoint.c (handle_jit_event): Update the call to
jit_event_handler to pass the JITer objfile.

gdb/ChangeLog
gdb/breakpoint.c
gdb/jit.c
gdb/jit.h

index 05e43901ae1a5f216f53dd28874986d72a17c66d..7d52e228b4649fb3e6a7f2949703f22d8326e3d9 100644 (file)
@@ -1,3 +1,15 @@
+2020-07-22  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>
+
+       * jit.h: Forward-declare `struct objfile`.
+       (jit_event_handler): Add a second parameter, the JITer objfile.
+       * jit.c (jit_read_descriptor): Change the signature to take the
+       JITer objfile as an argument instead of the jit_program_space_data.
+       (jit_inferior_init): Update the call to jit_read_descriptor.
+       (jit_event_handler): Use the new JITer objfile argument when calling
+       jit_read_descriptor.
+       * breakpoint.c (handle_jit_event): Update the call to
+       jit_event_handler to pass the JITer objfile.
+
 2020-07-21  John Baldwin  <jhb@FreeBSD.org>
 
        * gdbarch.c: Regenerate.
index 6d81323dd921fd3699757c32b2a6ab33894e9b09..414208469f9bdcc9232c942e5f60f9bd00d012e8 100644 (file)
@@ -5448,8 +5448,9 @@ handle_jit_event (void)
 
   frame = get_current_frame ();
   gdbarch = get_frame_arch (frame);
+  objfile *jiter = symbol_objfile (get_frame_function (frame));
 
-  jit_event_handler (gdbarch);
+  jit_event_handler (gdbarch, jiter);
 
   target_terminal::inferior ();
 }
index e8a843de3909313ab06f5b3f2a001c0fc6c530e4..41ed81ab4b02bc8984ae82e82f5e972d59851c0b 100644 (file)
--- a/gdb/jit.c
+++ b/gdb/jit.c
@@ -332,9 +332,9 @@ get_jit_program_space_data ()
    memory.  Returns true if all went well, false otherwise.  */
 
 static bool
-jit_read_descriptor (struct gdbarch *gdbarch,
-                    struct jit_descriptor *descriptor,
-                    struct jit_program_space_data *ps_data)
+jit_read_descriptor (gdbarch *gdbarch,
+                    jit_descriptor *descriptor,
+                    objfile *jiter)
 {
   int err;
   struct type *ptr_type;
@@ -344,16 +344,16 @@ jit_read_descriptor (struct gdbarch *gdbarch,
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   struct jit_objfile_data *objf_data;
 
-  if (ps_data->objfile == NULL)
-    return false;
-  objf_data = get_jit_objfile_data (ps_data->objfile);
+  gdb_assert (jiter != nullptr);
+  objf_data = get_jit_objfile_data (jiter);
+
   if (objf_data->descriptor == NULL)
     return false;
 
   if (jit_debug)
     fprintf_unfiltered (gdb_stdlog,
                        "jit_read_descriptor, descriptor_addr = %s\n",
-                       paddress (gdbarch, MSYMBOL_VALUE_ADDRESS (ps_data->objfile,
+                       paddress (gdbarch, MSYMBOL_VALUE_ADDRESS (jiter,
                                                                  objf_data->descriptor)));
 
   /* Figure out how big the descriptor is on the remote and how to read it.  */
@@ -363,7 +363,7 @@ jit_read_descriptor (struct gdbarch *gdbarch,
   desc_buf = (gdb_byte *) alloca (desc_size);
 
   /* Read the descriptor.  */
-  err = target_read_memory (MSYMBOL_VALUE_ADDRESS (ps_data->objfile,
+  err = target_read_memory (MSYMBOL_VALUE_ADDRESS (jiter,
                                                   objf_data->descriptor),
                            desc_buf, desc_size);
   if (err)
@@ -1255,9 +1255,13 @@ jit_inferior_init (struct gdbarch *gdbarch)
   if (!jit_breakpoint_re_set_internal (gdbarch, ps_data))
     return;
 
+  /* There must be a JITer registered, otherwise we would exit early
+     above.  */
+  objfile *jiter = ps_data->objfile;
+
   /* Read the descriptor so we can check the version number and load
      any already JITed functions.  */
-  if (!jit_read_descriptor (gdbarch, &descriptor, ps_data))
+  if (!jit_read_descriptor (gdbarch, &descriptor, jiter))
     return;
 
   /* Check that the version number agrees with that we support.  */
@@ -1330,7 +1334,7 @@ jit_inferior_exit_hook (struct inferior *inf)
 }
 
 void
-jit_event_handler (struct gdbarch *gdbarch)
+jit_event_handler (gdbarch *gdbarch, objfile *jiter)
 {
   struct jit_descriptor descriptor;
   struct jit_code_entry code_entry;
@@ -1338,8 +1342,7 @@ jit_event_handler (struct gdbarch *gdbarch)
   struct objfile *objf;
 
   /* Read the descriptor from remote memory.  */
-  if (!jit_read_descriptor (gdbarch, &descriptor,
-                           get_jit_program_space_data ()))
+  if (!jit_read_descriptor (gdbarch, &descriptor, jiter))
     return;
   entry_addr = descriptor.relevant_entry;
 
index cc135037812f43b5843d4f5ae937dd7db63bb826..71e78a5167d7e6c15c69251b8f6ce69cf8400a5c 100644 (file)
--- a/gdb/jit.h
+++ b/gdb/jit.h
@@ -20,6 +20,8 @@
 #ifndef JIT_H
 #define JIT_H
 
+struct objfile;
+
 /* When the JIT breakpoint fires, the inferior wants us to take one of
    these actions.  These values are used by the inferior, so the
    values of these enums cannot be changed.  */
@@ -76,8 +78,9 @@ extern void jit_inferior_created_hook (void);
 extern void jit_breakpoint_re_set (void);
 
 /* This function is called by handle_inferior_event when it decides
-   that the JIT event breakpoint has fired.  */
+   that the JIT event breakpoint has fired.  JITER is the objfile
+   whose JIT event breakpoint has been hit.  */
 
-extern void jit_event_handler (struct gdbarch *gdbarch);
+extern void jit_event_handler (gdbarch *gdbarch, objfile *jiter);
 
 #endif /* JIT_H */