Revert "do_target_wait_1: Clear TARGET_WNOHANG if the target isn't async."
[binutils-gdb.git] / gdb / jit.c
index 39e364101e71a1a527e99420c545b7bffefad971..9f57d521a8b91d116ad0ac2570650cafeee14b6d 100644 (file)
--- a/gdb/jit.c
+++ b/gdb/jit.c
@@ -1,6 +1,6 @@
 /* Handle JIT code generation in the inferior for GDB, the GNU Debugger.
 
-   Copyright (C) 2009-2020 Free Software Foundation, Inc.
+   Copyright (C) 2009-2022 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 
 static std::string jit_reader_dir;
 
-static const char *const jit_break_name = "__jit_debug_register_code";
+static const char jit_break_name[] = "__jit_debug_register_code";
 
-static const char *const jit_descriptor_name = "__jit_debug_descriptor";
+static const char jit_descriptor_name[] = "__jit_debug_descriptor";
 
-static void jit_inferior_init (struct gdbarch *gdbarch);
+static void jit_inferior_created_hook (inferior *inf);
 static void jit_inferior_exit_hook (struct inferior *inf);
 
 /* An unwinder is registered for every gdbarch.  This key is used to
@@ -58,9 +58,14 @@ static void jit_inferior_exit_hook (struct inferior *inf);
 
 static struct gdbarch_data *jit_gdbarch_data;
 
-/* Non-zero if we want to see trace of jit level stuff.  */
+/* True if we want to see trace of jit level stuff.  */
 
