Allocate dwz_file with new
authorTom Tromey <tom@tromey.com>
Wed, 16 May 2018 20:33:15 +0000 (14:33 -0600)
committerTom Tromey <tom@tromey.com>
Fri, 18 May 2018 21:12:14 +0000 (15:12 -0600)
This adds a constructor to struct dwz_file and arranges for it to be
allocated with "new" and wrapped in a unique_ptr.  This cuts down on
the amount of manual memory management that must be done.

Regression tested by the buildbot.

gdb/ChangeLog
2018-05-18  Tom Tromey  <tom@tromey.com>

* dwarf2read.c (struct dwz_file): Add constructor, initializers.
<dwz_bfd>: Now a gdb_bfd_ref_ptr.
(~dwarf2_per_objfile): Update
(dwarf2_get_dwz_file): Use new.
* dwarf2read.h (struct dwarf2_per_objfile) <dwz_file>: Now a
unique_ptr.

gdb/ChangeLog
gdb/dwarf2read.c
gdb/dwarf2read.h

index 54010899508b05b49e9db42e8ddc281ba6c0cdd9..3c829df12d495fd46fb0f244a1f1c8ca749419b0 100644 (file)
@@ -1,3 +1,12 @@
+2018-05-18  Tom Tromey  <tom@tromey.com>
+
+       * dwarf2read.c (struct dwz_file): Add constructor, initializers.
+       <dwz_bfd>: Now a gdb_bfd_ref_ptr.
+       (~dwarf2_per_objfile): Update
+       (dwarf2_get_dwz_file): Use new.
+       * dwarf2read.h (struct dwarf2_per_objfile) <dwz_file>: Now a
+       unique_ptr.
+
 2018-05-18  Tom Tromey  <tom@tromey.com>
 
        * dwarf2read.h (struct dwarf2_per_objfile) <dwp_file>: Now a
index dc149012efbb0f763cd3e39ed8f1026b9c0a79df..0690785c5e404c823048062eb8dbd5a06dc8b22c 100644 (file)
@@ -845,17 +845,22 @@ struct dwp_file
 
 struct dwz_file
 {
+  dwz_file (gdb_bfd_ref_ptr &&bfd)
+    : dwz_bfd (std::move (bfd))
+  {
+  }
+
   /* A dwz file can only contain a few sections.  */
-  struct dwarf2_section_info abbrev;
-  struct dwarf2_section_info info;
-  struct dwarf2_section_info str;
-  struct dwarf2_section_info line;
-  struct dwarf2_section_info macro;
-  struct dwarf2_section_info gdb_index;
-  struct dwarf2_section_info debug_names;
+  struct dwarf2_section_info abbrev {};
+  struct dwarf2_section_info info {};
+  struct dwarf2_section_info str {};
+  struct dwarf2_section_info line {};
+  struct dwarf2_section_info macro {};
+  struct dwarf2_section_info gdb_index {};
+  struct dwarf2_section_info debug_names {};
 
   /* The dwz's BFD.  */
-  bfd *dwz_bfd;
+  gdb_bfd_ref_ptr dwz_bfd;
 };
 
 /* Struct used to pass misc. parameters to read_die_and_children, et
@@ -2151,9 +2156,6 @@ dwarf2_per_objfile::~dwarf2_per_objfile ()
   if (dwo_files != NULL)
     free_dwo_files (dwo_files, objfile);
 
-  if (dwz_file != NULL && dwz_file->dwz_bfd)
-    gdb_bfd_unref (dwz_file->dwz_bfd);
-
   /* Everything else should be on the objfile obstack.  */
 }
 
@@ -2639,13 +2641,12 @@ static struct dwz_file *
 dwarf2_get_dwz_file (struct dwarf2_per_objfile *dwarf2_per_objfile)
 {
   const char *filename;
-  struct dwz_file *result;
   bfd_size_type buildid_len_arg;
   size_t buildid_len;
   bfd_byte *buildid;
 
   if (dwarf2_per_objfile->dwz_file != NULL)
-    return dwarf2_per_objfile->dwz_file;
+    return dwarf2_per_objfile->dwz_file.get ();
 
   bfd_set_error (bfd_error_no_error);
   gdb::unique_xmalloc_ptr<char> data
@@ -2691,15 +2692,16 @@ dwarf2_get_dwz_file (struct dwarf2_per_objfile *dwarf2_per_objfile)
     error (_("could not find '.gnu_debugaltlink' file for %s"),
           objfile_name (dwarf2_per_objfile->objfile));
 
-  result = OBSTACK_ZALLOC (&dwarf2_per_objfile->objfile->objfile_obstack,
-                          struct dwz_file);
-  result->dwz_bfd = dwz_bfd.release ();
+  std::unique_ptr<struct dwz_file> result
+    (new struct dwz_file (std::move (dwz_bfd)));
 
-  bfd_map_over_sections (result->dwz_bfd, locate_dwz_sections, result);
+  bfd_map_over_sections (result->dwz_bfd.get (), locate_dwz_sections,
+                        result.get ());
 
-  gdb_bfd_record_inclusion (dwarf2_per_objfile->objfile->obfd, result->dwz_bfd);
-  dwarf2_per_objfile->dwz_file = result;
-  return result;
+  gdb_bfd_record_inclusion (dwarf2_per_objfile->objfile->obfd,
+                           result->dwz_bfd.get ());
+  dwarf2_per_objfile->dwz_file = std::move (result);
+  return dwarf2_per_objfile->dwz_file.get ();
 }
 \f
 /* DWARF quick_symbols_functions support.  */
index 1e0663be1600f5e825ce456b367106ce188b5a09..fbac7171debb4e4b3f5124a8f5927e978501f228 100644 (file)
@@ -198,7 +198,7 @@ public:
 
   /* The shared '.dwz' file, if one exists.  This is used when the
      original data was compressed using 'dwz -m'.  */
-  struct dwz_file *dwz_file = NULL;
+  std::unique_ptr<struct dwz_file> dwz_file;
 
   /* A flag indicating whether this objfile has a section loaded at a
      VMA of 0.  */