perf dwarf-regs: Pass accurate disassembly machine to get_dwarf_regnum
authorIan Rogers <irogers@google.com>
Fri, 8 Nov 2024 23:45:50 +0000 (15:45 -0800)
committerNamhyung Kim <namhyung@kernel.org>
Sat, 9 Nov 2024 16:39:13 +0000 (08:39 -0800)
Rather than pass 0/EM_NONE, use the value computed in the disasm
struct arch. Switch the EM_NONE case to EM_HOST, rewriting EM_NONE if
it were passed to get_dwarf_regnum. Pass a flags value as
architectures like csky need the flags to determine the ABI variant.

Reviewed-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: Ian Rogers <irogers@google.com>
Cc: Anup Patel <anup@brainfault.org>
Cc: Yang Jihong <yangjihong@bytedance.com>
Cc: Palmer Dabbelt <palmer@dabbelt.com>
Cc: David S. Miller <davem@davemloft.net>
Cc: Albert Ou <aou@eecs.berkeley.edu>
Cc: Shenlin Liang <liangshenlin@eswincomputing.com>
Cc: Nick Terrell <terrelln@fb.com>
Cc: Guilherme Amadio <amadio@gentoo.org>
Cc: Steinar H. Gunderson <sesse@google.com>
Cc: Changbin Du <changbin.du@huawei.com>
Cc: Alexander Lobakin <aleksander.lobakin@intel.com>
Cc: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Cc: Huacai Chen <chenhuacai@kernel.org>
Cc: Guo Ren <guoren@kernel.org>
Cc: Masahiro Yamada <masahiroy@kernel.org>
Cc: Will Deacon <will@kernel.org>
Cc: James Clark <james.clark@linaro.org>
Cc: Mike Leach <mike.leach@linaro.org>
Cc: Chen Pei <cp0613@linux.alibaba.com>
Cc: Leo Yan <leo.yan@linux.dev>
Cc: Oliver Upton <oliver.upton@linux.dev>
Cc: Aditya Gupta <adityag@linux.ibm.com>
Cc: Kajol Jain <kjain@linux.ibm.com>
Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-riscv@lists.infradead.org
Cc: Bibo Mao <maobibo@loongson.cn>
Cc: John Garry <john.g.garry@oracle.com>
Cc: Atish Patra <atishp@rivosinc.com>
Cc: Dima Kogan <dima@secretsauce.net>
Cc: Paul Walmsley <paul.walmsley@sifive.com>
Cc: Dr. David Alan Gilbert <linux@treblig.org>
Cc: linux-csky@vger.kernel.org
Link: https://lore.kernel.org/r/20241108234606.429459-6-irogers@google.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/perf/util/annotate.c
tools/perf/util/dwarf-regs.c
tools/perf/util/include/dwarf-regs.h

index 37ce43c..b1d98da 100644 (file)
@@ -2292,7 +2292,7 @@ static int extract_reg_offset(struct arch *arch, const char *str,
        if (regname == NULL)
                return -1;
 
-       op_loc->reg1 = get_dwarf_regnum(regname, 0);
+       op_loc->reg1 = get_dwarf_regnum(regname, arch->e_machine, arch->e_flags);
        free(regname);
 
        /* Get the second register */
@@ -2305,7 +2305,7 @@ static int extract_reg_offset(struct arch *arch, const char *str,
                if (regname == NULL)
                        return -1;
 
-               op_loc->reg2 = get_dwarf_regnum(regname, 0);
+               op_loc->reg2 = get_dwarf_regnum(regname, arch->e_machine, arch->e_flags);
                free(regname);
        }
        return 0;
@@ -2405,7 +2405,7 @@ int annotate_get_insn_location(struct arch *arch, struct disasm_line *dl,
                                return -1;
 
                        if (*s == arch->objdump.register_char)
-                               op_loc->reg1 = get_dwarf_regnum(s, 0);
+                               op_loc->reg1 = get_dwarf_regnum(s, arch->e_machine, arch->e_flags);
                        else if (*s == arch->objdump.imm_char) {
                                op_loc->offset = strtol(s + 1, &p, 0);
                                if (p && p != s + 1)
index 7c01bc4..1321387 100644 (file)
@@ -70,7 +70,7 @@ __weak int get_arch_regnum(const char *name __maybe_unused)
 }
 
 /* Return DWARF register number from architecture register name */
-int get_dwarf_regnum(const char *name, unsigned int machine)
+int get_dwarf_regnum(const char *name, unsigned int machine, unsigned int flags __maybe_unused)
 {
        char *regname = strdup(name);
        int reg = -1;
@@ -84,8 +84,12 @@ int get_dwarf_regnum(const char *name, unsigned int machine)
        if (p)
                *p = '\0';
 
+       if (machine == EM_NONE) {
+               /* Generic arch - use host arch */
+               machine = EM_HOST;
+       }
        switch (machine) {
-       case EM_NONE:   /* Generic arch - use host arch */
+       case EM_HOST:
                reg = get_arch_regnum(regname);
                break;
        default:
index ce9f10b..3c3a908 100644 (file)
@@ -103,12 +103,13 @@ int get_arch_regnum(const char *name);
  * name: architecture register name
  * machine: ELF machine signature (EM_*)
  */
-int get_dwarf_regnum(const char *name, unsigned int machine);
+int get_dwarf_regnum(const char *name, unsigned int machine, unsigned int flags);
 
 #else /* HAVE_LIBDW_SUPPORT */
 
 static inline int get_dwarf_regnum(const char *name __maybe_unused,
-                                  unsigned int machine __maybe_unused)
+                                  unsigned int machine __maybe_unused,
+                                  unsigned int flags __maybe_unused)
 {
        return -1;
 }