-static unsigned int jit_debug = 0;
+static bool jit_debug = false;
+
+/* Print a "jit" debug statement.  */
+
+#define jit_debug_printf(fmt, ...) \
+  debug_prefixed_printf_cond (jit_debug, "jit", fmt, ##__VA_ARGS__)
 
 static void
 show_jit_debug (struct ui_file *file, int from_tty,
@@ -69,84 +74,54 @@ show_jit_debug (struct ui_file *file, int from_tty,
   fprintf_filtered (file, _("JIT debugging is %s.\n"), value);
 }
 
-struct target_buffer
-{
-  CORE_ADDR base;
-  ULONGEST size;
-};
-
-/* Opening the file is a no-op.  */
-
-static void *
-mem_bfd_iovec_open (struct bfd *abfd, void *open_closure)
-{
-  return open_closure;
-}
-
-/* Closing the file is just freeing the base/size pair on our side.  */
-
-static int
-mem_bfd_iovec_close (struct bfd *abfd, void *stream)
-{
-  xfree (stream);
-
-  /* Zero means success.  */
-  return 0;
-}
+/* Implementation of the "maintenance info jit" command.  */
 
-/* For reading the file, we just need to pass through to target_read_memory and
-   fix up the arguments and return values.  */
-
-static file_ptr
-mem_bfd_iovec_pread (struct bfd *abfd, void *stream, void *buf,
-                    file_ptr nbytes, file_ptr offset)
+static void
+maint_info_jit_cmd (const char *args, int from_tty)
 {
-  int err;
-  struct target_buffer *buffer = (struct target_buffer *) stream;
-
-  /* If this read will read all of the file, limit it to just the rest.  */
-  if (offset + nbytes > buffer->size)
-    nbytes = buffer->size - offset;
+  inferior *inf = current_inferior ();
+  bool printed_header = false;
 
-  /* If there are no more bytes left, we've reached EOF.  */
-  if (nbytes == 0)
-    return 0;
-
-  err = target_read_memory (buffer->base + offset, (gdb_byte *) buf, nbytes);
-  if (err)
-    return -1;
+  gdb::optional<ui_out_emit_table> table_emitter;
 
-  return nbytes;
-}
-
-/* For statting the file, we only support the st_size attribute.  */
-
-static int
-mem_bfd_iovec_stat (struct bfd *abfd, void *stream, struct stat *sb)
-{
-  struct target_buffer *buffer = (struct target_buffer*) stream;
+  /* Print a line for each JIT-ed objfile.  */
+  for (objfile *obj : inf->pspace->objfiles ())
+    {
+      if (obj->jited_data == nullptr)
+       continue;
 
-  memset (sb, 0, sizeof (struct stat));
-  sb->st_size = buffer->size;
-  return 0;
-}
+      if (!printed_header)
+       {
+         table_emitter.emplace (current_uiout, 3, -1, "jit-created-objfiles");
+
+         /* The +2 allows for the leading '0x', then one character for
+            every 4-bits.  */
+         int addr_width = 2 + (gdbarch_ptr_bit (obj->arch ()) / 4);
+
+         /* The std::max here selects between the width of an address (as
+            a string) and the width of the column header string.  */
+         current_uiout->table_header (std::max (addr_width, 22), ui_left,
+                                      "jit_code_entry-address",
+                                      "jit_code_entry address");
+         current_uiout->table_header (std::max (addr_width, 15), ui_left,
+                                      "symfile-address", "symfile address");
+         current_uiout->table_header (20, ui_left,
+                                      "symfile-size", "symfile size");
+         current_uiout->table_body ();
+
+         printed_header = true;
+       }
 
-/* Open a BFD from the target's memory.  */
+      ui_out_emit_tuple tuple_emitter (current_uiout, "jit-objfile");
 
-static gdb_bfd_ref_ptr
-bfd_open_from_target_memory (CORE_ADDR addr, ULONGEST size,
-                            const char *target)
-{
-  struct target_buffer *buffer = XNEW (struct target_buffer);
-
-  buffer->base = addr;
-  buffer->size = size;
-  return gdb_bfd_openr_iovec ("<in-memory>", target,
-                             mem_bfd_iovec_open,
-                             buffer,
-                             mem_bfd_iovec_pread,
-                             mem_bfd_iovec_close,
-                             mem_bfd_iovec_stat);
+      current_uiout->field_core_addr ("jit_code_entry-address", obj->arch (),
+                                     obj->jited_data->addr);
+      current_uiout->field_core_addr ("symfile-address", obj->arch (),
+                                     obj->jited_data->symfile_addr);
+      current_uiout->field_unsigned ("symfile-size",
+                                     obj->jited_data->symfile_size);
+      current_uiout->text ("\n");
+    }
 }
 
 struct jit_reader
@@ -173,7 +148,7 @@ struct jit_reader
 static struct jit_reader *loaded_jit_reader = NULL;
 
 typedef struct gdb_reader_funcs * (reader_init_fn_type) (void);
-static const char *reader_init_fn_sym = "gdb_init_reader";
+static const char reader_init_fn_sym[] = "gdb_init_reader";
 
 /* Try to load FILE_NAME as a JIT debug info reader.  */
 
@@ -183,9 +158,8 @@ jit_reader_load (const char *file_name)
   reader_init_fn_type *init_fn;
   struct gdb_reader_funcs *funcs = NULL;
 
-  if (jit_debug)
-    fprintf_unfiltered (gdb_stdlog, _("Opening shared object %s.\n"),
-                       file_name);
+  jit_debug_printf ("Opening shared object %s", file_name);
+
   gdb_dlhandle_up so = gdb_dlopen (file_name);
 
   init_fn = (reader_init_fn_type *) gdb_dlsym (so, reader_init_fn_sym);
@@ -216,12 +190,12 @@ jit_reader_load_command (const char *args, int from_tty)
     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 ();
-  jit_inferior_created_hook ();
+  jit_inferior_created_hook (current_inferior ());
 }
 
 /* Provides the jit-reader-unload command.  */
@@ -239,86 +213,37 @@ jit_reader_unload_command (const char *args, int from_tty)
   loaded_jit_reader = NULL;
 }
 
-/* Per-program space structure recording which objfile has the JIT
-   symbols.  */
-
-struct jit_program_space_data
-{
-  /* The objfile.  This is NULL if no objfile holds the JIT
-     symbols.  */
-
-  struct objfile *objfile = nullptr;
-
-  /* If this program space has __jit_debug_register_code, this is the
-     cached address from the minimal symbol.  This is used to detect
-     relocations requiring the breakpoint to be re-created.  */
-
-  CORE_ADDR cached_code_address = 0;
-
-  /* This is the JIT event breakpoint, or NULL if it has not been
-     set.  */
-
-  struct breakpoint *jit_breakpoint = nullptr;
-};
-
-static program_space_key<jit_program_space_data> jit_program_space_key;
+/* Destructor for jiter_objfile_data.  */
 
-/* Destructor for jit_objfile_data.  */
-
-jit_objfile_data::~jit_objfile_data ()
+jiter_objfile_data::~jiter_objfile_data ()
 {
-  /* Free the data allocated in the jit_program_space_data slot.  */
-  if (this->register_code != NULL)
-    {
-      struct jit_program_space_data *ps_data;
-
-      ps_data = jit_program_space_key.get (this->objfile->pspace);
-      if (ps_data != NULL && ps_data->objfile == this->objfile)
-       {
-         ps_data->objfile = NULL;
-         if (ps_data->jit_breakpoint != NULL)
-           delete_breakpoint (ps_data->jit_breakpoint);
-         ps_data->cached_code_address = 0;
-       }
-    }
+  if (this->jit_breakpoint != nullptr)
+    delete_breakpoint (this->jit_breakpoint);
 }
 
