]> www.infradead.org Git - users/hch/misc.git/commitdiff
perf dwarf-aux: Use signed variable types in match_var_offset
authorZecheng Li <zecheng@google.com>
Mon, 25 Aug 2025 19:54:03 +0000 (19:54 +0000)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 3 Sep 2025 18:45:50 +0000 (15:45 -0300)
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>
tools/perf/util/dwarf-aux.c

index 559c953ca17271be2f19ad0e4e323128da616e6a..92005442557848890e110aa84a117de6fe11a280 100644 (file)
@@ -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;
 }