diff options
author | Simon Marchi <simon.marchi@polymtl.ca> | 2021-10-01 17:15:20 +0200 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2021-10-01 17:15:20 +0200 |
commit | b4c919f75256a8f2263950ce2f970ba40d279b57 (patch) | |
tree | ef15543e80a88c36798131be2e055ccc9db841e1 | |
parent | 242fe37867ce33d8f8158bc2ee154d1e2e026a49 (diff) | |
download | gdb-b4c919f75256a8f2263950ce2f970ba40d279b57.zip gdb-b4c919f75256a8f2263950ce2f970ba40d279b57.tar.gz gdb-b4c919f75256a8f2263950ce2f970ba40d279b57.tar.bz2 |
[gdb/symtab] Fix htab_find_slot call in read_call_site_scope
In read_call_site_scope we have:
...
call_site_local.pc = pc;
slot = htab_find_slot (cu->call_site_htab, &call_site_local, INSERT);
...
The call passes a call_site pointer as element. OTOH, the hashtab is created
using hash_f == core_addr_hash and eq_f == core_addr_eq, so the element
will be accessed through a CORE_ADDR pointer.
This is not wrong (at least in C), given that pc is the first field in
call_site.
Nevertheless, as in call_site_for_pc, make the htab_find_slot call match the
used hash_f and eq_f by using &pc instead:
...
slot = htab_find_slot (cu->call_site_htab, &pc, INSERT);
...
Tested on x86_64-linux.
Co-Authored-By: Tom de Vries <tdevries@suse.de>
-rw-r--r-- | gdb/dwarf2/read.c | 5 | ||||
-rw-r--r-- | gdb/gdbtypes.h | 4 |
2 files changed, 3 insertions, 6 deletions
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index f4967a0..b9b62b4 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -13341,7 +13341,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) struct gdbarch *gdbarch = objfile->arch (); CORE_ADDR pc, baseaddr; struct attribute *attr; - struct call_site *call_site, call_site_local; + struct call_site *call_site; void **slot; int nparams; struct die_info *child_die; @@ -13369,8 +13369,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) cu->call_site_htab = htab_create_alloc_ex (16, core_addr_hash, core_addr_eq, NULL, &objfile->objfile_obstack, hashtab_obstack_allocate, NULL); - call_site_local.pc = pc; - slot = htab_find_slot (cu->call_site_htab, &call_site_local, INSERT); + slot = htab_find_slot (cu->call_site_htab, &pc, INSERT); if (*slot != NULL) { complaint (_("Duplicate PC %s for DW_TAG_call_site " diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index 5ec7a5f..6d09576 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -1793,9 +1793,7 @@ struct call_site_parameter struct call_site { - /* * Address of the first instruction after this call. It must be - the first field as we overload core_addr_hash and core_addr_eq - for it. */ + /* Address of the first instruction after this call. */ CORE_ADDR pc; |