-/* Fetch the jit_objfile_data associated with OBJF.  If no data exists
+/* Fetch the jiter_objfile_data associated with OBJF.  If no data exists
    yet, make a new structure and attach it.  */
 
-static struct jit_objfile_data *
-get_jit_objfile_data (struct objfile *objf)
+static jiter_objfile_data *
+get_jiter_objfile_data (objfile *objf)
 {
-  if (objf->jit_data == nullptr)
-    objf->jit_data.reset (new jit_objfile_data (objf));
+  if (objf->jiter_data == nullptr)
+    objf->jiter_data.reset (new jiter_objfile_data ());
 
-  return objf->jit_data.get ();
+  return objf->jiter_data.get ();
 }
 
 /* Remember OBJFILE has been created for struct jit_code_entry located
    at inferior address ENTRY.  */
 
 static void
-add_objfile_entry (struct objfile *objfile, CORE_ADDR entry)
+add_objfile_entry (struct objfile *objfile, CORE_ADDR entry,
+                  CORE_ADDR symfile_addr, ULONGEST symfile_size)
 {
-  struct jit_objfile_data *objf_data;
+  gdb_assert (objfile->jited_data == nullptr);
 
-  objf_data = get_jit_objfile_data (objfile);
-  objf_data->addr = entry;
-}
-
-/* Return jit_program_space_data for current program space.  Allocate
-   if not already present.  */
-
-static struct jit_program_space_data *
-get_jit_program_space_data ()
-{
-  struct jit_program_space_data *ps_data;
-
-  ps_data = jit_program_space_key.get (current_program_space);
-  if (ps_data == NULL)
-    ps_data = jit_program_space_key.emplace (current_program_space);
-  return ps_data;
+  objfile->jited_data.reset (new jited_objfile_data (entry, symfile_addr,
+                                                    symfile_size));
 }
 
 /* Helper function for reading the global JIT descriptor from remote
@@ -335,19 +260,14 @@ jit_read_descriptor (gdbarch *gdbarch,
   int desc_size;
   gdb_byte *desc_buf;
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-  struct jit_objfile_data *objf_data;
 
   gdb_assert (jiter != nullptr);
-  objf_data = get_jit_objfile_data (jiter);
+  jiter_objfile_data *objf_data = jiter->jiter_data.get ();
+  gdb_assert (objf_data != nullptr);
 
-  if (objf_data->descriptor == NULL)
-    return false;
+  CORE_ADDR addr = MSYMBOL_VALUE_ADDRESS (jiter, objf_data->descriptor);
 
-  if (jit_debug)
-    fprintf_unfiltered (gdb_stdlog,
-                       "jit_read_descriptor, descriptor_addr = %s\n",
-                       paddress (gdbarch, MSYMBOL_VALUE_ADDRESS (jiter,
-                                                                 objf_data->descriptor)));
+  jit_debug_printf ("descriptor_addr = %s", paddress (gdbarch, addr));
 
   /* Figure out how big the descriptor is on the remote and how to read it.  */
   ptr_type = builtin_type (gdbarch)->builtin_data_ptr;
@@ -356,13 +276,11 @@ jit_read_descriptor (gdbarch *gdbarch,
   desc_buf = (gdb_byte *) alloca (desc_size);
 
   /* Read the descriptor.  */
-  err = target_read_memory (MSYMBOL_VALUE_ADDRESS (jiter,
-                                                  objf_data->descriptor),
-                           desc_buf, desc_size);
+  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;
     }
 
@@ -490,7 +408,16 @@ struct gdb_object
 /* The type of the `private' data passed around by the callback
    functions.  */
 
-typedef CORE_ADDR jit_dbg_reader_data;
+struct jit_dbg_reader_data
+{
+  /* Address of the jit_code_entry in the inferior's address space.  */
+  CORE_ADDR entry_addr;
+
+  /* The code entry, copied in our address space.  */
+  const jit_code_entry &entry;
+
+  struct gdbarch *gdbarch;
+};
 
 /* The reader calls into this function to read data off the targets
    address space.  */
@@ -610,11 +537,11 @@ finalize_symtab (struct gdb_symtab *stab, struct objfile *objfile)
     });
 
   cust = allocate_compunit_symtab (objfile, stab->file_name.c_str ());
