Re: [PATCH v1 07/11] perf annotate-data: Handle global variable access with const register
From: Namhyung Kim
Date: Tue Feb 10 2026 - 21:37:21 EST
On Mon, Jan 26, 2026 at 09:05:00PM -0500, Zecheng Li wrote:
> When a register holds a constant value (TSR_KIND_CONST) and is used with
> a negative offset, treat it as a potential global variable access
> instead of falling through to CFA (frame) handling.
>
> This fixes cases like array indexing with computed offsets:
>
> movzbl -0x7d72725a(%rax), %eax # array[%rax]
>
> Where %rax contains a computed index and the negative offset points to a
> global array. Previously this fell through to the CFA path which doesn't
> handle global variables, resulting in "no type information".
>
> The fix redirects such accesses to check_kernel which calls
> get_global_var_type() to resolve the type from the global variable
> cache. We could also treat registers with integer types to the global
> variable path, but this requires more changes.
I'm thinking of how we can support user binaries with this code pattern.
For now, I think it's ok for the kernel, but at least we need to check
if dso__kernel(map__dso(dloc->ms->map)) is not zero (DSO_SPACE__USER).
Thanks,
Namhyung
>
> Signed-off-by: Zecheng Li <zli94@xxxxxxxx>
> ---
> tools/perf/util/annotate-data.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/tools/perf/util/annotate-data.c b/tools/perf/util/annotate-data.c
> index 970238bc81b7..177aa6634504 100644
> --- a/tools/perf/util/annotate-data.c
> +++ b/tools/perf/util/annotate-data.c
> @@ -1230,6 +1230,10 @@ static enum type_match_result check_matching_type(struct type_state *state,
> return PERF_TMR_BAIL_OUT;
> }
>
> + if (state->regs[reg].kind == TSR_KIND_CONST) {
> + if (dloc->op->offset < 0 && reg != state->stack_reg && reg != dloc->fbreg)
> + goto check_kernel;
> + }
> check_non_register:
> if (reg == dloc->fbreg || reg == state->stack_reg) {
> struct type_state_stack *stack;
> --
> 2.52.0
>