public inbox for gdb-cvs@sourceware.org
help / color / mirror / Atom feed
* [binutils-gdb] gdb: Remove use of VEC from dwarf2read.c
@ 2019-10-15 19:14 Andrew Burgess
  0 siblings, 0 replies; only message in thread
From: Andrew Burgess @ 2019-10-15 19:14 UTC (permalink / raw)
  To: gdb-cvs

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=ae6400219c19f165692254740531b2a7ad74945e

commit ae6400219c19f165692254740531b2a7ad74945e
Author: Andrew Burgess <andrew.burgess@embecosm.com>
Date:   Wed Oct 2 15:38:51 2019 +0100

    gdb: Remove use of VEC from dwarf2read.c
    
    This removes a use of VEC from GDB, from dwarf2read.c.  This removal
    is not very clean, and would probably benefit from additional
    refactoring in the future.
    
    The problem here is that the VEC is contained within struct
    dwarf2_per_cu_data, which is treated as POD in dwarf2read.c.  As such
    it is actually a VEC pointer.  When converting this to a std::vector
    in an ideal world we would not use a std::vector pointer, and use the
    std::vector directly.  Sadly, to do that would require some rewriting
    in dwarf2read.c - my concern would be introducing bugs during this
    rewrite.
    
    If we move to a std::vector pointer then we need to take care to
    handle the case where the pointer is null.  The old VEC library would
    handle null for us, making the VEC interface very clean.  With
    std::vector we need to handle the null pointer case ourselves.
    
    The achieve this then I've added a small number of function that wrap
    up access to the std::vector, hopefully hiding the null pointer
    management.
    
    The final ugliness with this conversion is that, ideally, when
    wrapping a data member behind an interface I would make the data
    member private, however, treating the structure as POD once again
    prevents this, so we are left with the data member being public, but
    access (ideally) being through the published interface functions.
    
    There should be no user visible changes after this commit.
    
    gdb/ChangeLog:
    
    	* gdb/dwarf2read.c (dwarf2_per_objfile::~dwarf2_per_objfile):
    	Update for new std::vector based implementation.
    	(process_psymtab_comp_unit_reader): Likewise.
    	(scan_partial_symbols): Likewise.
    	(recursively_compute_inclusions): Likewise.
    	(compute_compunit_symtab_includes): Likewise.
    	(process_imported_unit_die): Likewise.
    	(queue_and_load_dwo_tu): Likewise.
    	(follow_die_sig_1): Likewise.
    	* gdb/dwarf2read.h: Remove DEF_VEC_P.
    	(typedef dwarf2_per_cu_ptr): Remove.
    	(struct dwarf2_per_cu_data) <imported_symtabs_empty>: New
    	function.
    	(struct dwarf2_per_cu_data) <imported_symtabs_push>: New function.
    	(struct dwarf2_per_cu_data) <imported_symtabs_size>: New function.
    	(struct dwarf2_per_cu_data) <imported_symtabs_free>: New function.
    	(struct dwarf2_per_cu_data) <imported_symtabs>: Change to
    	std::vector.
    
    Change-Id: Id0f4bda977c9dd83b0ba3d7fb42f7e5e2b6869c8

Diff:
---
 gdb/ChangeLog    | 21 +++++++++++++++++++
 gdb/dwarf2read.c | 61 ++++++++++++++++++++++----------------------------------
 gdb/dwarf2read.h | 44 +++++++++++++++++++++++++++++++++++-----
 3 files changed, 84 insertions(+), 42 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 6ac32c5..e6bd246 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,24 @@
+2019-10-15  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+	* gdb/dwarf2read.c (dwarf2_per_objfile::~dwarf2_per_objfile):
+	Update for new std::vector based implementation.
+	(process_psymtab_comp_unit_reader): Likewise.
+	(scan_partial_symbols): Likewise.
+	(recursively_compute_inclusions): Likewise.
+	(compute_compunit_symtab_includes): Likewise.
+	(process_imported_unit_die): Likewise.
+	(queue_and_load_dwo_tu): Likewise.
+	(follow_die_sig_1): Likewise.
+	* gdb/dwarf2read.h: Remove DEF_VEC_P.
+	(typedef dwarf2_per_cu_ptr): Remove.
+	(struct dwarf2_per_cu_data) <imported_symtabs_empty>: New
+	function.
+	(struct dwarf2_per_cu_data) <imported_symtabs_push>: New function.
+	(struct dwarf2_per_cu_data) <imported_symtabs_size>: New function.
+	(struct dwarf2_per_cu_data) <imported_symtabs_free>: New function.
+	(struct dwarf2_per_cu_data) <imported_symtabs>: Change to
+	std::vector.
+
 2019-10-15  Tom Tromey  <tromey@adacore.com>
 
 	* windows-nat.c (windows_nat_target::resume): Use %x when logging
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 5d072f5..ab3f43c 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -2152,10 +2152,10 @@ dwarf2_per_objfile::~dwarf2_per_objfile ()
     htab_delete (line_header_hash);
 
   for (dwarf2_per_cu_data *per_cu : all_comp_units)
-    VEC_free (dwarf2_per_cu_ptr, per_cu->imported_symtabs);
+    per_cu->imported_symtabs_free ();
 
   for (signatured_type *sig_type : all_type_units)
-    VEC_free (dwarf2_per_cu_ptr, sig_type->per_cu.imported_symtabs);
+    sig_type->per_cu.imported_symtabs_free ();
 
   /* Everything else should be on the objfile obstack.  */
 }
@@ -8080,24 +8080,23 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader,
 
   end_psymtab_common (objfile, pst);
 
-  if (!VEC_empty (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs))
+  if (!cu->per_cu->imported_symtabs_empty ())
     {
       int i;
-      int len = VEC_length (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs);
-      struct dwarf2_per_cu_data *iter;
+      int len = cu->per_cu->imported_symtabs_size ();
 
       /* Fill in 'dependencies' here; we fill in 'users' in a
 	 post-pass.  */
       pst->number_of_dependencies = len;
       pst->dependencies
 	= objfile->partial_symtabs->allocate_dependencies (len);
-      for (i = 0;
-	   VEC_iterate (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs,
-			i, iter);
-	   ++i)
-	pst->dependencies[i] = iter->v.psymtab;
+      for (i = 0; i < len; ++i)
+	{
+	  pst->dependencies[i]
+	    = cu->per_cu->imported_symtabs->at (i)->v.psymtab;
+	}
 
-      VEC_free (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs);
+      cu->per_cu->imported_symtabs_free ();
     }
 
   /* Get the list of files included in the current compilation unit,
@@ -8727,8 +8726,7 @@ scan_partial_symbols (struct partial_die_info *first_die, CORE_ADDR *lowpc,
 		if (per_cu->v.psymtab == NULL)
 		  process_psymtab_comp_unit (per_cu, 1, cu->language);
 
-		VEC_safe_push (dwarf2_per_cu_ptr,
-			       cu->per_cu->imported_symtabs, per_cu);
+		cu->per_cu->imported_symtabs_push (per_cu);
 	      }
 	      break;
 	    case DW_TAG_imported_declaration:
@@ -10244,9 +10242,7 @@ recursively_compute_inclusions (std::vector<compunit_symtab *> *result,
 				struct compunit_symtab *immediate_parent)
 {
   void **slot;
-  int ix;
   struct compunit_symtab *cust;
-  struct dwarf2_per_cu_data *iter;
 
   slot = htab_find_slot (all_children, per_cu, INSERT);
   if (*slot != NULL)
@@ -10281,13 +10277,12 @@ recursively_compute_inclusions (std::vector<compunit_symtab *> *result,
 	}
     }
 
-  for (ix = 0;
-       VEC_iterate (dwarf2_per_cu_ptr, per_cu->imported_symtabs, ix, iter);
-       ++ix)
-    {
-      recursively_compute_inclusions (result, all_children,
-				      all_type_symtabs, iter, cust);
-    }
+  if (!per_cu->imported_symtabs_empty ())
+    for (dwarf2_per_cu_data *ptr : *per_cu->imported_symtabs)
+      {
+	recursively_compute_inclusions (result, all_children,
+					all_type_symtabs, ptr, cust);
+      }
 }
 
 /* Compute the compunit_symtab 'includes' fields for the compunit_symtab of
@@ -10298,10 +10293,9 @@ compute_compunit_symtab_includes (struct dwarf2_per_cu_data *per_cu)
 {
   gdb_assert (! per_cu->is_debug_types);
 
-  if (!VEC_empty (dwarf2_per_cu_ptr, per_cu->imported_symtabs))
+  if (!per_cu->imported_symtabs_empty ())
     {
-      int ix, len;
-      struct dwarf2_per_cu_data *per_cu_iter;
+      int len;
       std::vector<compunit_symtab *> result_symtabs;
       htab_t all_children, all_type_symtabs;
       struct compunit_symtab *cust = get_compunit_symtab (per_cu);
@@ -10315,14 +10309,10 @@ compute_compunit_symtab_includes (struct dwarf2_per_cu_data *per_cu)
       all_type_symtabs = htab_create_alloc (1, htab_hash_pointer, htab_eq_pointer,
 					    NULL, xcalloc, xfree);
 
-      for (ix = 0;
-	   VEC_iterate (dwarf2_per_cu_ptr, per_cu->imported_symtabs,
-			ix, per_cu_iter);
-	   ++ix)
+      for (dwarf2_per_cu_data *ptr : *per_cu->imported_symtabs)
 	{
 	  recursively_compute_inclusions (&result_symtabs, all_children,
-					  all_type_symtabs, per_cu_iter,
-					  cust);
+					  all_type_symtabs, ptr, cust);
 	}
 
       /* Now we have a transitive closure of all the included symtabs.  */