-  allocate_symtab (cust, stab->file_name.c_str ());
+  symtab *filetab = allocate_symtab (cust, stab->file_name.c_str ());
   add_compunit_symtab_to_objfile (cust);
 
   /* JIT compilers compile in memory.  */
-  COMPUNIT_DIRNAME (cust) = NULL;
+  cust->set_dirname (nullptr);
 
   /* Copy over the linetable entry if one was provided.  */
   if (stab->linetable)
@@ -622,17 +549,16 @@ finalize_symtab (struct gdb_symtab *stab, struct objfile *objfile)
       size_t size = ((stab->linetable->nitems - 1)
                     * sizeof (struct linetable_entry)
                     + sizeof (struct linetable));
-      SYMTAB_LINETABLE (COMPUNIT_FILETABS (cust))
-       = (struct linetable *) obstack_alloc (&objfile->objfile_obstack, size);
-      memcpy (SYMTAB_LINETABLE (COMPUNIT_FILETABS (cust)),
-             stab->linetable.get (), size);
+      filetab->set_linetable ((struct linetable *)
+                             obstack_alloc (&objfile->objfile_obstack, size));
+      memcpy (filetab->linetable (), stab->linetable.get (), size);
     }
 
   blockvector_size = (sizeof (struct blockvector)
                      + (actual_nblocks - 1) * sizeof (struct block *));
   bv = (struct blockvector *) obstack_alloc (&objfile->objfile_obstack,
                                             blockvector_size);
-  COMPUNIT_BLOCKVECTOR (cust) = bv;
+  cust->set_blockvector (bv);
 
   /* At the end of this function, (begin, end) will contain the PC range this
      entire blockvector spans.  */
@@ -661,10 +587,10 @@ finalize_symtab (struct gdb_symtab *stab, struct objfile *objfile)
       BLOCK_END (new_block) = (CORE_ADDR) gdb_block_iter.end;
 
       /* The name.  */
