From 3360b6e7963e3c579e50078e78d226ea63e2960f Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Tue, 18 Jun 2019 18:59:51 +0200 Subject: [PATCH] [gdb] Fix abstract_to_concrete type 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>, 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 PR gdb/24515 * dwarf2read.h (abstract_to_concrete): Change type from std::unordered_map> to std::unordered_map>. * dwarf2read.c (read_variable): Update. (dwarf2_fetch_die_loc_sect_off): Update. --- gdb/ChangeLog | 9 +++++++++ gdb/dwarf2read.c | 13 +++++++++---- gdb/dwarf2read.h | 2 +- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 22a473a4037..83f47b25701 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2019-06-18 Tom de Vries + + PR gdb/24515 + * dwarf2read.h (abstract_to_concrete): Change type from + std::unordered_map> to + std::unordered_map>. + * dwarf2read.c (read_variable): Update. + (dwarf2_fetch_die_loc_sect_off): Update. + 2019-06-17 Tom de Vries PR gdb/24617 diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index a51ae49e870..9cf513b582a 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -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; diff --git a/gdb/dwarf2read.h b/gdb/dwarf2read.h index e8658950e36..776860e454d 100644 --- a/gdb/dwarf2read.h +++ b/gdb/dwarf2read.h @@ -256,7 +256,7 @@ public: /* Mapping from abstract origin DIE to concrete DIEs that reference it as DW_AT_abstract_origin. */ - std::unordered_map> + std::unordered_map> abstract_to_concrete; }; -- 2.39.2