[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<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.
This commit is contained in:
parent
4ed4690fc2
commit
3360b6e796
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user