Patchwork [RFA] Allocate dwz_file with new

login
register
mail settings
Submitter Tom Tromey
Date May 16, 2018, 11:32 p.m.
Message ID <20180516233205.22139-1-tom@tromey.com>
Download mbox | patch
Permalink /patch/27309/
State New
Headers show

Comments

Tom Tromey - May 16, 2018, 11:32 p.m.
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-16  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    |  9 +++++++++
 gdb/dwarf2read.c | 42 ++++++++++++++++++++++--------------------
 gdb/dwarf2read.h |  2 +-
 3 files changed, 32 insertions(+), 21 deletions(-)
Simon Marchi - May 18, 2018, 8:21 p.m.
On 2018-05-16 07:32 PM, Tom Tromey wrote:
> 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.

LGTM, thanks.

Simon

Patch

diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 575d316cdd..227ff71aa5 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -842,17 +842,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
@@ -2150,9 +2155,6 @@  dwarf2_per_objfile::~dwarf2_per_objfile ()
   if (dwp_file != NULL)
     gdb_bfd_unref (dwp_file->dbfd);
 
-  if (dwz_file != NULL && dwz_file->dwz_bfd)
-    gdb_bfd_unref (dwz_file->dwz_bfd);
-
   if (index_table != NULL)
     index_table->~mapped_index ();
 
@@ -2641,13 +2643,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
@@ -2693,15 +2694,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 ();
 }
 
 /* DWARF quick_symbols_functions support.  */
diff --git a/gdb/dwarf2read.h b/gdb/dwarf2read.h
index 8e6c41dc09..a1891def6c 100644
--- a/gdb/dwarf2read.h
+++ b/gdb/dwarf2read.h
@@ -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.  */