Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

authored by

Ian Rogers and committed by
Arnaldo Carvalho de Melo
e20848c3 60869b22

+40 -16
+4 -1
tools/perf/util/Build
··· 241 241 perf-util-$(CONFIG_CXX_DEMANGLE) += demangle-cxx.o 242 242 perf-util-y += demangle-ocaml.o 243 243 perf-util-y += demangle-java.o 244 - perf-util-y += demangle-rust.o 244 + perf-util-y += demangle-rust-v0.o 245 245 perf-util-$(CONFIG_LIBLLVM) += llvm-c-helpers.o 246 + 247 + CFLAGS_demangle-rust-v0.o += -Wno-shadow -Wno-declaration-after-statement \ 248 + -Wno-switch-default -Wno-switch-enum -Wno-missing-field-initializers 246 249 247 250 ifdef CONFIG_JITDUMP 248 251 perf-util-$(CONFIG_LIBELF) += jitdump.o
+36 -15
tools/perf/util/symbol-elf.c
··· 16 16 #include "demangle-cxx.h" 17 17 #include "demangle-ocaml.h" 18 18 #include "demangle-java.h" 19 - #include "demangle-rust.h" 19 + #include "demangle-rust-v0.h" 20 20 #include "machine.h" 21 21 #include "vdso.h" 22 22 #include "debug.h" 23 23 #include "util/copyfile.h" 24 24 #include <linux/ctype.h> 25 25 #include <linux/kernel.h> 26 + #include <linux/log2.h> 26 27 #include <linux/zalloc.h> 27 28 #include <linux/string.h> 28 29 #include <symbol/kallsyms.h> ··· 309 308 310 309 static char *demangle_sym(struct dso *dso, int kmodule, const char *elf_name) 311 310 { 311 + struct demangle rust_demangle = { 312 + .style = DemangleStyleUnknown, 313 + }; 312 314 char *demangled = NULL; 313 315 314 316 /* ··· 322 318 if (!want_demangle(dso__kernel(dso) || kmodule)) 323 319 return demangled; 324 320 325 - demangled = cxx_demangle_sym(elf_name, verbose > 0, verbose > 0); 326 - if (demangled == NULL) { 327 - demangled = ocaml_demangle_sym(elf_name); 328 - if (demangled == NULL) { 329 - demangled = java_demangle_sym(elf_name, JAVA_DEMANGLE_NORET); 330 - } 331 - } 332 - else if (rust_is_mangled(demangled)) 333 - /* 334 - * Input to Rust demangling is the BFD-demangled 335 - * name which it Rust-demangles in place. 336 - */ 337 - rust_demangle_sym(demangled); 321 + rust_demangle_demangle(elf_name, &rust_demangle); 322 + if (rust_demangle_is_known(&rust_demangle)) { 323 + /* A rust mangled name. */ 324 + if (rust_demangle.mangled_len == 0) 325 + return demangled; 338 326 339 - return demangled; 327 + for (size_t buf_len = roundup_pow_of_two(rust_demangle.mangled_len * 2); 328 + buf_len < 1024 * 1024; buf_len += 32) { 329 + char *tmp = realloc(demangled, buf_len); 330 + 331 + if (!tmp) { 332 + /* Failure to grow output buffer, return what is there. */ 333 + return demangled; 334 + } 335 + demangled = tmp; 336 + if (rust_demangle_display_demangle(&rust_demangle, demangled, buf_len, 337 + /*alternate=*/true) == OverflowOk) 338 + return demangled; 339 + } 340 + /* Buffer exceeded sensible bounds, return what is there. */ 341 + return demangled; 342 + } 343 + 344 + demangled = cxx_demangle_sym(elf_name, verbose > 0, verbose > 0); 345 + if (demangled) 346 + return demangled; 347 + 348 + demangled = ocaml_demangle_sym(elf_name); 349 + if (demangled) 350 + return demangled; 351 + 352 + return java_demangle_sym(elf_name, JAVA_DEMANGLE_NORET); 340 353 } 341 354 342 355 struct rel_info {