Change objfile to use new/delete
[deliverable/binutils-gdb.git] / gdb / solib.c
index fc45133fd0f88964b6223f252fa857a0c82657f4..f9f7217b7d6fdd080ff0692ad292552b76f67a7a 100644 (file)
@@ -89,9 +89,6 @@ set_solib_ops (struct gdbarch *gdbarch, const struct target_so_ops *new_ops)
    configuration needs to call set_solib_ops.  */
 struct target_so_ops *current_target_so_ops;
 
-/* List of known shared objects */
-#define so_list_head current_program_space->so_list
-
 /* Local function prototypes */
 
 /* If non-empty, this is a search path for loading non-absolute shared library
@@ -353,16 +350,15 @@ solib_find_1 (const char *in_pathname, int *fd, int is_solib)
 
   /* If not found, next search the inferior's $PATH environment variable.  */
   if (found_file < 0 && sysroot == NULL)
-    found_file = openp (get_in_environ (current_inferior ()->environment,
-                                       "PATH"),
+    found_file = openp (current_inferior ()->environment.get ("PATH"),
                        OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH, in_pathname,
                        O_RDONLY | O_BINARY, &temp_pathname);
 
   /* If not found, and we're looking for a solib, next search the
      inferior's $LD_LIBRARY_PATH environment variable.  */
   if (is_solib && found_file < 0 && sysroot == NULL)
-    found_file = openp (get_in_environ (current_inferior ()->environment,
-                                       "LD_LIBRARY_PATH"),
+    found_file = openp (current_inferior ()->environment.get
+                       ("LD_LIBRARY_PATH"),
                        OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH, in_pathname,
                        O_RDONLY | O_BINARY, &temp_pathname);
 
@@ -550,14 +546,10 @@ static int
 solib_map_sections (struct so_list *so)
 {
   const struct target_so_ops *ops = solib_ops (target_gdbarch ());
-  char *filename;
   struct target_section *p;
-  struct cleanup *old_chain;
 
-  filename = tilde_expand (so->so_name);
-  old_chain = make_cleanup (xfree, filename);
-  gdb_bfd_ref_ptr abfd (ops->bfd_open (filename));
-  do_cleanups (old_chain);
+  gdb::unique_xmalloc_ptr<char> filename (tilde_expand (so->so_name));
+  gdb_bfd_ref_ptr abfd (ops->bfd_open (filename.get ()));
 
   if (abfd == NULL)
     return 0;
@@ -749,31 +741,10 @@ solib_used (const struct so_list *const known)
   return 0;
 }
 
-/* Synchronize GDB's shared object list with inferior's.
-
-   Extract the list of currently loaded shared objects from the
-   inferior, and compare it with the list of shared objects currently
-   in GDB's so_list_head list.  Edit so_list_head to bring it in sync
-   with the inferior's new list.
-
-   If we notice that the inferior has unloaded some shared objects,
-   free any symbolic info GDB had read about those shared objects.
-
-   Don't load symbolic info for any new shared objects; just add them
-   to the list, and leave their symbols_loaded flag clear.
-
-   If FROM_TTY is non-null, feel free to print messages about what
-   we're doing.
-
-   If TARGET is non-null, add the sections of all new shared objects
-   to TARGET's section table.  Note that this doesn't remove any
-   sections for shared objects that have been unloaded, and it
-   doesn't check to see if the new shared objects are already present in
-   the section table.  But we only use this for core files and
-   processes we've just attached to, so that's okay.  */
+/* See solib.h.  */
 
-static void
-update_solib_list (int from_tty, struct target_ops *target)
+void
+update_solib_list (int from_tty)
 {
   const struct target_so_ops *ops = solib_ops (target_gdbarch ());
   struct so_list *inferior = ops->current_sos();
@@ -789,9 +760,19 @@ update_solib_list (int from_tty, struct target_ops *target)
         have not opened a symbol file, we may be able to get its
         symbols now!  */
       if (inf->attach_flag && symfile_objfile == NULL)
-       catch_errors (ops->open_symbol_file_object, &from_tty,
-                     "Error reading attached process's symbol file.\n",
-                     RETURN_MASK_ALL);
+       {
+         TRY
+           {
+             ops->open_symbol_file_object (from_tty);
+           }
+         CATCH (ex, RETURN_MASK_ALL)
+           {
+             exception_fprintf (gdb_stderr, ex,
+                                "Error reading attached "
+                                "process's symbol file.\n");
+           }
+         END_CATCH
+       }
     }
 
   /* GDB and the inferior's dynamic linker each maintain their own
@@ -870,7 +851,7 @@ update_solib_list (int from_tty, struct target_ops *target)
          /* Unless the user loaded it explicitly, free SO's objfile.  */
          if (gdb->objfile && ! (gdb->objfile->flags & OBJF_USERLOADED)
              && !solib_used (gdb))
-           free_objfile (gdb->objfile);
+           delete gdb->objfile;
 
          /* Some targets' section tables might be referring to
             sections from so->abfd; remove them.  */
@@ -974,11 +955,10 @@ libpthread_solib_p (struct so_list *so)
    If READSYMS is 0, defer reading symbolic information until later
    but still do any needed low level processing.
 
-   FROM_TTY and TARGET are as described for update_solib_list, above.  */
+   FROM_TTY is described for update_solib_list, above.  */
 
 void
-solib_add (const char *pattern, int from_tty,
-          struct target_ops *target, int readsyms)
+solib_add (const char *pattern, int from_tty, int readsyms)
 {
   struct so_list *gdb;
 
@@ -1003,7 +983,7 @@ solib_add (const char *pattern, int from_tty,
        error (_("Invalid regexp: %s"), re_err);
     }
 
-  update_solib_list (from_tty, target);
+  update_solib_list (from_tty);
 
   /* Walk the list of currently loaded shared libraries, and read
      symbols for any that match the pattern --- or any whose symbols
@@ -1071,7 +1051,6 @@ info_sharedlibrary_command (char *pattern, int from_tty)
   int so_missing_debug_info = 0;
   int addr_width;
   int nr_libs;
-  struct cleanup *table_cleanup;
   struct gdbarch *gdbarch = target_gdbarch ();
   struct ui_out *uiout = current_uiout;
 
@@ -1086,10 +1065,10 @@ info_sharedlibrary_command (char *pattern, int from_tty)
   /* "0x", a little whitespace, and two hex digits per byte of pointers.  */
   addr_width = 4 + (gdbarch_ptr_bit (gdbarch) / 4);
 
-  update_solib_list (from_tty, 0);
+  update_solib_list (from_tty);
 
-  /* make_cleanup_ui_out_table_begin_end needs to know the number of
-     rows, so we need to make two passes over the libs.  */
+  /* ui_out_emit_table table_emitter needs to know the number of rows,
+     so we need to make two passes over the libs.  */
 
   for (nr_libs = 0, so = so_list_head; so; so = so->next)
     {
@@ -1101,58 +1080,52 @@ info_sharedlibrary_command (char *pattern, int from_tty)
        }
     }
 
-  table_cleanup =
-    make_cleanup_ui_out_table_begin_end (uiout, 4, nr_libs,
-                                        "SharedLibraryTable");
-
-  /* The "- 1" is because ui_out adds one space between columns.  */
-  uiout->table_header (addr_width - 1, ui_left, "from", "From");
-  uiout->table_header (addr_width - 1, ui_left, "to", "To");
-  uiout->table_header (12 - 1, ui_left, "syms-read", "Syms Read");
-  uiout->table_header (0, ui_noalign, "name", "Shared Object Library");
-
-  uiout->table_body ();
-
-  for (so = so_list_head; so; so = so->next)
-    {
-      struct cleanup *lib_cleanup;
-
-      if (! so->so_name[0])
-       continue;
-      if (pattern && ! re_exec (so->so_name))
-       continue;
-
-      lib_cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, "lib");
-
-      if (so->addr_high != 0)
-       {
-         uiout->field_core_addr ("from", gdbarch, so->addr_low);
-         uiout->field_core_addr ("to", gdbarch, so->addr_high);
-       }
-      else
-       {
-         uiout->field_skip ("from");
-         uiout->field_skip ("to");
-       }
-
-      if (! interp_ui_out (top_level_interpreter ())->is_mi_like_p ()
-         && so->symbols_loaded
-         && !objfile_has_symbols (so->objfile))
-       {
-         so_missing_debug_info = 1;
-         uiout->field_string ("syms-read", "Yes (*)");
-       }
-      else
-       uiout->field_string ("syms-read", so->symbols_loaded ? "Yes" : "No");
-
-      uiout->field_string ("name", so->so_name);
+  {
+    ui_out_emit_table table_emitter (uiout, 4, nr_libs, "SharedLibraryTable");
 
-      uiout->text ("\n");
+    /* The "- 1" is because ui_out adds one space between columns.  */
+    uiout->table_header (addr_width - 1, ui_left, "from", "From");
+    uiout->table_header (addr_width - 1, ui_left, "to", "To");
+    uiout->table_header (12 - 1, ui_left, "syms-read", "Syms Read");
+    uiout->table_header (0, ui_noalign, "name", "Shared Object Library");
 
-      do_cleanups (lib_cleanup);
-    }
+    uiout->table_body ();
 
-  do_cleanups (table_cleanup);
+    ALL_SO_LIBS (so)
+      {
+       if (! so->so_name[0])
+         continue;
+       if (pattern && ! re_exec (so->so_name))
+         continue;
+
+       ui_out_emit_tuple tuple_emitter (uiout, "lib");
+
+       if (so->addr_high != 0)
+         {
+           uiout->field_core_addr ("from", gdbarch, so->addr_low);
+           uiout->field_core_addr ("to", gdbarch, so->addr_high);
+         }
+       else
+         {
+           uiout->field_skip ("from");
+           uiout->field_skip ("to");
+         }
+
+       if (! interp_ui_out (top_level_interpreter ())->is_mi_like_p ()
+           && so->symbols_loaded
+           && !objfile_has_symbols (so->objfile))
+         {
+           so_missing_debug_info = 1;
+           uiout->field_string ("syms-read", "Yes (*)");
+         }
+       else
+         uiout->field_string ("syms-read", so->symbols_loaded ? "Yes" : "No");
+
+       uiout->field_string ("name", so->so_name);
+
+       uiout->text ("\n");
+      }
+  }
 
   if (nr_libs == 0)
     {
@@ -1276,7 +1249,7 @@ static void
 sharedlibrary_command (char *args, int from_tty)
 {
   dont_repeat ();
-  solib_add (args, from_tty, (struct target_ops *) 0, 1);
+  solib_add (args, from_tty, 1);
 }
 
 /* Implements the command "nosharedlibrary", which discards symbols
@@ -1322,9 +1295,9 @@ handle_solib_event (void)
   /* Check for any newly added shared libraries if we're supposed to
      be adding them automatically.  Switch terminal for any messages
      produced by breakpoint_re_set.  */
-  target_terminal_ours_for_output ();
-  solib_add (NULL, 0, &current_target, auto_solib_add);
-  target_terminal_inferior ();
+  target_terminal::ours_for_output ();
+  solib_add (NULL, 0, auto_solib_add);
+  target_terminal::inferior ();
 }
 
 /* Reload shared libraries, but avoid reloading the same symbol file
@@ -1334,28 +1307,24 @@ static void
 reload_shared_libraries_1 (int from_tty)
 {
   struct so_list *so;
-  struct cleanup *old_chain = make_cleanup (null_cleanup, NULL);
 
   if (print_symbol_loading_p (from_tty, 0, 0))
     printf_unfiltered (_("Loading symbols for shared libraries.\n"));
 
   for (so = so_list_head; so != NULL; so = so->next)
     {
-      char *filename, *found_pathname = NULL;
+      char *found_pathname = NULL;
       int was_loaded = so->symbols_loaded;
       symfile_add_flags add_flags = SYMFILE_DEFER_BP_RESET;
 
       if (from_tty)
        add_flags |= SYMFILE_VERBOSE;
 
-      filename = tilde_expand (so->so_original_name);
-      make_cleanup (xfree, filename);
-      gdb_bfd_ref_ptr abfd (solib_bfd_open (filename));
+      gdb::unique_xmalloc_ptr<char> filename
+       (tilde_expand (so->so_original_name));
+      gdb_bfd_ref_ptr abfd (solib_bfd_open (filename.get ()));
       if (abfd != NULL)
-       {
-         found_pathname = xstrdup (bfd_get_filename (abfd.get ()));
-         make_cleanup (xfree, found_pathname);
-       }
+       found_pathname = bfd_get_filename (abfd.get ());
 
       /* If this shared library is no longer associated with its previous
         symbol file, close that.  */
@@ -1365,7 +1334,7 @@ reload_shared_libraries_1 (int from_tty)
        {
          if (so->objfile && ! (so->objfile->flags & OBJF_USERLOADED)
              && !solib_used (so))
-           free_objfile (so->objfile);
+           delete so->objfile;
          remove_target_sections (so);
          clear_so (so);
        }
@@ -1397,8 +1366,6 @@ reload_shared_libraries_1 (int from_tty)
              solib_read_symbols (so, add_flags);
        }
     }
-
-  do_cleanups (old_chain);
 }
 
 static void
@@ -1441,7 +1408,7 @@ reload_shared_libraries (char *ignored, int from_tty,
      removed.  Call it only after the solib target has been initialized by
      solib_create_inferior_hook.  */
 
-  solib_add (NULL, 0, NULL, auto_solib_add);
+  solib_add (NULL, 0, auto_solib_add);
 
   breakpoint_re_set ();
 
@@ -1643,8 +1610,6 @@ remove_user_added_objfile (struct objfile *objfile)
     }
 }
 
-extern initialize_file_ftype _initialize_solib; /* -Wmissing-prototypes */
-
 void
 _initialize_solib (void)
 {
This page took 0.033367 seconds and 4 git commands to generate.