[3/7] Simplify file_and_directory storage management

Message ID 20210705170200.2160320-4-tom@tromey.com
State New
Headers show
Series
  • Fix dup-psym.exp with DWARF index
Related show

Commit Message

Tom Tromey July 5, 2021, 5:01 p.m.
file_and_directory carries a std::string in case the compilation
directory is computed, but a subsequent patch wants to preserve this
string without also having to maintain the storage for it.  So, this
patch arranges for the compilation directory string to be stored in
the per-BFD string bcache instead.
---
 gdb/dwarf2/read.c | 17 +++++++----------
 1 file changed, 7 insertions(+), 10 deletions(-)

-- 
2.26.3

Patch

diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index 641b489423c..0703ede6647 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -1533,14 +1533,10 @@  struct file_and_directory
   const char *name;
 
   /* The compilation directory.  NULL if not known.  If we needed to
-     compute a new string, this points to COMP_DIR_STORAGE, otherwise,
-     points directly to the DW_AT_comp_dir string attribute owned by
-     the obstack that owns the DIE.  */
+     compute a new string, it will be stored in the per-BFD string
+     bcache; otherwise, points directly to the DW_AT_comp_dir string
+     attribute owned by the obstack that owns the DIE.  */
   const char *comp_dir;
-
-  /* If we needed to build a new string for comp_dir, this is what
-     owns the storage.  */
-  std::string comp_dir_storage;
 };
 
 static file_and_directory find_file_and_directory (struct die_info *die,
@@ -10376,9 +10372,10 @@  find_file_and_directory (struct die_info *die, struct dwarf2_cu *cu)
       && producer_is_gcc_lt_4_3 (cu) && res.name != NULL
       && IS_ABSOLUTE_PATH (res.name))
     {
-      res.comp_dir_storage = ldirname (res.name);
-      if (!res.comp_dir_storage.empty ())
-	res.comp_dir = res.comp_dir_storage.c_str ();
+      std::string comp_dir_storage = ldirname (res.name);
+      if (!comp_dir_storage.empty ())
+	res.comp_dir
+	  = cu->per_objfile->objfile->intern (comp_dir_storage.c_str ());
     }
   if (res.comp_dir != NULL)
     {