Re: [PATCH v5 07/26] perf dwarf-regs: Adapt get_dwarf_regnum() for arm64
From: Ian Rogers
Date: Tue Sep 08 2026 - 14:17:18 EST
On Tue, Sep 8, 2026 at 6:01 AM Tengda Wu <wutengda@xxxxxxxxxxxxxxx> wrote:
>
> The current arm64 DWARF register lookup relies on 'aarch64_regstr_tbl',
> a static string table. While this works for kprobe-tracer where register
> names start with '%', it is insufficient for parsing register numbers
> directly from raw instructions (e.g., extracting '6' from 'x6' or 'w6')
> during annotation.
>
> Since get_dwarf_regnum() is currently used only by 'perf annotate' and
> does not affect kprobe-tracer, replace the limited table-based lookup
> with a programmatic implementation in __get_dwarf_regnum_arm64(). This
> allows resolving arm64 register names (x0-x30, w0-w30, sp, etc.) directly
> into their corresponding DWARF register numbers.
>
> Signed-off-by: Tengda Wu <wutengda@xxxxxxxxxxxxxxx>
> ---
> .../util/dwarf-regs-arch/dwarf-regs-arm64.c | 22 +++++++++++++++++++
> tools/perf/util/dwarf-regs.c | 2 +-
> tools/perf/util/include/dwarf-regs.h | 1 +
> 3 files changed, 24 insertions(+), 1 deletion(-)
>
> diff --git a/tools/perf/util/dwarf-regs-arch/dwarf-regs-arm64.c b/tools/perf/util/dwarf-regs-arch/dwarf-regs-arm64.c
> index 593ca7d4fccc..720c863d1869 100644
> --- a/tools/perf/util/dwarf-regs-arch/dwarf-regs-arm64.c
> +++ b/tools/perf/util/dwarf-regs-arch/dwarf-regs-arm64.c
> @@ -1,5 +1,8 @@
> // SPDX-License-Identifier: GPL-2.0
> #include <errno.h>
> +#include <ctype.h>
> +#include <stdlib.h>
> +#include <string.h>
> #include <dwarf-regs.h>
> #include "../../../arch/arm64/include/uapi/asm/perf_regs.h"
>
> @@ -10,3 +13,22 @@ int __get_dwarf_regnum_for_perf_regnum_arm64(int perf_regnum)
>
> return perf_regnum;
> }
> +
> +int __get_dwarf_regnum_arm64(const char *name)
> +{
> + int reg;
> +
> + if (!strcmp(name, "sp"))
> + return 31;
> +
> + if (*name != 'x' && *name != 'w')
> + return -ENOENT;
> +
> + name++;
> + if (!isdigit(*name))
> + return -ENOENT;
> +
> + reg = strtol(name, NULL, 10);
Nit: perhaps this can be a little faster and ensure correct string termination?
```
if (!isdigit(name[0])) {
return -ENOENT;
} else if (isdigit(name[1]) && name[2] == '\0') {
reg = (name[1] - ' 0') * 10 + name[2] - '0';
} else if (name[1] == '\0) {
reg = name[1] - '0';
} else {
return -ENOENT;
}
```
Everything else looks good to me.
Thanks,
Ian
> +
> + reg = strtol(name, NULL, 10);
> +
> + return reg >= 0 && reg <= 30 ? reg : -ENOENT;
> +}
> diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c
> index 797f455eba0d..bacf5c13c3bc 100644
> --- a/tools/perf/util/dwarf-regs.c
> +++ b/tools/perf/util/dwarf-regs.c
> @@ -114,7 +114,7 @@ int get_dwarf_regnum(const char *name, unsigned int machine, unsigned int flags)
> reg = _get_dwarf_regnum(arm_regstr_tbl, name);
> break;
> case EM_AARCH64:
> - reg = _get_dwarf_regnum(aarch64_regstr_tbl, name);
> + reg = __get_dwarf_regnum_arm64(name);
> break;
> case EM_CSKY:
> reg = __get_csky_regnum(name, flags);
> diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h
> index 46a764cf322f..a25f038bbff2 100644
> --- a/tools/perf/util/include/dwarf-regs.h
> +++ b/tools/perf/util/include/dwarf-regs.h
> @@ -105,6 +105,7 @@ int __get_dwarf_regnum_x86_64(const char *name);
> int __get_dwarf_regnum_for_perf_regnum_i386(int perf_regnum);
> int __get_dwarf_regnum_for_perf_regnum_x86_64(int perf_regnum);
>
> +int __get_dwarf_regnum_arm64(const char *name);
> int __get_dwarf_regnum_for_perf_regnum_arm(int perf_regnum);
> int __get_dwarf_regnum_for_perf_regnum_arm64(int perf_regnum);
>
> --
> 2.34.1
>