Move signatured_type::type to unshareable object
authorTom Tromey <tom@tromey.com>
Wed, 27 May 2020 15:19:35 +0000 (11:19 -0400)
committerSimon Marchi <simon.marchi@efficios.com>
Wed, 27 May 2020 15:19:35 +0000 (11:19 -0400)
signatured_type has a link to the "struct type".  However, types are
inherently objfile-specific, so once sharing is implemented, this will
be incorrect.

This patch moves the type to a new map in the DWARF unshareable
object.

gdb/ChangeLog:

YYYY-MM-DD  Tom Tromey  <tom@tromey.com>
YYYY-MM-DD  Simon Marchi  <simon.marchi@efficios.com>

* dwarf2/read.h (struct dwarf2_per_objfile)
<get_type_for_signatured_type, set_type_for_signatured_type>:
New methods.
<m_type_map>: New member.
(struct signatured_type) <type>: Remove.
* dwarf2/read.c
(dwarf2_per_objfile::get_type_for_signatured_type,
dwarf2_per_objfile::set_type_for_signatured_type): New.
(get_signatured_type): Use new methods.

Change-Id: I765ae3c43fae1064f51ced352167a57638609f02

gdb/ChangeLog
gdb/dwarf2/read.c
gdb/dwarf2/read.h

index f821370624324651f044aefc5583c2227e22b1f7..a3dec4fd13fc4dd762c95e4dcbf3e05f9b1555a3 100644 (file)
@@ -1,3 +1,16 @@
+2020-05-27  Tom Tromey  <tom@tromey.com>
+           Simon Marchi  <simon.marchi@efficios.com>
+
+       * dwarf2/read.h (struct dwarf2_per_objfile)
+       <get_type_for_signatured_type, set_type_for_signatured_type>:
+       New methods.
+       <m_type_map>: New member.
+       (struct signatured_type) <type>: Remove.
+       * dwarf2/read.c
+       (dwarf2_per_objfile::get_type_for_signatured_type,
+       dwarf2_per_objfile::set_type_for_signatured_type): New.
+       (get_signatured_type): Use new methods.
+
 2020-05-27  Tom Tromey  <tom@tromey.com>
            Simon Marchi  <simon.marchi@efficios.com>
 
index 53def0c87eb7d3a0a979a4bb6988d12b7ea5816b..7819fc5c8d6f55aa33082e49a093fc9361143463 100644 (file)
@@ -9630,6 +9630,25 @@ dwarf2_per_objfile::get_type_unit_group_unshareable (type_unit_group *tu_group)
   return result;
 }
 
+struct type *
+dwarf2_per_objfile::get_type_for_signatured_type
+  (signatured_type *sig_type) const
+{
+  auto iter = this->m_type_map.find (sig_type);
+  if (iter == this->m_type_map.end ())
+    return nullptr;
+
+  return iter->second;
+}
+
+void dwarf2_per_objfile::set_type_for_signatured_type
+  (signatured_type *sig_type, struct type *type)
+{
+  gdb_assert (this->m_type_map.find (sig_type) == this->m_type_map.end ());
+
+  this->m_type_map[sig_type] = type;
+}
+
 /* A helper function for computing the list of all symbol tables
    included by PER_CU.  */
 
@@ -22720,8 +22739,9 @@ get_signatured_type (struct die_info *die, ULONGEST signature,
     }
 
   /* If we already know the type we're done.  */
-  if (sig_type->type != NULL)
-    return sig_type->type;
+  type = dwarf2_per_objfile->get_type_for_signatured_type (sig_type);
+  if (type != nullptr)
+    return type;
 
   type_cu = cu;
   type_die = follow_die_sig_1 (die, sig_type, &type_cu);
@@ -22748,7 +22768,8 @@ get_signatured_type (struct die_info *die, ULONGEST signature,
                 objfile_name (dwarf2_per_objfile->objfile));
       type = build_error_marker_type (cu, die);
     }
-  sig_type->type = type;
+
+  dwarf2_per_objfile->set_type_for_signatured_type (sig_type, type);
 
   return type;
 }
index 13d31a97d3d7b2a9c852e5eb2ee82d0936dbe489..3500b0e7ba9f6d31be15751e1f7bb44c0d8bd35b 100644 (file)
@@ -329,11 +329,16 @@ struct dwarf2_per_objfile
   /* Set the compunit_symtab associated to PER_CU.  */
   void set_symtab (const dwarf2_per_cu_data *per_cu, compunit_symtab *symtab);
 
-/* Get the type_unit_group_unshareable corresponding to TU_GROUP.  If one
-   does not exist, create it.  */
+  /* Get the type_unit_group_unshareable corresponding to TU_GROUP.  If one
+     does not exist, create it.  */
   type_unit_group_unshareable *get_type_unit_group_unshareable
     (type_unit_group *tu_group);
 
+  struct type *get_type_for_signatured_type (signatured_type *sig_type) const;
+
+  void set_type_for_signatured_type (signatured_type *sig_type,
+                                    struct type *type);
+
   /* Find an integer type SIZE_IN_BYTES bytes in size and return it.
      UNSIGNED_P controls if the integer is unsigned or not.  */
   struct type *int_type (int size_in_bytes, bool unsigned_p) const;
@@ -363,6 +368,9 @@ private:
 
   std::unordered_map<type_unit_group *, type_unit_group_unshareable_up>
     m_type_units;
+
+  /* Map from signatured types to the corresponding struct type.  */
+  std::unordered_map<signatured_type *, struct type *> m_type_map;
 };
 
 /* Get the dwarf2_per_objfile associated to OBJFILE.  */
@@ -584,11 +592,6 @@ struct signatured_type
      can share them.  This points to the containing symtab.  */
   struct type_unit_group *type_unit_group;
 
-  /* The type.
-     The first time we encounter this type we fully read it in and install it
-     in the symbol tables.  Subsequent times we only need the type.  */
-  struct type *type;
-
   /* Containing DWO unit.
      This field is valid iff per_cu.reading_dwo_directly.  */
   struct dwo_unit *dwo_unit;