linux-perf-users.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 00/20] Remove PERF_HAVE_DWARF_REGS
@ 2024-10-17  0:25 Ian Rogers
  2024-10-17  0:25 ` [PATCH v3 01/20] perf bpf-prologue: Remove unused file Ian Rogers
                   ` (20 more replies)
  0 siblings, 21 replies; 31+ messages in thread
From: Ian Rogers @ 2024-10-17  0:25 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Kan Liang, John Garry, Will Deacon,
	James Clark, Mike Leach, Leo Yan, Guo Ren, Paul Walmsley,
	Palmer Dabbelt, Albert Ou, Nick Terrell,
	Masami Hiramatsu (Google), Changbin Du, Guilherme Amadio,
	Yang Jihong, Aditya Gupta, Athira Rajeev, Masahiro Yamada,
	Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra, Shenlin Liang,
	Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

These changes are on top of:
https://lore.kernel.org/lkml/20241017001354.56973-1-irogers@google.com/

Prior to these patches PERF_HAVE_DWARF_REGS indicated the presence of
dwarf-regs.c in the arch directory. dwarf-regs.c provided upto 4
functions:

1) regs_query_register_offset would translate a register name into a
pt_regs offset and was used by BPF prologues. BPF prologues existed
for BPF events and support for these was removed many releases ago.
This code was dead and could be removed.

2) get_arch_regstr duplicated get_dwarf_regstr and so it could be
removed.  The case for csky was a little more complicated as the ABI
controlled the string. The callers of get_dwarf_regstr were updated to
also pass the ELF flags so that on csky the ABI appropriate table
could be used. As the argument is only used on csky this a no-op for
everything else.

3) get_arch_regnum translated a register name back to a dwarf number
and only existed on x86 where "al", "ax", "eax" and "rax" could all
mean register 0. This code was moved to util with similar
machine/flags logic to get_arch_regstr and for consistency with it.

4) get_powerpc_regs a PowerPC specific function used by annotate that
should really be in util.

2 and 3 required the wiring through of the ELF machine and flags in
callers to get_dwarf_regstr and get_dwarf_regnum. When these values
weren't dependent on an ELF file a new EM_HOST and EF_HOST were added
to give the host ELF machine and flags. These 2 #defines got rid of
the existing separate arch files and #ifdefs.

v3: These files were separated from the rest of the v2 libdw clean up
    in:
https://lore.kernel.org/lkml/CAP-5=fVZH3L-6y_sxLwSmT8WyMXDMFnuqUksNULdQYJCPNBFYw@mail.gmail.com/

Ian Rogers (20):
  perf bpf-prologue: Remove unused file
  perf dwarf-regs: Remove PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET
  perf dwarf-regs: Add EM_HOST and EF_HOST defines
  perf disasm: Add e_machine/e_flags to struct arch
  perf dwarf-regs: Pass accurate disassembly machine to get_dwarf_regnum
  perf dwarf-regs: Pass ELF flags to get_dwarf_regstr
  perf dwarf-regs: Move x86 dwarf-regs out of arch
  perf arm64: Remove dwarf-regs.c
  perf arm: Remove dwarf-regs.c
  perf dwarf-regs: Move csky dwarf-regs out of arch
  perf loongarch: Remove dwarf-regs.c
  perf mips: Remove dwarf-regs.c
  perf dwarf-regs: Move powerpc dwarf-regs out of arch
  perf riscv: Remove dwarf-regs.c and add dwarf-regs-table.h
  perf s390: Remove dwarf-regs.c
  perf sh: Remove dwarf-regs.c
  perf sparc: Remove dwarf-regs.c
  perf xtensa: Remove dwarf-regs.c
  perf dwarf-regs: Remove get_arch_regstr code
  perf build: Remove PERF_HAVE_DWARF_REGS

 tools/perf/Makefile.config                    |  17 +-
 tools/perf/arch/arc/annotate/instructions.c   |   2 +
 tools/perf/arch/arm/Makefile                  |   3 -
 tools/perf/arch/arm/annotate/instructions.c   |   2 +
 tools/perf/arch/arm/util/Build                |   2 -
 tools/perf/arch/arm/util/dwarf-regs.c         |  61 -------
 tools/perf/arch/arm64/Makefile                |   4 -
 tools/perf/arch/arm64/annotate/instructions.c |   2 +
 tools/perf/arch/arm64/util/Build              |   1 -
 tools/perf/arch/arm64/util/dwarf-regs.c       |  92 -----------
 tools/perf/arch/csky/Makefile                 |   4 -
 tools/perf/arch/csky/annotate/instructions.c  |   7 +-
 tools/perf/arch/csky/util/Build               |   1 -
 tools/perf/arch/loongarch/Makefile            |   4 -
 .../arch/loongarch/annotate/instructions.c    |   2 +
 tools/perf/arch/loongarch/util/Build          |   1 -
 tools/perf/arch/loongarch/util/dwarf-regs.c   |  44 -----
 tools/perf/arch/mips/Makefile                 |   4 -
 tools/perf/arch/mips/annotate/instructions.c  |   2 +
 tools/perf/arch/mips/util/Build               |   1 -
 tools/perf/arch/mips/util/dwarf-regs.c        |  38 -----
 tools/perf/arch/powerpc/Makefile              |   5 -
 .../perf/arch/powerpc/annotate/instructions.c |   2 +
 tools/perf/arch/powerpc/util/Build            |   1 -
 tools/perf/arch/powerpc/util/dwarf-regs.c     | 153 ------------------
 tools/perf/arch/riscv/Makefile                |   5 +-
 .../arch/riscv/include/dwarf-regs-table.h     |  42 +++++
 tools/perf/arch/riscv/util/Build              |   1 -
 tools/perf/arch/riscv/util/dwarf-regs.c       |  72 ---------
 .../perf/arch/riscv64/annotate/instructions.c |   2 +
 tools/perf/arch/s390/Makefile                 |   4 -
 tools/perf/arch/s390/annotate/instructions.c  |   2 +
 tools/perf/arch/s390/util/Build               |   1 -
 tools/perf/arch/s390/util/dwarf-regs.c        |  43 -----
 tools/perf/arch/sh/Build                      |   1 -
 tools/perf/arch/sh/Makefile                   |   4 -
 tools/perf/arch/sh/util/Build                 |   1 -
 tools/perf/arch/sh/util/dwarf-regs.c          |  41 -----
 tools/perf/arch/sparc/Build                   |   1 -
 tools/perf/arch/sparc/Makefile                |   4 -
 tools/perf/arch/sparc/annotate/instructions.c |   2 +
 tools/perf/arch/sparc/util/Build              |   1 -
 tools/perf/arch/sparc/util/dwarf-regs.c       |  39 -----
 tools/perf/arch/x86/Makefile                  |   4 -
 tools/perf/arch/x86/annotate/instructions.c   |   3 +-
 tools/perf/arch/x86/util/Build                |   3 -
 tools/perf/arch/x86/util/dwarf-regs.c         | 153 ------------------
 tools/perf/arch/xtensa/Build                  |   1 -
 tools/perf/arch/xtensa/Makefile               |   4 -
 tools/perf/arch/xtensa/util/Build             |   1 -
 tools/perf/arch/xtensa/util/dwarf-regs.c      |  21 ---
 tools/perf/util/Build                         |   3 +
 tools/perf/util/annotate.c                    |   6 +-
 tools/perf/util/bpf-prologue.h                |  37 -----
 tools/perf/util/disasm.h                      |   4 +
 .../dwarf-regs.c => util/dwarf-regs-csky.c}   |  19 +--
 tools/perf/util/dwarf-regs-powerpc.c          |  61 +++++++
 tools/perf/util/dwarf-regs-x86.c              |  50 ++++++
 tools/perf/util/dwarf-regs.c                  |  38 +++--
 tools/perf/util/include/dwarf-regs.h          | 110 ++++++++++---
 tools/perf/util/probe-finder.c                |  13 +-
 tools/perf/util/probe-finder.h                |   3 +-
 62 files changed, 328 insertions(+), 927 deletions(-)
 delete mode 100644 tools/perf/arch/arm/util/dwarf-regs.c
 delete mode 100644 tools/perf/arch/arm64/util/dwarf-regs.c
 delete mode 100644 tools/perf/arch/csky/Makefile
 delete mode 100644 tools/perf/arch/loongarch/util/dwarf-regs.c
 delete mode 100644 tools/perf/arch/mips/util/dwarf-regs.c
 delete mode 100644 tools/perf/arch/powerpc/util/dwarf-regs.c
 create mode 100644 tools/perf/arch/riscv/include/dwarf-regs-table.h
 delete mode 100644 tools/perf/arch/riscv/util/dwarf-regs.c
 delete mode 100644 tools/perf/arch/s390/util/dwarf-regs.c
 delete mode 100644 tools/perf/arch/sh/Build
 delete mode 100644 tools/perf/arch/sh/Makefile
 delete mode 100644 tools/perf/arch/sh/util/Build
 delete mode 100644 tools/perf/arch/sh/util/dwarf-regs.c
 delete mode 100644 tools/perf/arch/sparc/Build
 delete mode 100644 tools/perf/arch/sparc/util/Build
 delete mode 100644 tools/perf/arch/sparc/util/dwarf-regs.c
 delete mode 100644 tools/perf/arch/x86/util/dwarf-regs.c
 delete mode 100644 tools/perf/arch/xtensa/Build
 delete mode 100644 tools/perf/arch/xtensa/Makefile
 delete mode 100644 tools/perf/arch/xtensa/util/Build
 delete mode 100644 tools/perf/arch/xtensa/util/dwarf-regs.c
 delete mode 100644 tools/perf/util/bpf-prologue.h
 rename tools/perf/{arch/csky/util/dwarf-regs.c => util/dwarf-regs-csky.c} (74%)
 create mode 100644 tools/perf/util/dwarf-regs-powerpc.c
 create mode 100644 tools/perf/util/dwarf-regs-x86.c

-- 
2.47.0.105.g07ac214952-goog


^ permalink raw reply	[flat|nested] 31+ messages in thread

* [PATCH v3 01/20] perf bpf-prologue: Remove unused file
  2024-10-17  0:25 [PATCH v3 00/20] Remove PERF_HAVE_DWARF_REGS Ian Rogers
@ 2024-10-17  0:25 ` Ian Rogers
  2024-10-17  0:25 ` [PATCH v3 02/20] perf dwarf-regs: Remove PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET Ian Rogers
                   ` (19 subsequent siblings)
  20 siblings, 0 replies; 31+ messages in thread
From: Ian Rogers @ 2024-10-17  0:25 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Kan Liang, John Garry, Will Deacon,
	James Clark, Mike Leach, Leo Yan, Guo Ren, Paul Walmsley,
	Palmer Dabbelt, Albert Ou, Nick Terrell,
	Masami Hiramatsu (Google), Changbin Du, Guilherme Amadio,
	Yang Jihong, Aditya Gupta, Athira Rajeev, Masahiro Yamada,
	Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra, Shenlin Liang,
	Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

Commit 4a73fca22692 ("perf bpf-prologue: Remove unused file") missed
cleaning up the header file. The code was unnecessary as Commit
3d6dfae88917 ("perf parse-events: Remove BPF event support") removed
building bpf-prologue.c.

Fixes: 4a73fca22692 ("perf bpf-prologue: Remove unused file")
Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/util/bpf-prologue.h | 37 ----------------------------------
 1 file changed, 37 deletions(-)
 delete mode 100644 tools/perf/util/bpf-prologue.h

diff --git a/tools/perf/util/bpf-prologue.h b/tools/perf/util/bpf-prologue.h
deleted file mode 100644
index 66dcf751ef65..000000000000
--- a/tools/perf/util/bpf-prologue.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (C) 2015, He Kuang <hekuang@huawei.com>
- * Copyright (C) 2015, Huawei Inc.
- */
-#ifndef __BPF_PROLOGUE_H
-#define __BPF_PROLOGUE_H
-
-struct probe_trace_arg;
-struct bpf_insn;
-
-#define BPF_PROLOGUE_MAX_ARGS 3
-#define BPF_PROLOGUE_START_ARG_REG BPF_REG_3
-#define BPF_PROLOGUE_FETCH_RESULT_REG BPF_REG_2
-
-#ifdef HAVE_BPF_PROLOGUE
-int bpf__gen_prologue(struct probe_trace_arg *args, int nargs,
-		      struct bpf_insn *new_prog, size_t *new_cnt,
-		      size_t cnt_space);
-#else
-#include <linux/compiler.h>
-#include <errno.h>
-
-static inline int
-bpf__gen_prologue(struct probe_trace_arg *args __maybe_unused,
-		  int nargs __maybe_unused,
-		  struct bpf_insn *new_prog __maybe_unused,
-		  size_t *new_cnt,
-		  size_t cnt_space __maybe_unused)
-{
-	if (!new_cnt)
-		return -EINVAL;
-	*new_cnt = 0;
-	return -ENOTSUP;
-}
-#endif
-#endif /* __BPF_PROLOGUE_H */
-- 
2.47.0.105.g07ac214952-goog


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v3 02/20] perf dwarf-regs: Remove PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET
  2024-10-17  0:25 [PATCH v3 00/20] Remove PERF_HAVE_DWARF_REGS Ian Rogers
  2024-10-17  0:25 ` [PATCH v3 01/20] perf bpf-prologue: Remove unused file Ian Rogers
@ 2024-10-17  0:25 ` Ian Rogers
  2024-10-17  0:25 ` [PATCH v3 03/20] perf dwarf-regs: Add EM_HOST and EF_HOST defines Ian Rogers
                   ` (18 subsequent siblings)
  20 siblings, 0 replies; 31+ messages in thread
From: Ian Rogers @ 2024-10-17  0:25 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Kan Liang, John Garry, Will Deacon,
	James Clark, Mike Leach, Leo Yan, Guo Ren, Paul Walmsley,
	Palmer Dabbelt, Albert Ou, Nick Terrell,
	Masami Hiramatsu (Google), Changbin Du, Guilherme Amadio,
	Yang Jihong, Aditya Gupta, Athira Rajeev, Masahiro Yamada,
	Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra, Shenlin Liang,
	Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET was used for BPF prologue
support which was removed in Commit 3d6dfae88917 ("perf parse-events:
Remove BPF event support"). The code is no longer used so remove.

Remove the offset from various dwarf-regs.c tables and the dependence
on ptrace.h. Rename structs starting pt_ as the ptrace derived offset is
now removed.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/Makefile.config                  |   4 -
 tools/perf/arch/arm64/Makefile              |   1 -
 tools/perf/arch/arm64/util/dwarf-regs.c     |  20 +---
 tools/perf/arch/loongarch/Makefile          |   1 -
 tools/perf/arch/loongarch/util/dwarf-regs.c |  10 --
 tools/perf/arch/powerpc/Makefile            |   1 -
 tools/perf/arch/powerpc/util/dwarf-regs.c   |  26 ++---
 tools/perf/arch/riscv/Makefile              |   1 -
 tools/perf/arch/riscv/util/dwarf-regs.c     |  14 +--
 tools/perf/arch/s390/Makefile               |   1 -
 tools/perf/arch/s390/util/dwarf-regs.c      |  27 -----
 tools/perf/arch/x86/Makefile                |   1 -
 tools/perf/arch/x86/util/dwarf-regs.c       | 109 +++-----------------
 tools/perf/util/include/dwarf-regs.h        |   8 --
 14 files changed, 27 insertions(+), 197 deletions(-)

diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index b93ed2b7623f..1d3f7dcc6b66 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -203,10 +203,6 @@ FEATURE_CHECK_CFLAGS-bpf = -I. -I$(srctree)/tools/include -I$(srctree)/tools/arc
 # include ARCH specific config
 -include $(src-perf)/arch/$(SRCARCH)/Makefile
 
-ifdef PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET
-  CFLAGS += -DHAVE_ARCH_REGS_QUERY_REGISTER_OFFSET
-endif
-
 include $(srctree)/tools/scripts/utilities.mak
 
 ifeq ($(call get-executable,$(FLEX)),)
diff --git a/tools/perf/arch/arm64/Makefile b/tools/perf/arch/arm64/Makefile
index 8a5ffbfe809f..ca2e35961287 100644
--- a/tools/perf/arch/arm64/Makefile
+++ b/tools/perf/arch/arm64/Makefile
@@ -3,7 +3,6 @@ ifndef NO_LIBDW
 PERF_HAVE_DWARF_REGS := 1
 endif
 PERF_HAVE_JITDUMP := 1
-PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET := 1
 HAVE_KVM_STAT_SUPPORT := 1
 
 #
diff --git a/tools/perf/arch/arm64/util/dwarf-regs.c b/tools/perf/arch/arm64/util/dwarf-regs.c
index 917b97d7c5d3..343a62fa4199 100644
--- a/tools/perf/arch/arm64/util/dwarf-regs.c
+++ b/tools/perf/arch/arm64/util/dwarf-regs.c
@@ -9,10 +9,9 @@
 #include <stddef.h>
 #include <string.h>
 #include <dwarf-regs.h>
-#include <linux/ptrace.h> /* for struct user_pt_regs */
 #include <linux/stringify.h>
 
-struct pt_regs_dwarfnum {
+struct regs_dwarfnum {
 	const char *name;
 	unsigned int dwarfnum;
 };
@@ -21,14 +20,12 @@ struct pt_regs_dwarfnum {
 #define GPR_DWARFNUM_NAME(num) \
 	{.name = __stringify(%x##num), .dwarfnum = num}
 #define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
-#define DWARFNUM2OFFSET(index) \
-	(index * sizeof((struct user_pt_regs *)0)->regs[0])
 
 /*
  * Reference:
  * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0057b/IHI0057B_aadwarf64.pdf
  */
-static const struct pt_regs_dwarfnum regdwarfnum_table[] = {
+static const struct regs_dwarfnum regdwarfnum_table[] = {
 	GPR_DWARFNUM_NAME(0),
 	GPR_DWARFNUM_NAME(1),
 	GPR_DWARFNUM_NAME(2),
@@ -74,19 +71,10 @@ static const struct pt_regs_dwarfnum regdwarfnum_table[] = {
  */
 const char *get_arch_regstr(unsigned int n)
 {
-	const struct pt_regs_dwarfnum *roff;
+	const struct regs_dwarfnum *roff;
+
 	for (roff = regdwarfnum_table; roff->name != NULL; roff++)
 		if (roff->dwarfnum == n)
 			return roff->name;
 	return NULL;
 }
-
-int regs_query_register_offset(const char *name)
-{
-	const struct pt_regs_dwarfnum *roff;
-
-	for (roff = regdwarfnum_table; roff->name != NULL; roff++)
-		if (!strcmp(roff->name, name))
-			return DWARFNUM2OFFSET(roff->dwarfnum);
-	return -EINVAL;
-}
diff --git a/tools/perf/arch/loongarch/Makefile b/tools/perf/arch/loongarch/Makefile
index 1cc5eb01f32b..79b432744296 100644
--- a/tools/perf/arch/loongarch/Makefile
+++ b/tools/perf/arch/loongarch/Makefile
@@ -2,7 +2,6 @@
 ifndef NO_LIBDW
 PERF_HAVE_DWARF_REGS := 1
 endif
-PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET := 1
 PERF_HAVE_JITDUMP := 1
 HAVE_KVM_STAT_SUPPORT := 1
 
diff --git a/tools/perf/arch/loongarch/util/dwarf-regs.c b/tools/perf/arch/loongarch/util/dwarf-regs.c
index 0f6ebc387463..bee08fdcf2fd 100644
--- a/tools/perf/arch/loongarch/util/dwarf-regs.c
+++ b/tools/perf/arch/loongarch/util/dwarf-regs.c
@@ -32,13 +32,3 @@ const char *get_arch_regstr(unsigned int n)
 	n %= 32;
 	return loongarch_gpr_table[n].name;
 }
-
-int regs_query_register_offset(const char *name)
-{
-	const struct pt_regs_dwarfnum *roff;
-
-	for (roff = loongarch_gpr_table; roff->name != NULL; roff++)
-		if (!strcmp(roff->name, name))
-			return roff->dwarfnum;
-	return -EINVAL;
-}
diff --git a/tools/perf/arch/powerpc/Makefile b/tools/perf/arch/powerpc/Makefile
index 7672d555f6cd..ae05727835d8 100644
--- a/tools/perf/arch/powerpc/Makefile
+++ b/tools/perf/arch/powerpc/Makefile
@@ -4,7 +4,6 @@ PERF_HAVE_DWARF_REGS := 1
 endif
 
 HAVE_KVM_STAT_SUPPORT := 1
-PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET := 1
 PERF_HAVE_JITDUMP := 1
 
 #
diff --git a/tools/perf/arch/powerpc/util/dwarf-regs.c b/tools/perf/arch/powerpc/util/dwarf-regs.c
index 104c7ae5c433..23846c59a522 100644
--- a/tools/perf/arch/powerpc/util/dwarf-regs.c
+++ b/tools/perf/arch/powerpc/util/dwarf-regs.c
@@ -9,29 +9,25 @@
 #include <errno.h>
 #include <string.h>
 #include <dwarf-regs.h>
-#include <linux/ptrace.h>
 #include <linux/kernel.h>
 #include <linux/stringify.h>
 
-struct pt_regs_dwarfnum {
+struct regs_dwarfnum {
 	const char *name;
 	unsigned int dwarfnum;
-	unsigned int ptregs_offset;
 };
 
 #define REG_DWARFNUM_NAME(r, num)					\
-		{.name = __stringify(%)__stringify(r), .dwarfnum = num,			\
-		.ptregs_offset = offsetof(struct pt_regs, r)}
+	{.name = __stringify(%)__stringify(r), .dwarfnum = num}
 #define GPR_DWARFNUM_NAME(num)						\
-		{.name = __stringify(%gpr##num), .dwarfnum = num,		\
-		.ptregs_offset = offsetof(struct pt_regs, gpr[num])}
-#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0, .ptregs_offset = 0}
+	{.name = __stringify(%gpr##num), .dwarfnum = num}
+#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
 
 /*
  * Reference:
  * http://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi-1.9.html
  */
-static const struct pt_regs_dwarfnum regdwarfnum_table[] = {
+static const struct regs_dwarfnum regdwarfnum_table[] = {
 	GPR_DWARFNUM_NAME(0),
 	GPR_DWARFNUM_NAME(1),
 	GPR_DWARFNUM_NAME(2),
@@ -83,22 +79,14 @@ static const struct pt_regs_dwarfnum regdwarfnum_table[] = {
  */
 const char *get_arch_regstr(unsigned int n)
 {
-	const struct pt_regs_dwarfnum *roff;
+	const struct regs_dwarfnum *roff;
+
 	for (roff = regdwarfnum_table; roff->name != NULL; roff++)
 		if (roff->dwarfnum == n)
 			return roff->name;
 	return NULL;
 }
 
-int regs_query_register_offset(const char *name)
-{
-	const struct pt_regs_dwarfnum *roff;
-	for (roff = regdwarfnum_table; roff->name != NULL; roff++)
-		if (!strcmp(roff->name, name))
-			return roff->ptregs_offset;
-	return -EINVAL;
-}
-
 #define PPC_OP(op)	(((op) >> 26) & 0x3F)
 #define PPC_RA(a)	(((a) >> 16) & 0x1f)
 #define PPC_RT(t)	(((t) >> 21) & 0x1f)
diff --git a/tools/perf/arch/riscv/Makefile b/tools/perf/arch/riscv/Makefile
index 4664a78a1afd..f01ab2171fd0 100644
--- a/tools/perf/arch/riscv/Makefile
+++ b/tools/perf/arch/riscv/Makefile
@@ -1,6 +1,5 @@
 ifndef NO_LIBDW
 PERF_HAVE_DWARF_REGS := 1
 endif
-PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET := 1
 PERF_HAVE_JITDUMP := 1
 HAVE_KVM_STAT_SUPPORT := 1
diff --git a/tools/perf/arch/riscv/util/dwarf-regs.c b/tools/perf/arch/riscv/util/dwarf-regs.c
index cd0504c02e2e..a9c4402ae57e 100644
--- a/tools/perf/arch/riscv/util/dwarf-regs.c
+++ b/tools/perf/arch/riscv/util/dwarf-regs.c
@@ -9,7 +9,7 @@
 #include <string.h> /* for strcmp */
 #include <dwarf-regs.h>
 
-struct pt_regs_dwarfnum {
+struct regs_dwarfnum {
 	const char *name;
 	unsigned int dwarfnum;
 };
@@ -17,7 +17,7 @@ struct pt_regs_dwarfnum {
 #define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}
 #define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
 
-struct pt_regs_dwarfnum riscv_dwarf_regs_table[] = {
+struct regs_dwarfnum riscv_dwarf_regs_table[] = {
 	REG_DWARFNUM_NAME("%zero", 0),
 	REG_DWARFNUM_NAME("%ra", 1),
 	REG_DWARFNUM_NAME("%sp", 2),
@@ -60,13 +60,3 @@ const char *get_arch_regstr(unsigned int n)
 {
 	return (n < RISCV_MAX_REGS) ? riscv_dwarf_regs_table[n].name : NULL;
 }
-
-int regs_query_register_offset(const char *name)
-{
-	const struct pt_regs_dwarfnum *roff;
-
-	for (roff = riscv_dwarf_regs_table; roff->name; roff++)
-		if (!strcmp(roff->name, name))
-			return roff->dwarfnum;
-	return -EINVAL;
-}
diff --git a/tools/perf/arch/s390/Makefile b/tools/perf/arch/s390/Makefile
index 3f66e2ede3f7..58e79f5b67a4 100644
--- a/tools/perf/arch/s390/Makefile
+++ b/tools/perf/arch/s390/Makefile
@@ -3,7 +3,6 @@ ifndef NO_LIBDW
 PERF_HAVE_DWARF_REGS := 1
 endif
 HAVE_KVM_STAT_SUPPORT := 1
-PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET := 1
 PERF_HAVE_JITDUMP := 1
 
 #
diff --git a/tools/perf/arch/s390/util/dwarf-regs.c b/tools/perf/arch/s390/util/dwarf-regs.c
index dfddb3099bfa..5bcf3192623a 100644
--- a/tools/perf/arch/s390/util/dwarf-regs.c
+++ b/tools/perf/arch/s390/util/dwarf-regs.c
@@ -7,37 +7,10 @@
  *
  */
 
-#include <errno.h>
-#include <stddef.h>
-#include <stdlib.h>
 #include <linux/kernel.h>
-#include <asm/ptrace.h>
-#include <string.h>
-#include <dwarf-regs.h>
 #include "dwarf-regs-table.h"
 
 const char *get_arch_regstr(unsigned int n)
 {
 	return (n >= ARRAY_SIZE(s390_dwarf_regs)) ? NULL : s390_dwarf_regs[n];
 }
-
-/*
- * Convert the register name into an offset to struct pt_regs (kernel).
- * This is required by the BPF prologue generator.  The BPF
- * program is called in the BPF overflow handler in the perf
- * core.
- */
-int regs_query_register_offset(const char *name)
-{
-	unsigned long gpr;
-
-	if (!name || strncmp(name, "%r", 2))
-		return -EINVAL;
-
-	errno = 0;
-	gpr = strtoul(name + 2, NULL, 10);
-	if (errno || gpr >= 16)
-		return -EINVAL;
-
-	return offsetof(user_pt_regs, gprs) + 8 * gpr;
-}
diff --git a/tools/perf/arch/x86/Makefile b/tools/perf/arch/x86/Makefile
index 9aa58acb5564..51cf267f4d85 100644
--- a/tools/perf/arch/x86/Makefile
+++ b/tools/perf/arch/x86/Makefile
@@ -3,7 +3,6 @@ ifndef NO_LIBDW
 PERF_HAVE_DWARF_REGS := 1
 endif
 HAVE_KVM_STAT_SUPPORT := 1
-PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET := 1
 PERF_HAVE_JITDUMP := 1
 
 ###
diff --git a/tools/perf/arch/x86/util/dwarf-regs.c b/tools/perf/arch/x86/util/dwarf-regs.c
index 399c4a0a29d8..530905118cd4 100644
--- a/tools/perf/arch/x86/util/dwarf-regs.c
+++ b/tools/perf/arch/x86/util/dwarf-regs.c
@@ -6,112 +6,31 @@
  * Written by Masami Hiramatsu <mhiramat@redhat.com>
  */
 
-#include <stddef.h>
 #include <errno.h> /* for EINVAL */
 #include <string.h> /* for strcmp */
-#include <linux/ptrace.h> /* for struct pt_regs */
-#include <linux/kernel.h> /* for offsetof */
+#include <linux/kernel.h> /* for ARRAY_SIZE */
 #include <dwarf-regs.h>
 
-/*
- * See arch/x86/kernel/ptrace.c.
- * Different from it:
- *
- *  - Since struct pt_regs is defined differently for user and kernel,
- *    but we want to use 'ax, bx' instead of 'rax, rbx' (which is struct
- *    field name of user's pt_regs), we make REG_OFFSET_NAME to accept
- *    both string name and reg field name.
- *
- *  - Since accessing x86_32's pt_regs from x86_64 building is difficult
- *    and vise versa, we simply fill offset with -1, so
- *    get_arch_regstr() still works but regs_query_register_offset()
- *    returns error.
- *    The only inconvenience caused by it now is that we are not allowed
- *    to generate BPF prologue for a x86_64 kernel if perf is built for
- *    x86_32. This is really a rare usecase.
- *
- *  - Order is different from kernel's ptrace.c for get_arch_regstr(). Use
- *    the order defined by dwarf.
- */
+#define DEFINE_DWARF_REGSTR_TABLE 1
+#include "dwarf-regs-table.h"
 
-struct pt_regs_offset {
-	const char *name;
-	int offset;
-};
-
-#define REG_OFFSET_END {.name = NULL, .offset = 0}
-
-#ifdef __x86_64__
-# define REG_OFFSET_NAME_64(n, r) {.name = n, .offset = offsetof(struct pt_regs, r)}
-# define REG_OFFSET_NAME_32(n, r) {.name = n, .offset = -1}
+/* Return architecture dependent register string (for kprobe-tracer) */
+const char *get_arch_regstr(unsigned int n)
+{
+#if defined(__i386__)
+	size_t len = ARRAY_SIZE(x86_32_regstr_tbl);
 #else
-# define REG_OFFSET_NAME_64(n, r) {.name = n, .offset = -1}
-# define REG_OFFSET_NAME_32(n, r) {.name = n, .offset = offsetof(struct pt_regs, r)}
+	size_t len = ARRAY_SIZE(x86_64_regstr_tbl);
 #endif
 
-/* TODO: switching by dwarf address size */
-#ifndef __x86_64__
-static const struct pt_regs_offset x86_32_regoffset_table[] = {
-	REG_OFFSET_NAME_32("%ax",	eax),
-	REG_OFFSET_NAME_32("%cx",	ecx),
-	REG_OFFSET_NAME_32("%dx",	edx),
-	REG_OFFSET_NAME_32("%bx",	ebx),
-	REG_OFFSET_NAME_32("$stack",	esp),	/* Stack address instead of %sp */
-	REG_OFFSET_NAME_32("%bp",	ebp),
-	REG_OFFSET_NAME_32("%si",	esi),
-	REG_OFFSET_NAME_32("%di",	edi),
-	REG_OFFSET_END,
-};
+	if (n >= len)
+		return NULL;
 
-#define regoffset_table x86_32_regoffset_table
+#if defined(__i386__)
+	return x86_32_regstr_tbl[n];
 #else
-static const struct pt_regs_offset x86_64_regoffset_table[] = {
-	REG_OFFSET_NAME_64("%ax",	rax),
-	REG_OFFSET_NAME_64("%dx",	rdx),
-	REG_OFFSET_NAME_64("%cx",	rcx),
-	REG_OFFSET_NAME_64("%bx",	rbx),
-	REG_OFFSET_NAME_64("%si",	rsi),
-	REG_OFFSET_NAME_64("%di",	rdi),
-	REG_OFFSET_NAME_64("%bp",	rbp),
-	REG_OFFSET_NAME_64("%sp",	rsp),
-	REG_OFFSET_NAME_64("%r8",	r8),
-	REG_OFFSET_NAME_64("%r9",	r9),
-	REG_OFFSET_NAME_64("%r10",	r10),
-	REG_OFFSET_NAME_64("%r11",	r11),
-	REG_OFFSET_NAME_64("%r12",	r12),
-	REG_OFFSET_NAME_64("%r13",	r13),
-	REG_OFFSET_NAME_64("%r14",	r14),
-	REG_OFFSET_NAME_64("%r15",	r15),
-	REG_OFFSET_END,
-};
-
-#define regoffset_table x86_64_regoffset_table
+	return x86_64_regstr_tbl[n];
 #endif
-
-/* Minus 1 for the ending REG_OFFSET_END */
-#define ARCH_MAX_REGS ((sizeof(regoffset_table) / sizeof(regoffset_table[0])) - 1)
-
-/* Return architecture dependent register string (for kprobe-tracer) */
-const char *get_arch_regstr(unsigned int n)
-{
-	return (n < ARCH_MAX_REGS) ? regoffset_table[n].name : NULL;
-}
-
-/* Reuse code from arch/x86/kernel/ptrace.c */
-/**
- * regs_query_register_offset() - query register offset from its name
- * @name:	the name of a register
- *
- * regs_query_register_offset() returns the offset of a register in struct
- * pt_regs from its name. If the name is invalid, this returns -EINVAL;
- */
-int regs_query_register_offset(const char *name)
-{
-	const struct pt_regs_offset *roff;
-	for (roff = regoffset_table; roff->name != NULL; roff++)
-		if (!strcmp(roff->name, name))
-			return roff->offset;
-	return -EINVAL;
 }
 
 struct dwarf_regs_idx {
diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h
index 29a7d0546b82..fbdd7307e0c2 100644
--- a/tools/perf/util/include/dwarf-regs.h
+++ b/tools/perf/util/include/dwarf-regs.h
@@ -42,12 +42,4 @@ static inline void get_powerpc_regs(u32 raw_insn __maybe_unused, int is_source _
 void get_powerpc_regs(u32 raw_insn, int is_source, struct annotated_op_loc *op_loc);
 #endif
 
-#ifdef HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET
-/*
- * Arch should support fetching the offset of a register in pt_regs
- * by its name. See kernel's regs_query_register_offset in
- * arch/xxx/kernel/ptrace.c.
- */
-int regs_query_register_offset(const char *name);
-#endif
 #endif
-- 
2.47.0.105.g07ac214952-goog


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v3 03/20] perf dwarf-regs: Add EM_HOST and EF_HOST defines
  2024-10-17  0:25 [PATCH v3 00/20] Remove PERF_HAVE_DWARF_REGS Ian Rogers
  2024-10-17  0:25 ` [PATCH v3 01/20] perf bpf-prologue: Remove unused file Ian Rogers
  2024-10-17  0:25 ` [PATCH v3 02/20] perf dwarf-regs: Remove PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET Ian Rogers
@ 2024-10-17  0:25 ` Ian Rogers
  2024-10-17  0:25 ` [PATCH v3 04/20] perf disasm: Add e_machine/e_flags to struct arch Ian Rogers
                   ` (17 subsequent siblings)
  20 siblings, 0 replies; 31+ messages in thread
