]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[gdb] Fix abstract_to_concrete type
authorTom de Vries <tdevries@suse.de>
Tue, 18 Jun 2019 16:59:51 +0000 (18:59 +0200)
committerTom de Vries <tdevries@suse.de>
Tue, 18 Jun 2019 16:59:51 +0000 (18:59 +0200)
The test-case varval.exp fails here:
...
FAIL: gdb.dwarf2/varval.exp: print varval2
...
with boards readnow/cc-with-gdb-index/cc-with-debug-names, as well as if gdb
is build with -fsanitize=address -lasan.

The problem is that the abstract_to_concrete map in which we track the
association of abstract to concrete DIEs (for DW_OP_GNU_variable_value
support) has type std::unordered_map<die_info_ptr, std::vector<die_info_ptr>>,
and the die_info_ptrs that we register in the map may be invalid by the time
that we start to lookup DIEs in the map.

Fix this by using the sect_offset instead to identify the DIEs in the map.

Build and tested on x86_64-linux.

gdb/ChangeLog:

2019-06-18  Tom de Vries  <tdevries@suse.de>

PR gdb/24515
* dwarf2read.h (abstract_to_concrete): Change type from
std::unordered_map<die_info_ptr, std::vector<die_info_ptr>> to
std::unordered_map<sect_offset, std::vector<sect_offset>>.
* dwarf2read.c (read_variable): Update.
(dwarf2_fetch_die_loc_sect_off): Update.

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

index 22a473a4037f698c22a76d8a40f98a43641bc7a7..83f47b257016b552af1e6ab47120b4737c6ddc03 100644 (file)
@@ -1,3 +1,12 @@
+2019-06-18  Tom de Vries  <tdevries@suse.de>
+
+       PR gdb/24515
+       * dwarf2read.h (abstract_to_concrete): Change type from
+       std::unordered_map<die_info_ptr, std::vector<die_info_ptr>> to
+       std::unordered_map<sect_offset, std::vector<sect_offset>>.
+       * dwarf2read.c (read_variable): Update.
+       (dwarf2_fetch_die_loc_sect_off): Update.
+
 2019-06-17  Tom de Vries  <tdevries@suse.de>
 
        PR gdb/24617
index a51ae49e87026bb0681f26527b38f41cdca21c12..9cf513b582a57da5007df385f357e2876b212926 100644 (file)
@@ -14288,7 +14288,7 @@ read_variable (struct die_info *die, struct dwarf2_cu *cu)
       struct die_info *origin_die
        = follow_die_ref (die, abstract_origin, &origin_cu);
       dwarf2_per_objfile *dpo = cu->per_cu->dwarf2_per_objfile;
-      dpo->abstract_to_concrete[origin_die].push_back (die);
+      dpo->abstract_to_concrete[origin_die->sect_off].push_back (die->sect_off);
     }
 }
 
@@ -23256,14 +23256,19 @@ dwarf2_fetch_die_loc_sect_off (sect_offset sect_off,
 
   attr = dwarf2_attr (die, DW_AT_location, cu);
   if (!attr && resolve_abstract_p
-      && (dwarf2_per_objfile->abstract_to_concrete.find (die)
+      && (dwarf2_per_objfile->abstract_to_concrete.find (die->sect_off)
          != dwarf2_per_objfile->abstract_to_concrete.end ()))
     {
       CORE_ADDR pc = (*get_frame_pc) (baton);
 
-      for (const auto &cand : dwarf2_per_objfile->abstract_to_concrete[die])
+      for (const auto &cand_off
+            : dwarf2_per_objfile->abstract_to_concrete[die->sect_off])
        {
-         if (!cand->parent
+         struct dwarf2_cu *cand_cu = cu;
+         struct die_info *cand
+           = follow_die_offset (cand_off, per_cu->is_dwz, &cand_cu);
+         if (!cand
+             || !cand->parent
              || cand->parent->tag != DW_TAG_subprogram)
            continue;
 
index e8658950e362473fa70c3db76b1b9f0de74c42c6..776860e454dc1ae53fe1870d03576c5a960919e1 100644 (file)
@@ -256,7 +256,7 @@ public:
 
   /* Mapping from abstract origin DIE to concrete DIEs that reference it as
      DW_AT_abstract_origin.  */
-  std::unordered_map<die_info_ptr, std::vector<die_info_ptr>>
+  std::unordered_map<sect_offset, std::vector<sect_offset>>
     abstract_to_concrete;
 };