[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:
Tom de Vries 2019-06-18 18:59:51 +02:00
parent 4ed4690fc2
commit 3360b6e796
3 changed files with 19 additions and 5 deletions

View 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;
};