From: Ian Rogers @ 2024-10-17  0:25 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Kan Liang, John Garry, Will Deacon,
	James Clark, Mike Leach, Leo Yan, Guo Ren, Paul Walmsley,
	Palmer Dabbelt, Albert Ou, Nick Terrell,
	Masami Hiramatsu (Google), Changbin Du, Guilherme Amadio,
	Yang Jihong, Aditya Gupta, Athira Rajeev, Masahiro Yamada,
	Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra, Shenlin Liang,
	Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

Computed from the build architecture defines, EM_HOST and EF_HOST give
values that can be used in dwarf register lookup. Place in
dwarf-regs.h so the value can be shared. Move some dwarf-regs.c
constants used for EM_HOST to dwarf-regs.h.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/util/dwarf-regs.c         |  8 ----
 tools/perf/util/include/dwarf-regs.h | 72 ++++++++++++++++++++++++++++
 2 files changed, 72 insertions(+), 8 deletions(-)

diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c
index 5b7f86c0063f..7c01bc4d7e5b 100644
--- a/tools/perf/util/dwarf-regs.c
+++ b/tools/perf/util/dwarf-regs.c
@@ -13,14 +13,6 @@
 #include <errno.h>
 #include <linux/kernel.h>
 
-#ifndef EM_AARCH64
-#define EM_AARCH64	183  /* ARM 64 bit */
-#endif
-
-#ifndef EM_LOONGARCH
-#define EM_LOONGARCH	258 /* LoongArch */
-#endif
-
 /* Define const char * {arch}_register_tbl[] */
 #define DEFINE_DWARF_REGSTR_TABLE
 #include "../arch/x86/include/dwarf-regs-table.h"
diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h
index fbdd7307e0c2..f4f87ded5e3d 100644
--- a/tools/perf/util/include/dwarf-regs.h
+++ b/tools/perf/util/include/dwarf-regs.h
@@ -2,6 +2,78 @@
 #ifndef _PERF_DWARF_REGS_H_
 #define _PERF_DWARF_REGS_H_
 #include "annotate.h"
+#include <elf.h>
+
+#ifndef EM_AARCH64
+#define EM_AARCH64	183  /* ARM 64 bit */
+#endif
+
+#ifndef EM_LOONGARCH
+#define EM_LOONGARCH	258 /* LoongArch */
+#endif
+
+/* EM_HOST gives the ELF machine for host, EF_HOST gives additional flags. */
+#if defined(__x86_64__)
+  #define EM_HOST EM_X86_64
+#elif defined(__i386__)
+  #define EM_HOST EM_386
+#elif defined(__aarch64__)
+  #define EM_HOST EM_AARCH64
+#elif defined(__arm__)
+  #define EM_HOST EM_ARM
+#elif defined(__alpha__)
+  #define EM_HOST EM_ALPHA
+#elif defined(__arc__)
+  #define EM_HOST EM_ARC
+#elif defined(__AVR__)
+  #define EM_HOST EM_AVR
+#elif defined(__AVR32__)
+  #define EM_HOST EM_AVR32
+#elif defined(__bfin__)
+  #define EM_HOST EM_BLACKFIN
+#elif defined(__csky__)
+  #define EM_HOST EM_CSKY
+  #if defined(__CSKYABIV2__)
+    #define EF_HOST EF_CSKY_ABIV2
+  #else
+    #define EF_HOST EF_CSKY_ABIV1
+  #endif
+#elif defined(__cris__)
+  #define EM_HOST EM_CRIS
+#elif defined(__hppa__) // HP PA-RISC
+  #define EM_HOST EM_PARISC
+#elif defined(__loongarch__)
+  #define EM_HOST EM_LOONGARCH
+#elif defined(__mips__)
+  #define EM_HOST EM_MIPS
+#elif defined(__m32r__)
+  #define EM_HOST EM_M32R
+#elif defined(__microblaze__)
+  #define EM_HOST EM_MICROBLAZE
+#elif defined(__MSP430__)
+  #define EM_HOST EM_MSP430
+#elif defined(__powerpc64__)
+  #define EM_HOST EM_PPC64
+#elif defined(__powerpc__)
+  #define EM_HOST EM_PPC
+#elif defined(__riscv)
+  #define EM_HOST EM_RISCV
+#elif defined(__s390x__)
+  #define EM_HOST EM_S390
+#elif defined(__sh__)
+  #define EM_HOST EM_SH
+#elif defined(__sparc64__) || defined(__sparc__)
+  #define EM_HOST EM_SPARC
+#elif defined(__xtensa__)
+  #define EM_HOST EM_XTENSA
+#else
+  /* Unknown host ELF machine type. */
+  #define EM_HOST EM_NONE
+#endif
+
+#if !defined(EF_HOST)
+  #define EF_HOST 0
+#endif
 
 #define DWARF_REG_PC  0xd3af9c /* random number */
 #define DWARF_REG_FB  0xd3affb /* random number */
-- 
2.47.0.105.g07ac214952-goog


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v3 04/20] perf disasm: Add e_machine/e_flags to struct arch
  2024-10-17  0:25 [PATCH v3 00/20] Remove PERF_HAVE_DWARF_REGS Ian Rogers
                   ` (2 preceding siblings ...)
  2024-10-17  0:25 ` [PATCH v3 03/20] perf dwarf-regs: Add EM_HOST and EF_HOST defines Ian Rogers
@ 2024-10-17  0:25 ` Ian Rogers
  2024-11-08 17:33   ` Namhyung Kim
  2024-10-17  0:25 ` [PATCH v3 05/20] perf dwarf-regs: Pass accurate disassembly machine to get_dwarf_regnum Ian Rogers
                   ` (16 subsequent siblings)
  20 siblings, 1 reply; 31+ messages in thread
From: Ian Rogers @ 2024-10-17  0:25 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Kan Liang, John Garry, Will Deacon,
	James Clark, Mike Leach, Leo Yan, Guo Ren, Paul Walmsley,
	Palmer Dabbelt, Albert Ou, Nick Terrell,
	Masami Hiramatsu (Google), Changbin Du, Guilherme Amadio,
	Yang Jihong, Aditya Gupta, Athira Rajeev, Masahiro Yamada,
	Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra, Shenlin Liang,
	Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

Currently functions like get_dwarf_regnum only work with the host
architecture. Carry the elf machine and flags in struct arch so that
in disassembly these can be used to allow cross platform disassembly.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/arch/arc/annotate/instructions.c       | 2 ++
 tools/perf/arch/arm/annotate/instructions.c       | 2 ++
 tools/perf/arch/arm64/annotate/instructions.c     | 2 ++
 tools/perf/arch/csky/annotate/instructions.c      | 7 ++++++-
 tools/perf/arch/loongarch/annotate/instructions.c | 2 ++
 tools/perf/arch/mips/annotate/instructions.c      | 2 ++
 tools/perf/arch/powerpc/annotate/instructions.c   | 2 ++
 tools/perf/arch/riscv64/annotate/instructions.c   | 2 ++
 tools/perf/arch/s390/annotate/instructions.c      | 2 ++
 tools/perf/arch/sparc/annotate/instructions.c     | 2 ++
 tools/perf/arch/x86/annotate/instructions.c       | 3 ++-
 tools/perf/util/disasm.h                          | 4 ++++
 12 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/tools/perf/arch/arc/annotate/instructions.c b/tools/perf/arch/arc/annotate/instructions.c
index 2f00e995c7e3..e5619770a1af 100644
--- a/tools/perf/arch/arc/annotate/instructions.c
+++ b/tools/perf/arch/arc/annotate/instructions.c
@@ -5,5 +5,7 @@ static int arc__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
 {
 	arch->initialized = true;
 	arch->objdump.comment_char = ';';
+	arch->e_machine = EM_ARC;
+	arch->e_flags = 0;
 	return 0;
 }
diff --git a/tools/perf/arch/arm/annotate/instructions.c b/tools/perf/arch/arm/annotate/instructions.c
index 2ff6cedeb9c5..cf91a43362b0 100644
--- a/tools/perf/arch/arm/annotate/instructions.c
+++ b/tools/perf/arch/arm/annotate/instructions.c
@@ -53,6 +53,8 @@ static int arm__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
 	arch->associate_instruction_ops   = arm__associate_instruction_ops;
 	arch->objdump.comment_char	  = ';';
 	arch->objdump.skip_functions_char = '+';
+	arch->e_machine = EM_ARM;
+	arch->e_flags = 0;
 	return 0;
 
 out_free_call:
diff --git a/tools/perf/arch/arm64/annotate/instructions.c b/tools/perf/arch/arm64/annotate/instructions.c
index f86d9f4798bd..d465d093e7eb 100644
--- a/tools/perf/arch/arm64/annotate/instructions.c
+++ b/tools/perf/arch/arm64/annotate/instructions.c
@@ -113,6 +113,8 @@ static int arm64__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
 	arch->associate_instruction_ops   = arm64__associate_instruction_ops;
 	arch->objdump.comment_char	  = '/';
 	arch->objdump.skip_functions_char = '+';
+	arch->e_machine = EM_AARCH64;
+	arch->e_flags = 0;
 	return 0;
 
 out_free_call:
diff --git a/tools/perf/arch/csky/annotate/instructions.c b/tools/perf/arch/csky/annotate/instructions.c
index 5337bfb7d5fc..14270311d215 100644
--- a/tools/perf/arch/csky/annotate/instructions.c
+++ b/tools/perf/arch/csky/annotate/instructions.c
@@ -43,6 +43,11 @@ static int csky__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
 	arch->initialized = true;
 	arch->objdump.comment_char = '/';
 	arch->associate_instruction_ops = csky__associate_ins_ops;
-
+	arch->e_machine = EM_CSKY;
+#if defined(__CSKYABIV2__)
+	arch->e_flags = EF_CSKY_ABIV2;
+#else
+	arch->e_flags = EF_CSKY_ABIV1;
+#endif
 	return 0;
 }
diff --git a/tools/perf/arch/loongarch/annotate/instructions.c b/tools/perf/arch/loongarch/annotate/instructions.c
index ab43b1ab51e3..70262d5f1444 100644
--- a/tools/perf/arch/loongarch/annotate/instructions.c
+++ b/tools/perf/arch/loongarch/annotate/instructions.c
@@ -131,6 +131,8 @@ int loongarch__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
 		arch->associate_instruction_ops = loongarch__associate_ins_ops;
 		arch->initialized = true;
 		arch->objdump.comment_char = '#';
+		arch->e_machine = EM_LOONGARCH;
+		arch->e_flags = 0;
 	}
 
 	return 0;
diff --git a/tools/perf/arch/mips/annotate/instructions.c b/tools/perf/arch/mips/annotate/instructions.c
index 340993f2a897..b50b46c613d6 100644
--- a/tools/perf/arch/mips/annotate/instructions.c
+++ b/tools/perf/arch/mips/annotate/instructions.c
@@ -40,6 +40,8 @@ int mips__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
 		arch->associate_instruction_ops = mips__associate_ins_ops;
 		arch->initialized = true;
 		arch->objdump.comment_char = '#';
+		arch->e_machine = EM_MIPS;
+		arch->e_flags = 0;
 	}
 
 	return 0;
diff --git a/tools/perf/arch/powerpc/annotate/instructions.c b/tools/perf/arch/powerpc/annotate/instructions.c
index 54478cf5cccc..ca567cfdcbdb 100644
--- a/tools/perf/arch/powerpc/annotate/instructions.c
+++ b/tools/perf/arch/powerpc/annotate/instructions.c
@@ -309,6 +309,8 @@ static int powerpc__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
 		arch->associate_instruction_ops = powerpc__associate_instruction_ops;
 		arch->objdump.comment_char      = '#';
 		annotate_opts.show_asm_raw = true;
+		arch->e_machine = EM_PPC;
+		arch->e_flags = 0;
 	}
 
 	return 0;
diff --git a/tools/perf/arch/riscv64/annotate/instructions.c b/tools/perf/arch/riscv64/annotate/instructions.c
index 869a0eb28953..55cf911633f8 100644
--- a/tools/perf/arch/riscv64/annotate/instructions.c
+++ b/tools/perf/arch/riscv64/annotate/instructions.c
@@ -28,6 +28,8 @@ int riscv64__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
 		arch->associate_instruction_ops = riscv64__associate_ins_ops;
 		arch->initialized = true;
 		arch->objdump.comment_char = '#';
+		arch->e_machine = EM_RISCV;
+		arch->e_flags = 0;
 	}
 
 	return 0;
diff --git a/tools/perf/arch/s390/annotate/instructions.c b/tools/perf/arch/s390/annotate/instructions.c
index eeac25cca699..c61193f1e096 100644
--- a/tools/perf/arch/s390/annotate/instructions.c
+++ b/tools/perf/arch/s390/annotate/instructions.c
@@ -166,6 +166,8 @@ static int s390__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
 			if (s390__cpuid_parse(arch, cpuid))
 				err = SYMBOL_ANNOTATE_ERRNO__ARCH_INIT_CPUID_PARSING;
 		}
+		arch->e_machine = EM_S390;
+		arch->e_flags = 0;
 	}
 
 	return err;
diff --git a/tools/perf/arch/sparc/annotate/instructions.c b/tools/perf/arch/sparc/annotate/instructions.c
index 2614c010c235..68c31580ccfc 100644
--- a/tools/perf/arch/sparc/annotate/instructions.c
+++ b/tools/perf/arch/sparc/annotate/instructions.c
@@ -163,6 +163,8 @@ static int sparc__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
 		arch->initialized = true;
 		arch->associate_instruction_ops = sparc__associate_instruction_ops;
 		arch->objdump.comment_char = '#';
+		arch->e_machine = EM_SPARC;
+		arch->e_flags = 0;
 	}
 
 	return 0;
diff --git a/tools/perf/arch/x86/annotate/instructions.c b/tools/perf/arch/x86/annotate/instructions.c
index c869abe3c31d..ae94b1f0b9cc 100644
--- a/tools/perf/arch/x86/annotate/instructions.c
+++ b/tools/perf/arch/x86/annotate/instructions.c
@@ -202,7 +202,8 @@ static int x86__annotate_init(struct arch *arch, char *cpuid)
 		if (x86__cpuid_parse(arch, cpuid))
 			err = SYMBOL_ANNOTATE_ERRNO__ARCH_INIT_CPUID_PARSING;
 	}
-
+	arch->e_machine = EM_X86_64;
+	arch->e_flags = 0;
 	arch->initialized = true;
 	return err;
 }
diff --git a/tools/perf/util/disasm.h b/tools/perf/util/disasm.h
index 486c269b29ba..c135db2416b5 100644
--- a/tools/perf/util/disasm.h
+++ b/tools/perf/util/disasm.h
@@ -44,6 +44,10 @@ struct arch {
 				struct data_loc_info *dloc, Dwarf_Die *cu_die,
 				struct disasm_line *dl);
 #endif
+	/** @e_machine: ELF machine associated with arch. */
+	unsigned int e_machine;
+	/** @e_flags: Optional ELF flags associated with arch. */
+	unsigned int e_flags;
 };
 
 struct ins {
-- 
2.47.0.105.g07ac214952-goog


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v3 05/20] perf dwarf-regs: Pass accurate disassembly machine to get_dwarf_regnum
  2024-10-17  0:25 [PATCH v3 00/20] Remove PERF_HAVE_DWARF_REGS Ian Rogers
                   ` (3 preceding siblings ...)
  2024-10-17  0:25 ` [PATCH v3 04/20] perf disasm: Add e_machine/e_flags to struct arch Ian Rogers
@ 2024-10-17  0:25 ` Ian Rogers
  2024-10-17  0:25 ` [PATCH v3 06/20] perf dwarf-regs: Pass ELF flags to get_dwarf_regstr Ian Rogers
                   ` (15 subsequent siblings)
  20 siblings, 0 replies; 31+ messages in thread
From: Ian Rogers @ 2024-10-17  0:25 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Kan Liang, John Garry, Will Deacon,
	James Clark, Mike Leach, Leo Yan, Guo Ren, Paul Walmsley,
	Palmer Dabbelt, Albert Ou, Nick Terrell,
	Masami Hiramatsu (Google), Changbin Du, Guilherme Amadio,
	Yang Jihong, Aditya Gupta, Athira Rajeev, Masahiro Yamada,
	Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra, Shenlin Liang,
	Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

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.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/util/annotate.c           | 6 +++---
 tools/perf/util/dwarf-regs.c         | 8 ++++++--
 tools/perf/util/include/dwarf-regs.h | 5 +++--
 3 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
index 37ce43c4eb8f..b1d98da79be8 100644
--- a/tools/perf/util/annotate.c
+++ b/tools/perf/util/annotate.c
@@ -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)
diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c
index 7c01bc4d7e5b..1321387f6948 100644
--- a/tools/perf/util/dwarf-regs.c
+++ b/tools/perf/util/dwarf-regs.c
@@ -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:
diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h
index f4f87ded5e3d..ee0a734564c7 100644
--- a/tools/perf/util/include/dwarf-regs.h
+++ b/tools/perf/util/include/dwarf-regs.h
@@ -93,12 +93,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;
 }
-- 
2.47.0.105.g07ac214952-goog


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v3 06/20] perf dwarf-regs: Pass ELF flags to get_dwarf_regstr
  2024-10-17  0:25 [PATCH v3 00/20] Remove PERF_HAVE_DWARF_REGS Ian Rogers
                   ` (4 preceding siblings ...)
  2024-10-17  0:25 ` [PATCH v3 05/20] perf dwarf-regs: Pass accurate disassembly machine to get_dwarf_regnum Ian Rogers
@ 2024-10-17  0:25 ` Ian Rogers
  2024-10-17  0:25 ` [PATCH v3 07/20] perf dwarf-regs: Move x86 dwarf-regs out of arch Ian Rogers
                   ` (14 subsequent siblings)
  20 siblings, 0 replies; 31+ messages in thread
From: Ian Rogers @ 2024-10-17  0:25 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Kan Liang, John Garry, Will Deacon,
	James Clark, Mike Leach, Leo Yan, Guo Ren, Paul Walmsley,
	Palmer Dabbelt, Albert Ou, Nick Terrell,
	Masami Hiramatsu (Google), Changbin Du, Guilherme Amadio,
	Yang Jihong, Aditya Gupta, Athira Rajeev, Masahiro Yamada,
	Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra, Shenlin Liang,
	Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

Pass a flags value as architectures like csky need the flags to
determine the ABI variant.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/util/dwarf-regs.c         |  3 ++-
 tools/perf/util/include/dwarf-regs.h | 11 ++++++-----
 tools/perf/util/probe-finder.c       | 13 +++++++------
 tools/perf/util/probe-finder.h       |  3 ++-
 4 files changed, 17 insertions(+), 13 deletions(-)

diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c
index 1321387f6948..86b3ef638fbb 100644
--- a/tools/perf/util/dwarf-regs.c
+++ b/tools/perf/util/dwarf-regs.c
@@ -29,7 +29,8 @@
 #define __get_dwarf_regstr(tbl, n) (((n) < ARRAY_SIZE(tbl)) ? (tbl)[(n)] : NULL)
 
 /* Return architecture dependent register string (for kprobe-tracer) */
