]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
perf dwarf-aux: Preserve typedefs in match_var_offset
authorZecheng Li <zecheng@google.com>
Mon, 9 Mar 2026 17:55:15 +0000 (13:55 -0400)
committerNamhyung Kim <namhyung@kernel.org>
Thu, 19 Mar 2026 21:42:29 +0000 (14:42 -0700)
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>
tools/perf/util/dwarf-aux.c

index 38142062d6e5f6f81ef982d9d4986ebf4ceefc38..3b0fc9038f1995a68386e1ebb2db56b7b0b22821 100644 (file)
@@ -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) {
-               /* 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)
+       if (__die_get_real_type(die_mem, &data->type) == NULL)
                return false;
 
-       if (is_pointer && dwarf_tag(&type_die) == DW_TAG_pointer_type) {
+       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(&type_die, &type_die) == NULL)
+               if (__die_get_real_type(ptr_type, &data->type) == NULL)
                        return false;
        }
 
-       if (dwarf_aggregate_size(&type_die, &size) < 0)
+       if (offset == 0) {
+               /* Update offset relative to the start of the variable */
+               data->offset = 0;
+               return true;
+       }
+
+       if (dwarf_aggregate_size(&data->type, &size) < 0)
                return false;
 
        if ((u64)offset >= size)