mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
perf symbol-elf: Integrate rust-v0 demangling
Use the demangle-rust-v0 APIs to see if symbol is Rust mangled and demangle if so. The API requires a pre-allocated output buffer, some estimation and retrying are added for this. Signed-off-by: Ian Rogers <irogers@google.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alex Gaynor <alex.gaynor@gmail.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Alice Ryhl <aliceryhl@google.com> Cc: Andreas Hindborg <a.hindborg@kernel.org> Cc: Ariel Ben-Yehuda <ariel.byd@gmail.com> Cc: Benno Lossin <benno.lossin@proton.me> Cc: Bill Wendling <morbo@google.com> Cc: Björn Roy Baron <bjorn3_gh@protonmail.com> Cc: Boqun Feng <boqun.feng@gmail.com> Cc: Daniel Xu <dxu@dxuuu.xyz> Cc: Danilo Krummrich <dakr@kernel.org> Cc: Gary Guo <gary@garyguo.net> Cc: Howard Chu <howardchu95@gmail.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: James Clark <james.clark@linaro.org> Cc: Jiapeng Chong <jiapeng.chong@linux.alibaba.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Justin Stitt <justinstitt@google.com> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Miguel Ojeda <ojeda@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Nathan Chancellor <nathan@kernel.org> Cc: Nick Desaulniers <nick.desaulniers+lkml@gmail.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Ravi Bangoria <ravi.bangoria@amd.com> Cc: Stephen Brennan <stephen.s.brennan@oracle.com> Cc: Trevor Gross <tmgross@umich.edu> Link: https://lore.kernel.org/r/20250430004128.474388-3-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
60869b22af
commit
e20848c317
@ -241,9 +241,12 @@ perf-util-y += cap.o
|
||||
perf-util-$(CONFIG_CXX_DEMANGLE) += demangle-cxx.o
|
||||
perf-util-y += demangle-ocaml.o
|
||||
perf-util-y += demangle-java.o
|
||||
perf-util-y += demangle-rust.o
|
||||
perf-util-y += demangle-rust-v0.o
|
||||
perf-util-$(CONFIG_LIBLLVM) += llvm-c-helpers.o
|
||||
|
||||
CFLAGS_demangle-rust-v0.o += -Wno-shadow -Wno-declaration-after-statement \
|
||||
-Wno-switch-default -Wno-switch-enum -Wno-missing-field-initializers
|
||||
|
||||
ifdef CONFIG_JITDUMP
|
||||
perf-util-$(CONFIG_LIBELF) += jitdump.o
|
||||
perf-util-$(CONFIG_LIBELF) += genelf.o
|
||||
|
@ -16,13 +16,14 @@
|
||||
#include "demangle-cxx.h"
|
||||
#include "demangle-ocaml.h"
|
||||
#include "demangle-java.h"
|
||||
#include "demangle-rust.h"
|
||||
#include "demangle-rust-v0.h"
|
||||
#include "machine.h"
|
||||
#include "vdso.h"
|
||||
#include "debug.h"
|
||||
#include "util/copyfile.h"
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/log2.h>
|
||||
#include <linux/zalloc.h>
|
||||
#include <linux/string.h>
|
||||
#include <symbol/kallsyms.h>
|
||||
@ -308,6 +309,9 @@ char *cxx_demangle_sym(const char *str __maybe_unused, bool params __maybe_unuse
|
||||
|
||||
static char *demangle_sym(struct dso *dso, int kmodule, const char *elf_name)
|
||||
{
|
||||
struct demangle rust_demangle = {
|
||||
.style = DemangleStyleUnknown,
|
||||
};
|
||||
char *demangled = NULL;
|
||||
|
||||
/*
|
||||
@ -318,21 +322,38 @@ static char *demangle_sym(struct dso *dso, int kmodule, const char *elf_name)
|
||||
if (!want_demangle(dso__kernel(dso) || kmodule))
|
||||
return demangled;
|
||||
|
||||
demangled = cxx_demangle_sym(elf_name, verbose > 0, verbose > 0);
|
||||
if (demangled == NULL) {
|
||||
demangled = ocaml_demangle_sym(elf_name);
|
||||
if (demangled == NULL) {
|
||||
demangled = java_demangle_sym(elf_name, JAVA_DEMANGLE_NORET);
|
||||
}
|
||||
}
|
||||
else if (rust_is_mangled(demangled))
|
||||
/*
|
||||
* Input to Rust demangling is the BFD-demangled
|
||||
* name which it Rust-demangles in place.
|
||||
*/
|
||||
rust_demangle_sym(demangled);
|
||||
|
||||
rust_demangle_demangle(elf_name, &rust_demangle);
|
||||
if (rust_demangle_is_known(&rust_demangle)) {
|
||||
/* A rust mangled name. */
|
||||
if (rust_demangle.mangled_len == 0)
|
||||
return demangled;
|
||||
|
||||
for (size_t buf_len = roundup_pow_of_two(rust_demangle.mangled_len * 2);
|
||||
buf_len < 1024 * 1024; buf_len += 32) {
|
||||
char *tmp = realloc(demangled, buf_len);
|
||||
|
||||
if (!tmp) {
|
||||
/* Failure to grow output buffer, return what is there. */
|
||||
return demangled;
|
||||
}
|
||||
demangled = tmp;
|
||||
if (rust_demangle_display_demangle(&rust_demangle, demangled, buf_len,
|
||||
/*alternate=*/true) == OverflowOk)
|
||||
return demangled;
|
||||
}
|
||||
/* Buffer exceeded sensible bounds, return what is there. */
|
||||
return demangled;
|
||||
}
|
||||
|
||||
demangled = cxx_demangle_sym(elf_name, verbose > 0, verbose > 0);
|
||||
if (demangled)
|
||||
return demangled;
|
||||
|
||||
demangled = ocaml_demangle_sym(elf_name);
|
||||
if (demangled)
|
||||
return demangled;
|
||||
|
||||
return java_demangle_sym(elf_name, JAVA_DEMANGLE_NORET);
|
||||
}
|
||||
|
||||
struct rel_info {
|
||||
|
Loading…
Reference in New Issue
Block a user