/* Handle JIT code generation in the inferior for GDB, the GNU Debugger.
- Copyright (C) 2009-2021 Free Software Foundation, Inc.
+ Copyright (C) 2009-2022 Free Software Foundation, Inc.
This file is part of GDB.
fprintf_filtered (file, _("JIT debugging is %s.\n"), value);
}
+/* Implementation of the "maintenance info jit" command. */
+
+static void
+maint_info_jit_cmd (const char *args, int from_tty)
+{
+ inferior *inf = current_inferior ();
+ bool printed_header = false;
+
+ /* Print a line for each JIT-ed objfile. */
+ for (objfile *obj : inf->pspace->objfiles ())
+ {
+ if (obj->jited_data == nullptr)
+ continue;
+
+ if (!printed_header)
+ {
+ printf_filtered ("Base address of known JIT-ed objfiles:\n");
+ printed_header = true;
+ }
+
+ printf_filtered (" %s\n", paddress (obj->arch (), obj->jited_data->addr));
+ }
+}
+
struct jit_reader
{
jit_reader (struct gdb_reader_funcs *f, gdb_dlhandle_up &&h)
error (_("JIT reader already loaded. Run jit-reader-unload first."));
if (!IS_ABSOLUTE_PATH (file.get ()))
- file.reset (xstrprintf ("%s%s%s", jit_reader_dir.c_str (), SLASH_STRING,
- file.get ()));
+ file = xstrprintf ("%s%s%s", jit_reader_dir.c_str (),
+ SLASH_STRING, file.get ());
loaded_jit_reader = jit_reader_load (file.get ());
reinit_frame_cache ();
err = target_read_memory (addr, desc_buf, desc_size);
if (err)
{
- printf_unfiltered (_("Unable to read JIT descriptor from "
- "remote memory\n"));
+ fprintf_unfiltered (gdb_stderr, _("Unable to read JIT descriptor from "
+ "remote memory\n"));
return false;
}
(code_entry->symfile_addr, code_entry->symfile_size, gnutarget));
if (nbfd == NULL)
{
- puts_unfiltered (_("Error opening JITed symbol file, ignoring it.\n"));
+ fputs_unfiltered (_("Error opening JITed symbol file, ignoring it.\n"),
+ gdb_stderr);
return;
}
We would segfault later without this line. */
if (!bfd_check_format (nbfd.get (), bfd_object))
{
- printf_unfiltered (_("\
+ fprintf_unfiltered (gdb_stderr, _("\
JITed symbol file is not an object file, ignoring it.\n"));
return;
}
if (b->type != bp_jit_event)
return;
- for (bp_location *iter = b->loc; iter != nullptr; iter = iter->next)
+ for (bp_location *iter : b->locations ())
{
for (objfile *objf : iter->pspace->objfiles ())
{
{
for (objfile *the_objfile : pspace->objfiles ())
{
+ /* Skip separate debug objects. */
+ if (the_objfile->separate_debug_objfile_backlink != nullptr)
+ continue;
+
if (the_objfile->skip_jit_symbol_lookup)
continue;
}
jiter_objfile_data *objf_data
- = get_jiter_objfile_data (reg_symbol.objfile);
+ = get_jiter_objfile_data (the_objfile);
objf_data->register_code = reg_symbol.minsym;
objf_data->descriptor = desc_symbol.minsym;
static const struct frame_unwind jit_frame_unwind =
{
+ "jit",
NORMAL_FRAME,
default_frame_unwind_stop_reason,
jit_frame_this_id,
/* Check that the version number agrees with that we support. */
if (descriptor.version != 1)
{
- printf_unfiltered (_("Unsupported JIT protocol version %ld "
- "in descriptor (expected 1)\n"),
- (long) descriptor.version);
+ fprintf_unfiltered (gdb_stderr,
+ _("Unsupported JIT protocol version %ld "
+ "in descriptor (expected 1)\n"),
+ (long) descriptor.version);
continue;
}
{
objfile *jited = jit_find_objf_with_entry_addr (entry_addr);
if (jited == nullptr)
- printf_unfiltered (_("Unable to find JITed code "
- "entry at address: %s\n"),
- paddress (gdbarch, entry_addr));
+ fprintf_unfiltered (gdb_stderr,
+ _("Unable to find JITed code "
+ "entry at address: %s\n"),
+ paddress (gdbarch, entry_addr));
else
jited->unlink ();
show_jit_debug,
&setdebuglist, &showdebuglist);
- gdb::observers::inferior_created.attach (jit_inferior_created_hook);
- gdb::observers::inferior_execd.attach (jit_inferior_created_hook);
- gdb::observers::inferior_exit.attach (jit_inferior_exit_hook);
- gdb::observers::breakpoint_deleted.attach (jit_breakpoint_deleted);
+ add_cmd ("jit", class_maintenance, maint_info_jit_cmd,
+ _("Print information about JIT-ed code objects."),
+ &maintenanceinfolist);
+
+ gdb::observers::inferior_created.attach (jit_inferior_created_hook, "jit");
+ gdb::observers::inferior_execd.attach (jit_inferior_created_hook, "jit");
+ gdb::observers::inferior_exit.attach (jit_inferior_exit_hook, "jit");
+ gdb::observers::breakpoint_deleted.attach (jit_breakpoint_deleted, "jit");
jit_gdbarch_data = gdbarch_data_register_pre_init (jit_gdbarch_data_init);
if (is_dl_available ())