-const char *get_dwarf_regstr(unsigned int n, unsigned int machine)
+const char *get_dwarf_regstr(unsigned int n, unsigned int machine,
+			     unsigned int flags __maybe_unused)
 {
 	switch (machine) {
 	case EM_NONE:	/* Generic arch - use host arch */
diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h
index ee0a734564c7..925525405e2d 100644
--- a/tools/perf/util/include/dwarf-regs.h
+++ b/tools/perf/util/include/dwarf-regs.h
@@ -80,12 +80,13 @@
 
 #ifdef HAVE_LIBDW_SUPPORT
 const char *get_arch_regstr(unsigned int n);
-/*
- * get_dwarf_regstr - Returns ftrace register string from DWARF regnum
- * n: DWARF register number
- * machine: ELF machine signature (EM_*)
+/**
+ * get_dwarf_regstr() - Returns ftrace register string from DWARF regnum.
+ * @n: DWARF register number.
+ * @machine: ELF machine signature (EM_*).
+ * @flags: ELF flags for things like ABI differences.
  */
-const char *get_dwarf_regstr(unsigned int n, unsigned int machine);
+const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int flags);
 
 int get_arch_regnum(const char *name);
 /*
diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index 8ea15a2a4397..8a932cc2f63d 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -56,7 +56,7 @@ static struct probe_trace_arg_ref *alloc_trace_arg_ref(long offs)
  */
 static int convert_variable_location(Dwarf_Die *vr_die, Dwarf_Addr addr,
 				     Dwarf_Op *fb_ops, Dwarf_Die *sp_die,
-				     unsigned int machine,
+				     const struct probe_finder *pf,
 				     struct probe_trace_arg *tvar)
 {
 	Dwarf_Attribute attr;
@@ -166,7 +166,7 @@ static int convert_variable_location(Dwarf_Die *vr_die, Dwarf_Addr addr,
 	if (!tvar)
 		return ret2;
 
-	regs = get_dwarf_regstr(regn, machine);
+	regs = get_dwarf_regstr(regn, pf->e_machine, pf->e_flags);
 	if (!regs) {
 		/* This should be a bug in DWARF or this tool */
 		pr_warning("Mapping for the register number %u "
@@ -451,7 +451,7 @@ static int convert_variable(Dwarf_Die *vr_die, struct probe_finder *pf)
 		 dwarf_diename(vr_die));
 
 	ret = convert_variable_location(vr_die, pf->addr, pf->fb_ops,
-					&pf->sp_die, pf->machine, pf->tvar);
+					&pf->sp_die, pf, pf->tvar);
 	if (ret == -ENOENT && pf->skip_empty_arg)
 		/* This can be found in other place. skip it */
 		return 0;
@@ -1134,7 +1134,8 @@ static int debuginfo__find_probes(struct debuginfo *dbg,
 	if (gelf_getehdr(elf, &ehdr) == NULL)
 		return -EINVAL;
 
-	pf->machine = ehdr.e_machine;
+	pf->e_machine = ehdr.e_machine;
+	pf->e_flags = ehdr.e_flags;
 
 	do {
 		GElf_Shdr shdr;
@@ -1171,7 +1172,7 @@ static int copy_variables_cb(Dwarf_Die *die_mem, void *data)
 	    (tag == DW_TAG_variable && vf->vars)) {
 		if (convert_variable_location(die_mem, vf->pf->addr,
 					      vf->pf->fb_ops, &pf->sp_die,
-					      pf->machine, NULL) == 0) {
+					      pf, /*tvar=*/NULL) == 0) {
 			vf->args[vf->nargs].var = (char *)dwarf_diename(die_mem);
 			if (vf->args[vf->nargs].var == NULL) {
 				vf->ret = -ENOMEM;
@@ -1402,7 +1403,7 @@ static int collect_variables_cb(Dwarf_Die *die_mem, void *data)
 	    tag == DW_TAG_variable) {
 		ret = convert_variable_location(die_mem, af->pf.addr,
 						af->pf.fb_ops, &af->pf.sp_die,
-						af->pf.machine, NULL);
+						&af->pf, /*tvar=*/NULL);
 		if (ret == 0 || ret == -ERANGE) {
 			int ret2;
 			bool externs = !af->child;
diff --git a/tools/perf/util/probe-finder.h b/tools/perf/util/probe-finder.h
index dfcf8cdd9e8d..be7b46ea2460 100644
--- a/tools/perf/util/probe-finder.h
+++ b/tools/perf/util/probe-finder.h
@@ -68,7 +68,8 @@ struct probe_finder {
 	/* Call Frame Information from .debug_frame. Not owned. */
 	Dwarf_CFI		*cfi_dbg;
 	Dwarf_Op		*fb_ops;	/* Frame base attribute */
-	unsigned int		machine;	/* Target machine arch */
+	unsigned int		e_machine;	/* ELF target machine arch */
+	unsigned int		e_flags;	/* ELF target machine flags */
 	struct perf_probe_arg	*pvar;		/* Current target variable */
 	struct probe_trace_arg	*tvar;		/* Current result variable */
 	bool			skip_empty_arg;	/* Skip non-exist args */
-- 
2.47.0.105.g07ac214952-goog


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v3 07/20] perf dwarf-regs: Move x86 dwarf-regs out of arch
  2024-10-17  0:25 [PATCH v3 00/20] Remove PERF_HAVE_DWARF_REGS Ian Rogers
                   ` (5 preceding siblings ...)
  2024-10-17  0:25 ` [PATCH v3 06/20] perf dwarf-regs: Pass ELF flags to get_dwarf_regstr Ian Rogers
@ 2024-10-17  0:25 ` Ian Rogers
  2024-10-17  0:25 ` [PATCH v3 08/20] perf arm64: Remove dwarf-regs.c Ian Rogers
                   ` (13 subsequent siblings)
  20 siblings, 0 replies; 31+ messages in thread
From: Ian Rogers @ 2024-10-17  0:25 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Kan Liang, John Garry, Will Deacon,
	James Clark, Mike Leach, Leo Yan, Guo Ren, Paul Walmsley,
	Palmer Dabbelt, Albert Ou, Nick Terrell,
	Masami Hiramatsu (Google), Changbin Du, Guilherme Amadio,
	Yang Jihong, Aditya Gupta, Athira Rajeev, Masahiro Yamada,
	Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra, Shenlin Liang,
	Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

Move arch/x86/util/dwarf-regs.c to util/dwarf-regs-x86.c and compile
in unconditionally. To avoid get_arch_regnum being duplicated, rename
to get_x86_regnum and add to get_dwarf_regnum switch.

For get_arch_regstr, this was unused on x86 unless the machine type
was EM_NONE. Map that case to EM_HOST and remove get_arch_regstr from
dwarf-regs-x86.c.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/arch/x86/util/Build                |  3 ---
 tools/perf/util/Build                         |  1 +
 .../dwarf-regs.c => util/dwarf-regs-x86.c}    | 24 +------------------
 tools/perf/util/dwarf-regs.c                  | 17 +++++++++++++
 tools/perf/util/include/dwarf-regs.h          |  8 +++++++
 5 files changed, 27 insertions(+), 26 deletions(-)
 rename tools/perf/{arch/x86/util/dwarf-regs.c => util/dwarf-regs-x86.c} (77%)

diff --git a/tools/perf/arch/x86/util/Build b/tools/perf/arch/x86/util/Build
index 9705cda4f240..70af491a6dd7 100644
--- a/tools/perf/arch/x86/util/Build
+++ b/tools/perf/arch/x86/util/Build
@@ -12,9 +12,6 @@ perf-util-y += evsel.o
 perf-util-y += iostat.o
 perf-util-y += env.o
 
-perf-util-$(CONFIG_LIBDW) += dwarf-regs.o
-perf-util-$(CONFIG_BPF_PROLOGUE) += dwarf-regs.o
-
 perf-util-$(CONFIG_LOCAL_LIBUNWIND)    += unwind-libunwind.o
 perf-util-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
 
diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index 1eedead5f2f2..4c615611b9d7 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -203,6 +203,7 @@ endif
 perf-util-$(CONFIG_LIBDW) += probe-finder.o
 perf-util-$(CONFIG_LIBDW) += dwarf-aux.o
 perf-util-$(CONFIG_LIBDW) += dwarf-regs.o
+perf-util-$(CONFIG_LIBDW) += dwarf-regs-x86.o
 perf-util-$(CONFIG_LIBDW) += debuginfo.o
 perf-util-$(CONFIG_LIBDW) += annotate-data.o
 
diff --git a/tools/perf/arch/x86/util/dwarf-regs.c b/tools/perf/util/dwarf-regs-x86.c
similarity index 77%
rename from tools/perf/arch/x86/util/dwarf-regs.c
rename to tools/perf/util/dwarf-regs-x86.c
index 530905118cd4..7a55c65e8da6 100644
--- a/tools/perf/arch/x86/util/dwarf-regs.c
+++ b/tools/perf/util/dwarf-regs-x86.c
@@ -11,28 +11,6 @@
 #include <linux/kernel.h> /* for ARRAY_SIZE */
 #include <dwarf-regs.h>
 
-#define DEFINE_DWARF_REGSTR_TABLE 1
-#include "dwarf-regs-table.h"
-
-/* Return architecture dependent register string (for kprobe-tracer) */
-const char *get_arch_regstr(unsigned int n)
-{
-#if defined(__i386__)
-	size_t len = ARRAY_SIZE(x86_32_regstr_tbl);
-#else
-	size_t len = ARRAY_SIZE(x86_64_regstr_tbl);
-#endif
-
-	if (n >= len)
-		return NULL;
-
-#if defined(__i386__)
-	return x86_32_regstr_tbl[n];
-#else
-	return x86_64_regstr_tbl[n];
-#endif
-}
-
 struct dwarf_regs_idx {
 	const char *name;
 	int idx;
@@ -58,7 +36,7 @@ static const struct dwarf_regs_idx x86_regidx_table[] = {
 	{ "rip", DWARF_REG_PC },
 };
 
-int get_arch_regnum(const char *name)
+int get_x86_regnum(const char *name)
 {
 	unsigned int i;
 
diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c
index 86b3ef638fbb..eac99a246737 100644
--- a/tools/perf/util/dwarf-regs.c
+++ b/tools/perf/util/dwarf-regs.c
@@ -32,9 +32,17 @@
 const char *get_dwarf_regstr(unsigned int n, unsigned int machine,
 			     unsigned int flags __maybe_unused)
 {
+#if EM_HOST == EM_X86_64 || EM_HOST == EM_386
+	if (machine == EM_NONE) {
+		/* Generic arch - use host arch */
+		machine = EM_HOST;
+	}
+#endif
 	switch (machine) {
+#if EM_HOST != EM_X86_64 && EM_HOST != EM_386
 	case EM_NONE:	/* Generic arch - use host arch */
 		return get_arch_regstr(n);
+#endif
 	case EM_386:
 		return __get_dwarf_regstr(x86_32_regstr_tbl, n);
 	case EM_X86_64:
@@ -65,10 +73,12 @@ const char *get_dwarf_regstr(unsigned int n, unsigned int machine,
 	return NULL;
 }
 
+#if EM_HOST != EM_X86_64 && EM_HOST != EM_386
 __weak int get_arch_regnum(const char *name __maybe_unused)
 {
 	return -ENOTSUP;
 }
+#endif
 
 /* Return DWARF register number from architecture register name */
 int get_dwarf_regnum(const char *name, unsigned int machine, unsigned int flags __maybe_unused)
@@ -90,9 +100,16 @@ int get_dwarf_regnum(const char *name, unsigned int machine, unsigned int flags
 		machine = EM_HOST;
 	}
 	switch (machine) {
+#if EM_HOST != EM_X86_64 && EM_HOST != EM_386
 	case EM_HOST:
 		reg = get_arch_regnum(regname);
 		break;
+#endif
+	case EM_X86_64:
+		fallthrough;
+	case EM_386:
+		reg = get_x86_regnum(regname);
+		break;
 	default:
 		pr_err("ELF MACHINE %x is not supported.\n", machine);
 	}
diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h
index 925525405e2d..062623aefd5a 100644
--- a/tools/perf/util/include/dwarf-regs.h
+++ b/tools/perf/util/include/dwarf-regs.h
@@ -79,7 +79,10 @@
 #define DWARF_REG_FB  0xd3affb /* random number */
 
 #ifdef HAVE_LIBDW_SUPPORT
+#if !defined(__x86_64__) && !defined(__i386__)
 const char *get_arch_regstr(unsigned int n);
+#endif
+
 /**
  * get_dwarf_regstr() - Returns ftrace register string from DWARF regnum.
  * @n: DWARF register number.
@@ -88,7 +91,12 @@ const char *get_arch_regstr(unsigned int n);
  */
 const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int flags);
 
+int get_x86_regnum(const char *name);
+
+#if !defined(__x86_64__) && !defined(__i386__)
 int get_arch_regnum(const char *name);
+#endif
+
 /*
  * get_dwarf_regnum - Returns DWARF regnum from register name
  * name: architecture register name
-- 
2.47.0.105.g07ac214952-goog


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v3 08/20] perf arm64: Remove dwarf-regs.c
  2024-10-17  0:25 [PATCH v3 00/20] Remove PERF_HAVE_DWARF_REGS Ian Rogers
                   ` (6 preceding siblings ...)
  2024-10-17  0:25 ` [PATCH v3 07/20] perf dwarf-regs: Move x86 dwarf-regs out of arch Ian Rogers
@ 2024-10-17  0:25 ` Ian Rogers
  2024-10-17  0:25 ` [PATCH v3 09/20] perf arm: " Ian Rogers
                   ` (12 subsequent siblings)
  20 siblings, 0 replies; 31+ messages in thread
From: Ian Rogers @ 2024-10-17  0:25 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Kan Liang, John Garry, Will Deacon,
	James Clark, Mike Leach, Leo Yan, Guo Ren, Paul Walmsley,
	Palmer Dabbelt, Albert Ou, Nick Terrell,
	Masami Hiramatsu (Google), Changbin Du, Guilherme Amadio,
	Yang Jihong, Aditya Gupta, Athira Rajeev, Masahiro Yamada,
	Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra, Shenlin Liang,
	Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

The file just provides the function get_arch_regstr, however, if in
the only caller get_dwarf_regstr EM_HOST is used for the EM_NONE case
the function can never be called. So remove as dead code. Tidy up the
EM_NONE cases for arm64 in dwarf-regs.c.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/arch/arm64/util/Build        |  1 -
 tools/perf/arch/arm64/util/dwarf-regs.c | 80 -------------------------
 tools/perf/util/dwarf-regs.c            |  4 +-
 tools/perf/util/include/dwarf-regs.h    |  2 +-
 4 files changed, 3 insertions(+), 84 deletions(-)
 delete mode 100644 tools/perf/arch/arm64/util/dwarf-regs.c

diff --git a/tools/perf/arch/arm64/util/Build b/tools/perf/arch/arm64/util/Build
index 4387a6d6a6c3..a74521b79eaa 100644
--- a/tools/perf/arch/arm64/util/Build
+++ b/tools/perf/arch/arm64/util/Build
@@ -4,7 +4,6 @@ perf-util-y += perf_regs.o
 perf-util-y += tsc.o
 perf-util-y += pmu.o
 perf-util-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
-perf-util-$(CONFIG_LIBDW)     += dwarf-regs.o
 perf-util-$(CONFIG_LOCAL_LIBUNWIND) += unwind-libunwind.o
 perf-util-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
 
diff --git a/tools/perf/arch/arm64/util/dwarf-regs.c b/tools/perf/arch/arm64/util/dwarf-regs.c
deleted file mode 100644
index 343a62fa4199..000000000000
--- a/tools/perf/arch/arm64/util/dwarf-regs.c
+++ /dev/null
@@ -1,80 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Mapping of DWARF debug register numbers into register names.
- *
- * Copyright (C) 2010 Will Deacon, ARM Ltd.
- */
-
-#include <errno.h>
-#include <stddef.h>
-#include <string.h>
-#include <dwarf-regs.h>
-#include <linux/stringify.h>
-
-struct regs_dwarfnum {
-	const char *name;
-	unsigned int dwarfnum;
-};
-
-#define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}
-#define GPR_DWARFNUM_NAME(num) \
-	{.name = __stringify(%x##num), .dwarfnum = num}
-#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
-
-/*
- * Reference:
- * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0057b/IHI0057B_aadwarf64.pdf
- */
-static const struct regs_dwarfnum regdwarfnum_table[] = {
-	GPR_DWARFNUM_NAME(0),
-	GPR_DWARFNUM_NAME(1),
-	GPR_DWARFNUM_NAME(2),
-	GPR_DWARFNUM_NAME(3),
-	GPR_DWARFNUM_NAME(4),
-	GPR_DWARFNUM_NAME(5),
-	GPR_DWARFNUM_NAME(6),
-	GPR_DWARFNUM_NAME(7),
-	GPR_DWARFNUM_NAME(8),
-	GPR_DWARFNUM_NAME(9),
-	GPR_DWARFNUM_NAME(10),
-	GPR_DWARFNUM_NAME(11),
-	GPR_DWARFNUM_NAME(12),
-	GPR_DWARFNUM_NAME(13),
-	GPR_DWARFNUM_NAME(14),
-	GPR_DWARFNUM_NAME(15),
-	GPR_DWARFNUM_NAME(16),
-	GPR_DWARFNUM_NAME(17),
-	GPR_DWARFNUM_NAME(18),
-	GPR_DWARFNUM_NAME(19),
-	GPR_DWARFNUM_NAME(20),
-	GPR_DWARFNUM_NAME(21),
-	GPR_DWARFNUM_NAME(22),
-	GPR_DWARFNUM_NAME(23),
-	GPR_DWARFNUM_NAME(24),
-	GPR_DWARFNUM_NAME(25),
-	GPR_DWARFNUM_NAME(26),
-	GPR_DWARFNUM_NAME(27),
-	GPR_DWARFNUM_NAME(28),
-	GPR_DWARFNUM_NAME(29),
-	REG_DWARFNUM_NAME("%lr", 30),
-	REG_DWARFNUM_NAME("%sp", 31),
-	REG_DWARFNUM_END,
-};
-
-/**
- * get_arch_regstr() - lookup register name from it's DWARF register number
- * @n:	the DWARF register number
- *
- * get_arch_regstr() returns the name of the register in struct
- * regdwarfnum_table from it's DWARF register number. If the register is not
- * found in the table, this returns NULL;
- */
-const char *get_arch_regstr(unsigned int n)
-{
-	const struct regs_dwarfnum *roff;
-
-	for (roff = regdwarfnum_table; roff->name != NULL; roff++)
-		if (roff->dwarfnum == n)
-			return roff->name;
-	return NULL;
-}
diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c
index eac99a246737..18e916c8e993 100644
--- a/tools/perf/util/dwarf-regs.c
+++ b/tools/perf/util/dwarf-regs.c
@@ -32,14 +32,14 @@
 const char *get_dwarf_regstr(unsigned int n, unsigned int machine,
 			     unsigned int flags __maybe_unused)
 {
-#if EM_HOST == EM_X86_64 || EM_HOST == EM_386
+#if EM_HOST == EM_X86_64 || EM_HOST == EM_386 || EM_HOST == EM_AARCH64
 	if (machine == EM_NONE) {
 		/* Generic arch - use host arch */
 		machine = EM_HOST;
 	}
 #endif
 	switch (machine) {
-#if EM_HOST != EM_X86_64 && EM_HOST != EM_386
+#if EM_HOST != EM_X86_64 && EM_HOST != EM_386 && EM_HOST != EM_AARCH64
 	case EM_NONE:	/* Generic arch - use host arch */
 		return get_arch_regstr(n);
 #endif
diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h
index 062623aefd5a..e640657f69c8 100644
--- a/tools/perf/util/include/dwarf-regs.h
+++ b/tools/perf/util/include/dwarf-regs.h
@@ -79,7 +79,7 @@
 #define DWARF_REG_FB  0xd3affb /* random number */
 
 #ifdef HAVE_LIBDW_SUPPORT
-#if !defined(__x86_64__) && !defined(__i386__)
+#if !defined(__x86_64__) && !defined(__i386__) && !defined(__aarch64__)
 const char *get_arch_regstr(unsigned int n);
 #endif
 
-- 
2.47.0.105.g07ac214952-goog


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v3 09/20] perf arm: Remove dwarf-regs.c
  2024-10-17  0:25 [PATCH v3 00/20] Remove PERF_HAVE_DWARF_REGS Ian Rogers
                   ` (7 preceding siblings ...)
  2024-10-17  0:25 ` [PATCH v3 08/20] perf arm64: Remove dwarf-regs.c Ian Rogers
@ 2024-10-17  0:25 ` Ian Rogers
  2024-10-17  0:25 ` [PATCH v3 10/20] perf dwarf-regs: Move csky dwarf-regs out of arch Ian Rogers
                   ` (11 subsequent siblings)
  20 siblings, 0 replies; 31+ messages in thread
From: Ian Rogers @ 2024-10-17  0:25 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Kan Liang, John Garry, Will Deacon,
	James Clark, Mike Leach, Leo Yan, Guo Ren, Paul Walmsley,
	Palmer Dabbelt, Albert Ou, Nick Terrell,
	Masami Hiramatsu (Google), Changbin Du, Guilherme Amadio,
	Yang Jihong, Aditya Gupta, Athira Rajeev, Masahiro Yamada,
	Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra, Shenlin Liang,
	Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

The file just provides the function get_arch_regstr, however, if in
the only caller get_dwarf_regstr EM_HOST is used for the EM_NONE case
the function can never be called. So remove as dead code. Tidy up the
EM_NONE cases for arm in dwarf-regs.c.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/arch/arm/util/Build        |  2 -
 tools/perf/arch/arm/util/dwarf-regs.c | 61 ---------------------------
 tools/perf/util/dwarf-regs.c          |  4 +-
 tools/perf/util/include/dwarf-regs.h  |  2 +-
 4 files changed, 3 insertions(+), 66 deletions(-)
 delete mode 100644 tools/perf/arch/arm/util/dwarf-regs.c

diff --git a/tools/perf/arch/arm/util/Build b/tools/perf/arch/arm/util/Build
index e06fea1ea8ff..f7a8b37d1c68 100644
--- a/tools/perf/arch/arm/util/Build
+++ b/tools/perf/arch/arm/util/Build
@@ -1,7 +1,5 @@
 perf-util-y += perf_regs.o
 
-perf-util-$(CONFIG_LIBDW) += dwarf-regs.o
-
 perf-util-$(CONFIG_LOCAL_LIBUNWIND)    += unwind-libunwind.o
 perf-util-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
 
diff --git a/tools/perf/arch/arm/util/dwarf-regs.c b/tools/perf/arch/arm/util/dwarf-regs.c
deleted file mode 100644
index fc5f71c91802..000000000000
--- a/tools/perf/arch/arm/util/dwarf-regs.c
+++ /dev/null
@@ -1,61 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Mapping of DWARF debug register numbers into register names.
- *
- * Copyright (C) 2010 Will Deacon, ARM Ltd.
- */
-
-#include <stddef.h>
-#include <linux/stringify.h>
-#include <dwarf-regs.h>
-
-struct pt_regs_dwarfnum {
-	const char *name;
-	unsigned int dwarfnum;
-};
-
-#define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}
-#define GPR_DWARFNUM_NAME(num) \
-	{.name = __stringify(%r##num), .dwarfnum = num}
-#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
-
-/*
- * Reference:
- * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0040a/IHI0040A_aadwarf.pdf
- */
-static const struct pt_regs_dwarfnum regdwarfnum_table[] = {
-	GPR_DWARFNUM_NAME(0),
-	GPR_DWARFNUM_NAME(1),
-	GPR_DWARFNUM_NAME(2),
-	GPR_DWARFNUM_NAME(3),
-	GPR_DWARFNUM_NAME(4),
-	GPR_DWARFNUM_NAME(5),
-	GPR_DWARFNUM_NAME(6),
-	GPR_DWARFNUM_NAME(7),
-	GPR_DWARFNUM_NAME(8),
-	GPR_DWARFNUM_NAME(9),
-	GPR_DWARFNUM_NAME(10),
-	REG_DWARFNUM_NAME("%fp", 11),
-	REG_DWARFNUM_NAME("%ip", 12),
-	REG_DWARFNUM_NAME("%sp", 13),
-	REG_DWARFNUM_NAME("%lr", 14),
-	REG_DWARFNUM_NAME("%pc", 15),
-	REG_DWARFNUM_END,
-};
-
-/**
- * get_arch_regstr() - lookup register name from it's DWARF register number
- * @n:	the DWARF register number
- *
- * get_arch_regstr() returns the name of the register in struct
- * regdwarfnum_table from it's DWARF register number. If the register is not
- * found in the table, this returns NULL;
- */
-const char *get_arch_regstr(unsigned int n)
-{
-	const struct pt_regs_dwarfnum *roff;
-	for (roff = regdwarfnum_table; roff->name != NULL; roff++)
-		if (roff->dwarfnum == n)
-			return roff->name;
-	return NULL;
-}
diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c
index 18e916c8e993..fd21f9e90e40 100644
--- a/tools/perf/util/dwarf-regs.c
+++ b/tools/perf/util/dwarf-regs.c
@@ -32,14 +32,14 @@
 const char *get_dwarf_regstr(unsigned int n, unsigned int machine,
 			     unsigned int flags __maybe_unused)
 {
-#if EM_HOST == EM_X86_64 || EM_HOST == EM_386 || EM_HOST == EM_AARCH64
+#if EM_HOST == EM_X86_64 || EM_HOST == EM_386 || EM_HOST == EM_AARCH64 || EM_HOST == EM_ARM
 	if (machine == EM_NONE) {
 		/* Generic arch - use host arch */
 		machine = EM_HOST;
 	}
 #endif
 	switch (machine) {
-#if EM_HOST != EM_X86_64 && EM_HOST != EM_386 && EM_HOST != EM_AARCH64
+#if EM_HOST != EM_X86_64 && EM_HOST != EM_386 && EM_HOST != EM_AARCH64 && EM_HOST != EM_ARM
 	case EM_NONE:	/* Generic arch - use host arch */
 		return get_arch_regstr(n);
 #endif
diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h
index e640657f69c8..0b533409d82a 100644
--- a/tools/perf/util/include/dwarf-regs.h
+++ b/tools/perf/util/include/dwarf-regs.h
@@ -79,7 +79,7 @@
 #define DWARF_REG_FB  0xd3affb /* random number */
 
 #ifdef HAVE_LIBDW_SUPPORT
-#if !defined(__x86_64__) && !defined(__i386__) && !defined(__aarch64__)
+#if !defined(__x86_64__) && !defined(__i386__) && !defined(__aarch64__) && !defined(__arm__)
 const char *get_arch_regstr(unsigned int n);
 #endif
 
-- 
2.47.0.105.g07ac214952-goog


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v3 10/20] perf dwarf-regs: Move csky dwarf-regs out of arch
  2024-10-17  0:25 [PATCH v3 00/20] Remove PERF_HAVE_DWARF_REGS Ian Rogers
                   ` (8 preceding siblings ...)
  2024-10-17  0:25 ` [PATCH v3 09/20] perf arm: " Ian Rogers
@ 2024-10-17  0:25 ` Ian Rogers
  2024-11-08 20:03   ` Namhyung Kim
  2024-10-17  0:25 ` [PATCH v3 11/20] perf loongarch: Remove dwarf-regs.c Ian Rogers
                   ` (10 subsequent siblings)
  20 siblings, 1 reply; 31+ messages in thread
From: Ian Rogers @ 2024-10-17  0:25 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Kan Liang, John Garry, Will Deacon,
	James Clark, Mike Leach, Leo Yan, Guo Ren, Paul Walmsley,
	Palmer Dabbelt, Albert Ou, Nick Terrell,
	Masami Hiramatsu (Google), Changbin Du, Guilherme Amadio,
	Yang Jihong, Aditya Gupta, Athira Rajeev, Masahiro Yamada,
	Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra, Shenlin Liang,
	Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

Move arch/csky/util/dwarf-regs.c to util/dwarf-regs-csky.c and compile
in unconditionally. To avoid get_arch_regstr being duplicated, rename
to get_csky_regstr and add to get_dwarf_regstr switch.

Update #ifdefs to allow ABI V1 and V2 tables at the same
time. Determine the table from the ELF flags.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/arch/csky/util/Build               |  1 -
 tools/perf/util/Build                         |  1 +
 .../dwarf-regs.c => util/dwarf-regs-csky.c}   | 19 ++++++++++---------
 tools/perf/util/dwarf-regs.c                  | 11 +++++++----
 tools/perf/util/include/dwarf-regs.h          |  2 ++
 5 files changed, 20 insertions(+), 14 deletions(-)
 rename tools/perf/{arch/csky/util/dwarf-regs.c => util/dwarf-regs-csky.c} (74%)

diff --git a/tools/perf/arch/csky/util/Build b/tools/perf/arch/csky/util/Build
index 1325310cab6a..5e6ea82c4202 100644
--- a/tools/perf/arch/csky/util/Build
+++ b/tools/perf/arch/csky/util/Build
@@ -1,4 +1,3 @@
 perf-util-y += perf_regs.o
 
-perf-util-$(CONFIG_LIBDW) += dwarf-regs.o
 perf-util-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index 4c615611b9d7..99ae4e2802b8 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -203,6 +203,7 @@ endif
 perf-util-$(CONFIG_LIBDW) += probe-finder.o
 perf-util-$(CONFIG_LIBDW) += dwarf-aux.o
 perf-util-$(CONFIG_LIBDW) += dwarf-regs.o
+perf-util-$(CONFIG_LIBDW) += dwarf-regs-csky.o
 perf-util-$(CONFIG_LIBDW) += dwarf-regs-x86.o
 perf-util-$(CONFIG_LIBDW) += debuginfo.o
 perf-util-$(CONFIG_LIBDW) += annotate-data.o
diff --git a/tools/perf/arch/csky/util/dwarf-regs.c b/tools/perf/util/dwarf-regs-csky.c
similarity index 74%
rename from tools/perf/arch/csky/util/dwarf-regs.c
rename to tools/perf/util/dwarf-regs-csky.c
index ca86ecaeacbb..d38ef1f07f3e 100644
--- a/tools/perf/arch/csky/util/dwarf-regs.c
+++ b/tools/perf/util/dwarf-regs-csky.c
@@ -5,9 +5,8 @@
 #include <stddef.h>
 #include <dwarf-regs.h>
 
-#if defined(__CSKYABIV2__)
-#define CSKY_MAX_REGS 73
-const char *csky_dwarf_regs_table[CSKY_MAX_REGS] = {
+#define CSKY_ABIV2_MAX_REGS 73
+const char *csky_dwarf_regs_table_abiv2[CSKY_ABIV2_MAX_REGS] = {
 	/* r0 ~ r8 */
 	"%a0", "%a1", "%a2", "%a3", "%regs0", "%regs1", "%regs2", "%regs3",
 	/* r9 ~ r15 */
@@ -26,9 +25,9 @@ const char *csky_dwarf_regs_table[CSKY_MAX_REGS] = {
 	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 	"%epc",
 };
-#else
-#define CSKY_MAX_REGS 57
-const char *csky_dwarf_regs_table[CSKY_MAX_REGS] = {
+
+#define CSKY_ABIV1_MAX_REGS 57
+const char *csky_dwarf_regs_table_abiv1[CSKY_ABIV1_MAX_REGS] = {
 	/* r0 ~ r8 */
 	"%sp", "%regs9", "%a0", "%a1", "%a2", "%a3", "%regs0", "%regs1",
 	/* r9 ~ r15 */
@@ -41,9 +40,11 @@ const char *csky_dwarf_regs_table[CSKY_MAX_REGS] = {
 	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 	"%epc",
 };
-#endif
 
-const char *get_arch_regstr(unsigned int n)
+const char *get_csky_regstr(unsigned int n, unsigned int flags)
 {
-	return (n < CSKY_MAX_REGS) ? csky_dwarf_regs_table[n] : NULL;
+	if (flags & EF_CSKY_ABIV2)
+		return (n < CSKY_ABIV2_MAX_REGS) ? csky_dwarf_regs_table_abiv2[n] : NULL;
+
+	return (n < CSKY_ABIV1_MAX_REGS) ? csky_dwarf_regs_table_abiv1[n] : NULL;
 }
diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c
index fd21f9e90e40..9a76f83af62c 100644
--- a/tools/perf/util/dwarf-regs.c
+++ b/tools/perf/util/dwarf-regs.c
@@ -29,17 +29,18 @@
 #define __get_dwarf_regstr(tbl, n) (((n) < ARRAY_SIZE(tbl)) ? (tbl)[(n)] : NULL)
 
 /* Return architecture dependent register string (for kprobe-tracer) */
-const char *get_dwarf_regstr(unsigned int n, unsigned int machine,
-			     unsigned int flags __maybe_unused)
+const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int flags)
 {
-#if EM_HOST == EM_X86_64 || EM_HOST == EM_386 || EM_HOST == EM_AARCH64 || EM_HOST == EM_ARM
+#if EM_HOST == EM_X86_64 || EM_HOST == EM_386 || EM_HOST == EM_AARCH64 || EM_HOST == EM_ARM \
+    || EM_HOST == EM_CSKY
 	if (machine == EM_NONE) {
 		/* Generic arch - use host arch */
 		machine = EM_HOST;
 	}
 #endif
 	switch (machine) {
-#if EM_HOST != EM_X86_64 && EM_HOST != EM_386 && EM_HOST != EM_AARCH64 && EM_HOST != EM_ARM
+#if EM_HOST != EM_X86_64 && EM_HOST != EM_386 && EM_HOST != EM_AARCH64 && EM_HOST != EM_ARM \
+    && EM_HOST != EM_CSKY
 	case EM_NONE:	/* Generic arch - use host arch */
 		return get_arch_regstr(n);
 #endif
@@ -51,6 +52,8 @@ const char *get_dwarf_regstr(unsigned int n, unsigned int machine,
 		return __get_dwarf_regstr(arm_regstr_tbl, n);
 	case EM_AARCH64:
 		return __get_dwarf_regstr(aarch64_regstr_tbl, n);
+	case EM_CSKY:
+		return get_csky_regstr(n, flags);
 	case EM_SH:
 		return __get_dwarf_regstr(sh_regstr_tbl, n);
 	case EM_S390:
diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h
index 0b533409d82a..b72d9d308ce4 100644
--- a/tools/perf/util/include/dwarf-regs.h
+++ b/tools/perf/util/include/dwarf-regs.h
@@ -83,6 +83,8 @@
 const char *get_arch_regstr(unsigned int n);
 #endif
 
+const char *get_csky_regstr(unsigned int n, unsigned int flags);
+
 /**
  * get_dwarf_regstr() - Returns ftrace register string from DWARF regnum.
  * @n: DWARF register number.
-- 
2.47.0.105.g07ac214952-goog


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v3 11/20] perf loongarch: Remove dwarf-regs.c
  2024-10-17  0:25 [PATCH v3 00/20] Remove PERF_HAVE_DWARF_REGS Ian Rogers
                   ` (9 preceding siblings ...)
  2024-10-17  0:25 ` [PATCH v3 10/20] perf dwarf-regs: Move csky dwarf-regs out of arch Ian Rogers
@ 2024-10-17  0:25 ` Ian Rogers
  2024-10-17  0:25 ` [PATCH v3 12/20] perf mips: " Ian Rogers
                   ` (9 subsequent siblings)
  20 siblings, 0 replies; 31+ messages in thread
From: Ian Rogers @ 2024-10-17  0:25 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Kan Liang, John Garry, Will Deacon,
	James Clark, Mike Leach, Leo Yan, Guo Ren, Paul Walmsley,
	Palmer Dabbelt, Albert Ou, Nick Terrell,
	Masami Hiramatsu (Google), Changbin Du, Guilherme Amadio,
	Yang Jihong, Aditya Gupta, Athira Rajeev, Masahiro Yamada,
	Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra, Shenlin Liang,
	Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

The file just provides the function get_arch_regstr, however, if in
the only caller get_dwarf_regstr EM_HOST is used for the EM_NONE case
the function can never be called. So remove as dead code. Tidy up the
EM_NONE cases for loongarch in dwarf-regs.c.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/arch/loongarch/util/Build        |  1 -
 tools/perf/arch/loongarch/util/dwarf-regs.c | 34 ---------------------
 tools/perf/util/dwarf-regs.c                |  4 +--
 tools/perf/util/include/dwarf-regs.h        |  3 +-
 4 files changed, 4 insertions(+), 38 deletions(-)
 delete mode 100644 tools/perf/arch/loongarch/util/dwarf-regs.c

diff --git a/tools/perf/arch/loongarch/util/Build b/tools/perf/arch/loongarch/util/Build
index 06ff95394921..0aa31986ecb5 100644
--- a/tools/perf/arch/loongarch/util/Build
+++ b/tools/perf/arch/loongarch/util/Build
@@ -1,7 +1,6 @@
 perf-util-y += header.o
 perf-util-y += perf_regs.o
 
-perf-util-$(CONFIG_LIBDW)     += dwarf-regs.o
 perf-util-$(CONFIG_LOCAL_LIBUNWIND) += unwind-libunwind.o
 perf-util-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
 perf-util-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
diff --git a/tools/perf/arch/loongarch/util/dwarf-regs.c b/tools/perf/arch/loongarch/util/dwarf-regs.c
deleted file mode 100644
index bee08fdcf2fd..000000000000
--- a/tools/perf/arch/loongarch/util/dwarf-regs.c
+++ /dev/null
@@ -1,34 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * dwarf-regs.c : Mapping of DWARF debug register numbers into register names.
- *
- * Copyright (C) 2020-2023 Loongson Technology Corporation Limited
- */
-
-#include <stdio.h>
-#include <errno.h> /* for EINVAL */
-#include <string.h> /* for strcmp */
-#include <dwarf-regs.h>
-
-struct pt_regs_dwarfnum {
-	const char *name;
-	unsigned int dwarfnum;
-};
-
-static struct pt_regs_dwarfnum loongarch_gpr_table[] = {
-	{"%r0", 0}, {"%r1", 1}, {"%r2", 2}, {"%r3", 3},
-	{"%r4", 4}, {"%r5", 5}, {"%r6", 6}, {"%r7", 7},
-	{"%r8", 8}, {"%r9", 9}, {"%r10", 10}, {"%r11", 11},
-	{"%r12", 12}, {"%r13", 13}, {"%r14", 14}, {"%r15", 15},
-	{"%r16", 16}, {"%r17", 17}, {"%r18", 18}, {"%r19", 19},
-	{"%r20", 20}, {"%r21", 21}, {"%r22", 22}, {"%r23", 23},
-	{"%r24", 24}, {"%r25", 25}, {"%r26", 26}, {"%r27", 27},
-	{"%r28", 28}, {"%r29", 29}, {"%r30", 30}, {"%r31", 31},
-	{NULL, 0}
-};
-
-const char *get_arch_regstr(unsigned int n)
-{
-	n %= 32;
-	return loongarch_gpr_table[n].name;
-}
diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c
index 9a76f83af62c..efc41d0fbee9 100644
--- a/tools/perf/util/dwarf-regs.c
+++ b/tools/perf/util/dwarf-regs.c
@@ -32,7 +32,7 @@
 const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int flags)
 {
 #if EM_HOST == EM_X86_64 || EM_HOST == EM_386 || EM_HOST == EM_AARCH64 || EM_HOST == EM_ARM \
-    || EM_HOST == EM_CSKY
+    || EM_HOST == EM_CSKY || EM_HOST == EM_LOONGARCH
 	if (machine == EM_NONE) {
 		/* Generic arch - use host arch */
 		machine = EM_HOST;
@@ -40,7 +40,7 @@ const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int
 #endif
 	switch (machine) {
 #if EM_HOST != EM_X86_64 && EM_HOST != EM_386 && EM_HOST != EM_AARCH64 && EM_HOST != EM_ARM \
-    && EM_HOST != EM_CSKY
+    && EM_HOST != EM_CSKY && EM_HOST != EM_LOONGARCH
 	case EM_NONE:	/* Generic arch - use host arch */
 		return get_arch_regstr(n);
 #endif
diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h
index b72d9d308ce4..4f205a58db89 100644
--- a/tools/perf/util/include/dwarf-regs.h
+++ b/tools/perf/util/include/dwarf-regs.h
@@ -79,7 +79,8 @@
 #define DWARF_REG_FB  0xd3affb /* random number */
 
 #ifdef HAVE_LIBDW_SUPPORT
-#if !defined(__x86_64__) && !defined(__i386__) && !defined(__aarch64__) && !defined(__arm__)
+#if !defined(__x86_64__) && !defined(__i386__) && !defined(__aarch64__) && !defined(__arm__) \
+    && !defined(__loongarch__)
 const char *get_arch_regstr(unsigned int n);
 #endif
 
-- 
2.47.0.105.g07ac214952-goog


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v3 12/20] perf mips: Remove dwarf-regs.c
  2024-10-17  0:25 [PATCH v3 00/20] Remove PERF_HAVE_DWARF_REGS Ian Rogers
                   ` (10 preceding siblings ...)
  2024-10-17  0:25 ` [PATCH v3 11/20] perf loongarch: Remove dwarf-regs.c Ian Rogers
@ 2024-10-17  0:25 ` Ian Rogers
  2024-10-17  0:25 ` [PATCH v3 13/20] perf dwarf-regs: Move powerpc dwarf-regs out of arch Ian Rogers
                   ` (8 subsequent siblings)
  20 siblings, 0 replies; 31+ messages in thread
From: Ian Rogers @ 2024-10-17  0:25 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Kan Liang, John Garry, Will Deacon,
	James Clark, Mike Leach, Leo Yan, Guo Ren, Paul Walmsley,
	Palmer Dabbelt, Albert Ou, Nick Terrell,
	Masami Hiramatsu (Google), Changbin Du, Guilherme Amadio,
	Yang Jihong, Aditya Gupta, Athira Rajeev, Masahiro Yamada,
	Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra, Shenlin Liang,
	Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

The file just provides the function get_arch_regstr, however, if in
the only caller get_dwarf_regstr EM_HOST is used for the EM_NONE case
the function can never be called. So remove as dead code. Tidy up the
EM_NONE cases for mips in dwarf-regs.c.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/arch/mips/util/Build        |  1 -
 tools/perf/arch/mips/util/dwarf-regs.c | 38 --------------------------
 tools/perf/util/dwarf-regs.c           |  4 +--
 tools/perf/util/include/dwarf-regs.h   |  2 +-
 4 files changed, 3 insertions(+), 42 deletions(-)
 delete mode 100644 tools/perf/arch/mips/util/dwarf-regs.c

diff --git a/tools/perf/arch/mips/util/Build b/tools/perf/arch/mips/util/Build
index b328109fc16c..691fa2051958 100644
--- a/tools/perf/arch/mips/util/Build
+++ b/tools/perf/arch/mips/util/Build
@@ -1,3 +1,2 @@
 perf-util-y += perf_regs.o
-perf-util-$(CONFIG_LIBDW) += dwarf-regs.o
 perf-util-$(CONFIG_LOCAL_LIBUNWIND) += unwind-libunwind.o
diff --git a/tools/perf/arch/mips/util/dwarf-regs.c b/tools/perf/arch/mips/util/dwarf-regs.c
deleted file mode 100644
index 25c13a91c2a7..000000000000
--- a/tools/perf/arch/mips/util/dwarf-regs.c
+++ /dev/null
@@ -1,38 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * dwarf-regs.c : Mapping of DWARF debug register numbers into register names.
- *
- * Copyright (C) 2013 Cavium, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- */
-
-#include <stdio.h>
-#include <dwarf-regs.h>
-
-static const char *mips_gpr_names[32] = {
-	"$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7", "$8", "$9",
-	"$10", "$11", "$12", "$13", "$14", "$15", "$16", "$17", "$18", "$19",
-	"$20", "$21", "$22", "$23", "$24", "$25", "$26", "$27", "$28", "$29",
-	"$30", "$31"
-};
-
-const char *get_arch_regstr(unsigned int n)
-{
-	if (n < 32)
-		return mips_gpr_names[n];
-	if (n == 64)
-		return "hi";
-	if (n == 65)
-		return "lo";
-	return NULL;
-}
diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c
index efc41d0fbee9..d536964df43c 100644
--- a/tools/perf/util/dwarf-regs.c
+++ b/tools/perf/util/dwarf-regs.c
@@ -32,7 +32,7 @@
 const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int flags)
 {
 #if EM_HOST == EM_X86_64 || EM_HOST == EM_386 || EM_HOST == EM_AARCH64 || EM_HOST == EM_ARM \
-    || EM_HOST == EM_CSKY || EM_HOST == EM_LOONGARCH
+    || EM_HOST == EM_CSKY || EM_HOST == EM_LOONGARCH || EM_HOST == EM_MIPS
 	if (machine == EM_NONE) {
 		/* Generic arch - use host arch */
 		machine = EM_HOST;
@@ -40,7 +40,7 @@ const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int
 #endif
 	switch (machine) {
 #if EM_HOST != EM_X86_64 && EM_HOST != EM_386 && EM_HOST != EM_AARCH64 && EM_HOST != EM_ARM \
-    && EM_HOST != EM_CSKY && EM_HOST != EM_LOONGARCH
+    && EM_HOST != EM_CSKY && EM_HOST != EM_LOONGARCH && EM_HOST != EM_MIPS
 	case EM_NONE:	/* Generic arch - use host arch */
 		return get_arch_regstr(n);
 #endif
diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h
index 4f205a58db89..1f771b635789 100644
--- a/tools/perf/util/include/dwarf-regs.h
+++ b/tools/perf/util/include/dwarf-regs.h
@@ -80,7 +80,7 @@
 
 #ifdef HAVE_LIBDW_SUPPORT
 #if !defined(__x86_64__) && !defined(__i386__) && !defined(__aarch64__) && !defined(__arm__) \
-    && !defined(__loongarch__)
+    && !defined(__loongarch__) && !defined(__mips__)
 const char *get_arch_regstr(unsigned int n);
 #endif
 
-- 
2.47.0.105.g07ac214952-goog


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v3 13/20] perf dwarf-regs: Move powerpc dwarf-regs out of arch
  2024-10-17  0:25 [PATCH v3 00/20] Remove PERF_HAVE_DWARF_REGS Ian Rogers
                   ` (11 preceding siblings ...)
  2024-10-17  0:25 ` [PATCH v3 12/20] perf mips: " Ian Rogers
@ 2024-10-17  0:25 ` Ian Rogers
  2024-10-17  0:25 ` [PATCH v3 14/20] perf riscv: Remove dwarf-regs.c and add dwarf-regs-table.h Ian Rogers
                   ` (7 subsequent siblings)
  20 siblings, 0 replies; 31+ messages in thread
From: Ian Rogers @ 2024-10-17  0:25 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Kan Liang, John Garry, Will Deacon,
	James Clark, Mike Leach, Leo Yan, Guo Ren, Paul Walmsley,
	Palmer Dabbelt, Albert Ou, Nick Terrell,
	Masami Hiramatsu (Google), Changbin Du, Guilherme Amadio,
	Yang Jihong, Aditya Gupta, Athira Rajeev, Masahiro Yamada,
	Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra, Shenlin Liang,
	Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

Move arch/powerpc/util/dwarf-regs.c to util/dwarf-regs-powerpc.c and
compile in unconditionally. get_arch_regstr is redundant when EM_NONE
is treated as EM_HOST so remove and update dwarf-regs.c conditions.
Make get_powerpc_regs unconditionally available whwn libdw is.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/arch/powerpc/util/Build        |   1 -
 tools/perf/arch/powerpc/util/dwarf-regs.c | 141 ----------------------
 tools/perf/util/Build                     |   1 +
 tools/perf/util/dwarf-regs-powerpc.c      |  61 ++++++++++
 tools/perf/util/dwarf-regs.c              |   6 +-
 tools/perf/util/include/dwarf-regs.h      |   9 +-
 6 files changed, 70 insertions(+), 149 deletions(-)
 delete mode 100644 tools/perf/arch/powerpc/util/dwarf-regs.c
 create mode 100644 tools/perf/util/dwarf-regs-powerpc.c

diff --git a/tools/perf/arch/powerpc/util/Build b/tools/perf/arch/powerpc/util/Build
index 3d979480a188..ed82715080f9 100644
--- a/tools/perf/arch/powerpc/util/Build
+++ b/tools/perf/arch/powerpc/util/Build
@@ -7,7 +7,6 @@ perf-util-y += sym-handling.o
 perf-util-y += evsel.o
 perf-util-y += event.o
 
-perf-util-$(CONFIG_LIBDW) += dwarf-regs.o
 perf-util-$(CONFIG_LIBDW) += skip-callchain-idx.o
 
 perf-util-$(CONFIG_LIBUNWIND) += unwind-libunwind.o
diff --git a/tools/perf/arch/powerpc/util/dwarf-regs.c b/tools/perf/arch/powerpc/util/dwarf-regs.c
deleted file mode 100644
index 23846c59a522..000000000000
--- a/tools/perf/arch/powerpc/util/dwarf-regs.c
+++ /dev/null
@@ -1,141 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * Mapping of DWARF debug register numbers into register names.
- *
- * Copyright (C) 2010 Ian Munsie, IBM Corporation.
- */
-
-#include <stddef.h>
-#include <errno.h>
-#include <string.h>
-#include <dwarf-regs.h>
-#include <linux/kernel.h>
-#include <linux/stringify.h>
-
-struct regs_dwarfnum {
-	const char *name;
-	unsigned int dwarfnum;
-};
-
-#define REG_DWARFNUM_NAME(r, num)					\
-	{.name = __stringify(%)__stringify(r), .dwarfnum = num}
-#define GPR_DWARFNUM_NAME(num)						\
-	{.name = __stringify(%gpr##num), .dwarfnum = num}
-#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
-
-/*
- * Reference:
- * http://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi-1.9.html
- */
-static const struct regs_dwarfnum regdwarfnum_table[] = {
-	GPR_DWARFNUM_NAME(0),
-	GPR_DWARFNUM_NAME(1),
-	GPR_DWARFNUM_NAME(2),
-	GPR_DWARFNUM_NAME(3),
-	GPR_DWARFNUM_NAME(4),
-	GPR_DWARFNUM_NAME(5),
-	GPR_DWARFNUM_NAME(6),
-	GPR_DWARFNUM_NAME(7),
-	GPR_DWARFNUM_NAME(8),
-	GPR_DWARFNUM_NAME(9),
-	GPR_DWARFNUM_NAME(10),
-	GPR_DWARFNUM_NAME(11),
-	GPR_DWARFNUM_NAME(12),
-	GPR_DWARFNUM_NAME(13),
-	GPR_DWARFNUM_NAME(14),
-	GPR_DWARFNUM_NAME(15),
-	GPR_DWARFNUM_NAME(16),
-	GPR_DWARFNUM_NAME(17),
-	GPR_DWARFNUM_NAME(18),
-	GPR_DWARFNUM_NAME(19),
-	GPR_DWARFNUM_NAME(20),
-	GPR_DWARFNUM_NAME(21),
-	GPR_DWARFNUM_NAME(22),
-	GPR_DWARFNUM_NAME(23),
-	GPR_DWARFNUM_NAME(24),
-	GPR_DWARFNUM_NAME(25),
-	GPR_DWARFNUM_NAME(26),
-	GPR_DWARFNUM_NAME(27),
-	GPR_DWARFNUM_NAME(28),
-	GPR_DWARFNUM_NAME(29),
-	GPR_DWARFNUM_NAME(30),
-	GPR_DWARFNUM_NAME(31),
-	REG_DWARFNUM_NAME(msr,   66),
-	REG_DWARFNUM_NAME(ctr,   109),
-	REG_DWARFNUM_NAME(link,  108),
-	REG_DWARFNUM_NAME(xer,   101),
-	REG_DWARFNUM_NAME(dar,   119),
-	REG_DWARFNUM_NAME(dsisr, 118),
-	REG_DWARFNUM_END,
-};
-
-/**
- * get_arch_regstr() - lookup register name from it's DWARF register number
- * @n:	the DWARF register number
- *
- * get_arch_regstr() returns the name of the register in struct
- * regdwarfnum_table from it's DWARF register number. If the register is not
- * found in the table, this returns NULL;
- */
-const char *get_arch_regstr(unsigned int n)
-{
-	const struct regs_dwarfnum *roff;
-
-	for (roff = regdwarfnum_table; roff->name != NULL; roff++)
-		if (roff->dwarfnum == n)
-			return roff->name;
-	return NULL;
-}
-
-#define PPC_OP(op)	(((op) >> 26) & 0x3F)
-#define PPC_RA(a)	(((a) >> 16) & 0x1f)
-#define PPC_RT(t)	(((t) >> 21) & 0x1f)
-#define PPC_RB(b)	(((b) >> 11) & 0x1f)
-#define PPC_D(D)	((D) & 0xfffe)
-#define PPC_DS(DS)	((DS) & 0xfffc)
-#define OP_LD	58
-#define OP_STD	62
-
-static int get_source_reg(u32 raw_insn)
-{
-	return PPC_RA(raw_insn);
-}
-
-static int get_target_reg(u32 raw_insn)
-{
-	return PPC_RT(raw_insn);
-}
-
-static int get_offset_opcode(u32 raw_insn)
-{
-	int opcode = PPC_OP(raw_insn);
-
-	/* DS- form */
-	if ((opcode == OP_LD) || (opcode == OP_STD))
-		return PPC_DS(raw_insn);
-	else
-		return PPC_D(raw_insn);
-}
-
-/*
- * Fills the required fields for op_loc depending on if it
- * is a source or target.
- * D form: ins RT,D(RA) -> src_reg1 = RA, offset = D, dst_reg1 = RT
- * DS form: ins RT,DS(RA) -> src_reg1 = RA, offset = DS, dst_reg1 = RT
- * X form: ins RT,RA,RB -> src_reg1 = RA, src_reg2 = RB, dst_reg1 = RT
- */
-void get_powerpc_regs(u32 raw_insn, int is_source,
-		struct annotated_op_loc *op_loc)
-{
-	if (is_source)
-		op_loc->reg1 = get_source_reg(raw_insn);
-	else
-		op_loc->reg1 = get_target_reg(raw_insn);
-
-	if (op_loc->multi_regs)
-		op_loc->reg2 = PPC_RB(raw_insn);
-
-	/* TODO: Implement offset handling for X Form */
-	if ((op_loc->mem_ref) && (PPC_OP(raw_insn) != 31))
-		op_loc->offset = get_offset_opcode(raw_insn);
-}
diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index 99ae4e2802b8..eeab8684ddcc 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -204,6 +204,7 @@ perf-util-$(CONFIG_LIBDW) += probe-finder.o
 perf-util-$(CONFIG_LIBDW) += dwarf-aux.o
 perf-util-$(CONFIG_LIBDW) += dwarf-regs.o
 perf-util-$(CONFIG_LIBDW) += dwarf-regs-csky.o
+perf-util-$(CONFIG_LIBDW) += dwarf-regs-powerpc.o
 perf-util-$(CONFIG_LIBDW) += dwarf-regs-x86.o
 perf-util-$(CONFIG_LIBDW) += debuginfo.o
 perf-util-$(CONFIG_LIBDW) += annotate-data.o
diff --git a/tools/perf/util/dwarf-regs-powerpc.c b/tools/perf/util/dwarf-regs-powerpc.c
new file mode 100644
index 000000000000..caf77a234c78
--- /dev/null
+++ b/tools/perf/util/dwarf-regs-powerpc.c
@@ -0,0 +1,61 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Mapping of DWARF debug register numbers into register names.
+ *
+ * Copyright (C) 2010 Ian Munsie, IBM Corporation.
+ */
+
+#include <dwarf-regs.h>
+
+#define PPC_OP(op)	(((op) >> 26) & 0x3F)
+#define PPC_RA(a)	(((a) >> 16) & 0x1f)
+#define PPC_RT(t)	(((t) >> 21) & 0x1f)
+#define PPC_RB(b)	(((b) >> 11) & 0x1f)
+#define PPC_D(D)	((D) & 0xfffe)
+#define PPC_DS(DS)	((DS) & 0xfffc)
+#define OP_LD	58
+#define OP_STD	62
+
+static int get_source_reg(u32 raw_insn)
+{
+	return PPC_RA(raw_insn);
+}
+
+static int get_target_reg(u32 raw_insn)
+{
+	return PPC_RT(raw_insn);
+}
+
+static int get_offset_opcode(u32 raw_insn)
+{
+	int opcode = PPC_OP(raw_insn);
+
+	/* DS- form */
+	if ((opcode == OP_LD) || (opcode == OP_STD))
+		return PPC_DS(raw_insn);
+	else
+		return PPC_D(raw_insn);
+}
+
+/*
+ * Fills the required fields for op_loc depending on if it
+ * is a source or target.
+ * D form: ins RT,D(RA) -> src_reg1 = RA, offset = D, dst_reg1 = RT
+ * DS form: ins RT,DS(RA) -> src_reg1 = RA, offset = DS, dst_reg1 = RT
+ * X form: ins RT,RA,RB -> src_reg1 = RA, src_reg2 = RB, dst_reg1 = RT
+ */
+void get_powerpc_regs(u32 raw_insn, int is_source,
+		struct annotated_op_loc *op_loc)
+{
+	if (is_source)
+		op_loc->reg1 = get_source_reg(raw_insn);
+	else
+		op_loc->reg1 = get_target_reg(raw_insn);
+
+	if (op_loc->multi_regs)
+		op_loc->reg2 = PPC_RB(raw_insn);
+
+	/* TODO: Implement offset handling for X Form */
+	if ((op_loc->mem_ref) && (PPC_OP(raw_insn) != 31))
+		op_loc->offset = get_offset_opcode(raw_insn);
+}
diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c
index d536964df43c..3d98c2bf6035 100644
--- a/tools/perf/util/dwarf-regs.c
+++ b/tools/perf/util/dwarf-regs.c
@@ -32,7 +32,8 @@
 const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int flags)
 {
 #if EM_HOST == EM_X86_64 || EM_HOST == EM_386 || EM_HOST == EM_AARCH64 || EM_HOST == EM_ARM \
-    || EM_HOST == EM_CSKY || EM_HOST == EM_LOONGARCH || EM_HOST == EM_MIPS
+    || EM_HOST == EM_CSKY || EM_HOST == EM_LOONGARCH || EM_HOST == EM_MIPS || EM_HOST == EM_PPC \
+    || EM_HOST == EM_PPC64
 	if (machine == EM_NONE) {
 		/* Generic arch - use host arch */
 		machine = EM_HOST;
@@ -40,7 +41,8 @@ const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int
 #endif
 	switch (machine) {
 #if EM_HOST != EM_X86_64 && EM_HOST != EM_386 && EM_HOST != EM_AARCH64 && EM_HOST != EM_ARM \
-    && EM_HOST != EM_CSKY && EM_HOST != EM_LOONGARCH && EM_HOST != EM_MIPS
+    && EM_HOST != EM_CSKY && EM_HOST != EM_LOONGARCH && EM_HOST != EM_MIPS && EM_HOST != EM_PPC \
+    && EM_HOST != EM_PPC64
 	case EM_NONE:	/* Generic arch - use host arch */
 		return get_arch_regstr(n);
 #endif
diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h
index 1f771b635789..1763280855ce 100644
--- a/tools/perf/util/include/dwarf-regs.h
+++ b/tools/perf/util/include/dwarf-regs.h
@@ -80,7 +80,8 @@
 
 #ifdef HAVE_LIBDW_SUPPORT
 #if !defined(__x86_64__) && !defined(__i386__) && !defined(__aarch64__) && !defined(__arm__) \
-    && !defined(__loongarch__) && !defined(__mips__)
+    && !defined(__loongarch__) && !defined(__mips__) && !defined(__powerpc__) \
+    && !defined(__powerpc64__)
 const char *get_arch_regstr(unsigned int n);
 #endif
 
@@ -107,6 +108,8 @@ int get_arch_regnum(const char *name);
  */
 int get_dwarf_regnum(const char *name, unsigned int machine, unsigned int flags);
 
+void get_powerpc_regs(u32 raw_insn, int is_source, struct annotated_op_loc *op_loc);
+
 #else /* HAVE_LIBDW_SUPPORT */
 
 static inline int get_dwarf_regnum(const char *name __maybe_unused,
@@ -115,16 +118,12 @@ static inline int get_dwarf_regnum(const char *name __maybe_unused,
 {
 	return -1;
 }
-#endif
 
-#if !defined(__powerpc__) || !defined(HAVE_LIBDW_SUPPORT)
 static inline void get_powerpc_regs(u32 raw_insn __maybe_unused, int is_source __maybe_unused,
 		struct annotated_op_loc *op_loc __maybe_unused)
 {
 	return;
 }
-#else
-void get_powerpc_regs(u32 raw_insn, int is_source, struct annotated_op_loc *op_loc);
 #endif
 
 #endif
-- 
2.47.0.105.g07ac214952-goog


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v3 14/20] perf riscv: Remove dwarf-regs.c and add dwarf-regs-table.h
  2024-10-17  0:25 [PATCH v3 00/20] Remove PERF_HAVE_DWARF_REGS Ian Rogers
                   ` (12 preceding siblings ...)
  2024-10-17  0:25 ` [PATCH v3 13/20] perf dwarf-regs: Move powerpc dwarf-regs out of arch Ian Rogers
@ 2024-10-17  0:25 ` Ian Rogers
  2024-10-18 19:39   ` Palmer Dabbelt
  2024-10-17  0:25 ` [PATCH v3 15/20] perf s390: Remove dwarf-regs.c Ian Rogers
                   ` (6 subsequent siblings)
  20 siblings, 1 reply; 31+ messages in thread
From: Ian Rogers @ 2024-10-17  0:25 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Kan Liang, John Garry, Will Deacon,
	James Clark, Mike Leach, Leo Yan, Guo Ren, Paul Walmsley,
	Palmer Dabbelt, Albert Ou, Nick Terrell,
	Masami Hiramatsu (Google), Changbin Du, Guilherme Amadio,
	Yang Jihong, Aditya Gupta, Athira Rajeev, Masahiro Yamada,
	Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra, Shenlin Liang,
	Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

The file just provides the function get_arch_regstr, however, if in
the only caller get_dwarf_regstr EM_HOST is used for the EM_NONE case,
and the register table is provided in a header file, the function can
never be called. So remove as dead code. Tidy up the EM_NONE cases for
riscv in dwarf-regs.c.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 .../dwarf-regs-table.h}                       | 32 ++++---------------
 tools/perf/arch/riscv/util/Build              |  1 -
 tools/perf/util/dwarf-regs.c                  |  7 ++--
 tools/perf/util/include/dwarf-regs.h          |  2 +-
 4 files changed, 12 insertions(+), 30 deletions(-)
 rename tools/perf/arch/riscv/{util/dwarf-regs.c => include/dwarf-regs-table.h} (56%)

diff --git a/tools/perf/arch/riscv/util/dwarf-regs.c b/tools/perf/arch/riscv/include/dwarf-regs-table.h
similarity index 56%
rename from tools/perf/arch/riscv/util/dwarf-regs.c
rename to tools/perf/arch/riscv/include/dwarf-regs-table.h
index a9c4402ae57e..a45b63a6d5a8 100644
--- a/tools/perf/arch/riscv/util/dwarf-regs.c
+++ b/tools/perf/arch/riscv/include/dwarf-regs-table.h
@@ -1,23 +1,10 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd.
- * Mapping of DWARF debug register numbers into register names.
- */
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifdef DEFINE_DWARF_REGSTR_TABLE
+/* This is included in perf/util/dwarf-regs.c */
 
-#include <stddef.h>
-#include <errno.h> /* for EINVAL */
-#include <string.h> /* for strcmp */
-#include <dwarf-regs.h>
+#define REG_DWARFNUM_NAME(reg, idx)	[idx] = "%" #reg
 
-struct regs_dwarfnum {
-	const char *name;
-	unsigned int dwarfnum;
-};
-
-#define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}
-#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
-
-struct regs_dwarfnum riscv_dwarf_regs_table[] = {
+static const char * const riscv_regstr_tbl[] = {
 	REG_DWARFNUM_NAME("%zero", 0),
 	REG_DWARFNUM_NAME("%ra", 1),
 	REG_DWARFNUM_NAME("%sp", 2),
@@ -50,13 +37,6 @@ struct regs_dwarfnum riscv_dwarf_regs_table[] = {
 	REG_DWARFNUM_NAME("%t4", 29),
 	REG_DWARFNUM_NAME("%t5", 30),
 	REG_DWARFNUM_NAME("%t6", 31),
-	REG_DWARFNUM_END,
 };
 
-#define RISCV_MAX_REGS ((sizeof(riscv_dwarf_regs_table) / \
-		 sizeof(riscv_dwarf_regs_table[0])) - 1)
-
-const char *get_arch_regstr(unsigned int n)
-{
-	return (n < RISCV_MAX_REGS) ? riscv_dwarf_regs_table[n].name : NULL;
-}
+#endif
diff --git a/tools/perf/arch/riscv/util/Build b/tools/perf/arch/riscv/util/Build
index 8f93091b8345..58a672246024 100644
--- a/tools/perf/arch/riscv/util/Build
+++ b/tools/perf/arch/riscv/util/Build
@@ -2,5 +2,4 @@ perf-util-y += perf_regs.o
 perf-util-y += header.o
 
 perf-util-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
-perf-util-$(CONFIG_LIBDW) += dwarf-regs.o
 perf-util-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c
index 3d98c2bf6035..2c6b197556dd 100644
--- a/tools/perf/util/dwarf-regs.c
+++ b/tools/perf/util/dwarf-regs.c
@@ -20,6 +20,7 @@
 #include "../arch/arm64/include/dwarf-regs-table.h"
 #include "../arch/sh/include/dwarf-regs-table.h"
 #include "../arch/powerpc/include/dwarf-regs-table.h"
+#include "../arch/riscv/include/dwarf-regs-table.h"
 #include "../arch/s390/include/dwarf-regs-table.h"
 #include "../arch/sparc/include/dwarf-regs-table.h"
 #include "../arch/xtensa/include/dwarf-regs-table.h"
@@ -33,7 +34,7 @@ const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int
 {
 #if EM_HOST == EM_X86_64 || EM_HOST == EM_386 || EM_HOST == EM_AARCH64 || EM_HOST == EM_ARM \
     || EM_HOST == EM_CSKY || EM_HOST == EM_LOONGARCH || EM_HOST == EM_MIPS || EM_HOST == EM_PPC \
-    || EM_HOST == EM_PPC64
+    || EM_HOST == EM_PPC64 || EM_HOST == EM_RISCV
 	if (machine == EM_NONE) {
 		/* Generic arch - use host arch */
 		machine = EM_HOST;
@@ -42,7 +43,7 @@ const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int
 	switch (machine) {
 #if EM_HOST != EM_X86_64 && EM_HOST != EM_386 && EM_HOST != EM_AARCH64 && EM_HOST != EM_ARM \
     && EM_HOST != EM_CSKY && EM_HOST != EM_LOONGARCH && EM_HOST != EM_MIPS && EM_HOST != EM_PPC \
-    && EM_HOST != EM_PPC64
+    && EM_HOST != EM_PPC64 && EM_HOST != EM_RISCV
 	case EM_NONE:	/* Generic arch - use host arch */
 		return get_arch_regstr(n);
 #endif
@@ -63,6 +64,8 @@ const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int
 	case EM_PPC:
 	case EM_PPC64:
 		return __get_dwarf_regstr(powerpc_regstr_tbl, n);
+	case EM_RISCV:
+		return __get_dwarf_regstr(riscv_regstr_tbl, n);
 	case EM_SPARC:
 	case EM_SPARCV9:
 		return __get_dwarf_regstr(sparc_regstr_tbl, n);
diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h
index 1763280855ce..35f4f33205da 100644
--- a/tools/perf/util/include/dwarf-regs.h
+++ b/tools/perf/util/include/dwarf-regs.h
@@ -81,7 +81,7 @@
 #ifdef HAVE_LIBDW_SUPPORT
 #if !defined(__x86_64__) && !defined(__i386__) && !defined(__aarch64__) && !defined(__arm__) \
     && !defined(__loongarch__) && !defined(__mips__) && !defined(__powerpc__) \
-    && !defined(__powerpc64__)
+    && !defined(__powerpc64__) && !defined(__riscv__)
 const char *get_arch_regstr(unsigned int n);
 #endif
 
-- 
2.47.0.105.g07ac214952-goog


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v3 15/20] perf s390: Remove dwarf-regs.c
  2024-10-17  0:25 [PATCH v3 00/20] Remove PERF_HAVE_DWARF_REGS Ian Rogers
                   ` (13 preceding siblings ...)
  2024-10-17  0:25 ` [PATCH v3 14/20] perf riscv: Remove dwarf-regs.c and add dwarf-regs-table.h Ian Rogers
@ 2024-10-17  0:25 ` Ian Rogers
  2024-10-17  0:25 ` [PATCH v3 16/20] perf sh: " Ian Rogers
                   ` (5 subsequent siblings)
  20 siblings, 0 replies; 31+ messages in thread
From: Ian Rogers @ 2024-10-17  0:25 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Kan Liang, John Garry, Will Deacon,
	James Clark, Mike Leach, Leo Yan, Guo Ren, Paul Walmsley,
	Palmer Dabbelt, Albert Ou, Nick Terrell,
	Masami Hiramatsu (Google), Changbin Du, Guilherme Amadio,
	Yang Jihong, Aditya Gupta, Athira Rajeev, Masahiro Yamada,
	Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra, Shenlin Liang,
	Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

The file just provides the function get_arch_regstr, however, if in
the only caller get_dwarf_regstr EM_HOST is used for the EM_NONE case
the function can never be called. So remove as dead code. Tidy up the
EM_NONE cases for s390 in dwarf-regs.c.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/arch/s390/util/Build        |  1 -
 tools/perf/arch/s390/util/dwarf-regs.c | 16 ----------------
 tools/perf/util/dwarf-regs.c           |  4 ++--
 tools/perf/util/include/dwarf-regs.h   |  2 +-
 4 files changed, 3 insertions(+), 20 deletions(-)
 delete mode 100644 tools/perf/arch/s390/util/dwarf-regs.c

diff --git a/tools/perf/arch/s390/util/Build b/tools/perf/arch/s390/util/Build
index 787410f99bb3..736c0ad09194 100644
--- a/tools/perf/arch/s390/util/Build
+++ b/tools/perf/arch/s390/util/Build
@@ -2,7 +2,6 @@ perf-util-y += header.o
 perf-util-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
 perf-util-y += perf_regs.o
 
-perf-util-$(CONFIG_LIBDW) += dwarf-regs.o
 perf-util-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
 
 perf-util-y += machine.o
diff --git a/tools/perf/arch/s390/util/dwarf-regs.c b/tools/perf/arch/s390/util/dwarf-regs.c
deleted file mode 100644
index 5bcf3192623a..000000000000
--- a/tools/perf/arch/s390/util/dwarf-regs.c
+++ /dev/null
@@ -1,16 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Mapping of DWARF debug register numbers into register names.
- *
- * Copyright IBM Corp. 2010, 2017
- * Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
- *
- */
-
-#include <linux/kernel.h>
-#include "dwarf-regs-table.h"
-
-const char *get_arch_regstr(unsigned int n)
-{
-	return (n >= ARRAY_SIZE(s390_dwarf_regs)) ? NULL : s390_dwarf_regs[n];
-}
diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c
index 2c6b197556dd..1649fc07f4f5 100644
--- a/tools/perf/util/dwarf-regs.c
+++ b/tools/perf/util/dwarf-regs.c
@@ -34,7 +34,7 @@ const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int
 {
 #if EM_HOST == EM_X86_64 || EM_HOST == EM_386 || EM_HOST == EM_AARCH64 || EM_HOST == EM_ARM \
     || EM_HOST == EM_CSKY || EM_HOST == EM_LOONGARCH || EM_HOST == EM_MIPS || EM_HOST == EM_PPC \
-    || EM_HOST == EM_PPC64 || EM_HOST == EM_RISCV
+    || EM_HOST == EM_PPC64 || EM_HOST == EM_RISCV || EM_HOST == EM_S390
 	if (machine == EM_NONE) {
 		/* Generic arch - use host arch */
 		machine = EM_HOST;
@@ -43,7 +43,7 @@ const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int
 	switch (machine) {
 #if EM_HOST != EM_X86_64 && EM_HOST != EM_386 && EM_HOST != EM_AARCH64 && EM_HOST != EM_ARM \
     && EM_HOST != EM_CSKY && EM_HOST != EM_LOONGARCH && EM_HOST != EM_MIPS && EM_HOST != EM_PPC \
-    && EM_HOST != EM_PPC64 && EM_HOST != EM_RISCV
+    && EM_HOST != EM_PPC64 && EM_HOST != EM_RISCV && EM_HOST != EM_S390
 	case EM_NONE:	/* Generic arch - use host arch */
 		return get_arch_regstr(n);
 #endif
diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h
index 35f4f33205da..25f3d6b90f10 100644
--- a/tools/perf/util/include/dwarf-regs.h
+++ b/tools/perf/util/include/dwarf-regs.h
@@ -81,7 +81,7 @@
 #ifdef HAVE_LIBDW_SUPPORT
 #if !defined(__x86_64__) && !defined(__i386__) && !defined(__aarch64__) && !defined(__arm__) \
     && !defined(__loongarch__) && !defined(__mips__) && !defined(__powerpc__) \
-    && !defined(__powerpc64__) && !defined(__riscv__)
+    && !defined(__powerpc64__) && !defined(__riscv__) && !defined(__s390x__)
 const char *get_arch_regstr(unsigned int n);
 #endif
 
-- 
2.47.0.105.g07ac214952-goog


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v3 16/20] perf sh: Remove dwarf-regs.c
  2024-10-17  0:25 [PATCH v3 00/20] Remove PERF_HAVE_DWARF_REGS Ian Rogers
                   ` (14 preceding siblings ...)
  2024-10-17  0:25 ` [PATCH v3 15/20] perf s390: Remove dwarf-regs.c Ian Rogers
@ 2024-10-17  0:25 ` Ian Rogers
  2024-10-17  0:25 ` [PATCH v3 17/20] perf sparc: " Ian Rogers
                   ` (4 subsequent siblings)
  20 siblings, 0 replies; 31+ messages in thread
From: Ian Rogers @ 2024-10-17  0:25 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Kan Liang, John Garry, Will Deacon,
	James Clark, Mike Leach, Leo Yan, Guo Ren, Paul Walmsley,
	Palmer Dabbelt, Albert Ou, Nick Terrell,
	Masami Hiramatsu (Google), Changbin Du, Guilherme Amadio,
	Yang Jihong, Aditya Gupta, Athira Rajeev, Masahiro Yamada,
	Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra, Shenlin Liang,
	Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

The file just provides the function get_arch_regstr, however, if in
the only caller get_dwarf_regstr EM_HOST is used for the EM_NONE case
the function can never be called. So remove as dead code. As this is
the only file in the arch/sh/util clean up Build files. Tidy up the
EM_NONE cases for sh in dwarf-regs.c.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/arch/sh/Build             |  1 -
 tools/perf/arch/sh/util/Build        |  1 -
 tools/perf/arch/sh/util/dwarf-regs.c | 41 ----------------------------
 tools/perf/util/dwarf-regs.c         |  4 +--
 tools/perf/util/include/dwarf-regs.h |  2 +-
 5 files changed, 3 insertions(+), 46 deletions(-)
 delete mode 100644 tools/perf/arch/sh/Build
 delete mode 100644 tools/perf/arch/sh/util/Build
 delete mode 100644 tools/perf/arch/sh/util/dwarf-regs.c

diff --git a/tools/perf/arch/sh/Build b/tools/perf/arch/sh/Build
deleted file mode 100644
index e63eabc2c8f4..000000000000
--- a/tools/perf/arch/sh/Build
+++ /dev/null
@@ -1 +0,0 @@
-perf-util-y += util/
diff --git a/tools/perf/arch/sh/util/Build b/tools/perf/arch/sh/util/Build
deleted file mode 100644
index 2337a0b710a2..000000000000
--- a/tools/perf/arch/sh/util/Build
+++ /dev/null
@@ -1 +0,0 @@
-perf-util-$(CONFIG_LIBDW) += dwarf-regs.o
diff --git a/tools/perf/arch/sh/util/dwarf-regs.c b/tools/perf/arch/sh/util/dwarf-regs.c
deleted file mode 100644
index 4b17fc86c73b..000000000000
--- a/tools/perf/arch/sh/util/dwarf-regs.c
+++ /dev/null
@@ -1,41 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * Mapping of DWARF debug register numbers into register names.
- *
- * Copyright (C) 2010 Matt Fleming <matt@console-pimps.org>
- */
-
-#include <stddef.h>
-#include <dwarf-regs.h>
-
-/*
- * Generic dwarf analysis helpers
- */
-
-#define SH_MAX_REGS 18
-const char *sh_regs_table[SH_MAX_REGS] = {
-	"r0",
-	"r1",
-	"r2",
-	"r3",
-	"r4",
-	"r5",
-	"r6",
-	"r7",
-	"r8",
-	"r9",
-	"r10",
-	"r11",
-	"r12",
-	"r13",
-	"r14",
-	"r15",
-	"pc",
-	"pr",
-};
-
-/* Return architecture dependent register string (for kprobe-tracer) */
-const char *get_arch_regstr(unsigned int n)
-{
-	return (n < SH_MAX_REGS) ? sh_regs_table[n] : NULL;
-}
diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c
index 1649fc07f4f5..944ff4ef0290 100644
--- a/tools/perf/util/dwarf-regs.c
+++ b/tools/perf/util/dwarf-regs.c
@@ -34,7 +34,7 @@ const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int
 {
 #if EM_HOST == EM_X86_64 || EM_HOST == EM_386 || EM_HOST == EM_AARCH64 || EM_HOST == EM_ARM \
     || EM_HOST == EM_CSKY || EM_HOST == EM_LOONGARCH || EM_HOST == EM_MIPS || EM_HOST == EM_PPC \
-    || EM_HOST == EM_PPC64 || EM_HOST == EM_RISCV || EM_HOST == EM_S390
+    || EM_HOST == EM_PPC64 || EM_HOST == EM_RISCV || EM_HOST == EM_S390 || EM_HOST == EM_SH
 	if (machine == EM_NONE) {
 		/* Generic arch - use host arch */
 		machine = EM_HOST;
@@ -43,7 +43,7 @@ const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int
 	switch (machine) {
 #if EM_HOST != EM_X86_64 && EM_HOST != EM_386 && EM_HOST != EM_AARCH64 && EM_HOST != EM_ARM \
     && EM_HOST != EM_CSKY && EM_HOST != EM_LOONGARCH && EM_HOST != EM_MIPS && EM_HOST != EM_PPC \
-    && EM_HOST != EM_PPC64 && EM_HOST != EM_RISCV && EM_HOST != EM_S390
+    && EM_HOST != EM_PPC64 && EM_HOST != EM_RISCV && EM_HOST != EM_S390 && EM_HOST != EM_SH
 	case EM_NONE:	/* Generic arch - use host arch */
 		return get_arch_regstr(n);
 #endif
diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h
index 25f3d6b90f10..2b212ed70a15 100644
--- a/tools/perf/util/include/dwarf-regs.h
+++ b/tools/perf/util/include/dwarf-regs.h
@@ -81,7 +81,7 @@
 #ifdef HAVE_LIBDW_SUPPORT
 #if !defined(__x86_64__) && !defined(__i386__) && !defined(__aarch64__) && !defined(__arm__) \
     && !defined(__loongarch__) && !defined(__mips__) && !defined(__powerpc__) \
-    && !defined(__powerpc64__) && !defined(__riscv__) && !defined(__s390x__)
+    && !defined(__powerpc64__) && !defined(__riscv__) && !defined(__s390x__) && !defined(__sh__)
 const char *get_arch_regstr(unsigned int n);
 #endif
 
-- 
2.47.0.105.g07ac214952-goog


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v3 17/20] perf sparc: Remove dwarf-regs.c
  2024-10-17  0:25 [PATCH v3 00/20] Remove PERF_HAVE_DWARF_REGS Ian Rogers
                   ` (15 preceding siblings ...)
  2024-10-17  0:25 ` [PATCH v3 16/20] perf sh: " Ian Rogers
@ 2024-10-17  0:25 ` Ian Rogers
  2024-10-17  0:25 ` [PATCH v3 18/20] perf xtensa: " Ian Rogers
                   ` (3 subsequent siblings)
  20 siblings, 0 replies; 31+ messages in thread
From: Ian Rogers @ 2024-10-17  0:25 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Kan Liang, John Garry, Will Deacon,
	James Clark, Mike Leach, Leo Yan, Guo Ren, Paul Walmsley,
	Palmer Dabbelt, Albert Ou, Nick Terrell,
	Masami Hiramatsu (Google), Changbin Du, Guilherme Amadio,
	Yang Jihong, Aditya Gupta, Athira Rajeev, Masahiro Yamada,
	Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra, Shenlin Liang,
	Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

The file just provides the function get_arch_regstr, however, if in
the only caller get_dwarf_regstr EM_HOST is used for the EM_NONE case
the function can never be called. So remove as dead code. As this is
the only file in the arch/sparc/util clean up Build files. Tidy up the
EM_NONE cases for sparc in dwarf-regs.c.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/arch/sparc/Build             |  1 -
 tools/perf/arch/sparc/util/Build        |  1 -
 tools/perf/arch/sparc/util/dwarf-regs.c | 39 -------------------------
 tools/perf/util/dwarf-regs.c            |  6 ++--
 tools/perf/util/include/dwarf-regs.h    |  3 +-
 5 files changed, 6 insertions(+), 44 deletions(-)
 delete mode 100644 tools/perf/arch/sparc/Build
 delete mode 100644 tools/perf/arch/sparc/util/Build
 delete mode 100644 tools/perf/arch/sparc/util/dwarf-regs.c

diff --git a/tools/perf/arch/sparc/Build b/tools/perf/arch/sparc/Build
deleted file mode 100644
index e63eabc2c8f4..000000000000
--- a/tools/perf/arch/sparc/Build
+++ /dev/null
@@ -1 +0,0 @@
-perf-util-y += util/
diff --git a/tools/perf/arch/sparc/util/Build b/tools/perf/arch/sparc/util/Build
deleted file mode 100644
index 2337a0b710a2..000000000000
--- a/tools/perf/arch/sparc/util/Build
+++ /dev/null
@@ -1 +0,0 @@
-perf-util-$(CONFIG_LIBDW) += dwarf-regs.o
diff --git a/tools/perf/arch/sparc/util/dwarf-regs.c b/tools/perf/arch/sparc/util/dwarf-regs.c
deleted file mode 100644
index 1282cb2dc7bd..000000000000
--- a/tools/perf/arch/sparc/util/dwarf-regs.c
+++ /dev/null
@@ -1,39 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * Mapping of DWARF debug register numbers into register names.
- *
- * Copyright (C) 2010 David S. Miller <davem@davemloft.net>
- */
-
-#include <stddef.h>
-#include <dwarf-regs.h>
-
-#define SPARC_MAX_REGS	96
-
-const char *sparc_regs_table[SPARC_MAX_REGS] = {
-	"%g0", "%g1", "%g2", "%g3", "%g4", "%g5", "%g6", "%g7",
-	"%o0", "%o1", "%o2", "%o3", "%o4", "%o5", "%sp", "%o7",
-	"%l0", "%l1", "%l2", "%l3", "%l4", "%l5", "%l6", "%l7",
-	"%i0", "%i1", "%i2", "%i3", "%i4", "%i5", "%fp", "%i7",
-	"%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7",
-	"%f8", "%f9", "%f10", "%f11", "%f12", "%f13", "%f14", "%f15",
-	"%f16", "%f17", "%f18", "%f19", "%f20", "%f21", "%f22", "%f23",
-	"%f24", "%f25", "%f26", "%f27", "%f28", "%f29", "%f30", "%f31",
-	"%f32", "%f33", "%f34", "%f35", "%f36", "%f37", "%f38", "%f39",
-	"%f40", "%f41", "%f42", "%f43", "%f44", "%f45", "%f46", "%f47",
-	"%f48", "%f49", "%f50", "%f51", "%f52", "%f53", "%f54", "%f55",
-	"%f56", "%f57", "%f58", "%f59", "%f60", "%f61", "%f62", "%f63",
-};
-
-/**
- * get_arch_regstr() - lookup register name from it's DWARF register number
- * @n:	the DWARF register number
- *
- * get_arch_regstr() returns the name of the register in struct
- * regdwarfnum_table from it's DWARF register number. If the register is not
- * found in the table, this returns NULL;
- */
-const char *get_arch_regstr(unsigned int n)
-{
-	return (n < SPARC_MAX_REGS) ? sparc_regs_table[n] : NULL;
-}
diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c
index 944ff4ef0290..a0bcc2529cb0 100644
--- a/tools/perf/util/dwarf-regs.c
+++ b/tools/perf/util/dwarf-regs.c
@@ -34,7 +34,8 @@ const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int
 {
 #if EM_HOST == EM_X86_64 || EM_HOST == EM_386 || EM_HOST == EM_AARCH64 || EM_HOST == EM_ARM \
     || EM_HOST == EM_CSKY || EM_HOST == EM_LOONGARCH || EM_HOST == EM_MIPS || EM_HOST == EM_PPC \
-    || EM_HOST == EM_PPC64 || EM_HOST == EM_RISCV || EM_HOST == EM_S390 || EM_HOST == EM_SH
+    || EM_HOST == EM_PPC64 || EM_HOST == EM_RISCV || EM_HOST == EM_S390 || EM_HOST == EM_SH \
+    || EM_HOST == EM_SPARC || EM_HOST == EM_SPARCV9
 	if (machine == EM_NONE) {
 		/* Generic arch - use host arch */
 		machine = EM_HOST;
@@ -43,7 +44,8 @@ const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int
 	switch (machine) {
 #if EM_HOST != EM_X86_64 && EM_HOST != EM_386 && EM_HOST != EM_AARCH64 && EM_HOST != EM_ARM \
     && EM_HOST != EM_CSKY && EM_HOST != EM_LOONGARCH && EM_HOST != EM_MIPS && EM_HOST != EM_PPC \
-    && EM_HOST != EM_PPC64 && EM_HOST != EM_RISCV && EM_HOST != EM_S390 && EM_HOST != EM_SH
+    && EM_HOST != EM_PPC64 && EM_HOST != EM_RISCV && EM_HOST != EM_S390 && EM_HOST != EM_SH \
+    && EM_HOST != EM_SPARC && EM_HOST != EM_SPARCV9
 	case EM_NONE:	/* Generic arch - use host arch */
 		return get_arch_regstr(n);
 #endif
diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h
index 2b212ed70a15..b2cf7d9e4785 100644
--- a/tools/perf/util/include/dwarf-regs.h
+++ b/tools/perf/util/include/dwarf-regs.h
@@ -81,7 +81,8 @@
 #ifdef HAVE_LIBDW_SUPPORT
 #if !defined(__x86_64__) && !defined(__i386__) && !defined(__aarch64__) && !defined(__arm__) \
     && !defined(__loongarch__) && !defined(__mips__) && !defined(__powerpc__) \
-    && !defined(__powerpc64__) && !defined(__riscv__) && !defined(__s390x__) && !defined(__sh__)
+    && !defined(__powerpc64__) && !defined(__riscv__) && !defined(__s390x__) && !defined(__sh__) \
+    && !defined(__sparc64__) && !defined(__sparc__)
 const char *get_arch_regstr(unsigned int n);
 #endif
 
-- 
2.47.0.105.g07ac214952-goog


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v3 18/20] perf xtensa: Remove dwarf-regs.c
  2024-10-17  0:25 [PATCH v3 00/20] Remove PERF_HAVE_DWARF_REGS Ian Rogers
                   ` (16 preceding siblings ...)
  2024-10-17  0:25 ` [PATCH v3 17/20] perf sparc: " Ian Rogers
@ 2024-10-17  0:25 ` Ian Rogers
  2024-10-17  0:25 ` [PATCH v3 19/20] perf dwarf-regs: Remove get_arch_regstr code Ian Rogers
                   ` (2 subsequent siblings)
  20 siblings, 0 replies; 31+ messages in thread
From: Ian Rogers @ 2024-10-17  0:25 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Kan Liang, John Garry, Will Deacon,
	James Clark, Mike Leach, Leo Yan, Guo Ren, Paul Walmsley,
	Palmer Dabbelt, Albert Ou, Nick Terrell,
	Masami Hiramatsu (Google), Changbin Du, Guilherme Amadio,
	Yang Jihong, Aditya Gupta, Athira Rajeev, Masahiro Yamada,
	Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra, Shenlin Liang,
	Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

The file just provides the function get_arch_regstr, however, if in
the only caller get_dwarf_regstr EM_HOST is used for the EM_NONE case
the function can never be called. So remove as dead code. As this is
the only file in the arch/xtensa/util clean up Build files. Tidy up the
EM_NONE cases for xtensa in dwarf-regs.c.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/arch/xtensa/Build             |  1 -
 tools/perf/arch/xtensa/util/Build        |  1 -
 tools/perf/arch/xtensa/util/dwarf-regs.c | 21 ---------------------
 tools/perf/util/dwarf-regs.c             |  4 ++--
 tools/perf/util/include/dwarf-regs.h     |  2 +-
 5 files changed, 3 insertions(+), 26 deletions(-)
 delete mode 100644 tools/perf/arch/xtensa/Build
 delete mode 100644 tools/perf/arch/xtensa/util/Build
 delete mode 100644 tools/perf/arch/xtensa/util/dwarf-regs.c

diff --git a/tools/perf/arch/xtensa/Build b/tools/perf/arch/xtensa/Build
deleted file mode 100644
index e63eabc2c8f4..000000000000
--- a/tools/perf/arch/xtensa/Build
+++ /dev/null
@@ -1 +0,0 @@
-perf-util-y += util/
diff --git a/tools/perf/arch/xtensa/util/Build b/tools/perf/arch/xtensa/util/Build
deleted file mode 100644
index 2d1a48696ad9..000000000000
--- a/tools/perf/arch/xtensa/util/Build
+++ /dev/null
@@ -1 +0,0 @@
-perf-$(CONFIG_LIBDW) += dwarf-regs.o
diff --git a/tools/perf/arch/xtensa/util/dwarf-regs.c b/tools/perf/arch/xtensa/util/dwarf-regs.c
deleted file mode 100644
index 12f5457300f5..000000000000
--- a/tools/perf/arch/xtensa/util/dwarf-regs.c
+++ /dev/null
@@ -1,21 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * Mapping of DWARF debug register numbers into register names.
- *
- * Copyright (c) 2015 Cadence Design Systems Inc.
- */
-
-#include <stddef.h>
-#include <dwarf-regs.h>
-
-#define XTENSA_MAX_REGS 16
-
-const char *xtensa_regs_table[XTENSA_MAX_REGS] = {
-	"a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7",
-	"a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15",
-};
-
-const char *get_arch_regstr(unsigned int n)
-{
-	return n < XTENSA_MAX_REGS ? xtensa_regs_table[n] : NULL;
-}
diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c
index a0bcc2529cb0..05fff75a8f59 100644
--- a/tools/perf/util/dwarf-regs.c
+++ b/tools/perf/util/dwarf-regs.c
@@ -35,7 +35,7 @@ const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int
 #if EM_HOST == EM_X86_64 || EM_HOST == EM_386 || EM_HOST == EM_AARCH64 || EM_HOST == EM_ARM \
     || EM_HOST == EM_CSKY || EM_HOST == EM_LOONGARCH || EM_HOST == EM_MIPS || EM_HOST == EM_PPC \
     || EM_HOST == EM_PPC64 || EM_HOST == EM_RISCV || EM_HOST == EM_S390 || EM_HOST == EM_SH \
-    || EM_HOST == EM_SPARC || EM_HOST == EM_SPARCV9
+    || EM_HOST == EM_SPARC || EM_HOST == EM_SPARCV9 || EM_HOST == EM_XTENSA
 	if (machine == EM_NONE) {
 		/* Generic arch - use host arch */
 		machine = EM_HOST;
@@ -45,7 +45,7 @@ const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int
 #if EM_HOST != EM_X86_64 && EM_HOST != EM_386 && EM_HOST != EM_AARCH64 && EM_HOST != EM_ARM \
     && EM_HOST != EM_CSKY && EM_HOST != EM_LOONGARCH && EM_HOST != EM_MIPS && EM_HOST != EM_PPC \
     && EM_HOST != EM_PPC64 && EM_HOST != EM_RISCV && EM_HOST != EM_S390 && EM_HOST != EM_SH \
-    && EM_HOST != EM_SPARC && EM_HOST != EM_SPARCV9
+    && EM_HOST != EM_SPARC && EM_HOST != EM_SPARCV9 && EM_HOST != EM_XTENSA
 	case EM_NONE:	/* Generic arch - use host arch */
 		return get_arch_regstr(n);
 #endif
diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h
index b2cf7d9e4785..9dfc9abfdddd 100644
--- a/tools/perf/util/include/dwarf-regs.h
+++ b/tools/perf/util/include/dwarf-regs.h
@@ -82,7 +82,7 @@
 #if !defined(__x86_64__) && !defined(__i386__) && !defined(__aarch64__) && !defined(__arm__) \
     && !defined(__loongarch__) && !defined(__mips__) && !defined(__powerpc__) \
     && !defined(__powerpc64__) && !defined(__riscv__) && !defined(__s390x__) && !defined(__sh__) \
-    && !defined(__sparc64__) && !defined(__sparc__)
+    && !defined(__sparc64__) && !defined(__sparc__) && !defined(__xtensa__)
 const char *get_arch_regstr(unsigned int n);
 #endif
 
-- 
2.47.0.105.g07ac214952-goog


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v3 19/20] perf dwarf-regs: Remove get_arch_regstr code
  2024-10-17  0:25 [PATCH v3 00/20] Remove PERF_HAVE_DWARF_REGS Ian Rogers
                   ` (17 preceding siblings ...)
  2024-10-17  0:25 ` [PATCH v3 18/20] perf xtensa: " Ian Rogers
@ 2024-10-17  0:25 ` Ian Rogers
  2024-10-17  0:25 ` [PATCH v3 20/20] perf build: Remove PERF_HAVE_DWARF_REGS Ian Rogers
  2024-11-07 19:29 ` [PATCH v3 00/20] " Namhyung Kim
  20 siblings, 0 replies; 31+ messages in thread
From: Ian Rogers @ 2024-10-17  0:25 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Kan Liang, John Garry, Will Deacon,
	James Clark, Mike Leach, Leo Yan, Guo Ren, Paul Walmsley,
	Palmer Dabbelt, Albert Ou, Nick Terrell,
	Masami Hiramatsu (Google), Changbin Du, Guilherme Amadio,
	Yang Jihong, Aditya Gupta, Athira Rajeev, Masahiro Yamada,
	Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra, Shenlin Liang,
	Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

get_arch_regstr no longer exists so remove declaration. Associated ifs
and switches are made unconditional.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/util/dwarf-regs.c         | 12 ------------
 tools/perf/util/include/dwarf-regs.h |  7 -------
 2 files changed, 19 deletions(-)

diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c
index 05fff75a8f59..28a1cfdf26d4 100644
--- a/tools/perf/util/dwarf-regs.c
+++ b/tools/perf/util/dwarf-regs.c
@@ -32,23 +32,11 @@
 /* Return architecture dependent register string (for kprobe-tracer) */
 const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int flags)
 {
-#if EM_HOST == EM_X86_64 || EM_HOST == EM_386 || EM_HOST == EM_AARCH64 || EM_HOST == EM_ARM \
-    || EM_HOST == EM_CSKY || EM_HOST == EM_LOONGARCH || EM_HOST == EM_MIPS || EM_HOST == EM_PPC \
-    || EM_HOST == EM_PPC64 || EM_HOST == EM_RISCV || EM_HOST == EM_S390 || EM_HOST == EM_SH \
-    || EM_HOST == EM_SPARC || EM_HOST == EM_SPARCV9 || EM_HOST == EM_XTENSA
 	if (machine == EM_NONE) {
 		/* Generic arch - use host arch */
 		machine = EM_HOST;
 	}
-#endif
 	switch (machine) {
-#if EM_HOST != EM_X86_64 && EM_HOST != EM_386 && EM_HOST != EM_AARCH64 && EM_HOST != EM_ARM \
-    && EM_HOST != EM_CSKY && EM_HOST != EM_LOONGARCH && EM_HOST != EM_MIPS && EM_HOST != EM_PPC \
-    && EM_HOST != EM_PPC64 && EM_HOST != EM_RISCV && EM_HOST != EM_S390 && EM_HOST != EM_SH \
-    && EM_HOST != EM_SPARC && EM_HOST != EM_SPARCV9 && EM_HOST != EM_XTENSA
-	case EM_NONE:	/* Generic arch - use host arch */
-		return get_arch_regstr(n);
-#endif
 	case EM_386:
 		return __get_dwarf_regstr(x86_32_regstr_tbl, n);
 	case EM_X86_64:
diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h
index 9dfc9abfdddd..6ee95cc69917 100644
--- a/tools/perf/util/include/dwarf-regs.h
+++ b/tools/perf/util/include/dwarf-regs.h
@@ -79,13 +79,6 @@
 #define DWARF_REG_FB  0xd3affb /* random number */
 
 #ifdef HAVE_LIBDW_SUPPORT
-#if !defined(__x86_64__) && !defined(__i386__) && !defined(__aarch64__) && !defined(__arm__) \
-    && !defined(__loongarch__) && !defined(__mips__) && !defined(__powerpc__) \
-    && !defined(__powerpc64__) && !defined(__riscv__) && !defined(__s390x__) && !defined(__sh__) \
-    && !defined(__sparc64__) && !defined(__sparc__) && !defined(__xtensa__)
-const char *get_arch_regstr(unsigned int n);
-#endif
-
 const char *get_csky_regstr(unsigned int n, unsigned int flags);
 
 /**
-- 
2.47.0.105.g07ac214952-goog


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [PATCH v3 20/20] perf build: Remove PERF_HAVE_DWARF_REGS
  2024-10-17  0:25 [PATCH v3 00/20] Remove PERF_HAVE_DWARF_REGS Ian Rogers
                   ` (18 preceding siblings ...)
  2024-10-17  0:25 ` [PATCH v3 19/20] perf dwarf-regs: Remove get_arch_regstr code Ian Rogers
@ 2024-10-17  0:25 ` Ian Rogers
  2024-11-07 19:29 ` [PATCH v3 00/20] " Namhyung Kim
  20 siblings, 0 replies; 31+ messages in thread
From: Ian Rogers @ 2024-10-17  0:25 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, Kan Liang, John Garry, Will Deacon,
	James Clark, Mike Leach, Leo Yan, Guo Ren, Paul Walmsley,
	Palmer Dabbelt, Albert Ou, Nick Terrell,
	Masami Hiramatsu (Google), Changbin Du, Guilherme Amadio,
	Yang Jihong, Aditya Gupta, Athira Rajeev, Masahiro Yamada,
	Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra, Shenlin Liang,
	Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

PERF_HAVE_DWARF_REGS was true when an architecture had a dwarf-regs.c
file. There are no more architecture dwarf-regs.c files, selection is
done using constants from the ELF file rather than conditional
compilation. When removing PERF_HAVE_DWARF_REGS was the only variable
in the Makefile, remove the Makefile.

Add missing SPDX for RISC-V Makefile.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/Makefile.config         | 13 ++++---------
 tools/perf/arch/arm/Makefile       |  3 ---
 tools/perf/arch/arm64/Makefile     |  3 ---
 tools/perf/arch/csky/Makefile      |  4 ----
 tools/perf/arch/loongarch/Makefile |  3 ---
 tools/perf/arch/mips/Makefile      |  4 ----
 tools/perf/arch/powerpc/Makefile   |  4 ----
 tools/perf/arch/riscv/Makefile     |  4 +---
 tools/perf/arch/s390/Makefile      |  3 ---
 tools/perf/arch/sh/Makefile        |  4 ----
 tools/perf/arch/sparc/Makefile     |  4 ----
 tools/perf/arch/x86/Makefile       |  3 ---
 tools/perf/arch/xtensa/Makefile    |  4 ----
 13 files changed, 5 insertions(+), 51 deletions(-)
 delete mode 100644 tools/perf/arch/csky/Makefile
 delete mode 100644 tools/perf/arch/sh/Makefile
 delete mode 100644 tools/perf/arch/xtensa/Makefile

diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index 1d3f7dcc6b66..87dae64c0501 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -551,15 +551,10 @@ ifndef NO_LIBELF
   endif
 
   ifndef NO_LIBDW
-    ifeq ($(origin PERF_HAVE_DWARF_REGS), undefined)
-      $(warning DWARF register mappings have not been defined for architecture $(SRCARCH), DWARF support disabled)
-      NO_LIBDW := 1
-    else
-      CFLAGS += -DHAVE_LIBDW_SUPPORT $(LIBDW_CFLAGS)
-      LDFLAGS += $(LIBDW_LDFLAGS)
-      EXTLIBS += ${DWARFLIBS}
-      $(call detected,CONFIG_LIBDW)
-    endif # PERF_HAVE_DWARF_REGS
+    CFLAGS += -DHAVE_LIBDW_SUPPORT $(LIBDW_CFLAGS)
+    LDFLAGS += $(LIBDW_LDFLAGS)
+    EXTLIBS += ${DWARFLIBS}
+    $(call detected,CONFIG_LIBDW)
   endif # NO_LIBDW
 
   ifndef NO_LIBBPF
diff --git a/tools/perf/arch/arm/Makefile b/tools/perf/arch/arm/Makefile
index 9b164d379548..8b59ce8efb89 100644
--- a/tools/perf/arch/arm/Makefile
+++ b/tools/perf/arch/arm/Makefile
@@ -1,5 +1,2 @@
 # SPDX-License-Identifier: GPL-2.0-only
-ifndef NO_LIBDW
-PERF_HAVE_DWARF_REGS := 1
-endif
 PERF_HAVE_JITDUMP := 1
diff --git a/tools/perf/arch/arm64/Makefile b/tools/perf/arch/arm64/Makefile
index ca2e35961287..91570d5d428e 100644
--- a/tools/perf/arch/arm64/Makefile
+++ b/tools/perf/arch/arm64/Makefile
@@ -1,7 +1,4 @@
 # SPDX-License-Identifier: GPL-2.0
-ifndef NO_LIBDW
-PERF_HAVE_DWARF_REGS := 1
-endif
 PERF_HAVE_JITDUMP := 1
 HAVE_KVM_STAT_SUPPORT := 1
 
diff --git a/tools/perf/arch/csky/Makefile b/tools/perf/arch/csky/Makefile
deleted file mode 100644
index 119b06a64bed..000000000000
--- a/tools/perf/arch/csky/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-ifndef NO_LIBDW
-PERF_HAVE_DWARF_REGS := 1
-endif
diff --git a/tools/perf/arch/loongarch/Makefile b/tools/perf/arch/loongarch/Makefile
index 79b432744296..52544d59245b 100644
--- a/tools/perf/arch/loongarch/Makefile
+++ b/tools/perf/arch/loongarch/Makefile
@@ -1,7 +1,4 @@
 # SPDX-License-Identifier: GPL-2.0
-ifndef NO_LIBDW
-PERF_HAVE_DWARF_REGS := 1
-endif
 PERF_HAVE_JITDUMP := 1
 HAVE_KVM_STAT_SUPPORT := 1
 
diff --git a/tools/perf/arch/mips/Makefile b/tools/perf/arch/mips/Makefile
index 733f7b76f52d..827168f1077a 100644
--- a/tools/perf/arch/mips/Makefile
+++ b/tools/perf/arch/mips/Makefile
@@ -1,8 +1,4 @@
 # SPDX-License-Identifier: GPL-2.0
-ifndef NO_LIBDW
-PERF_HAVE_DWARF_REGS := 1
-endif
-
 # Syscall table generation for perf
 out    := $(OUTPUT)arch/mips/include/generated/asm
 header := $(out)/syscalls_n64.c
diff --git a/tools/perf/arch/powerpc/Makefile b/tools/perf/arch/powerpc/Makefile
index ae05727835d8..dc8f4fb8e324 100644
--- a/tools/perf/arch/powerpc/Makefile
+++ b/tools/perf/arch/powerpc/Makefile
@@ -1,8 +1,4 @@
 # SPDX-License-Identifier: GPL-2.0
-ifndef NO_LIBDW
-PERF_HAVE_DWARF_REGS := 1
-endif
-
 HAVE_KVM_STAT_SUPPORT := 1
 PERF_HAVE_JITDUMP := 1
 
diff --git a/tools/perf/arch/riscv/Makefile b/tools/perf/arch/riscv/Makefile
index f01ab2171fd0..087e099fb453 100644
--- a/tools/perf/arch/riscv/Makefile
+++ b/tools/perf/arch/riscv/Makefile
@@ -1,5 +1,3 @@
-ifndef NO_LIBDW
-PERF_HAVE_DWARF_REGS := 1
-endif
+# SPDX-License-Identifier: GPL-2.0
 PERF_HAVE_JITDUMP := 1
 HAVE_KVM_STAT_SUPPORT := 1
diff --git a/tools/perf/arch/s390/Makefile b/tools/perf/arch/s390/Makefile
index 58e79f5b67a4..c431c21b11ef 100644
--- a/tools/perf/arch/s390/Makefile
+++ b/tools/perf/arch/s390/Makefile
@@ -1,7 +1,4 @@
 # SPDX-License-Identifier: GPL-2.0-only
-ifndef NO_LIBDW
-PERF_HAVE_DWARF_REGS := 1
-endif
 HAVE_KVM_STAT_SUPPORT := 1
 PERF_HAVE_JITDUMP := 1
 
diff --git a/tools/perf/arch/sh/Makefile b/tools/perf/arch/sh/Makefile
deleted file mode 100644
index 119b06a64bed..000000000000
--- a/tools/perf/arch/sh/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-ifndef NO_LIBDW
-PERF_HAVE_DWARF_REGS := 1
-endif
diff --git a/tools/perf/arch/sparc/Makefile b/tools/perf/arch/sparc/Makefile
index 7741184894c8..8b59ce8efb89 100644
--- a/tools/perf/arch/sparc/Makefile
+++ b/tools/perf/arch/sparc/Makefile
@@ -1,6 +1,2 @@
 # SPDX-License-Identifier: GPL-2.0-only
-ifndef NO_LIBDW
-PERF_HAVE_DWARF_REGS := 1
-endif
-
 PERF_HAVE_JITDUMP := 1
diff --git a/tools/perf/arch/x86/Makefile b/tools/perf/arch/x86/Makefile
index 51cf267f4d85..a6b6e0a9308a 100644
--- a/tools/perf/arch/x86/Makefile
+++ b/tools/perf/arch/x86/Makefile
@@ -1,7 +1,4 @@
 # SPDX-License-Identifier: GPL-2.0
-ifndef NO_LIBDW
-PERF_HAVE_DWARF_REGS := 1
-endif
 HAVE_KVM_STAT_SUPPORT := 1
 PERF_HAVE_JITDUMP := 1
 
diff --git a/tools/perf/arch/xtensa/Makefile b/tools/perf/arch/xtensa/Makefile
deleted file mode 100644
index 119b06a64bed..000000000000
--- a/tools/perf/arch/xtensa/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-ifndef NO_LIBDW
-PERF_HAVE_DWARF_REGS := 1
-endif
-- 
2.47.0.105.g07ac214952-goog


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* Re: [PATCH v3 14/20] perf riscv: Remove dwarf-regs.c and add dwarf-regs-table.h
  2024-10-17  0:25 ` [PATCH v3 14/20] perf riscv: Remove dwarf-regs.c and add dwarf-regs-table.h Ian Rogers
@ 2024-10-18 19:39   ` Palmer Dabbelt
  0 siblings, 0 replies; 31+ messages in thread
From: Palmer Dabbelt @ 2024-10-18 19:39 UTC (permalink / raw)
  To: irogers
  Cc: peterz, mingo, acme, namhyung, Mark Rutland, alexander.shishkin,
	jolsa, irogers, adrian.hunter, kan.liang, john.g.garry,
	Will Deacon, james.clark, mike.leach, leo.yan, guoren,
	Paul Walmsley, aou, terrelln, mhiramat, changbin.du, amadio,
	yangjihong, adityag, atrajeev, masahiroy, maobibo, chenhuacai,
	kjain, Atish Patra, liangshenlin, anup, oliver.upton, sesse,
	linux, cp0613, dima, przemyslaw.kitszel, davem,
	aleksander.lobakin, linux-kernel, linux-perf-users,
	linux-arm-kernel, linux-csky, linux-riscv

On Wed, 16 Oct 2024 17:25:14 PDT (-0700), irogers@google.com wrote:
> The file just provides the function get_arch_regstr, however, if in
> the only caller get_dwarf_regstr EM_HOST is used for the EM_NONE case,
> and the register table is provided in a header file, the function can
> never be called. So remove as dead code. Tidy up the EM_NONE cases for
> riscv in dwarf-regs.c.
>
> Signed-off-by: Ian Rogers <irogers@google.com>
> ---
>  .../dwarf-regs-table.h}                       | 32 ++++---------------
>  tools/perf/arch/riscv/util/Build              |  1 -
>  tools/perf/util/dwarf-regs.c                  |  7 ++--
>  tools/perf/util/include/dwarf-regs.h          |  2 +-
>  4 files changed, 12 insertions(+), 30 deletions(-)
>  rename tools/perf/arch/riscv/{util/dwarf-regs.c => include/dwarf-regs-table.h} (56%)
>
> diff --git a/tools/perf/arch/riscv/util/dwarf-regs.c b/tools/perf/arch/riscv/include/dwarf-regs-table.h
> similarity index 56%
> rename from tools/perf/arch/riscv/util/dwarf-regs.c
> rename to tools/perf/arch/riscv/include/dwarf-regs-table.h
> index a9c4402ae57e..a45b63a6d5a8 100644
> --- a/tools/perf/arch/riscv/util/dwarf-regs.c
> +++ b/tools/perf/arch/riscv/include/dwarf-regs-table.h
> @@ -1,23 +1,10 @@
> -// SPDX-License-Identifier: GPL-2.0
> -/*
> - * Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd.
> - * Mapping of DWARF debug register numbers into register names.
> - */
> +/* SPDX-License-Identifier: GPL-2.0 */
> +#ifdef DEFINE_DWARF_REGSTR_TABLE
> +/* This is included in perf/util/dwarf-regs.c */
>
> -#include <stddef.h>
> -#include <errno.h> /* for EINVAL */
> -#include <string.h> /* for strcmp */
> -#include <dwarf-regs.h>
> +#define REG_DWARFNUM_NAME(reg, idx)	[idx] = "%" #reg
>
> -struct regs_dwarfnum {
> -	const char *name;
> -	unsigned int dwarfnum;
> -};
> -
> -#define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}
> -#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
> -
> -struct regs_dwarfnum riscv_dwarf_regs_table[] = {
> +static const char * const riscv_regstr_tbl[] = {
>  	REG_DWARFNUM_NAME("%zero", 0),
>  	REG_DWARFNUM_NAME("%ra", 1),
>  	REG_DWARFNUM_NAME("%sp", 2),
> @@ -50,13 +37,6 @@ struct regs_dwarfnum riscv_dwarf_regs_table[] = {
>  	REG_DWARFNUM_NAME("%t4", 29),
>  	REG_DWARFNUM_NAME("%t5", 30),
>  	REG_DWARFNUM_NAME("%t6", 31),
> -	REG_DWARFNUM_END,
>  };
>
> -#define RISCV_MAX_REGS ((sizeof(riscv_dwarf_regs_table) / \
> -		 sizeof(riscv_dwarf_regs_table[0])) - 1)
> -
> -const char *get_arch_regstr(unsigned int n)
> -{
> -	return (n < RISCV_MAX_REGS) ? riscv_dwarf_regs_table[n].name : NULL;
> -}
> +#endif
> diff --git a/tools/perf/arch/riscv/util/Build b/tools/perf/arch/riscv/util/Build
> index 8f93091b8345..58a672246024 100644
> --- a/tools/perf/arch/riscv/util/Build
> +++ b/tools/perf/arch/riscv/util/Build
> @@ -2,5 +2,4 @@ perf-util-y += perf_regs.o
>  perf-util-y += header.o
>
>  perf-util-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
> -perf-util-$(CONFIG_LIBDW) += dwarf-regs.o
>  perf-util-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
> diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c
> index 3d98c2bf6035..2c6b197556dd 100644
> --- a/tools/perf/util/dwarf-regs.c
> +++ b/tools/perf/util/dwarf-regs.c
> @@ -20,6 +20,7 @@
>  #include "../arch/arm64/include/dwarf-regs-table.h"
>  #include "../arch/sh/include/dwarf-regs-table.h"
>  #include "../arch/powerpc/include/dwarf-regs-table.h"
> +#include "../arch/riscv/include/dwarf-regs-table.h"
>  #include "../arch/s390/include/dwarf-regs-table.h"
>  #include "../arch/sparc/include/dwarf-regs-table.h"
>  #include "../arch/xtensa/include/dwarf-regs-table.h"
> @@ -33,7 +34,7 @@ const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int
>  {
>  #if EM_HOST == EM_X86_64 || EM_HOST == EM_386 || EM_HOST == EM_AARCH64 || EM_HOST == EM_ARM \
>      || EM_HOST == EM_CSKY || EM_HOST == EM_LOONGARCH || EM_HOST == EM_MIPS || EM_HOST == EM_PPC \
> -    || EM_HOST == EM_PPC64
> +    || EM_HOST == EM_PPC64 || EM_HOST == EM_RISCV
>  	if (machine == EM_NONE) {
>  		/* Generic arch - use host arch */
>  		machine = EM_HOST;
> @@ -42,7 +43,7 @@ const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int
>  	switch (machine) {
>  #if EM_HOST != EM_X86_64 && EM_HOST != EM_386 && EM_HOST != EM_AARCH64 && EM_HOST != EM_ARM \
>      && EM_HOST != EM_CSKY && EM_HOST != EM_LOONGARCH && EM_HOST != EM_MIPS && EM_HOST != EM_PPC \
> -    && EM_HOST != EM_PPC64
> +    && EM_HOST != EM_PPC64 && EM_HOST != EM_RISCV
>  	case EM_NONE:	/* Generic arch - use host arch */
>  		return get_arch_regstr(n);
>  #endif
> @@ -63,6 +64,8 @@ const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int
>  	case EM_PPC:
>  	case EM_PPC64:
>  		return __get_dwarf_regstr(powerpc_regstr_tbl, n);
> +	case EM_RISCV:
> +		return __get_dwarf_regstr(riscv_regstr_tbl, n);
>  	case EM_SPARC:
>  	case EM_SPARCV9:
>  		return __get_dwarf_regstr(sparc_regstr_tbl, n);
> diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h
> index 1763280855ce..35f4f33205da 100644
> --- a/tools/perf/util/include/dwarf-regs.h
> +++ b/tools/perf/util/include/dwarf-regs.h
> @@ -81,7 +81,7 @@
>  #ifdef HAVE_LIBDW_SUPPORT
>  #if !defined(__x86_64__) && !defined(__i386__) && !defined(__aarch64__) && !defined(__arm__) \
>      && !defined(__loongarch__) && !defined(__mips__) && !defined(__powerpc__) \
> -    && !defined(__powerpc64__)
> +    && !defined(__powerpc64__) && !defined(__riscv__)
>  const char *get_arch_regstr(unsigned int n);
>  #endif

Acked-by: Palmer Dabbelt <palmer@rivosinc.com>

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v3 00/20] Remove PERF_HAVE_DWARF_REGS
  2024-10-17  0:25 [PATCH v3 00/20] Remove PERF_HAVE_DWARF_REGS Ian Rogers
                   ` (19 preceding siblings ...)
  2024-10-17  0:25 ` [PATCH v3 20/20] perf build: Remove PERF_HAVE_DWARF_REGS Ian Rogers
@ 2024-11-07 19:29 ` Namhyung Kim
  2024-11-08  0:00   ` Masami Hiramatsu
  20 siblings, 1 reply; 31+ messages in thread
From: Namhyung Kim @ 2024-11-07 19:29 UTC (permalink / raw)
  To: Ian Rogers, Masami Hiramatsu (Google)
  Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Mark Rutland, Alexander Shishkin, Jiri Olsa, Adrian Hunter,
	Kan Liang, John Garry, Will Deacon, James Clark, Mike Leach,
	Leo Yan, Guo Ren, Paul Walmsley, Palmer Dabbelt, Albert Ou,
	Nick Terrell, Changbin Du, Guilherme Amadio, Yang Jihong,
	Aditya Gupta, Athira Rajeev, Masahiro Yamada, Bibo Mao,
	Huacai Chen, Kajol Jain, Atish Patra, Shenlin Liang, Anup Patel,
	Oliver Upton, Steinar H. Gunderson, Dr. David Alan Gilbert,
	Chen Pei, Dima Kogan, Przemek Kitszel, David S. Miller,
	Alexander Lobakin, linux-kernel, linux-perf-users,
	linux-arm-kernel, linux-csky, linux-riscv

Hi all,

On Wed, Oct 16, 2024 at 05:25:00PM -0700, Ian Rogers wrote:
> These changes are on top of:
> https://lore.kernel.org/lkml/20241017001354.56973-1-irogers@google.com/
> 
> Prior to these patches PERF_HAVE_DWARF_REGS indicated the presence of
> dwarf-regs.c in the arch directory. dwarf-regs.c provided upto 4
> functions:
> 
> 1) regs_query_register_offset would translate a register name into a
> pt_regs offset and was used by BPF prologues. BPF prologues existed
> for BPF events and support for these was removed many releases ago.
> This code was dead and could be removed.
> 
> 2) get_arch_regstr duplicated get_dwarf_regstr and so it could be
> removed.  The case for csky was a little more complicated as the ABI
> controlled the string. The callers of get_dwarf_regstr were updated to
> also pass the ELF flags so that on csky the ABI appropriate table
> could be used. As the argument is only used on csky this a no-op for
> everything else.
> 
> 3) get_arch_regnum translated a register name back to a dwarf number
> and only existed on x86 where "al", "ax", "eax" and "rax" could all
> mean register 0. This code was moved to util with similar
> machine/flags logic to get_arch_regstr and for consistency with it.
> 
> 4) get_powerpc_regs a PowerPC specific function used by annotate that
> should really be in util.
> 
> 2 and 3 required the wiring through of the ELF machine and flags in
> callers to get_dwarf_regstr and get_dwarf_regnum. When these values
> weren't dependent on an ELF file a new EM_HOST and EF_HOST were added
> to give the host ELF machine and flags. These 2 #defines got rid of
> the existing separate arch files and #ifdefs.
> 
> v3: These files were separated from the rest of the v2 libdw clean up
>     in:
> https://lore.kernel.org/lkml/CAP-5=fVZH3L-6y_sxLwSmT8WyMXDMFnuqUksNULdQYJCPNBFYw@mail.gmail.com/
> 
> Ian Rogers (20):
>   perf bpf-prologue: Remove unused file
>   perf dwarf-regs: Remove PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET
>   perf dwarf-regs: Add EM_HOST and EF_HOST defines
>   perf disasm: Add e_machine/e_flags to struct arch
>   perf dwarf-regs: Pass accurate disassembly machine to get_dwarf_regnum
>   perf dwarf-regs: Pass ELF flags to get_dwarf_regstr
>   perf dwarf-regs: Move x86 dwarf-regs out of arch
>   perf arm64: Remove dwarf-regs.c
>   perf arm: Remove dwarf-regs.c
>   perf dwarf-regs: Move csky dwarf-regs out of arch
>   perf loongarch: Remove dwarf-regs.c
>   perf mips: Remove dwarf-regs.c
>   perf dwarf-regs: Move powerpc dwarf-regs out of arch
>   perf riscv: Remove dwarf-regs.c and add dwarf-regs-table.h
>   perf s390: Remove dwarf-regs.c
>   perf sh: Remove dwarf-regs.c
>   perf sparc: Remove dwarf-regs.c
>   perf xtensa: Remove dwarf-regs.c
>   perf dwarf-regs: Remove get_arch_regstr code
>   perf build: Remove PERF_HAVE_DWARF_REGS

These look all good and I'm about to apply the series.

Masami, do you have any remaining concerns?  It'd be nice if you can
give your Reviewed-by.

Thanks,
Namhyug

> 
>  tools/perf/Makefile.config                    |  17 +-
>  tools/perf/arch/arc/annotate/instructions.c   |   2 +
>  tools/perf/arch/arm/Makefile                  |   3 -
>  tools/perf/arch/arm/annotate/instructions.c   |   2 +
>  tools/perf/arch/arm/util/Build                |   2 -
>  tools/perf/arch/arm/util/dwarf-regs.c         |  61 -------
>  tools/perf/arch/arm64/Makefile                |   4 -
>  tools/perf/arch/arm64/annotate/instructions.c |   2 +
>  tools/perf/arch/arm64/util/Build              |   1 -
>  tools/perf/arch/arm64/util/dwarf-regs.c       |  92 -----------
>  tools/perf/arch/csky/Makefile                 |   4 -
>  tools/perf/arch/csky/annotate/instructions.c  |   7 +-
>  tools/perf/arch/csky/util/Build               |   1 -
>  tools/perf/arch/loongarch/Makefile            |   4 -
>  .../arch/loongarch/annotate/instructions.c    |   2 +
>  tools/perf/arch/loongarch/util/Build          |   1 -
>  tools/perf/arch/loongarch/util/dwarf-regs.c   |  44 -----
>  tools/perf/arch/mips/Makefile                 |   4 -
>  tools/perf/arch/mips/annotate/instructions.c  |   2 +
>  tools/perf/arch/mips/util/Build               |   1 -
>  tools/perf/arch/mips/util/dwarf-regs.c        |  38 -----
>  tools/perf/arch/powerpc/Makefile              |   5 -
>  .../perf/arch/powerpc/annotate/instructions.c |   2 +
>  tools/perf/arch/powerpc/util/Build            |   1 -
>  tools/perf/arch/powerpc/util/dwarf-regs.c     | 153 ------------------
>  tools/perf/arch/riscv/Makefile                |   5 +-
>  .../arch/riscv/include/dwarf-regs-table.h     |  42 +++++
>  tools/perf/arch/riscv/util/Build              |   1 -
>  tools/perf/arch/riscv/util/dwarf-regs.c       |  72 ---------
>  .../perf/arch/riscv64/annotate/instructions.c |   2 +
>  tools/perf/arch/s390/Makefile                 |   4 -
>  tools/perf/arch/s390/annotate/instructions.c  |   2 +
>  tools/perf/arch/s390/util/Build               |   1 -
>  tools/perf/arch/s390/util/dwarf-regs.c        |  43 -----
>  tools/perf/arch/sh/Build                      |   1 -
>  tools/perf/arch/sh/Makefile                   |   4 -
>  tools/perf/arch/sh/util/Build                 |   1 -
>  tools/perf/arch/sh/util/dwarf-regs.c          |  41 -----
>  tools/perf/arch/sparc/Build                   |   1 -
>  tools/perf/arch/sparc/Makefile                |   4 -
>  tools/perf/arch/sparc/annotate/instructions.c |   2 +
>  tools/perf/arch/sparc/util/Build              |   1 -
>  tools/perf/arch/sparc/util/dwarf-regs.c       |  39 -----
>  tools/perf/arch/x86/Makefile                  |   4 -
>  tools/perf/arch/x86/annotate/instructions.c   |   3 +-
>  tools/perf/arch/x86/util/Build                |   3 -
>  tools/perf/arch/x86/util/dwarf-regs.c         | 153 ------------------
>  tools/perf/arch/xtensa/Build                  |   1 -
>  tools/perf/arch/xtensa/Makefile               |   4 -
>  tools/perf/arch/xtensa/util/Build             |   1 -
>  tools/perf/arch/xtensa/util/dwarf-regs.c      |  21 ---
>  tools/perf/util/Build                         |   3 +
>  tools/perf/util/annotate.c                    |   6 +-
>  tools/perf/util/bpf-prologue.h                |  37 -----
>  tools/perf/util/disasm.h                      |   4 +
>  .../dwarf-regs.c => util/dwarf-regs-csky.c}   |  19 +--
>  tools/perf/util/dwarf-regs-powerpc.c          |  61 +++++++
>  tools/perf/util/dwarf-regs-x86.c              |  50 ++++++
>  tools/perf/util/dwarf-regs.c                  |  38 +++--
>  tools/perf/util/include/dwarf-regs.h          | 110 ++++++++++---
>  tools/perf/util/probe-finder.c                |  13 +-
>  tools/perf/util/probe-finder.h                |   3 +-
>  62 files changed, 328 insertions(+), 927 deletions(-)
>  delete mode 100644 tools/perf/arch/arm/util/dwarf-regs.c
>  delete mode 100644 tools/perf/arch/arm64/util/dwarf-regs.c
>  delete mode 100644 tools/perf/arch/csky/Makefile
>  delete mode 100644 tools/perf/arch/loongarch/util/dwarf-regs.c
>  delete mode 100644 tools/perf/arch/mips/util/dwarf-regs.c
>  delete mode 100644 tools/perf/arch/powerpc/util/dwarf-regs.c
>  create mode 100644 tools/perf/arch/riscv/include/dwarf-regs-table.h
>  delete mode 100644 tools/perf/arch/riscv/util/dwarf-regs.c
>  delete mode 100644 tools/perf/arch/s390/util/dwarf-regs.c
>  delete mode 100644 tools/perf/arch/sh/Build
>  delete mode 100644 tools/perf/arch/sh/Makefile
>  delete mode 100644 tools/perf/arch/sh/util/Build
>  delete mode 100644 tools/perf/arch/sh/util/dwarf-regs.c
>  delete mode 100644 tools/perf/arch/sparc/Build
>  delete mode 100644 tools/perf/arch/sparc/util/Build
>  delete mode 100644 tools/perf/arch/sparc/util/dwarf-regs.c
>  delete mode 100644 tools/perf/arch/x86/util/dwarf-regs.c
>  delete mode 100644 tools/perf/arch/xtensa/Build
>  delete mode 100644 tools/perf/arch/xtensa/Makefile
>  delete mode 100644 tools/perf/arch/xtensa/util/Build
>  delete mode 100644 tools/perf/arch/xtensa/util/dwarf-regs.c
>  delete mode 100644 tools/perf/util/bpf-prologue.h
>  rename tools/perf/{arch/csky/util/dwarf-regs.c => util/dwarf-regs-csky.c} (74%)
>  create mode 100644 tools/perf/util/dwarf-regs-powerpc.c
>  create mode 100644 tools/perf/util/dwarf-regs-x86.c
> 
> -- 
> 2.47.0.105.g07ac214952-goog
> 

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v3 00/20] Remove PERF_HAVE_DWARF_REGS
  2024-11-07 19:29 ` [PATCH v3 00/20] " Namhyung Kim
@ 2024-11-08  0:00   ` Masami Hiramatsu
  2024-11-08 18:33     ` Namhyung Kim
  0 siblings, 1 reply; 31+ messages in thread
From: Masami Hiramatsu @ 2024-11-08  0:00 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Ian Rogers, Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Mark Rutland, Alexander Shishkin, Jiri Olsa, Adrian Hunter,
	Kan Liang, John Garry, Will Deacon, James Clark, Mike Leach,
	Leo Yan, Guo Ren, Paul Walmsley, Palmer Dabbelt, Albert Ou,
	Nick Terrell, Changbin Du, Guilherme Amadio, Yang Jihong,
	Aditya Gupta, Athira Rajeev, Masahiro Yamada, Bibo Mao,
	Huacai Chen, Kajol Jain, Atish Patra, Shenlin Liang, Anup Patel,
	Oliver Upton, Steinar H. Gunderson, Dr. David Alan Gilbert,
	Chen Pei, Dima Kogan, Przemek Kitszel, David S. Miller,
	Alexander Lobakin, linux-kernel, linux-perf-users,
	linux-arm-kernel, linux-csky, linux-riscv

Hi,

On Thu, 7 Nov 2024 11:29:34 -0800
Namhyung Kim <namhyung@kernel.org> wrote:

> Hi all,
> 
> On Wed, Oct 16, 2024 at 05:25:00PM -0700, Ian Rogers wrote:
> > These changes are on top of:
> > https://lore.kernel.org/lkml/20241017001354.56973-1-irogers@google.com/
> > 
> > Prior to these patches PERF_HAVE_DWARF_REGS indicated the presence of
> > dwarf-regs.c in the arch directory. dwarf-regs.c provided upto 4
> > functions:
> > 
> > 1) regs_query_register_offset would translate a register name into a
> > pt_regs offset and was used by BPF prologues. BPF prologues existed
> > for BPF events and support for these was removed many releases ago.
> > This code was dead and could be removed.
> > 
> > 2) get_arch_regstr duplicated get_dwarf_regstr and so it could be
> > removed.  The case for csky was a little more complicated as the ABI
> > controlled the string. The callers of get_dwarf_regstr were updated to
> > also pass the ELF flags so that on csky the ABI appropriate table
> > could be used. As the argument is only used on csky this a no-op for
> > everything else.
> > 
> > 3) get_arch_regnum translated a register name back to a dwarf number
> > and only existed on x86 where "al", "ax", "eax" and "rax" could all
> > mean register 0. This code was moved to util with similar
> > machine/flags logic to get_arch_regstr and for consistency with it.
> > 
> > 4) get_powerpc_regs a PowerPC specific function used by annotate that
> > should really be in util.
> > 
> > 2 and 3 required the wiring through of the ELF machine and flags in
> > callers to get_dwarf_regstr and get_dwarf_regnum. When these values
> > weren't dependent on an ELF file a new EM_HOST and EF_HOST were added
> > to give the host ELF machine and flags. These 2 #defines got rid of
> > the existing separate arch files and #ifdefs.
> > 
> > v3: These files were separated from the rest of the v2 libdw clean up
> >     in:
> > https://lore.kernel.org/lkml/CAP-5=fVZH3L-6y_sxLwSmT8WyMXDMFnuqUksNULdQYJCPNBFYw@mail.gmail.com/
> > 
> > Ian Rogers (20):
> >   perf bpf-prologue: Remove unused file
> >   perf dwarf-regs: Remove PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET
> >   perf dwarf-regs: Add EM_HOST and EF_HOST defines
> >   perf disasm: Add e_machine/e_flags to struct arch
> >   perf dwarf-regs: Pass accurate disassembly machine to get_dwarf_regnum
> >   perf dwarf-regs: Pass ELF flags to get_dwarf_regstr
> >   perf dwarf-regs: Move x86 dwarf-regs out of arch
> >   perf arm64: Remove dwarf-regs.c
> >   perf arm: Remove dwarf-regs.c
> >   perf dwarf-regs: Move csky dwarf-regs out of arch
> >   perf loongarch: Remove dwarf-regs.c
> >   perf mips: Remove dwarf-regs.c
> >   perf dwarf-regs: Move powerpc dwarf-regs out of arch
> >   perf riscv: Remove dwarf-regs.c and add dwarf-regs-table.h
> >   perf s390: Remove dwarf-regs.c
> >   perf sh: Remove dwarf-regs.c
> >   perf sparc: Remove dwarf-regs.c
> >   perf xtensa: Remove dwarf-regs.c
> >   perf dwarf-regs: Remove get_arch_regstr code
> >   perf build: Remove PERF_HAVE_DWARF_REGS
> 
> These look all good and I'm about to apply the series.
> 
> Masami, do you have any remaining concerns?  It'd be nice if you can
> give your Reviewed-by.

I think it looks good to me.

Reviewed-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>

Thank you,

> 
> Thanks,
> Namhyug
> 
> > 
> >  tools/perf/Makefile.config                    |  17 +-
> >  tools/perf/arch/arc/annotate/instructions.c   |   2 +
> >  tools/perf/arch/arm/Makefile                  |   3 -
> >  tools/perf/arch/arm/annotate/instructions.c   |   2 +
> >  tools/perf/arch/arm/util/Build                |   2 -
> >  tools/perf/arch/arm/util/dwarf-regs.c         |  61 -------
> >  tools/perf/arch/arm64/Makefile                |   4 -
> >  tools/perf/arch/arm64/annotate/instructions.c |   2 +
> >  tools/perf/arch/arm64/util/Build              |   1 -
> >  tools/perf/arch/arm64/util/dwarf-regs.c       |  92 -----------
> >  tools/perf/arch/csky/Makefile                 |   4 -
> >  tools/perf/arch/csky/annotate/instructions.c  |   7 +-
> >  tools/perf/arch/csky/util/Build               |   1 -
> >  tools/perf/arch/loongarch/Makefile            |   4 -
> >  .../arch/loongarch/annotate/instructions.c    |   2 +
> >  tools/perf/arch/loongarch/util/Build          |   1 -
> >  tools/perf/arch/loongarch/util/dwarf-regs.c   |  44 -----
> >  tools/perf/arch/mips/Makefile                 |   4 -
> >  tools/perf/arch/mips/annotate/instructions.c  |   2 +
> >  tools/perf/arch/mips/util/Build               |   1 -
> >  tools/perf/arch/mips/util/dwarf-regs.c        |  38 -----
> >  tools/perf/arch/powerpc/Makefile              |   5 -
> >  .../perf/arch/powerpc/annotate/instructions.c |   2 +
> >  tools/perf/arch/powerpc/util/Build            |   1 -
> >  tools/perf/arch/powerpc/util/dwarf-regs.c     | 153 ------------------
> >  tools/perf/arch/riscv/Makefile                |   5 +-
> >  .../arch/riscv/include/dwarf-regs-table.h     |  42 +++++
> >  tools/perf/arch/riscv/util/Build              |   1 -
> >  tools/perf/arch/riscv/util/dwarf-regs.c       |  72 ---------
> >  .../perf/arch/riscv64/annotate/instructions.c |   2 +
> >  tools/perf/arch/s390/Makefile                 |   4 -
> >  tools/perf/arch/s390/annotate/instructions.c  |   2 +
> >  tools/perf/arch/s390/util/Build               |   1 -
> >  tools/perf/arch/s390/util/dwarf-regs.c        |  43 -----
> >  tools/perf/arch/sh/Build                      |   1 -
> >  tools/perf/arch/sh/Makefile                   |   4 -
> >  tools/perf/arch/sh/util/Build                 |   1 -
> >  tools/perf/arch/sh/util/dwarf-regs.c          |  41 -----
> >  tools/perf/arch/sparc/Build                   |   1 -
> >  tools/perf/arch/sparc/Makefile                |   4 -
> >  tools/perf/arch/sparc/annotate/instructions.c |   2 +
> >  tools/perf/arch/sparc/util/Build              |   1 -
> >  tools/perf/arch/sparc/util/dwarf-regs.c       |  39 -----
> >  tools/perf/arch/x86/Makefile                  |   4 -
> >  tools/perf/arch/x86/annotate/instructions.c   |   3 +-
> >  tools/perf/arch/x86/util/Build                |   3 -
> >  tools/perf/arch/x86/util/dwarf-regs.c         | 153 ------------------
> >  tools/perf/arch/xtensa/Build                  |   1 -
> >  tools/perf/arch/xtensa/Makefile               |   4 -
> >  tools/perf/arch/xtensa/util/Build             |   1 -
> >  tools/perf/arch/xtensa/util/dwarf-regs.c      |  21 ---
> >  tools/perf/util/Build                         |   3 +
> >  tools/perf/util/annotate.c                    |   6 +-
> >  tools/perf/util/bpf-prologue.h                |  37 -----
> >  tools/perf/util/disasm.h                      |   4 +
> >  .../dwarf-regs.c => util/dwarf-regs-csky.c}   |  19 +--
> >  tools/perf/util/dwarf-regs-powerpc.c          |  61 +++++++
> >  tools/perf/util/dwarf-regs-x86.c              |  50 ++++++
> >  tools/perf/util/dwarf-regs.c                  |  38 +++--
> >  tools/perf/util/include/dwarf-regs.h          | 110 ++++++++++---
> >  tools/perf/util/probe-finder.c                |  13 +-
> >  tools/perf/util/probe-finder.h                |   3 +-
> >  62 files changed, 328 insertions(+), 927 deletions(-)
> >  delete mode 100644 tools/perf/arch/arm/util/dwarf-regs.c
> >  delete mode 100644 tools/perf/arch/arm64/util/dwarf-regs.c
> >  delete mode 100644 tools/perf/arch/csky/Makefile
> >  delete mode 100644 tools/perf/arch/loongarch/util/dwarf-regs.c
> >  delete mode 100644 tools/perf/arch/mips/util/dwarf-regs.c
> >  delete mode 100644 tools/perf/arch/powerpc/util/dwarf-regs.c
> >  create mode 100644 tools/perf/arch/riscv/include/dwarf-regs-table.h
> >  delete mode 100644 tools/perf/arch/riscv/util/dwarf-regs.c
> >  delete mode 100644 tools/perf/arch/s390/util/dwarf-regs.c
> >  delete mode 100644 tools/perf/arch/sh/Build
> >  delete mode 100644 tools/perf/arch/sh/Makefile
> >  delete mode 100644 tools/perf/arch/sh/util/Build
> >  delete mode 100644 tools/perf/arch/sh/util/dwarf-regs.c
> >  delete mode 100644 tools/perf/arch/sparc/Build
> >  delete mode 100644 tools/perf/arch/sparc/util/Build
> >  delete mode 100644 tools/perf/arch/sparc/util/dwarf-regs.c
> >  delete mode 100644 tools/perf/arch/x86/util/dwarf-regs.c
> >  delete mode 100644 tools/perf/arch/xtensa/Build
> >  delete mode 100644 tools/perf/arch/xtensa/Makefile
> >  delete mode 100644 tools/perf/arch/xtensa/util/Build
> >  delete mode 100644 tools/perf/arch/xtensa/util/dwarf-regs.c
> >  delete mode 100644 tools/perf/util/bpf-prologue.h
> >  rename tools/perf/{arch/csky/util/dwarf-regs.c => util/dwarf-regs-csky.c} (74%)
> >  create mode 100644 tools/perf/util/dwarf-regs-powerpc.c
> >  create mode 100644 tools/perf/util/dwarf-regs-x86.c
> > 
> > -- 
> > 2.47.0.105.g07ac214952-goog
> > 


-- 
Masami Hiramatsu (Google) <mhiramat@kernel.org>

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v3 04/20] perf disasm: Add e_machine/e_flags to struct arch
  2024-10-17  0:25 ` [PATCH v3 04/20] perf disasm: Add e_machine/e_flags to struct arch Ian Rogers
@ 2024-11-08 17:33   ` Namhyung Kim
  2024-11-08 18:19     ` Ian Rogers
  0 siblings, 1 reply; 31+ messages in thread
From: Namhyung Kim @ 2024-11-08 17:33 UTC (permalink / raw)
  To: Ian Rogers
  Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Mark Rutland, Alexander Shishkin, Jiri Olsa, Adrian Hunter,
	Kan Liang, John Garry, Will Deacon, James Clark, Mike Leach,
	Leo Yan, Guo Ren, Paul Walmsley, Palmer Dabbelt, Albert Ou,
	Nick Terrell, Masami Hiramatsu (Google), Changbin Du,
	Guilherme Amadio, Yang Jihong, Aditya Gupta, Athira Rajeev,
	Masahiro Yamada, Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra,
	Shenlin Liang, Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

On Wed, Oct 16, 2024 at 05:25:04PM -0700, Ian Rogers wrote:
> Currently functions like get_dwarf_regnum only work with the host
> architecture. Carry the elf machine and flags in struct arch so that
> in disassembly these can be used to allow cross platform disassembly.
> 
> Signed-off-by: Ian Rogers <irogers@google.com>
> ---
>  tools/perf/arch/arc/annotate/instructions.c       | 2 ++
>  tools/perf/arch/arm/annotate/instructions.c       | 2 ++
>  tools/perf/arch/arm64/annotate/instructions.c     | 2 ++
>  tools/perf/arch/csky/annotate/instructions.c      | 7 ++++++-
>  tools/perf/arch/loongarch/annotate/instructions.c | 2 ++
>  tools/perf/arch/mips/annotate/instructions.c      | 2 ++
>  tools/perf/arch/powerpc/annotate/instructions.c   | 2 ++
>  tools/perf/arch/riscv64/annotate/instructions.c   | 2 ++
>  tools/perf/arch/s390/annotate/instructions.c      | 2 ++
>  tools/perf/arch/sparc/annotate/instructions.c     | 2 ++
>  tools/perf/arch/x86/annotate/instructions.c       | 3 ++-
>  tools/perf/util/disasm.h                          | 4 ++++
>  12 files changed, 30 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/perf/arch/arc/annotate/instructions.c b/tools/perf/arch/arc/annotate/instructions.c
> index 2f00e995c7e3..e5619770a1af 100644
> --- a/tools/perf/arch/arc/annotate/instructions.c
> +++ b/tools/perf/arch/arc/annotate/instructions.c
> @@ -5,5 +5,7 @@ static int arc__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
>  {
>  	arch->initialized = true;
>  	arch->objdump.comment_char = ';';
> +	arch->e_machine = EM_ARC;
> +	arch->e_flags = 0;
>  	return 0;
>  }
> diff --git a/tools/perf/arch/arm/annotate/instructions.c b/tools/perf/arch/arm/annotate/instructions.c
> index 2ff6cedeb9c5..cf91a43362b0 100644
> --- a/tools/perf/arch/arm/annotate/instructions.c
> +++ b/tools/perf/arch/arm/annotate/instructions.c
> @@ -53,6 +53,8 @@ static int arm__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
>  	arch->associate_instruction_ops   = arm__associate_instruction_ops;
>  	arch->objdump.comment_char	  = ';';
>  	arch->objdump.skip_functions_char = '+';
> +	arch->e_machine = EM_ARM;
> +	arch->e_flags = 0;
>  	return 0;
>  
>  out_free_call:
> diff --git a/tools/perf/arch/arm64/annotate/instructions.c b/tools/perf/arch/arm64/annotate/instructions.c
> index f86d9f4798bd..d465d093e7eb 100644
> --- a/tools/perf/arch/arm64/annotate/instructions.c
> +++ b/tools/perf/arch/arm64/annotate/instructions.c
> @@ -113,6 +113,8 @@ static int arm64__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
>  	arch->associate_instruction_ops   = arm64__associate_instruction_ops;
>  	arch->objdump.comment_char	  = '/';
>  	arch->objdump.skip_functions_char = '+';
> +	arch->e_machine = EM_AARCH64;
> +	arch->e_flags = 0;
>  	return 0;
>  
>  out_free_call:
> diff --git a/tools/perf/arch/csky/annotate/instructions.c b/tools/perf/arch/csky/annotate/instructions.c
> index 5337bfb7d5fc..14270311d215 100644
> --- a/tools/perf/arch/csky/annotate/instructions.c
> +++ b/tools/perf/arch/csky/annotate/instructions.c
> @@ -43,6 +43,11 @@ static int csky__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
>  	arch->initialized = true;
>  	arch->objdump.comment_char = '/';
>  	arch->associate_instruction_ops = csky__associate_ins_ops;
> -
> +	arch->e_machine = EM_CSKY;
> +#if defined(__CSKYABIV2__)
> +	arch->e_flags = EF_CSKY_ABIV2;
> +#else
> +	arch->e_flags = EF_CSKY_ABIV1;
> +#endif

By moving this into the general code, it should take care of old systems
that doesn't have the macro.

  In file included from util/disasm.c:109:                                        
  /linux/tools/perf/arch/csky/annotate/instructions.c: In function 'csky__annotate_init':
  /linux/tools/perf/arch/csky/annotate/instructions.c:50:25: error: 'EF_CSKY_ABIV1' undeclared (first use in this function)
     50 |         arch->e_flags = EF_CSKY_ABIV1;                                  
        |                         ^~~~~~~~~~~~~                                   
  /linux/tools/perf/arch/csky/annotate/instructions.c:50:25: note: each undeclared identifier is reported only once for each function it appears in

Also, I think __CSKYABIV2__ is defined only when the host is csky.  So
it'll use ABI v1 on cross env.  I'm not sure if it's a problem.  We may
need to save the ABI somewhere in the metadata later.

Thanks,
Namhyung


>  	return 0;
>  }
> diff --git a/tools/perf/arch/loongarch/annotate/instructions.c b/tools/perf/arch/loongarch/annotate/instructions.c
> index ab43b1ab51e3..70262d5f1444 100644
> --- a/tools/perf/arch/loongarch/annotate/instructions.c
> +++ b/tools/perf/arch/loongarch/annotate/instructions.c
> @@ -131,6 +131,8 @@ int loongarch__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
>  		arch->associate_instruction_ops = loongarch__associate_ins_ops;
>  		arch->initialized = true;
>  		arch->objdump.comment_char = '#';
> +		arch->e_machine = EM_LOONGARCH;
> +		arch->e_flags = 0;
>  	}
>  
>  	return 0;
> diff --git a/tools/perf/arch/mips/annotate/instructions.c b/tools/perf/arch/mips/annotate/instructions.c
> index 340993f2a897..b50b46c613d6 100644
> --- a/tools/perf/arch/mips/annotate/instructions.c
> +++ b/tools/perf/arch/mips/annotate/instructions.c
> @@ -40,6 +40,8 @@ int mips__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
>  		arch->associate_instruction_ops = mips__associate_ins_ops;
>  		arch->initialized = true;
>  		arch->objdump.comment_char = '#';
> +		arch->e_machine = EM_MIPS;
> +		arch->e_flags = 0;
>  	}
>  
>  	return 0;
> diff --git a/tools/perf/arch/powerpc/annotate/instructions.c b/tools/perf/arch/powerpc/annotate/instructions.c
> index 54478cf5cccc..ca567cfdcbdb 100644
> --- a/tools/perf/arch/powerpc/annotate/instructions.c
> +++ b/tools/perf/arch/powerpc/annotate/instructions.c
> @@ -309,6 +309,8 @@ static int powerpc__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
>  		arch->associate_instruction_ops = powerpc__associate_instruction_ops;
>  		arch->objdump.comment_char      = '#';
>  		annotate_opts.show_asm_raw = true;
> +		arch->e_machine = EM_PPC;
> +		arch->e_flags = 0;
>  	}
>  
>  	return 0;
> diff --git a/tools/perf/arch/riscv64/annotate/instructions.c b/tools/perf/arch/riscv64/annotate/instructions.c
> index 869a0eb28953..55cf911633f8 100644
> --- a/tools/perf/arch/riscv64/annotate/instructions.c
> +++ b/tools/perf/arch/riscv64/annotate/instructions.c
> @@ -28,6 +28,8 @@ int riscv64__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
>  		arch->associate_instruction_ops = riscv64__associate_ins_ops;
>  		arch->initialized = true;
>  		arch->objdump.comment_char = '#';
> +		arch->e_machine = EM_RISCV;
> +		arch->e_flags = 0;
>  	}
>  
>  	return 0;
> diff --git a/tools/perf/arch/s390/annotate/instructions.c b/tools/perf/arch/s390/annotate/instructions.c
> index eeac25cca699..c61193f1e096 100644
> --- a/tools/perf/arch/s390/annotate/instructions.c
> +++ b/tools/perf/arch/s390/annotate/instructions.c
> @@ -166,6 +166,8 @@ static int s390__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
>  			if (s390__cpuid_parse(arch, cpuid))
>  				err = SYMBOL_ANNOTATE_ERRNO__ARCH_INIT_CPUID_PARSING;
>  		}
> +		arch->e_machine = EM_S390;
> +		arch->e_flags = 0;
>  	}
>  
>  	return err;
> diff --git a/tools/perf/arch/sparc/annotate/instructions.c b/tools/perf/arch/sparc/annotate/instructions.c
> index 2614c010c235..68c31580ccfc 100644
> --- a/tools/perf/arch/sparc/annotate/instructions.c
> +++ b/tools/perf/arch/sparc/annotate/instructions.c
> @@ -163,6 +163,8 @@ static int sparc__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
>  		arch->initialized = true;
>  		arch->associate_instruction_ops = sparc__associate_instruction_ops;
>  		arch->objdump.comment_char = '#';
> +		arch->e_machine = EM_SPARC;
> +		arch->e_flags = 0;
>  	}
>  
>  	return 0;
> diff --git a/tools/perf/arch/x86/annotate/instructions.c b/tools/perf/arch/x86/annotate/instructions.c
> index c869abe3c31d..ae94b1f0b9cc 100644
> --- a/tools/perf/arch/x86/annotate/instructions.c
> +++ b/tools/perf/arch/x86/annotate/instructions.c
> @@ -202,7 +202,8 @@ static int x86__annotate_init(struct arch *arch, char *cpuid)
>  		if (x86__cpuid_parse(arch, cpuid))
>  			err = SYMBOL_ANNOTATE_ERRNO__ARCH_INIT_CPUID_PARSING;
>  	}
> -
> +	arch->e_machine = EM_X86_64;
> +	arch->e_flags = 0;
>  	arch->initialized = true;
>  	return err;
>  }
> diff --git a/tools/perf/util/disasm.h b/tools/perf/util/disasm.h
> index 486c269b29ba..c135db2416b5 100644
> --- a/tools/perf/util/disasm.h
> +++ b/tools/perf/util/disasm.h
> @@ -44,6 +44,10 @@ struct arch {
>  				struct data_loc_info *dloc, Dwarf_Die *cu_die,
>  				struct disasm_line *dl);
>  #endif
> +	/** @e_machine: ELF machine associated with arch. */
> +	unsigned int e_machine;
> +	/** @e_flags: Optional ELF flags associated with arch. */
> +	unsigned int e_flags;
>  };
>  
>  struct ins {
> -- 
> 2.47.0.105.g07ac214952-goog
> 

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v3 04/20] perf disasm: Add e_machine/e_flags to struct arch
  2024-11-08 17:33   ` Namhyung Kim
@ 2024-11-08 18:19     ` Ian Rogers
  2024-11-08 18:38       ` Namhyung Kim
  0 siblings, 1 reply; 31+ messages in thread
From: Ian Rogers @ 2024-11-08 18:19 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Mark Rutland, Alexander Shishkin, Jiri Olsa, Adrian Hunter,
	Kan Liang, John Garry, Will Deacon, James Clark, Mike Leach,
	Leo Yan, Guo Ren, Paul Walmsley, Palmer Dabbelt, Albert Ou,
	Nick Terrell, Masami Hiramatsu (Google), Changbin Du,
	Guilherme Amadio, Yang Jihong, Aditya Gupta, Athira Rajeev,
	Masahiro Yamada, Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra,
	Shenlin Liang, Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

On Fri, Nov 8, 2024 at 9:33 AM Namhyung Kim <namhyung@kernel.org> wrote:
>
> On Wed, Oct 16, 2024 at 05:25:04PM -0700, Ian Rogers wrote:
> > Currently functions like get_dwarf_regnum only work with the host
> > architecture. Carry the elf machine and flags in struct arch so that
> > in disassembly these can be used to allow cross platform disassembly.
> >
> > Signed-off-by: Ian Rogers <irogers@google.com>
> > ---
> >  tools/perf/arch/arc/annotate/instructions.c       | 2 ++
> >  tools/perf/arch/arm/annotate/instructions.c       | 2 ++
> >  tools/perf/arch/arm64/annotate/instructions.c     | 2 ++
> >  tools/perf/arch/csky/annotate/instructions.c      | 7 ++++++-
> >  tools/perf/arch/loongarch/annotate/instructions.c | 2 ++
> >  tools/perf/arch/mips/annotate/instructions.c      | 2 ++
> >  tools/perf/arch/powerpc/annotate/instructions.c   | 2 ++
> >  tools/perf/arch/riscv64/annotate/instructions.c   | 2 ++
> >  tools/perf/arch/s390/annotate/instructions.c      | 2 ++
> >  tools/perf/arch/sparc/annotate/instructions.c     | 2 ++
> >  tools/perf/arch/x86/annotate/instructions.c       | 3 ++-
> >  tools/perf/util/disasm.h                          | 4 ++++
> >  12 files changed, 30 insertions(+), 2 deletions(-)
> >
> > diff --git a/tools/perf/arch/arc/annotate/instructions.c b/tools/perf/arch/arc/annotate/instructions.c
> > index 2f00e995c7e3..e5619770a1af 100644
> > --- a/tools/perf/arch/arc/annotate/instructions.c
> > +++ b/tools/perf/arch/arc/annotate/instructions.c
> > @@ -5,5 +5,7 @@ static int arc__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
> >  {
> >       arch->initialized = true;
> >       arch->objdump.comment_char = ';';
> > +     arch->e_machine = EM_ARC;
> > +     arch->e_flags = 0;
> >       return 0;
> >  }
> > diff --git a/tools/perf/arch/arm/annotate/instructions.c b/tools/perf/arch/arm/annotate/instructions.c
> > index 2ff6cedeb9c5..cf91a43362b0 100644
> > --- a/tools/perf/arch/arm/annotate/instructions.c
> > +++ b/tools/perf/arch/arm/annotate/instructions.c
> > @@ -53,6 +53,8 @@ static int arm__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
> >       arch->associate_instruction_ops   = arm__associate_instruction_ops;
> >       arch->objdump.comment_char        = ';';
> >       arch->objdump.skip_functions_char = '+';
> > +     arch->e_machine = EM_ARM;
> > +     arch->e_flags = 0;
> >       return 0;
> >
> >  out_free_call:
> > diff --git a/tools/perf/arch/arm64/annotate/instructions.c b/tools/perf/arch/arm64/annotate/instructions.c
> > index f86d9f4798bd..d465d093e7eb 100644
> > --- a/tools/perf/arch/arm64/annotate/instructions.c
> > +++ b/tools/perf/arch/arm64/annotate/instructions.c
> > @@ -113,6 +113,8 @@ static int arm64__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
> >       arch->associate_instruction_ops   = arm64__associate_instruction_ops;
> >       arch->objdump.comment_char        = '/';
> >       arch->objdump.skip_functions_char = '+';
> > +     arch->e_machine = EM_AARCH64;
> > +     arch->e_flags = 0;
> >       return 0;
> >
> >  out_free_call:
> > diff --git a/tools/perf/arch/csky/annotate/instructions.c b/tools/perf/arch/csky/annotate/instructions.c
> > index 5337bfb7d5fc..14270311d215 100644
> > --- a/tools/perf/arch/csky/annotate/instructions.c
> > +++ b/tools/perf/arch/csky/annotate/instructions.c
> > @@ -43,6 +43,11 @@ static int csky__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
> >       arch->initialized = true;
> >       arch->objdump.comment_char = '/';
> >       arch->associate_instruction_ops = csky__associate_ins_ops;
> > -
> > +     arch->e_machine = EM_CSKY;
> > +#if defined(__CSKYABIV2__)
> > +     arch->e_flags = EF_CSKY_ABIV2;
> > +#else
> > +     arch->e_flags = EF_CSKY_ABIV1;
> > +#endif
>
> By moving this into the general code, it should take care of old systems
> that doesn't have the macro.
>
>   In file included from util/disasm.c:109:
>   /linux/tools/perf/arch/csky/annotate/instructions.c: In function 'csky__annotate_init':
>   /linux/tools/perf/arch/csky/annotate/instructions.c:50:25: error: 'EF_CSKY_ABIV1' undeclared (first use in this function)
>      50 |         arch->e_flags = EF_CSKY_ABIV1;
>         |                         ^~~~~~~~~~~~~
>   /linux/tools/perf/arch/csky/annotate/instructions.c:50:25: note: each undeclared identifier is reported only once for each function it appears in

EF_CSKY_ABIV1 is defined in elf.h and has been there at least 5 years in libelf:
https://sourceware.org/git/?p=elfutils.git;a=commit;f=libelf/elf.h;h=9c82942ae7355a3226c53a92c2c73b33193c5e33
I suspected the issue here is missing elf.h include, but the .c file
is included in tools/perf/util/disasm.c and that must have a
transitive dependency given other things are building. Do you want me
to send a patch making this conditional with extra #ifdefs or re-send
the series?

> Also, I think __CSKYABIV2__ is defined only when the host is csky.  So
> it'll use ABI v1 on cross env.  I'm not sure if it's a problem.  We may
> need to save the ABI somewhere in the metadata later.

Agreed. In general we should read e_machine and e_flags from the ELF
file, so I'm not sure new metadata is needed. This patch is trying to
lay groundwork for that.

Thanks,
Ian

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v3 00/20] Remove PERF_HAVE_DWARF_REGS
  2024-11-08  0:00   ` Masami Hiramatsu
@ 2024-11-08 18:33     ` Namhyung Kim
  0 siblings, 0 replies; 31+ messages in thread
From: Namhyung Kim @ 2024-11-08 18:33 UTC (permalink / raw)
  To: Masami Hiramatsu
  Cc: Ian Rogers, Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Mark Rutland, Alexander Shishkin, Jiri Olsa, Adrian Hunter,
	Kan Liang, John Garry, Will Deacon, James Clark, Mike Leach,
	Leo Yan, Guo Ren, Paul Walmsley, Palmer Dabbelt, Albert Ou,
	Nick Terrell, Changbin Du, Guilherme Amadio, Yang Jihong,
	Aditya Gupta, Athira Rajeev, Masahiro Yamada, Bibo Mao,
	Huacai Chen, Kajol Jain, Atish Patra, Shenlin Liang, Anup Patel,
	Oliver Upton, Steinar H. Gunderson, Dr. David Alan Gilbert,
	Chen Pei, Dima Kogan, Przemek Kitszel, David S. Miller,
	Alexander Lobakin, linux-kernel, linux-perf-users,
	linux-arm-kernel, linux-csky, linux-riscv

On Fri, Nov 08, 2024 at 09:00:40AM +0900, Masami Hiramatsu wrote:
> Hi,
> 
> On Thu, 7 Nov 2024 11:29:34 -0800
> Namhyung Kim <namhyung@kernel.org> wrote:
> 
> > Hi all,
> > 
> > On Wed, Oct 16, 2024 at 05:25:00PM -0700, Ian Rogers wrote:
> > > These changes are on top of:
> > > https://lore.kernel.org/lkml/20241017001354.56973-1-irogers@google.com/
> > > 
> > > Prior to these patches PERF_HAVE_DWARF_REGS indicated the presence of
> > > dwarf-regs.c in the arch directory. dwarf-regs.c provided upto 4
> > > functions:
> > > 
> > > 1) regs_query_register_offset would translate a register name into a
> > > pt_regs offset and was used by BPF prologues. BPF prologues existed
> > > for BPF events and support for these was removed many releases ago.
> > > This code was dead and could be removed.
> > > 
> > > 2) get_arch_regstr duplicated get_dwarf_regstr and so it could be
> > > removed.  The case for csky was a little more complicated as the ABI
> > > controlled the string. The callers of get_dwarf_regstr were updated to
> > > also pass the ELF flags so that on csky the ABI appropriate table
> > > could be used. As the argument is only used on csky this a no-op for
> > > everything else.
> > > 
> > > 3) get_arch_regnum translated a register name back to a dwarf number
> > > and only existed on x86 where "al", "ax", "eax" and "rax" could all
> > > mean register 0. This code was moved to util with similar
> > > machine/flags logic to get_arch_regstr and for consistency with it.
> > > 
> > > 4) get_powerpc_regs a PowerPC specific function used by annotate that
> > > should really be in util.
> > > 
> > > 2 and 3 required the wiring through of the ELF machine and flags in
> > > callers to get_dwarf_regstr and get_dwarf_regnum. When these values
> > > weren't dependent on an ELF file a new EM_HOST and EF_HOST were added
> > > to give the host ELF machine and flags. These 2 #defines got rid of
> > > the existing separate arch files and #ifdefs.
> > > 
> > > v3: These files were separated from the rest of the v2 libdw clean up
> > >     in:
> > > https://lore.kernel.org/lkml/CAP-5=fVZH3L-6y_sxLwSmT8WyMXDMFnuqUksNULdQYJCPNBFYw@mail.gmail.com/
> > > 
> > > Ian Rogers (20):
> > >   perf bpf-prologue: Remove unused file
> > >   perf dwarf-regs: Remove PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET
> > >   perf dwarf-regs: Add EM_HOST and EF_HOST defines
> > >   perf disasm: Add e_machine/e_flags to struct arch
> > >   perf dwarf-regs: Pass accurate disassembly machine to get_dwarf_regnum
> > >   perf dwarf-regs: Pass ELF flags to get_dwarf_regstr
> > >   perf dwarf-regs: Move x86 dwarf-regs out of arch
> > >   perf arm64: Remove dwarf-regs.c
> > >   perf arm: Remove dwarf-regs.c
> > >   perf dwarf-regs: Move csky dwarf-regs out of arch
> > >   perf loongarch: Remove dwarf-regs.c
> > >   perf mips: Remove dwarf-regs.c
> > >   perf dwarf-regs: Move powerpc dwarf-regs out of arch
> > >   perf riscv: Remove dwarf-regs.c and add dwarf-regs-table.h
> > >   perf s390: Remove dwarf-regs.c
> > >   perf sh: Remove dwarf-regs.c
> > >   perf sparc: Remove dwarf-regs.c
> > >   perf xtensa: Remove dwarf-regs.c
> > >   perf dwarf-regs: Remove get_arch_regstr code
> > >   perf build: Remove PERF_HAVE_DWARF_REGS
> > 
> > These look all good and I'm about to apply the series.
> > 
> > Masami, do you have any remaining concerns?  It'd be nice if you can
> > give your Reviewed-by.
> 
> I think it looks good to me.
> 
> Reviewed-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>

Thanks for your review!
Namhyung


^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v3 04/20] perf disasm: Add e_machine/e_flags to struct arch
  2024-11-08 18:19     ` Ian Rogers
@ 2024-11-08 18:38       ` Namhyung Kim
  2024-11-08 18:45         ` Ian Rogers
  0 siblings, 1 reply; 31+ messages in thread
From: Namhyung Kim @ 2024-11-08 18:38 UTC (permalink / raw)
  To: Ian Rogers
  Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Mark Rutland, Alexander Shishkin, Jiri Olsa, Adrian Hunter,
	Kan Liang, John Garry, Will Deacon, James Clark, Mike Leach,
	Leo Yan, Guo Ren, Paul Walmsley, Palmer Dabbelt, Albert Ou,
	Nick Terrell, Masami Hiramatsu (Google), Changbin Du,
	Guilherme Amadio, Yang Jihong, Aditya Gupta, Athira Rajeev,
	Masahiro Yamada, Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra,
	Shenlin Liang, Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

On Fri, Nov 08, 2024 at 10:19:52AM -0800, Ian Rogers wrote:
> On Fri, Nov 8, 2024 at 9:33 AM Namhyung Kim <namhyung@kernel.org> wrote:
> >
> > On Wed, Oct 16, 2024 at 05:25:04PM -0700, Ian Rogers wrote:
> > > Currently functions like get_dwarf_regnum only work with the host
> > > architecture. Carry the elf machine and flags in struct arch so that
> > > in disassembly these can be used to allow cross platform disassembly.
> > >
> > > Signed-off-by: Ian Rogers <irogers@google.com>
> > > ---
> > >  tools/perf/arch/arc/annotate/instructions.c       | 2 ++
> > >  tools/perf/arch/arm/annotate/instructions.c       | 2 ++
> > >  tools/perf/arch/arm64/annotate/instructions.c     | 2 ++
> > >  tools/perf/arch/csky/annotate/instructions.c      | 7 ++++++-
> > >  tools/perf/arch/loongarch/annotate/instructions.c | 2 ++
> > >  tools/perf/arch/mips/annotate/instructions.c      | 2 ++
> > >  tools/perf/arch/powerpc/annotate/instructions.c   | 2 ++
> > >  tools/perf/arch/riscv64/annotate/instructions.c   | 2 ++
> > >  tools/perf/arch/s390/annotate/instructions.c      | 2 ++
> > >  tools/perf/arch/sparc/annotate/instructions.c     | 2 ++
> > >  tools/perf/arch/x86/annotate/instructions.c       | 3 ++-
> > >  tools/perf/util/disasm.h                          | 4 ++++
> > >  12 files changed, 30 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/tools/perf/arch/arc/annotate/instructions.c b/tools/perf/arch/arc/annotate/instructions.c
> > > index 2f00e995c7e3..e5619770a1af 100644
> > > --- a/tools/perf/arch/arc/annotate/instructions.c
> > > +++ b/tools/perf/arch/arc/annotate/instructions.c
> > > @@ -5,5 +5,7 @@ static int arc__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
> > >  {
> > >       arch->initialized = true;
> > >       arch->objdump.comment_char = ';';
> > > +     arch->e_machine = EM_ARC;
> > > +     arch->e_flags = 0;
> > >       return 0;
> > >  }
> > > diff --git a/tools/perf/arch/arm/annotate/instructions.c b/tools/perf/arch/arm/annotate/instructions.c
> > > index 2ff6cedeb9c5..cf91a43362b0 100644
> > > --- a/tools/perf/arch/arm/annotate/instructions.c
> > > +++ b/tools/perf/arch/arm/annotate/instructions.c
> > > @@ -53,6 +53,8 @@ static int arm__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
> > >       arch->associate_instruction_ops   = arm__associate_instruction_ops;
> > >       arch->objdump.comment_char        = ';';
> > >       arch->objdump.skip_functions_char = '+';
> > > +     arch->e_machine = EM_ARM;
> > > +     arch->e_flags = 0;
> > >       return 0;
> > >
> > >  out_free_call:
> > > diff --git a/tools/perf/arch/arm64/annotate/instructions.c b/tools/perf/arch/arm64/annotate/instructions.c
> > > index f86d9f4798bd..d465d093e7eb 100644
> > > --- a/tools/perf/arch/arm64/annotate/instructions.c
> > > +++ b/tools/perf/arch/arm64/annotate/instructions.c
> > > @@ -113,6 +113,8 @@ static int arm64__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
> > >       arch->associate_instruction_ops   = arm64__associate_instruction_ops;
> > >       arch->objdump.comment_char        = '/';
> > >       arch->objdump.skip_functions_char = '+';
> > > +     arch->e_machine = EM_AARCH64;
> > > +     arch->e_flags = 0;
> > >       return 0;
> > >
> > >  out_free_call:
> > > diff --git a/tools/perf/arch/csky/annotate/instructions.c b/tools/perf/arch/csky/annotate/instructions.c
> > > index 5337bfb7d5fc..14270311d215 100644
> > > --- a/tools/perf/arch/csky/annotate/instructions.c
> > > +++ b/tools/perf/arch/csky/annotate/instructions.c
> > > @@ -43,6 +43,11 @@ static int csky__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
> > >       arch->initialized = true;
> > >       arch->objdump.comment_char = '/';
> > >       arch->associate_instruction_ops = csky__associate_ins_ops;
> > > -
> > > +     arch->e_machine = EM_CSKY;
> > > +#if defined(__CSKYABIV2__)
> > > +     arch->e_flags = EF_CSKY_ABIV2;
> > > +#else
> > > +     arch->e_flags = EF_CSKY_ABIV1;
> > > +#endif
> >
> > By moving this into the general code, it should take care of old systems
> > that doesn't have the macro.
> >
> >   In file included from util/disasm.c:109:
> >   /linux/tools/perf/arch/csky/annotate/instructions.c: In function 'csky__annotate_init':
> >   /linux/tools/perf/arch/csky/annotate/instructions.c:50:25: error: 'EF_CSKY_ABIV1' undeclared (first use in this function)
> >      50 |         arch->e_flags = EF_CSKY_ABIV1;
> >         |                         ^~~~~~~~~~~~~
> >   /linux/tools/perf/arch/csky/annotate/instructions.c:50:25: note: each undeclared identifier is reported only once for each function it appears in
> 
> EF_CSKY_ABIV1 is defined in elf.h and has been there at least 5 years in libelf:
> https://sourceware.org/git/?p=elfutils.git;a=commit;f=libelf/elf.h;h=9c82942ae7355a3226c53a92c2c73b33193c5e33
> I suspected the issue here is missing elf.h include, but the .c file
> is included in tools/perf/util/disasm.c and that must have a
> transitive dependency given other things are building. Do you want me
> to send a patch making this conditional with extra #ifdefs or re-send
> the series?

Yeah, it's unfortunate but I think we can have a small incremental diff
here to define them if it's not there.  Then I'll squash it to the
patch.

> 
> > Also, I think __CSKYABIV2__ is defined only when the host is csky.  So
> > it'll use ABI v1 on cross env.  I'm not sure if it's a problem.  We may
> > need to save the ABI somewhere in the metadata later.
> 
> Agreed. In general we should read e_machine and e_flags from the ELF
> file, so I'm not sure new metadata is needed. This patch is trying to
> lay groundwork for that.

I understand that.  Yeah it should come from the binary.

Thanks,
Namhyung


^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v3 04/20] perf disasm: Add e_machine/e_flags to struct arch
  2024-11-08 18:38       ` Namhyung Kim
@ 2024-11-08 18:45         ` Ian Rogers
  0 siblings, 0 replies; 31+ messages in thread
From: Ian Rogers @ 2024-11-08 18:45 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Mark Rutland, Alexander Shishkin, Jiri Olsa, Adrian Hunter,
	Kan Liang, John Garry, Will Deacon, James Clark, Mike Leach,
	Leo Yan, Guo Ren, Paul Walmsley, Palmer Dabbelt, Albert Ou,
	Nick Terrell, Masami Hiramatsu (Google), Changbin Du,
	Guilherme Amadio, Yang Jihong, Aditya Gupta, Athira Rajeev,
	Masahiro Yamada, Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra,
	Shenlin Liang, Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

On Fri, Nov 8, 2024 at 10:38 AM Namhyung Kim <namhyung@kernel.org> wrote:
>
> On Fri, Nov 08, 2024 at 10:19:52AM -0800, Ian Rogers wrote:
> > On Fri, Nov 8, 2024 at 9:33 AM Namhyung Kim <namhyung@kernel.org> wrote:
> > >
> > > On Wed, Oct 16, 2024 at 05:25:04PM -0700, Ian Rogers wrote:
> > > > Currently functions like get_dwarf_regnum only work with the host
> > > > architecture. Carry the elf machine and flags in struct arch so that
> > > > in disassembly these can be used to allow cross platform disassembly.
> > > >
> > > > Signed-off-by: Ian Rogers <irogers@google.com>
> > > > ---
> > > >  tools/perf/arch/arc/annotate/instructions.c       | 2 ++
> > > >  tools/perf/arch/arm/annotate/instructions.c       | 2 ++
> > > >  tools/perf/arch/arm64/annotate/instructions.c     | 2 ++
> > > >  tools/perf/arch/csky/annotate/instructions.c      | 7 ++++++-
> > > >  tools/perf/arch/loongarch/annotate/instructions.c | 2 ++
> > > >  tools/perf/arch/mips/annotate/instructions.c      | 2 ++
> > > >  tools/perf/arch/powerpc/annotate/instructions.c   | 2 ++
> > > >  tools/perf/arch/riscv64/annotate/instructions.c   | 2 ++
> > > >  tools/perf/arch/s390/annotate/instructions.c      | 2 ++
> > > >  tools/perf/arch/sparc/annotate/instructions.c     | 2 ++
> > > >  tools/perf/arch/x86/annotate/instructions.c       | 3 ++-
> > > >  tools/perf/util/disasm.h                          | 4 ++++
> > > >  12 files changed, 30 insertions(+), 2 deletions(-)
> > > >
> > > > diff --git a/tools/perf/arch/arc/annotate/instructions.c b/tools/perf/arch/arc/annotate/instructions.c
> > > > index 2f00e995c7e3..e5619770a1af 100644
> > > > --- a/tools/perf/arch/arc/annotate/instructions.c
> > > > +++ b/tools/perf/arch/arc/annotate/instructions.c
> > > > @@ -5,5 +5,7 @@ static int arc__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
> > > >  {
> > > >       arch->initialized = true;
> > > >       arch->objdump.comment_char = ';';
> > > > +     arch->e_machine = EM_ARC;
> > > > +     arch->e_flags = 0;
> > > >       return 0;
> > > >  }
> > > > diff --git a/tools/perf/arch/arm/annotate/instructions.c b/tools/perf/arch/arm/annotate/instructions.c
> > > > index 2ff6cedeb9c5..cf91a43362b0 100644
> > > > --- a/tools/perf/arch/arm/annotate/instructions.c
> > > > +++ b/tools/perf/arch/arm/annotate/instructions.c
> > > > @@ -53,6 +53,8 @@ static int arm__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
> > > >       arch->associate_instruction_ops   = arm__associate_instruction_ops;
> > > >       arch->objdump.comment_char        = ';';
> > > >       arch->objdump.skip_functions_char = '+';
> > > > +     arch->e_machine = EM_ARM;
> > > > +     arch->e_flags = 0;
> > > >       return 0;
> > > >
> > > >  out_free_call:
> > > > diff --git a/tools/perf/arch/arm64/annotate/instructions.c b/tools/perf/arch/arm64/annotate/instructions.c
> > > > index f86d9f4798bd..d465d093e7eb 100644
> > > > --- a/tools/perf/arch/arm64/annotate/instructions.c
> > > > +++ b/tools/perf/arch/arm64/annotate/instructions.c
> > > > @@ -113,6 +113,8 @@ static int arm64__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
> > > >       arch->associate_instruction_ops   = arm64__associate_instruction_ops;
> > > >       arch->objdump.comment_char        = '/';
> > > >       arch->objdump.skip_functions_char = '+';
> > > > +     arch->e_machine = EM_AARCH64;
> > > > +     arch->e_flags = 0;
> > > >       return 0;
> > > >
> > > >  out_free_call:
> > > > diff --git a/tools/perf/arch/csky/annotate/instructions.c b/tools/perf/arch/csky/annotate/instructions.c
> > > > index 5337bfb7d5fc..14270311d215 100644
> > > > --- a/tools/perf/arch/csky/annotate/instructions.c
> > > > +++ b/tools/perf/arch/csky/annotate/instructions.c
> > > > @@ -43,6 +43,11 @@ static int csky__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
> > > >       arch->initialized = true;
> > > >       arch->objdump.comment_char = '/';
> > > >       arch->associate_instruction_ops = csky__associate_ins_ops;
> > > > -
> > > > +     arch->e_machine = EM_CSKY;
> > > > +#if defined(__CSKYABIV2__)
> > > > +     arch->e_flags = EF_CSKY_ABIV2;
> > > > +#else
> > > > +     arch->e_flags = EF_CSKY_ABIV1;
> > > > +#endif
> > >
> > > By moving this into the general code, it should take care of old systems
> > > that doesn't have the macro.
> > >
> > >   In file included from util/disasm.c:109:
> > >   /linux/tools/perf/arch/csky/annotate/instructions.c: In function 'csky__annotate_init':
> > >   /linux/tools/perf/arch/csky/annotate/instructions.c:50:25: error: 'EF_CSKY_ABIV1' undeclared (first use in this function)
> > >      50 |         arch->e_flags = EF_CSKY_ABIV1;
> > >         |                         ^~~~~~~~~~~~~
> > >   /linux/tools/perf/arch/csky/annotate/instructions.c:50:25: note: each undeclared identifier is reported only once for each function it appears in
> >
> > EF_CSKY_ABIV1 is defined in elf.h and has been there at least 5 years in libelf:
> > https://sourceware.org/git/?p=elfutils.git;a=commit;f=libelf/elf.h;h=9c82942ae7355a3226c53a92c2c73b33193c5e33
> > I suspected the issue here is missing elf.h include, but the .c file
> > is included in tools/perf/util/disasm.c and that must have a
> > transitive dependency given other things are building. Do you want me
> > to send a patch making this conditional with extra #ifdefs or re-send
> > the series?
>
> Yeah, it's unfortunate but I think we can have a small incremental diff
> here to define them if it's not there.  Then I'll squash it to the
> patch.

Thanks, sgtm. Could you also explicitly include elf.h into disasm.c
rather than depending on the transitive #include? There's obviously
tech debt to not have .c files including each other to work around the
build system.

Ian

> >
> > > Also, I think __CSKYABIV2__ is defined only when the host is csky.  So
> > > it'll use ABI v1 on cross env.  I'm not sure if it's a problem.  We may
> > > need to save the ABI somewhere in the metadata later.
> >
> > Agreed. In general we should read e_machine and e_flags from the ELF
> > file, so I'm not sure new metadata is needed. This patch is trying to
> > lay groundwork for that.
>
> I understand that.  Yeah it should come from the binary.
>
> Thanks,
> Namhyung
>

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v3 10/20] perf dwarf-regs: Move csky dwarf-regs out of arch
  2024-10-17  0:25 ` [PATCH v3 10/20] perf dwarf-regs: Move csky dwarf-regs out of arch Ian Rogers
@ 2024-11-08 20:03   ` Namhyung Kim
  2024-11-08 23:08     ` Ian Rogers
  0 siblings, 1 reply; 31+ messages in thread
From: Namhyung Kim @ 2024-11-08 20:03 UTC (permalink / raw)
  To: Ian Rogers
  Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Mark Rutland, Alexander Shishkin, Jiri Olsa, Adrian Hunter,
	Kan Liang, John Garry, Will Deacon, James Clark, Mike Leach,
	Leo Yan, Guo Ren, Paul Walmsley, Palmer Dabbelt, Albert Ou,
	Nick Terrell, Masami Hiramatsu (Google), Changbin Du,
	Guilherme Amadio, Yang Jihong, Aditya Gupta, Athira Rajeev,
	Masahiro Yamada, Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra,
	Shenlin Liang, Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

On Wed, Oct 16, 2024 at 05:25:10PM -0700, Ian Rogers wrote:
> Move arch/csky/util/dwarf-regs.c to util/dwarf-regs-csky.c and compile
> in unconditionally. To avoid get_arch_regstr being duplicated, rename
> to get_csky_regstr and add to get_dwarf_regstr switch.
> 
> Update #ifdefs to allow ABI V1 and V2 tables at the same
> time. Determine the table from the ELF flags.
> 
> Signed-off-by: Ian Rogers <irogers@google.com>
> ---
>  tools/perf/arch/csky/util/Build               |  1 -
>  tools/perf/util/Build                         |  1 +
>  .../dwarf-regs.c => util/dwarf-regs-csky.c}   | 19 ++++++++++---------
>  tools/perf/util/dwarf-regs.c                  | 11 +++++++----
>  tools/perf/util/include/dwarf-regs.h          |  2 ++
>  5 files changed, 20 insertions(+), 14 deletions(-)
>  rename tools/perf/{arch/csky/util/dwarf-regs.c => util/dwarf-regs-csky.c} (74%)
> 
> diff --git a/tools/perf/arch/csky/util/Build b/tools/perf/arch/csky/util/Build
> index 1325310cab6a..5e6ea82c4202 100644
> --- a/tools/perf/arch/csky/util/Build
> +++ b/tools/perf/arch/csky/util/Build
> @@ -1,4 +1,3 @@
>  perf-util-y += perf_regs.o
>  
> -perf-util-$(CONFIG_LIBDW) += dwarf-regs.o
>  perf-util-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
> diff --git a/tools/perf/util/Build b/tools/perf/util/Build
> index 4c615611b9d7..99ae4e2802b8 100644
> --- a/tools/perf/util/Build
> +++ b/tools/perf/util/Build
> @@ -203,6 +203,7 @@ endif
>  perf-util-$(CONFIG_LIBDW) += probe-finder.o
>  perf-util-$(CONFIG_LIBDW) += dwarf-aux.o
>  perf-util-$(CONFIG_LIBDW) += dwarf-regs.o
> +perf-util-$(CONFIG_LIBDW) += dwarf-regs-csky.o
>  perf-util-$(CONFIG_LIBDW) += dwarf-regs-x86.o
>  perf-util-$(CONFIG_LIBDW) += debuginfo.o
>  perf-util-$(CONFIG_LIBDW) += annotate-data.o
> diff --git a/tools/perf/arch/csky/util/dwarf-regs.c b/tools/perf/util/dwarf-regs-csky.c
> similarity index 74%
> rename from tools/perf/arch/csky/util/dwarf-regs.c
> rename to tools/perf/util/dwarf-regs-csky.c
> index ca86ecaeacbb..d38ef1f07f3e 100644
> --- a/tools/perf/arch/csky/util/dwarf-regs.c
> +++ b/tools/perf/util/dwarf-regs-csky.c
> @@ -5,9 +5,8 @@
>  #include <stddef.h>
>  #include <dwarf-regs.h>
>  
> -#if defined(__CSKYABIV2__)
> -#define CSKY_MAX_REGS 73
> -const char *csky_dwarf_regs_table[CSKY_MAX_REGS] = {
> +#define CSKY_ABIV2_MAX_REGS 73
> +const char *csky_dwarf_regs_table_abiv2[CSKY_ABIV2_MAX_REGS] = {
>  	/* r0 ~ r8 */
>  	"%a0", "%a1", "%a2", "%a3", "%regs0", "%regs1", "%regs2", "%regs3",
>  	/* r9 ~ r15 */
> @@ -26,9 +25,9 @@ const char *csky_dwarf_regs_table[CSKY_MAX_REGS] = {
>  	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
>  	"%epc",
>  };
> -#else
> -#define CSKY_MAX_REGS 57
> -const char *csky_dwarf_regs_table[CSKY_MAX_REGS] = {
> +
> +#define CSKY_ABIV1_MAX_REGS 57
> +const char *csky_dwarf_regs_table_abiv1[CSKY_ABIV1_MAX_REGS] = {
>  	/* r0 ~ r8 */
>  	"%sp", "%regs9", "%a0", "%a1", "%a2", "%a3", "%regs0", "%regs1",
>  	/* r9 ~ r15 */
> @@ -41,9 +40,11 @@ const char *csky_dwarf_regs_table[CSKY_MAX_REGS] = {
>  	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
>  	"%epc",
>  };
> -#endif
>  
> -const char *get_arch_regstr(unsigned int n)
> +const char *get_csky_regstr(unsigned int n, unsigned int flags)
>  {
> -	return (n < CSKY_MAX_REGS) ? csky_dwarf_regs_table[n] : NULL;
> +	if (flags & EF_CSKY_ABIV2)

Hmm.. you need it here as well.


> +		return (n < CSKY_ABIV2_MAX_REGS) ? csky_dwarf_regs_table_abiv2[n] : NULL;
> +
> +	return (n < CSKY_ABIV1_MAX_REGS) ? csky_dwarf_regs_table_abiv1[n] : NULL;
>  }
> diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c
> index fd21f9e90e40..9a76f83af62c 100644
> --- a/tools/perf/util/dwarf-regs.c
> +++ b/tools/perf/util/dwarf-regs.c
> @@ -29,17 +29,18 @@
>  #define __get_dwarf_regstr(tbl, n) (((n) < ARRAY_SIZE(tbl)) ? (tbl)[(n)] : NULL)
>  
>  /* Return architecture dependent register string (for kprobe-tracer) */
> -const char *get_dwarf_regstr(unsigned int n, unsigned int machine,
> -			     unsigned int flags __maybe_unused)
> +const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int flags)
>  {
> -#if EM_HOST == EM_X86_64 || EM_HOST == EM_386 || EM_HOST == EM_AARCH64 || EM_HOST == EM_ARM
> +#if EM_HOST == EM_X86_64 || EM_HOST == EM_386 || EM_HOST == EM_AARCH64 || EM_HOST == EM_ARM \
> +    || EM_HOST == EM_CSKY

And here too.  It seems you also need a rebase.

At this point, I'm giving up.  Can you please refresh the series with
a fix?

Thanks,
Namhyung


>  	if (machine == EM_NONE) {
>  		/* Generic arch - use host arch */
>  		machine = EM_HOST;
>  	}
>  #endif
>  	switch (machine) {
> -#if EM_HOST != EM_X86_64 && EM_HOST != EM_386 && EM_HOST != EM_AARCH64 && EM_HOST != EM_ARM
> +#if EM_HOST != EM_X86_64 && EM_HOST != EM_386 && EM_HOST != EM_AARCH64 && EM_HOST != EM_ARM \
> +    && EM_HOST != EM_CSKY
>  	case EM_NONE:	/* Generic arch - use host arch */
>  		return get_arch_regstr(n);
>  #endif
> @@ -51,6 +52,8 @@ const char *get_dwarf_regstr(unsigned int n, unsigned int machine,
>  		return __get_dwarf_regstr(arm_regstr_tbl, n);
>  	case EM_AARCH64:
>  		return __get_dwarf_regstr(aarch64_regstr_tbl, n);
> +	case EM_CSKY:
> +		return get_csky_regstr(n, flags);
>  	case EM_SH:
>  		return __get_dwarf_regstr(sh_regstr_tbl, n);
>  	case EM_S390:
> diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h
> index 0b533409d82a..b72d9d308ce4 100644
> --- a/tools/perf/util/include/dwarf-regs.h
> +++ b/tools/perf/util/include/dwarf-regs.h
> @@ -83,6 +83,8 @@
>  const char *get_arch_regstr(unsigned int n);
>  #endif
>  
> +const char *get_csky_regstr(unsigned int n, unsigned int flags);
> +
>  /**
>   * get_dwarf_regstr() - Returns ftrace register string from DWARF regnum.
>   * @n: DWARF register number.
> -- 
> 2.47.0.105.g07ac214952-goog
> 

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v3 10/20] perf dwarf-regs: Move csky dwarf-regs out of arch
  2024-11-08 20:03   ` Namhyung Kim
@ 2024-11-08 23:08     ` Ian Rogers
  0 siblings, 0 replies; 31+ messages in thread
From: Ian Rogers @ 2024-11-08 23:08 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Mark Rutland, Alexander Shishkin, Jiri Olsa, Adrian Hunter,
	Kan Liang, John Garry, Will Deacon, James Clark, Mike Leach,
	Leo Yan, Guo Ren, Paul Walmsley, Palmer Dabbelt, Albert Ou,
	Nick Terrell, Masami Hiramatsu (Google), Changbin Du,
	Guilherme Amadio, Yang Jihong, Aditya Gupta, Athira Rajeev,
	Masahiro Yamada, Bibo Mao, Huacai Chen, Kajol Jain, Atish Patra,
	Shenlin Liang, Anup Patel, Oliver Upton, Steinar H. Gunderson,
	Dr. David Alan Gilbert, Chen Pei, Dima Kogan, Przemek Kitszel,
	David S. Miller, Alexander Lobakin, linux-kernel,
	linux-perf-users, linux-arm-kernel, linux-csky, linux-riscv

On Fri, Nov 8, 2024 at 12:03 PM Namhyung Kim <namhyung@kernel.org> wrote:
>
> On Wed, Oct 16, 2024 at 05:25:10PM -0700, Ian Rogers wrote:
> > Move arch/csky/util/dwarf-regs.c to util/dwarf-regs-csky.c and compile
> > in unconditionally. To avoid get_arch_regstr being duplicated, rename
> > to get_csky_regstr and add to get_dwarf_regstr switch.
> >
> > Update #ifdefs to allow ABI V1 and V2 tables at the same
> > time. Determine the table from the ELF flags.
> >
> > Signed-off-by: Ian Rogers <irogers@google.com>
> > ---
> >  tools/perf/arch/csky/util/Build               |  1 -
> >  tools/perf/util/Build                         |  1 +
> >  .../dwarf-regs.c => util/dwarf-regs-csky.c}   | 19 ++++++++++---------
> >  tools/perf/util/dwarf-regs.c                  | 11 +++++++----
> >  tools/perf/util/include/dwarf-regs.h          |  2 ++
> >  5 files changed, 20 insertions(+), 14 deletions(-)
> >  rename tools/perf/{arch/csky/util/dwarf-regs.c => util/dwarf-regs-csky.c} (74%)
> >
> > diff --git a/tools/perf/arch/csky/util/Build b/tools/perf/arch/csky/util/Build
> > index 1325310cab6a..5e6ea82c4202 100644
> > --- a/tools/perf/arch/csky/util/Build
> > +++ b/tools/perf/arch/csky/util/Build
> > @@ -1,4 +1,3 @@
> >  perf-util-y += perf_regs.o
> >
> > -perf-util-$(CONFIG_LIBDW) += dwarf-regs.o
> >  perf-util-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
> > diff --git a/tools/perf/util/Build b/tools/perf/util/Build
> > index 4c615611b9d7..99ae4e2802b8 100644
> > --- a/tools/perf/util/Build
> > +++ b/tools/perf/util/Build
> > @@ -203,6 +203,7 @@ endif
> >  perf-util-$(CONFIG_LIBDW) += probe-finder.o
> >  perf-util-$(CONFIG_LIBDW) += dwarf-aux.o
> >  perf-util-$(CONFIG_LIBDW) += dwarf-regs.o
> > +perf-util-$(CONFIG_LIBDW) += dwarf-regs-csky.o
> >  perf-util-$(CONFIG_LIBDW) += dwarf-regs-x86.o
> >  perf-util-$(CONFIG_LIBDW) += debuginfo.o
> >  perf-util-$(CONFIG_LIBDW) += annotate-data.o
> > diff --git a/tools/perf/arch/csky/util/dwarf-regs.c b/tools/perf/util/dwarf-regs-csky.c
> > similarity index 74%
> > rename from tools/perf/arch/csky/util/dwarf-regs.c
> > rename to tools/perf/util/dwarf-regs-csky.c
> > index ca86ecaeacbb..d38ef1f07f3e 100644
> > --- a/tools/perf/arch/csky/util/dwarf-regs.c
> > +++ b/tools/perf/util/dwarf-regs-csky.c
> > @@ -5,9 +5,8 @@
> >  #include <stddef.h>
> >  #include <dwarf-regs.h>
> >
> > -#if defined(__CSKYABIV2__)
> > -#define CSKY_MAX_REGS 73
> > -const char *csky_dwarf_regs_table[CSKY_MAX_REGS] = {
> > +#define CSKY_ABIV2_MAX_REGS 73
> > +const char *csky_dwarf_regs_table_abiv2[CSKY_ABIV2_MAX_REGS] = {
> >       /* r0 ~ r8 */
> >       "%a0", "%a1", "%a2", "%a3", "%regs0", "%regs1", "%regs2", "%regs3",
> >       /* r9 ~ r15 */
> > @@ -26,9 +25,9 @@ const char *csky_dwarf_regs_table[CSKY_MAX_REGS] = {
> >       NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
> >       "%epc",
> >  };
> > -#else
> > -#define CSKY_MAX_REGS 57
> > -const char *csky_dwarf_regs_table[CSKY_MAX_REGS] = {
> > +
> > +#define CSKY_ABIV1_MAX_REGS 57

Definition of CSKY_ABIV1_MAX_REGS.

> > +const char *csky_dwarf_regs_table_abiv1[CSKY_ABIV1_MAX_REGS] = {
> >       /* r0 ~ r8 */
> >       "%sp", "%regs9", "%a0", "%a1", "%a2", "%a3", "%regs0", "%regs1",
> >       /* r9 ~ r15 */
> > @@ -41,9 +40,11 @@ const char *csky_dwarf_regs_table[CSKY_MAX_REGS] = {
> >       NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
> >       "%epc",
> >  };
> > -#endif
> >
> > -const char *get_arch_regstr(unsigned int n)
> > +const char *get_csky_regstr(unsigned int n, unsigned int flags)
> >  {
> > -     return (n < CSKY_MAX_REGS) ? csky_dwarf_regs_table[n] : NULL;
> > +     if (flags & EF_CSKY_ABIV2)
>
> Hmm.. you need it here as well.

These constants are part of the dwarf-regs-csky.c file and not elf.h.

> > +             return (n < CSKY_ABIV2_MAX_REGS) ? csky_dwarf_regs_table_abiv2[n] : NULL;
> > +
> > +     return (n < CSKY_ABIV1_MAX_REGS) ? csky_dwarf_regs_table_abiv1[n] : NULL;
> >  }
> > diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c
> > index fd21f9e90e40..9a76f83af62c 100644
> > --- a/tools/perf/util/dwarf-regs.c
> > +++ b/tools/perf/util/dwarf-regs.c
> > @@ -29,17 +29,18 @@
> >  #define __get_dwarf_regstr(tbl, n) (((n) < ARRAY_SIZE(tbl)) ? (tbl)[(n)] : NULL)
> >
> >  /* Return architecture dependent register string (for kprobe-tracer) */
> > -const char *get_dwarf_regstr(unsigned int n, unsigned int machine,
> > -                          unsigned int flags __maybe_unused)
> > +const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int flags)
> >  {
> > -#if EM_HOST == EM_X86_64 || EM_HOST == EM_386 || EM_HOST == EM_AARCH64 || EM_HOST == EM_ARM
> > +#if EM_HOST == EM_X86_64 || EM_HOST == EM_386 || EM_HOST == EM_AARCH64 || EM_HOST == EM_ARM \
> > +    || EM_HOST == EM_CSKY
>
> And here too.  It seems you also need a rebase.
>
> At this point, I'm giving up.  Can you please refresh the series with
> a fix?

Sure I'll rebase and add ifndef+defines to dwarf-regs.h, I see we have
these currently for EM_AARCH64 and EM_LOONGARCH there.

Thanks,
Ian

^ permalink raw reply	[flat|nested] 31+ messages in thread

end of thread, other threads:[~2024-11-08 23:08 UTC | newest]

Thread overview: 31+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-17  0:25 [PATCH v3 00/20] Remove PERF_HAVE_DWARF_REGS Ian Rogers
2024-10-17  0:25 ` [PATCH v3 01/20] perf bpf-prologue: Remove unused file Ian Rogers
2024-10-17  0:25 ` [PATCH v3 02/20] perf dwarf-regs: Remove PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET Ian Rogers
2024-10-17  0:25 ` [PATCH v3 03/20] perf dwarf-regs: Add EM_HOST and EF_HOST defines Ian Rogers
2024-10-17  0:25 ` [PATCH v3 04/20] perf disasm: Add e_machine/e_flags to struct arch Ian Rogers
2024-11-08 17:33   ` Namhyung Kim
2024-11-08 18:19     ` Ian Rogers
2024-11-08 18:38       ` Namhyung Kim
2024-11-08 18:45         ` Ian Rogers
2024-10-17  0:25 ` [PATCH v3 05/20] perf dwarf-regs: Pass accurate disassembly machine to get_dwarf_regnum Ian Rogers
2024-10-17  0:25 ` [PATCH v3 06/20] perf dwarf-regs: Pass ELF flags to get_dwarf_regstr Ian Rogers
2024-10-17  0:25 ` [PATCH v3 07/20] perf dwarf-regs: Move x86 dwarf-regs out of arch Ian Rogers
2024-10-17  0:25 ` [PATCH v3 08/20] perf arm64: Remove dwarf-regs.c Ian Rogers
2024-10-17  0:25 ` [PATCH v3 09/20] perf arm: " Ian Rogers
2024-10-17  0:25 ` [PATCH v3 10/20] perf dwarf-regs: Move csky dwarf-regs out of arch Ian Rogers
2024-11-08 20:03   ` Namhyung Kim
2024-11-08 23:08     ` Ian Rogers
2024-10-17  0:25 ` [PATCH v3 11/20] perf loongarch: Remove dwarf-regs.c Ian Rogers
2024-10-17  0:25 ` [PATCH v3 12/20] perf mips: " Ian Rogers
2024-10-17  0:25 ` [PATCH v3 13/20] perf dwarf-regs: Move powerpc dwarf-regs out of arch Ian Rogers
2024-10-17  0:25 ` [PATCH v3 14/20] perf riscv: Remove dwarf-regs.c and add dwarf-regs-table.h Ian Rogers
2024-10-18 19:39   ` Palmer Dabbelt
2024-10-17  0:25 ` [PATCH v3 15/20] perf s390: Remove dwarf-regs.c Ian Rogers
2024-10-17  0:25 ` [PATCH v3 16/20] perf sh: " Ian Rogers
2024-10-17  0:25 ` [PATCH v3 17/20] perf sparc: " Ian Rogers
2024-10-17  0:25 ` [PATCH v3 18/20] perf xtensa: " Ian Rogers
2024-10-17  0:25 ` [PATCH v3 19/20] perf dwarf-regs: Remove get_arch_regstr code Ian Rogers
2024-10-17  0:25 ` [PATCH v3 20/20] perf build: Remove PERF_HAVE_DWARF_REGS Ian Rogers
2024-11-07 19:29 ` [PATCH v3 00/20] " Namhyung Kim
2024-11-08  0:00   ` Masami Hiramatsu
2024-11-08 18:33     ` Namhyung Kim

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).