-      SYMBOL_DOMAIN (block_name) = VAR_DOMAIN;
-      SYMBOL_ACLASS_INDEX (block_name) = LOC_BLOCK;
-      symbol_set_symtab (block_name, COMPUNIT_FILETABS (cust));
-      SYMBOL_TYPE (block_name) = lookup_function_type (block_type);
+      block_name->set_domain (VAR_DOMAIN);
+      block_name->set_aclass_index (LOC_BLOCK);
+      symbol_set_symtab (block_name, filetab);
+      block_name->set_type (lookup_function_type (block_type));
       SYMBOL_BLOCK_VALUE (block_name) = new_block;
 
       block_name->m_name = obstack_strdup (&objfile->objfile_obstack,
@@ -733,19 +659,22 @@ static void
 jit_object_close_impl (struct gdb_symbol_callbacks *cb,
                       struct gdb_object *obj)
 {
-  struct objfile *objfile;
-  jit_dbg_reader_data *priv_data;
-
-  priv_data = (jit_dbg_reader_data *) cb->priv_data;
+  jit_dbg_reader_data *priv_data = (jit_dbg_reader_data *) cb->priv_data;
+  std::string objfile_name
+    = string_printf ("<< JIT compiled code at %s >>",
+                    paddress (priv_data->gdbarch,
+                              priv_data->entry.symfile_addr));
 
-  objfile = objfile::make (nullptr, "<< JIT compiled code >>",
-                          OBJF_NOT_FILENAME);
-  objfile->per_bfd->gdbarch = target_gdbarch ();
+  objfile *objfile = objfile::make (nullptr, objfile_name.c_str (),
+                                   OBJF_NOT_FILENAME);
+  objfile->per_bfd->gdbarch = priv_data->gdbarch;
 
   for (gdb_symtab &symtab : obj->symtabs)
     finalize_symtab (&symtab, objfile);
 
-  add_objfile_entry (objfile, *priv_data);
+  add_objfile_entry (objfile, priv_data->entry_addr,
+                    priv_data->entry.symfile_addr,
+                    priv_data->entry.symfile_size);
 
   delete obj;
 }
@@ -755,11 +684,16 @@ jit_object_close_impl (struct gdb_symbol_callbacks *cb,
    inferior address space.  */
 
 static int
-jit_reader_try_read_symtab (struct jit_code_entry *code_entry,
+jit_reader_try_read_symtab (gdbarch *gdbarch, jit_code_entry *code_entry,
                            CORE_ADDR entry_addr)
 {
   int status;
-  jit_dbg_reader_data priv_data;
+  jit_dbg_reader_data priv_data
+    {
+      entry_addr,
+      *code_entry,
+      gdbarch
+    };
   struct gdb_reader_funcs *funcs;
   struct gdb_symbol_callbacks callbacks =
     {
@@ -775,8 +709,6 @@ jit_reader_try_read_symtab (struct jit_code_entry *code_entry,
       &priv_data
     };
 
-  priv_data = entry_addr;
-
   if (!loaded_jit_reader)
     return 0;
 
@@ -803,9 +735,9 @@ jit_reader_try_read_symtab (struct jit_code_entry *code_entry,
        status = 0;
     }
 
-  if (jit_debug && status == 0)
-    fprintf_unfiltered (gdb_stdlog,
-                       "Could not read symtab using the loaded JIT reader.\n");
+  if (status == 0)
+    jit_debug_printf ("Could not read symtab using the loaded JIT reader.");
+
   return status;
 }
 
@@ -821,19 +753,16 @@ jit_bfd_try_read_symtab (struct jit_code_entry *code_entry,
   struct objfile *objfile;
   const struct bfd_arch_info *b;
 
-  if (jit_debug)
-    fprintf_unfiltered (gdb_stdlog,
-                       "jit_bfd_try_read_symtab, symfile_addr = %s, "
-                       "symfile_size = %s\n",
-                       paddress (gdbarch, code_entry->symfile_addr),
-                       pulongest (code_entry->symfile_size));
+  jit_debug_printf ("symfile_addr = %s, symfile_size = %s",
+                   paddress (gdbarch, code_entry->symfile_addr),
+                   pulongest (code_entry->symfile_size));
 
-  gdb_bfd_ref_ptr nbfd (bfd_open_from_target_memory (code_entry->symfile_addr,
-                                                    code_entry->symfile_size,
-                                                    gnutarget));
+  gdb_bfd_ref_ptr nbfd (gdb_bfd_open_from_target_memory
+      (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;
     }
 
@@ -841,7 +770,7 @@ jit_bfd_try_read_symtab (struct jit_code_entry *code_entry,
      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;
     }
@@ -874,7 +803,8 @@ JITed symbol file is not an object file, ignoring it.\n"));
                                      &sai,
                                      OBJF_SHARED | OBJF_NOT_FILENAME, NULL);
 
-  add_objfile_entry (objfile, entry_addr);
+  add_objfile_entry (objfile, entry_addr, code_entry->symfile_addr,
+                    code_entry->symfile_size);
 }
 
 /* This function registers code associated with a JIT code entry.  It uses the
@@ -888,14 +818,11 @@ jit_register_code (struct gdbarch *gdbarch,
 {
   int success;
 
-  if (jit_debug)
-    fprintf_unfiltered (gdb_stdlog,
-                       "jit_register_code, symfile_addr = %s, "
-                       "symfile_size = %s\n",
-                       paddress (gdbarch, code_entry->symfile_addr),
-                       pulongest (code_entry->symfile_size));
+  jit_debug_printf ("symfile_addr = %s, symfile_size = %s",
+                   paddress (gdbarch, code_entry->symfile_addr),
+                   pulongest (code_entry->symfile_size));
 
-  success = jit_reader_try_read_symtab (code_entry, entry_addr);
+  success = jit_reader_try_read_symtab (gdbarch, code_entry, entry_addr);
 
   if (!success)
     jit_bfd_try_read_symtab (code_entry, entry_addr, gdbarch);
@@ -908,7 +835,7 @@ jit_find_objf_with_entry_addr (CORE_ADDR entry_addr)
 {
   for (objfile *objf : current_program_space->objfiles ())
     {
-      if (objf->jit_data != nullptr && objf->jit_data->addr == entry_addr)
+      if (objf->jited_data != nullptr && objf->jited_data->addr == entry_addr)
        return objf;
     }
 
@@ -921,80 +848,84 @@ jit_find_objf_with_entry_addr (CORE_ADDR entry_addr)
 static void
 jit_breakpoint_deleted (struct breakpoint *b)
 {
-  struct bp_location *iter;
-
   if (b->type != bp_jit_event)
     return;
 
-  for (iter = b->loc; iter != NULL; iter = iter->next)
+  for (bp_location *iter : b->locations ())
     {
-      struct jit_program_space_data *ps_data;
-
-      ps_data = jit_program_space_key.get (iter->pspace);
-      if (ps_data != NULL && ps_data->jit_breakpoint == iter->owner)
+      for (objfile *objf : iter->pspace->objfiles ())
        {
-         ps_data->cached_code_address = 0;
-         ps_data->jit_breakpoint = NULL;
+         jiter_objfile_data *jiter_data = objf->jiter_data.get ();
+
+         if (jiter_data != nullptr
+             && jiter_data->jit_breakpoint == iter->owner)
+           {
+             jiter_data->cached_code_address = 0;
+             jiter_data->jit_breakpoint = nullptr;
+           }
        }
     }
 }
 
-/* (Re-)Initialize the jit breakpoint if necessary.
-   Return true if the jit breakpoint has been successfully initialized.  */
+/* (Re-)Initialize the jit breakpoints for JIT-producing objfiles in
+   PSPACE.  */
 
-static bool
-jit_breakpoint_re_set_internal (struct gdbarch *gdbarch,
-                               struct jit_program_space_data *ps_data)
+static void
+jit_breakpoint_re_set_internal (struct gdbarch *gdbarch, program_space *pspace)
 {
-  struct bound_minimal_symbol reg_symbol;
-  struct bound_minimal_symbol desc_symbol;
-  struct jit_objfile_data *objf_data;
-  CORE_ADDR addr;
-
-  if (ps_data->objfile == NULL)
+  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;
+
       /* Lookup the registration symbol.  If it is missing, then we
         assume we are not attached to a JIT.  */
-      reg_symbol = lookup_bound_minimal_symbol (jit_break_name);
+      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)
-       return false;
+       {
+         /* No need to repeat the lookup the next time.  */
+         the_objfile->skip_jit_symbol_lookup = true;
+         continue;
+       }
 
-      desc_symbol = lookup_minimal_symbol (jit_descriptor_name, NULL,
-                                          reg_symbol.objfile);
+      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)
-       return false;
+       {
+         /* No need to repeat the lookup the next time.  */
+         the_objfile->skip_jit_symbol_lookup = true;
+         continue;
+       }
 
-      objf_data = get_jit_objfile_data (reg_symbol.objfile);
+      jiter_objfile_data *objf_data
+       = get_jiter_objfile_data (the_objfile);
       objf_data->register_code = reg_symbol.minsym;
       objf_data->descriptor = desc_symbol.minsym;
 
-      ps_data->objfile = reg_symbol.objfile;
-    }
-  else
-    objf_data = get_jit_objfile_data (ps_data->objfile);
-
-  addr = MSYMBOL_VALUE_ADDRESS (ps_data->objfile, objf_data->register_code);
+      CORE_ADDR addr = MSYMBOL_VALUE_ADDRESS (the_objfile,
+                                             objf_data->register_code);
 
-  if (jit_debug)
-    fprintf_unfiltered (gdb_stdlog,
-                       "jit_breakpoint_re_set_internal, "
-                       "breakpoint_addr = %s\n",
-                       paddress (gdbarch, addr));
+      jit_debug_printf ("breakpoint_addr = %s", paddress (gdbarch, addr));
 
-  if (ps_data->cached_code_address == addr)
-    return true;
-
-  /* Delete the old breakpoint.  */
-  if (ps_data->jit_breakpoint != NULL)
-    delete_breakpoint (ps_data->jit_breakpoint);
+      /* Check if we need to re-create the breakpoint.  */
+      if (objf_data->cached_code_address == addr)
+       continue;
 
-  /* Put a breakpoint in the registration symbol.  */
-  ps_data->cached_code_address = addr;
-  ps_data->jit_breakpoint = create_jit_event_breakpoint (gdbarch, addr);
+      /* Delete the old breakpoint.  */
+      if (objf_data->jit_breakpoint != nullptr)
+       delete_breakpoint (objf_data->jit_breakpoint);
 
-  return true;
+      /* Put a breakpoint in the registration symbol.  */
+      objf_data->cached_code_address = addr;
+      objf_data->jit_breakpoint = create_jit_event_breakpoint (gdbarch, addr);
+    }
 }
 
 /* The private data passed around in the frame unwind callback
@@ -1025,10 +956,7 @@ jit_unwind_reg_set_impl (struct gdb_unwind_callbacks *cb, int dwarf_regnum,
                                          dwarf_regnum);
   if (gdb_reg == -1)
     {
-      if (jit_debug)
-       fprintf_unfiltered (gdb_stdlog,
-                           _("Could not recognize DWARF regnum %d"),
-                           dwarf_regnum);
+      jit_debug_printf ("Could not recognize DWARF regnum %d", dwarf_regnum);
       value->free (value);
       return;
     }
@@ -1119,14 +1047,11 @@ jit_frame_sniffer (const struct frame_unwind *self,
   /* Try to coax the provided unwinder to unwind the stack */
   if (funcs->unwind (funcs, &callbacks) == GDB_SUCCESS)
     {
-      if (jit_debug)
-       fprintf_unfiltered (gdb_stdlog, _("Successfully unwound frame using "
-                                         "JIT reader.\n"));
+      jit_debug_printf ("Successfully unwound frame using JIT reader.");
       return 1;
     }
