[PATCH v3 1/9] gdb/jit: pass the jiter objfile as an argument to jit_event_handler

Simon Marchi simon.marchi@polymtl.ca
Wed Jul 15 13:48:57 GMT 2020


On 2020-07-15 4:16 a.m., Tankut Baris Aktemur wrote:
> 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-06-15  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>
> 
> 	* jit.h: Include "objfiles.h".
> 	(jit_event_handler): Add a second parameter, the JITer objfile.
> 	* breakpoint.c (handle_jit_event): Update the call to
> 	jit_event_handler to pass 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.
> ---
>  gdb/breakpoint.c |  3 ++-
>  gdb/jit.c        | 27 +++++++++++++++------------
>  gdb/jit.h        |  4 +++-
>  3 files changed, 20 insertions(+), 14 deletions(-)
> 
> diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
> index 6d81323dd92..414208469f9 100644
> --- a/gdb/breakpoint.c
> +++ b/gdb/breakpoint.c
> @@ -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 ();
>  }
> diff --git a/gdb/jit.c b/gdb/jit.c
> index e8a843de390..41ed81ab4b0 100644
> --- 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;
>  
> diff --git a/gdb/jit.h b/gdb/jit.h
> index cc135037812..dddded0236f 100644
> --- a/gdb/jit.h
> +++ b/gdb/jit.h
> @@ -20,6 +20,8 @@
>  #ifndef JIT_H
>  #define JIT_H
>  
> +#include "objfiles.h"

It's preferable to use forward declarations when possible:

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.  */
> @@ -78,6 +80,6 @@ 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.  */

Can you document the new parameter?  I suppose it would be something like
"JITER is the objfiles whose JIT event breakpoint has been hit".

Simon


More information about the Gdb-patches mailing list