]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
perf symbol-elf: Integrate rust-v0 demangling
authorIan Rogers <irogers@google.com>
Wed, 30 Apr 2025 00:41:24 +0000 (17:41 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 9 May 2025 20:00:59 +0000 (17:00 -0300)
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>
tools/perf/util/Build
tools/perf/util/symbol-elf.c

index 4f7f072fa222ba801d4efa6280ba5418a9b714bb..7910d908c814feec5e5e008f3a8b45384d796432 100644 (file)
@@ -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
index fbf6d0f73af915bc01a8568534f416a3beeba00f..3fc87309746feb1b8329f21a7421b525084551f9 100644 (file)
 #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);
+       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;
        }
-       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);
 
-       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 {