-  if (jit_debug)
-    fprintf_unfiltered (gdb_stdlog, _("Could not unwind frame using "
-                                     "JIT reader.\n"));
+
+  jit_debug_printf ("Could not unwind frame using JIT reader.");
 
   jit_dealloc_cache (this_frame, *cache);
   *cache = NULL;
@@ -1191,6 +1116,7 @@ jit_frame_prev_register (struct frame_info *this_frame, void **cache, int reg)
 
 static const struct frame_unwind jit_frame_unwind =
 {
+  "jit",
   NORMAL_FRAME,
   default_frame_unwind_stop_reason,
   jit_frame_this_id,
@@ -1229,71 +1155,68 @@ jit_prepend_unwinder (struct gdbarch *gdbarch)
 /* Register any already created translations.  */
 
 static void
-jit_inferior_init (struct gdbarch *gdbarch)
+jit_inferior_init (inferior *inf)
 {
   struct jit_descriptor descriptor;
   struct jit_code_entry cur_entry;
-  struct jit_program_space_data *ps_data;
   CORE_ADDR cur_entry_addr;
+  struct gdbarch *gdbarch = inf->gdbarch;
+  program_space *pspace = inf->pspace;
 
-  if (jit_debug)
-    fprintf_unfiltered (gdb_stdlog, "jit_inferior_init\n");
+  jit_debug_printf ("called");
 
   jit_prepend_unwinder (gdbarch);
 
-  ps_data = get_jit_program_space_data ();
-  if (!jit_breakpoint_re_set_internal (gdbarch, ps_data))
-    return;
+  jit_breakpoint_re_set_internal (gdbarch, pspace);
 
-  /* There must be a JITer registered, otherwise we would exit early
-     above.  */
-  objfile *jiter = ps_data->objfile;
+  for (objfile *jiter : pspace->objfiles ())
+    {
+      if (jiter->jiter_data == nullptr)
+       continue;
 
-  /* Read the descriptor so we can check the version number and load
-     any already JITed functions.  */
-  if (!jit_read_descriptor (gdbarch, &descriptor, jiter))
-    return;
+      /* Read the descriptor so we can check the version number and load
+        any already JITed functions.  */
+      if (!jit_read_descriptor (gdbarch, &descriptor, jiter))
+       continue;
 
-  /* 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);
-      return;
-    }
+      /* Check that the version number agrees with that we support.  */
+      if (descriptor.version != 1)
+       {
+         fprintf_unfiltered (gdb_stderr,
+                             _("Unsupported JIT protocol version %ld "
+                               "in descriptor (expected 1)\n"),
+                             (long) descriptor.version);
+         continue;
+       }
 
-  /* If we've attached to a running program, we need to check the descriptor
-     to register any functions that were already generated.  */
-  for (cur_entry_addr = descriptor.first_entry;
-       cur_entry_addr != 0;
-       cur_entry_addr = cur_entry.next_entry)
-    {
-      jit_read_code_entry (gdbarch, cur_entry_addr, &cur_entry);
+      /* If we've attached to a running program, we need to check the
+        descriptor to register any functions that were already
+        generated.  */
+      for (cur_entry_addr = descriptor.first_entry;
+          cur_entry_addr != 0;
+          cur_entry_addr = cur_entry.next_entry)
+       {
+         jit_read_code_entry (gdbarch, cur_entry_addr, &cur_entry);
 
-      /* This hook may be called many times during setup, so make sure we don't
-        add the same symbol file twice.  */
-      if (jit_find_objf_with_entry_addr (cur_entry_addr) != NULL)
-       continue;
+         /* This hook may be called many times during setup, so make sure
+            we don't add the same symbol file twice.  */
+         if (jit_find_objf_with_entry_addr (cur_entry_addr) != NULL)
+           continue;
 
-      jit_register_code (gdbarch, cur_entry_addr, &cur_entry);
+         jit_register_code (gdbarch, cur_entry_addr, &cur_entry);
+       }
     }
 }
 
-/* inferior_created observer.  */
+/* Looks for the descriptor and registration symbols and breakpoints
+   the registration function.  If it finds both, it registers all the
+   already JITed code.  If it has already found the symbols, then it
+   doesn't try again.  */
 
 static void
-jit_inferior_created (struct target_ops *ops, int from_tty)
-{
-  jit_inferior_created_hook ();
-}
-
-/* Exported routine to call when an inferior has been created.  */
-
-void
-jit_inferior_created_hook (void)
+jit_inferior_created_hook (inferior *inf)
 {
-  jit_inferior_init (target_gdbarch ());
+  jit_inferior_init (inf);
 }
 
 /* Exported routine to call to re-set the jit breakpoints,
@@ -1302,8 +1225,7 @@ jit_inferior_created_hook (void)
 void
 jit_breakpoint_re_set (void)
 {
-  jit_breakpoint_re_set_internal (target_gdbarch (),
-                                 get_jit_program_space_data ());
+  jit_breakpoint_re_set_internal (target_gdbarch (), current_program_space);
 }
 
 /* This function cleans up any code entries left over when the
@@ -1315,7 +1237,7 @@ jit_inferior_exit_hook (struct inferior *inf)
 {
   for (objfile *objf : current_program_space->objfiles_safe ())
     {
-      if (objf->jit_data != nullptr && objf->jit_data->addr != 0)
+      if (objf->jited_data != nullptr && objf->jited_data->addr != 0)
        objf->unlink ();
     }
 }
@@ -1324,34 +1246,44 @@ void
 jit_event_handler (gdbarch *gdbarch, objfile *jiter)
 {
   struct jit_descriptor descriptor;
-  struct jit_code_entry code_entry;
-  CORE_ADDR entry_addr;
-  struct objfile *objf;
+
+  /* If we get a JIT breakpoint event for this objfile, it is necessarily a
+     JITer.  */
+  gdb_assert (jiter->jiter_data != nullptr);
 
   /* Read the descriptor from remote memory.  */
   if (!jit_read_descriptor (gdbarch, &descriptor, jiter))
     return;
-  entry_addr = descriptor.relevant_entry;
+  CORE_ADDR entry_addr = descriptor.relevant_entry;
 
   /* Do the corresponding action.  */
   switch (descriptor.action_flag)
     {
     case JIT_NOACTION:
       break;
+
     case JIT_REGISTER:
-      jit_read_code_entry (gdbarch, entry_addr, &code_entry);
-      jit_register_code (gdbarch, entry_addr, &code_entry);
-      break;
+      {
+       jit_code_entry code_entry;
+       jit_read_code_entry (gdbarch, entry_addr, &code_entry);
+       jit_register_code (gdbarch, entry_addr, &code_entry);
+       break;
+      }
+
     case JIT_UNREGISTER:
-      objf = jit_find_objf_with_entry_addr (entry_addr);
-      if (objf == NULL)
-       printf_unfiltered (_("Unable to find JITed code "
-                            "entry at address: %s\n"),
-                          paddress (gdbarch, entry_addr));
-      else
-       objf->unlink ();
+      {
+       objfile *jited = jit_find_objf_with_entry_addr (entry_addr);
+       if (jited == nullptr)
+         fprintf_unfiltered (gdb_stderr,
+                             _("Unable to find JITed code "
+                               "entry at address: %s\n"),
+                             paddress (gdbarch, entry_addr));
+       else
+         jited->unlink ();
+
+       break;
+      }
 
-      break;
     default:
       error (_("Unknown action_flag value in JIT descriptor!"));
       break;
@@ -1378,17 +1310,22 @@ _initialize_jit ()
 {
   jit_reader_dir = relocate_gdb_directory (JIT_READER_DIR,
                                           JIT_READER_DIR_RELOCATABLE);
-  add_setshow_zuinteger_cmd ("jit", class_maintenance, &jit_debug,
-                            _("Set JIT debugging."),
-                            _("Show JIT debugging."),
-                            _("When non-zero, JIT debugging is enabled."),
-                            NULL,
-                            show_jit_debug,
-                            &setdebuglist, &showdebuglist);
-
-  gdb::observers::inferior_created.attach (jit_inferior_created);
-  gdb::observers::inferior_exit.attach (jit_inferior_exit_hook);
-  gdb::observers::breakpoint_deleted.attach (jit_breakpoint_deleted);
+  add_setshow_boolean_cmd ("jit", class_maintenance, &jit_debug,
+                          _("Set JIT debugging."),
+                          _("Show JIT debugging."),
+                          _("When set, JIT debugging is enabled."),
+                          NULL,
+                          show_jit_debug,
+                          &setdebuglist, &showdebuglist);
+
+  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 ())