From: Namhyung Kim <namhyung@kernel.org>
To: Zecheng Li <zecheng@google.com>
Cc: Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Jiri Olsa <jolsa@kernel.org>, Ian Rogers <irogers@google.com>,
Adrian Hunter <adrian.hunter@intel.com>,
"Liang, Kan" <kan.liang@linux.intel.com>,
Masami Hiramatsu <mhiramat@kernel.org>,
Xu Liu <xliuprof@google.com>,
linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 03/10] perf dwarf-aux: Better variable collection for insn tracking
Date: Fri, 29 Aug 2025 18:22:33 -0700 [thread overview]
Message-ID: <aLJSWXAUVBqSFYPL@google.com> (raw)
In-Reply-To: <20250825195412.223077-4-zecheng@google.com>
On Mon, Aug 25, 2025 at 07:54:05PM +0000, Zecheng Li wrote:
> Utilizes the previous is_breg_access_indirect function to determine if
> the register + offset stores the variable itself or the struct it points
> to, save the information in die_var_type.is_reg_var_addr.
>
> Since we are storing the real types in the stack state, we need to do a
> type dereference when is_reg_var_addr is set to false for stack/frame
> registers.
>
> For other gp registers, skip the variable when the register is a pointer
> to the type. If we want to accept these variables, we might also utilize
> is_reg_var_addr in a different way, we need to mark that register as a
> pointer to the type.
>
> Signed-off-by: Zecheng Li <zecheng@google.com>
Reviewed-by: Namhyung Kim <namhyung@kernel.org>
Thanks,
Namhyung
> ---
> tools/perf/util/annotate-data.c | 9 +++++++++
> tools/perf/util/dwarf-aux.c | 11 ++++++++++-
> tools/perf/util/dwarf-aux.h | 2 ++
> 3 files changed, 21 insertions(+), 1 deletion(-)
>
> diff --git a/tools/perf/util/annotate-data.c b/tools/perf/util/annotate-data.c
> index 1ef2edbc71d9..258157cc43c2 100644
> --- a/tools/perf/util/annotate-data.c
> +++ b/tools/perf/util/annotate-data.c
> @@ -868,6 +868,11 @@ static void update_var_state(struct type_state *state, struct data_loc_info *dlo
> int offset = var->offset;
> struct type_state_stack *stack;
>
> + /* If the reg location holds the pointer value, dereference the type */
> + if (!var->is_reg_var_addr && is_pointer_type(&mem_die) &&
> + __die_get_real_type(&mem_die, &mem_die) == NULL)
> + continue;
> +
> if (var->reg != DWARF_REG_FB)
> offset -= fb_offset;
>
> @@ -893,6 +898,10 @@ static void update_var_state(struct type_state *state, struct data_loc_info *dlo
>
> reg = &state->regs[var->reg];
>
> + /* For gp registers, skip the address registers for now */
> + if (var->is_reg_var_addr)
> + continue;
> +
> if (reg->ok && reg->kind == TSR_KIND_TYPE &&
> !is_better_type(®->type, &mem_die))
> continue;
> diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c
> index 449bc9ad7aff..6fd2db5d9381 100644
> --- a/tools/perf/util/dwarf-aux.c
> +++ b/tools/perf/util/dwarf-aux.c
> @@ -1627,13 +1627,22 @@ static int __die_collect_vars_cb(Dwarf_Die *die_mem, void *arg)
> if (!check_allowed_ops(ops, nops))
> return DIE_FIND_CB_SIBLING;
>
> - if (die_get_real_type(die_mem, &type_die) == NULL)
> + if (__die_get_real_type(die_mem, &type_die) == NULL)
> return DIE_FIND_CB_SIBLING;
>
> vt = malloc(sizeof(*vt));
> if (vt == NULL)
> return DIE_FIND_CB_END;
>
> + /* Usually a register holds the value of a variable */
> + vt->is_reg_var_addr = false;
> +
> + if (((ops->atom >= DW_OP_breg0 && ops->atom <= DW_OP_breg31) ||
> + ops->atom == DW_OP_bregx || ops->atom == DW_OP_fbreg) &&
> + !is_breg_access_indirect(ops, nops))
> + /* The register contains an address of the variable. */
> + vt->is_reg_var_addr = true;
> +
> vt->die_off = dwarf_dieoffset(&type_die);
> vt->addr = start;
> vt->reg = reg_from_dwarf_op(ops);
> diff --git a/tools/perf/util/dwarf-aux.h b/tools/perf/util/dwarf-aux.h
> index 892c8c5c23fc..cd481ec9c5a1 100644
> --- a/tools/perf/util/dwarf-aux.h
> +++ b/tools/perf/util/dwarf-aux.h
> @@ -148,6 +148,8 @@ struct die_var_type {
> u64 addr;
> int reg;
> int offset;
> + /* Whether the register holds a address to the type */
> + bool is_reg_var_addr;
> };
>
> /* Return type info of a member at offset */
> --
> 2.51.0.261.g7ce5a0a67e-goog
>
next prev parent reply other threads:[~2025-08-30 1:22 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-25 19:54 [PATCH v2 00/10] perf tools: Some improvements on data type profiler Zecheng Li
2025-08-25 19:54 ` [PATCH v2 01/10] perf dwarf-aux: Use signed variable types in match_var_offset Zecheng Li
2025-08-28 6:52 ` Namhyung Kim
2025-09-03 15:49 ` Arnaldo Carvalho de Melo
2025-09-03 22:05 ` Arnaldo Carvalho de Melo
2025-09-05 19:50 ` Namhyung Kim
2025-09-13 14:34 ` Arnaldo Carvalho de Melo
2025-08-25 19:54 ` [PATCH v2 02/10] perf dwarf-aux: More accurate variable type match for breg Zecheng Li
2025-08-28 7:18 ` Namhyung Kim
2025-08-28 18:36 ` Zecheng Li
2025-08-30 0:53 ` Namhyung Kim
2025-08-25 19:54 ` [PATCH v2 03/10] perf dwarf-aux: Better variable collection for insn tracking Zecheng Li
2025-08-30 1:22 ` Namhyung Kim [this message]
2025-08-25 19:54 ` [PATCH v2 04/10] perf annotate: Skip annotating data types to lea instructions Zecheng Li
2025-08-30 6:41 ` Namhyung Kim
2025-08-25 19:54 ` [PATCH v2 05/10] perf dwarf-aux: Find pointer type to a type Zecheng Li
2025-08-30 6:48 ` Namhyung Kim
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aLJSWXAUVBqSFYPL@google.com \
--to=namhyung@kernel.org \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=irogers@google.com \
--cc=jolsa@kernel.org \
--cc=kan.liang@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mhiramat@kernel.org \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=xliuprof@google.com \
--cc=zecheng@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.