Add new_inferior, inferior_deleted, and new_thread events
[deliverable/binutils-gdb.git] / gdb / objfiles.c
index fc692d19f03391c3a3501f182abadda54e1f1051..e743834df19149048acc4c2b01827f900bfcb8d4 100644 (file)
@@ -1,6 +1,6 @@
 /* GDB routines for manipulating objfiles.
 
-   Copyright (C) 1992-2015 Free Software Foundation, Inc.
+   Copyright (C) 1992-2017 Free Software Foundation, Inc.
 
    Contributed by Cygnus Support, using pieces from other GDB modules.
 
@@ -53,6 +53,8 @@
 #include "gdb_bfd.h"
 #include "btrace.h"
 
+#include <vector>
+
 /* Keep a registry of per-objfile data-pointers required by other GDB
    modules.  */
 
@@ -83,7 +85,7 @@ static const struct program_space_data *objfiles_pspace_data;
 static void
 objfiles_pspace_data_cleanup (struct program_space *pspace, void *arg)
 {
-  struct objfile_pspace_info *info = arg;
+  struct objfile_pspace_info *info = (struct objfile_pspace_info *) arg;
 
   xfree (info->sections);
   xfree (info);
@@ -97,7 +99,8 @@ get_objfile_pspace_data (struct program_space *pspace)
 {
   struct objfile_pspace_info *info;
 
-  info = program_space_data (pspace, objfiles_pspace_data);
+  info = ((struct objfile_pspace_info *)
+         program_space_data (pspace, objfiles_pspace_data));
   if (info == NULL)
     {
       info = XCNEW (struct objfile_pspace_info);
@@ -127,7 +130,8 @@ get_objfile_bfd_data (struct objfile *objfile, struct bfd *abfd)
   struct objfile_per_bfd_storage *storage = NULL;
 
   if (abfd != NULL)
-    storage = bfd_data (abfd, objfiles_bfd_data);
+    storage = ((struct objfile_per_bfd_storage *)
+              bfd_data (abfd, objfiles_bfd_data));
 
   if (storage == NULL)
     {
@@ -138,18 +142,24 @@ get_objfile_bfd_data (struct objfile *objfile, struct bfd *abfd)
        {
          storage
            = ((struct objfile_per_bfd_storage *)
-              bfd_zalloc (abfd, sizeof (struct objfile_per_bfd_storage)));
+              bfd_alloc (abfd, sizeof (struct objfile_per_bfd_storage)));
          set_bfd_data (abfd, objfiles_bfd_data, storage);
        }
       else
-       storage = OBSTACK_ZALLOC (&objfile->objfile_obstack,
-                                 struct objfile_per_bfd_storage);
+       {
+         storage = (objfile_per_bfd_storage *)
+           obstack_alloc (&objfile->objfile_obstack,
+                          sizeof (objfile_per_bfd_storage));
+       }
+
+      /* objfile_per_bfd_storage is not trivially constructible, must
+        call the ctor manually.  */
+      storage = new (storage) objfile_per_bfd_storage ();
 
       /* Look up the gdbarch associated with the BFD.  */
       if (abfd != NULL)
        storage->gdbarch = gdbarch_from_bfd (abfd);
 
-      obstack_init (&storage->storage_obstack);
       storage->filename_cache = bcache_xmalloc (NULL, NULL);
       storage->macro_cache = bcache_xmalloc (NULL, NULL);
       storage->language_of_main = language_unknown;
@@ -167,7 +177,7 @@ free_objfile_per_bfd_storage (struct objfile_per_bfd_storage *storage)
   bcache_xfree (storage->macro_cache);
   if (storage->demangled_names_hash)
     htab_delete (storage->demangled_names_hash);
-  obstack_free (&storage->storage_obstack, 0);
+  storage->~objfile_per_bfd_storage ();
 }
 
 /* A wrapper for free_objfile_per_bfd_storage that can be passed as a
@@ -176,7 +186,7 @@ free_objfile_per_bfd_storage (struct objfile_per_bfd_storage *storage)
 static void
 objfile_bfd_data_free (struct bfd *unused, void *d)
 {
-  free_objfile_per_bfd_storage (d);
+  free_objfile_per_bfd_storage ((struct objfile_per_bfd_storage *) d);
 }
 
 /* See objfiles.h.  */
@@ -320,7 +330,7 @@ static void
 add_to_objfile_sections (struct bfd *abfd, struct bfd_section *asect,
                         void *objfilep)
 {
-  add_to_objfile_sections_full (abfd, asect, objfilep, 0);
+  add_to_objfile_sections_full (abfd, asect, (struct objfile *) objfilep, 0);
 }
 
 /* Builds a section table for OBJFILE.
@@ -361,20 +371,11 @@ build_objfile_section_table (struct objfile *objfile)
    requests for specific operations.  Other bits like OBJF_SHARED are
    simply copied through to the new objfile flags member.  */
 
-/* NOTE: carlton/2003-02-04: This function is called with args NULL, 0
-   by jv-lang.c, to create an artificial objfile used to hold
-   information about dynamically-loaded Java classes.  Unfortunately,
-   that branch of this function doesn't get tested very frequently, so
-   it's prone to breakage.  (E.g. at one time the name was set to NULL
-   in that situation, which broke a loop over all names in the dynamic
-   library loader.)  If you change this function, please try to leave
-   things in a consistent state even if abfd is NULL.  */
-
 struct objfile *
-allocate_objfile (bfd *abfd, const char *name, int flags)
+allocate_objfile (bfd *abfd, const char *name, objfile_flags flags)
 {
   struct objfile *objfile;
-  char *expanded_name;
+  const char *expanded_name;
 
   objfile = XCNEW (struct objfile);
   objfile->psymbol_cache = psymbol_bcache_init ();
@@ -384,22 +385,25 @@ allocate_objfile (bfd *abfd, const char *name, int flags)
 
   objfile_alloc_data (objfile);
 
+  gdb::unique_xmalloc_ptr<char> name_holder;
   if (name == NULL)
     {
       gdb_assert (abfd == NULL);
       gdb_assert ((flags & OBJF_NOT_FILENAME) != 0);
-      expanded_name = xstrdup ("<<anonymous objfile>>");
+      expanded_name = "<<anonymous objfile>>";
     }
   else if ((flags & OBJF_NOT_FILENAME) != 0
           || is_target_filename (name))
-    expanded_name = xstrdup (name);
+    expanded_name = name;
   else
-    expanded_name = gdb_abspath (name);
+    {
+      name_holder = gdb_abspath (name);
+      expanded_name = name_holder.get ();
+    }
   objfile->original_name
     = (char *) obstack_copy0 (&objfile->objfile_obstack,
                              expanded_name,
                              strlen (expanded_name));
-  xfree (expanded_name);
 
   /* Update the per-objfile information that comes from the bfd, ensuring
      that any data that is reference is saved in the per-objfile data
@@ -755,7 +759,7 @@ free_objfile (struct objfile *objfile)
 static void
 do_free_objfile_cleanup (void *obj)
 {
-  free_objfile (obj);
+  free_objfile ((struct objfile *) obj);
 }
 
 struct cleanup *
@@ -941,7 +945,6 @@ objfile_relocate (struct objfile *objfile,
        debug_objfile = objfile_separate_debug_iterate (objfile, debug_objfile))
     {
       struct section_addr_info *objfile_addrs;
-      struct section_offsets *new_debug_offsets;
       struct cleanup *my_cleanups;
 
       objfile_addrs = build_section_addr_info_from_objfile (objfile);
@@ -954,15 +957,13 @@ objfile_relocate (struct objfile *objfile,
 
       gdb_assert (debug_objfile->num_sections
                  == gdb_bfd_count_sections (debug_objfile->obfd));
-      new_debug_offsets = 
-       ((struct section_offsets *)
-        xmalloc (SIZEOF_N_SECTION_OFFSETS (debug_objfile->num_sections)));
-      make_cleanup (xfree, new_debug_offsets);
-      relative_addr_info_to_section_offsets (new_debug_offsets,
+      std::vector<struct section_offsets>
+       new_debug_offsets (SIZEOF_N_SECTION_OFFSETS (debug_objfile->num_sections));
+      relative_addr_info_to_section_offsets (new_debug_offsets.data (),
                                             debug_objfile->num_sections,
                                             objfile_addrs);
 
-      changed |= objfile_relocate1 (debug_objfile, new_debug_offsets);
+      changed |= objfile_relocate1 (debug_objfile, new_debug_offsets.data ());
 
       do_cleanups (my_cleanups);
     }
@@ -1477,7 +1478,7 @@ find_pc_section (CORE_ADDR pc)
 /* Return non-zero if PC is in a section called NAME.  */
 
 int
-pc_in_section (CORE_ADDR pc, char *name)
+pc_in_section (CORE_ADDR pc, const char *name)
 {
   struct obj_section *s;
   int retval = 0;
@@ -1522,7 +1523,7 @@ resume_section_map_updates (struct program_space *pspace)
 void
 resume_section_map_updates_cleanup (void *arg)
 {
-  resume_section_map_updates (arg);
+  resume_section_map_updates ((struct program_space *) arg);
 }
 
 /* Return 1 if ADDR maps into one of the sections of OBJFILE and 0
@@ -1629,9 +1630,6 @@ objfile_flavour_name (struct objfile *objfile)
   return NULL;
 }
 
-/* Provide a prototype to silence -Wmissing-prototypes.  */
-extern initialize_file_ftype _initialize_objfiles;
-
 void
 _initialize_objfiles (void)
 {
This page took 0.02674 seconds and 4 git commands to generate.