@@ -10566,8 +10556,7 @@ process_imported_unit_die (struct die_info *die, struct dwarf2_cu *cu)
       if (maybe_queue_comp_unit (cu, per_cu, cu->language))
 	load_full_comp_unit (per_cu, false, cu->language);
 
-      VEC_safe_push (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs,
-		     per_cu);
+      cu->per_cu->imported_symtabs_push (per_cu);
     }
 }
 
@@ -13499,7 +13488,7 @@ queue_and_load_dwo_tu (void **slot, void *info)
 	 while processing PER_CU.  */
       if (maybe_queue_comp_unit (NULL, sig_cu, per_cu->cu->language))
 	load_full_type_unit (sig_cu);
-      VEC_safe_push (dwarf2_per_cu_ptr, per_cu->imported_symtabs, sig_cu);
+      per_cu->imported_symtabs_push (sig_cu);
     }
 
   return 1;
@@ -23666,9 +23655,7 @@ follow_die_sig_1 (struct die_info *src_die, struct signatured_type *sig_type,
       if (dwarf2_per_objfile->index_table != NULL
 	  && dwarf2_per_objfile->index_table->version <= 7)
 	{
-	  VEC_safe_push (dwarf2_per_cu_ptr,
-			 (*ref_cu)->per_cu->imported_symtabs,
-			 sig_cu->per_cu);
+	  (*ref_cu)->per_cu->imported_symtabs_push (sig_cu->per_cu);
 	}
 
       *ref_cu = sig_cu;
diff --git a/gdb/dwarf2read.h b/gdb/dwarf2read.h
index a737168..53fc7f4 100644
--- a/gdb/dwarf2read.h
+++ b/gdb/dwarf2read.h
@@ -30,9 +30,6 @@
 extern struct cmd_list_element *set_dwarf_cmdlist;
 extern struct cmd_list_element *show_dwarf_cmdlist;
 
-typedef struct dwarf2_per_cu_data *dwarf2_per_cu_ptr;
-DEF_VEC_P (dwarf2_per_cu_ptr);
-
 extern bool dwarf_always_disassemble;
 
 /* A descriptor for dwarf sections.
@@ -347,6 +344,37 @@ struct dwarf2_per_cu_data
     struct dwarf2_per_cu_quick_data *quick;
   } v;
 
+  /* Return true of IMPORTED_SYMTABS is empty or not yet allocated.  */
+  bool imported_symtabs_empty () const
+  {
+    return (imported_symtabs == nullptr || imported_symtabs->empty ());
+  }
+
+  /* Push P to the back of IMPORTED_SYMTABS, allocated IMPORTED_SYMTABS
+     first if required.  */
+  void imported_symtabs_push (dwarf2_per_cu_data *p)
+  {
+    if (imported_symtabs == nullptr)
+      imported_symtabs = new std::vector <dwarf2_per_cu_data *>;
+    imported_symtabs->push_back (p);
+  }
+
+  /* Return the size of IMPORTED_SYMTABS if it is allocated, otherwise
+     return 0.  */
+  size_t imported_symtabs_size () const
+  {
+    if (imported_symtabs == nullptr)
+      return 0;
+    return imported_symtabs->size ();
+  }
+
+  /* Delete IMPORTED_SYMTABS and set the pointer back to nullptr.  */
+  void imported_symtabs_free ()
+  {
+    delete imported_symtabs;
+    imported_symtabs = nullptr;
+  }
+
   /* The CUs we import using DW_TAG_imported_unit.  This is filled in
      while reading psymtabs, used to compute the psymtab dependencies,
      and then cleared.  Then it is filled in again while reading full
@@ -364,8 +392,14 @@ struct dwarf2_per_cu_data
      .gdb_index version <=7 this also records the TUs that the CU referred
      to.  Concurrently with this change gdb was modified to emit version 8
      indices so we only pay a price for gold generated indices.
-     http://sourceware.org/bugzilla/show_bug.cgi?id=15021.  */
-  VEC (dwarf2_per_cu_ptr) *imported_symtabs;
+     http://sourceware.org/bugzilla/show_bug.cgi?id=15021.
+
+     This currently needs to be a public member due to how
+     dwarf2_per_cu_data is allocated and used.  Ideally in future things
+     could be refactored to make this private.  Until then please try to
+     avoid direct access to this member, and instead use the helper
+     functions above.  */
+  std::vector <dwarf2_per_cu_data *> *imported_symtabs;
 };
 
 /* Entry in the signatured_types hash table.  */


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2019-10-15 19:14 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-10-15 19:14 [binutils-gdb] gdb: Remove use of VEC from dwarf2read.c Andrew Burgess

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).