mirror of
https://github.com/torvalds/linux.git
synced 2026-05-24 23:22:31 +02:00
perf dwarf-aux: Preserve typedefs in match_var_offset
Preserve typedefs in match_var_offset to match the results by __die_get_real_type. Also move the (offset == 0) branch after the is_pointer check to ensure the correct type is used, fixing cases where an incorrect pointer type was chosen when the access offset was 0. Signed-off-by: Zecheng Li <zecheng@google.com> Signed-off-by: Zecheng Li <zli94@ncsu.edu> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
This commit is contained in:
parent
30b2e6fa58
commit
ace1630317
|
|
@ -1405,6 +1405,8 @@ struct find_var_data {
|
|||
Dwarf_Addr addr;
|
||||
/* Target register */
|
||||
unsigned reg;
|
||||
/* Access data type */
|
||||
Dwarf_Die type;
|
||||
/* Access offset, set for global data */
|
||||
int offset;
|
||||
/* True if the current register is the frame base */
|
||||
|
|
@ -1417,29 +1419,31 @@ struct find_var_data {
|
|||
static bool match_var_offset(Dwarf_Die *die_mem, struct find_var_data *data,
|
||||
s64 addr_offset, s64 addr_type, bool is_pointer)
|
||||
{
|
||||
Dwarf_Die type_die;
|
||||
Dwarf_Word size;
|
||||
Dwarf_Die ptr_die;
|
||||
Dwarf_Die *ptr_type;
|
||||
s64 offset = addr_offset - addr_type;
|
||||
|
||||
if (offset < 0)
|
||||
return false;
|
||||
|
||||
if (__die_get_real_type(die_mem, &data->type) == NULL)
|
||||
return false;
|
||||
|
||||
ptr_type = die_get_pointer_type(&data->type, &ptr_die);
|
||||
if (is_pointer && ptr_type) {
|
||||
/* Get the target type of the pointer */
|
||||
if (__die_get_real_type(ptr_type, &data->type) == NULL)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (offset == 0) {
|
||||
/* Update offset relative to the start of the variable */
|
||||
data->offset = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (offset < 0)
|
||||
return false;
|
||||
|
||||
if (die_get_real_type(die_mem, &type_die) == NULL)
|
||||
return false;
|
||||
|
||||
if (is_pointer && dwarf_tag(&type_die) == DW_TAG_pointer_type) {
|
||||
/* Get the target type of the pointer */
|
||||
if (die_get_real_type(&type_die, &type_die) == NULL)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (dwarf_aggregate_size(&type_die, &size) < 0)
|
||||
if (dwarf_aggregate_size(&data->type, &size) < 0)
|
||||
return false;
|
||||
|
||||
if ((u64)offset >= size)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user