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
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 >
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
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
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 >
© 2016 - 2024 Red Hat, Inc.