mirror of https://github.com/torvalds/linux.git
perf dwarf-aux: Use signed variable types in match_var_offset
match_var_offset() compares address offsets to determine if an access falls within a variable's bounds. The offsets involved for those relative to base registers from DW_OP_breg can be negative. The current implementation uses unsigned types (u64) for these offsets, which rejects almost all negative values. Change the signature of match_var_offset() to use signed types (s64). This ensures correct behavior when addr_offset or addr_type are negative. Reviewed-by: Namhyung Kim <namhyung@kernel.org> Signed-off-by: Zecheng Li <zecheng@google.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Ian Rogers <irogers@google.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Xu Liu <xliuprof@google.com> Link: https://lore.kernel.org/r/20250825195412.223077-2-zecheng@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
9105df0185
commit
414bf79deb
|
|
@ -1388,18 +1388,19 @@ struct find_var_data {
|
|||
#define DWARF_OP_DIRECT_REGS 32
|
||||
|
||||
static bool match_var_offset(Dwarf_Die *die_mem, struct find_var_data *data,
|
||||
u64 addr_offset, u64 addr_type, bool is_pointer)
|
||||
s64 addr_offset, s64 addr_type, bool is_pointer)
|
||||
{
|
||||
Dwarf_Die type_die;
|
||||
Dwarf_Word size;
|
||||
s64 offset = addr_offset - addr_type;
|
||||
|
||||
if (addr_offset == addr_type) {
|
||||
if (offset == 0) {
|
||||
/* Update offset relative to the start of the variable */
|
||||
data->offset = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (addr_offset < addr_type)
|
||||
if (offset < 0)
|
||||
return false;
|
||||
|
||||
if (die_get_real_type(die_mem, &type_die) == NULL)
|
||||
|
|
@ -1414,11 +1415,11 @@ static bool match_var_offset(Dwarf_Die *die_mem, struct find_var_data *data,
|
|||
if (dwarf_aggregate_size(&type_die, &size) < 0)
|
||||
return false;
|
||||
|
||||
if (addr_offset >= addr_type + size)
|
||||
if ((u64)offset >= size)
|
||||
return false;
|
||||
|
||||
/* Update offset relative to the start of the variable */
|
||||
data->offset = addr_offset - addr_type;
|
||||
data->offset = offset;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue