gdb/jit: pass the jiter objfile as an argument to jit_event_handler
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.
This commit is contained in:
parent
39fdda0744
commit
fe053b9e85
@ -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.
|
||||
|
@ -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 ();
|
||||
}
|
||||
|
27
gdb/jit.c
27
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;
|
||||
|
||||
|
@ -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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user