mirror of
https://github.com/torvalds/linux.git
synced 2026-01-25 07:47:50 +00:00
perf demangle-rust: Add rustc-demangle C demangler
Imported at commit 80e40f57d99f ("add comment about finding latest
version of code") from:
https://github.com/rust-lang/rustc-demangle/blob/main/crates/native-c/src/demangle.c
https://github.com/rust-lang/rustc-demangle/blob/main/crates/native-c/include/demangle.h
There is discussion of this issue motivating the import in:
https://github.com/rust-lang/rust/issues/60705
https://lore.kernel.org/lkml/20250129193037.573431-1-irogers@google.com/
The SPDX lines reflect the dual license Apache-2 or MIT in:
https://github.com/rust-lang/rustc-demangle/blob/main/README.md
Following Migual Ojeda's suggestion comments were added on copyright and
keeping the code in sync with upstream.
The files are renamed as perf supports multiple demanglers and so
demangle as a name would be overloaded.
The work here was done by Ariel Ben-Yehuda <ariel.byd@gmail.com> and I
am merely importing it as discussed in the rust-lang issue.
Reviewed-by: Miguel Ojeda <ojeda@kernel.org>
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: 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-2-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
committed by
Arnaldo Carvalho de Melo
parent
4f1a19b8bc
commit
60869b22af
2042
tools/perf/util/demangle-rust-v0.c
Normal file
2042
tools/perf/util/demangle-rust-v0.c
Normal file
File diff suppressed because it is too large
Load Diff
88
tools/perf/util/demangle-rust-v0.h
Normal file
88
tools/perf/util/demangle-rust-v0.h
Normal file
@@ -0,0 +1,88 @@
|
||||
// SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
|
||||
// The contents of this file come from the Rust rustc-demangle library, hosted
|
||||
// in the <https://github.com/rust-lang/rustc-demangle> repository, licensed
|
||||
// under "Apache-2.0 OR MIT". For copyright details, see
|
||||
// <https://github.com/rust-lang/rustc-demangle/blob/main/README.md>.
|
||||
// Please note that the file should be kept as close as possible to upstream.
|
||||
|
||||
#ifndef _H_DEMANGLE_V0_H
|
||||
#define _H_DEMANGLE_V0_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#if defined(__GNUC__) || defined(__clang__)
|
||||
#define DEMANGLE_NODISCARD __attribute__((warn_unused_result))
|
||||
#else
|
||||
#define DEMANGLE_NODISCARD
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
OverflowOk,
|
||||
OverflowOverflow
|
||||
} overflow_status;
|
||||
|
||||
enum demangle_style {
|
||||
DemangleStyleUnknown = 0,
|
||||
DemangleStyleLegacy,
|
||||
DemangleStyleV0,
|
||||
};
|
||||
|
||||
// Not using a union here to make the struct easier to copy-paste if needed.
|
||||
struct demangle {
|
||||
enum demangle_style style;
|
||||
// points to the "mangled" part of the name,
|
||||
// not including `ZN` or `R` prefixes.
|
||||
const char *mangled;
|
||||
size_t mangled_len;
|
||||
// In DemangleStyleLegacy, is the number of path elements
|
||||
size_t elements;
|
||||
// while it's called "original", it will not contain `.llvm.9D1C9369@@16` suffixes
|
||||
// that are to be ignored.
|
||||
const char *original;
|
||||
size_t original_len;
|
||||
// Contains the part after the mangled name that is to be outputted,
|
||||
// which can be `.exit.i.i` suffixes LLVM sometimes adds.
|
||||
const char *suffix;
|
||||
size_t suffix_len;
|
||||
};
|
||||
|
||||
// if the length of the output buffer is less than `output_len-OVERFLOW_MARGIN`,
|
||||
// the demangler will return `OverflowOverflow` even if there is no overflow.
|
||||
#define OVERFLOW_MARGIN 4
|
||||
|
||||
/// Demangle a C string that refers to a Rust symbol and put the demangle intermediate result in `res`.
|
||||
/// Beware that `res` contains references into `s`. If `s` is modified (or free'd) before calling
|
||||
/// `rust_demangle_display_demangle` behavior is undefined.
|
||||
///
|
||||
/// Use `rust_demangle_display_demangle` to convert it to an actual string.
|
||||
void rust_demangle_demangle(const char *s, struct demangle *res);
|
||||
|
||||
/// Write the string in a `struct demangle` into a buffer.
|
||||
///
|
||||
/// Return `OverflowOk` if the output buffer was sufficiently big, `OverflowOverflow` if it wasn't.
|
||||
/// This function is `O(n)` in the length of the input + *output* [$], but the demangled output of demangling a symbol can
|
||||
/// be exponentially[$$] large, therefore it is recommended to have a sane bound (`rust-demangle`
|
||||
/// uses 1,000,000 bytes) on `len`.
|
||||
///
|
||||
/// `alternate`, if true, uses the less verbose alternate formatting (Rust `{:#}`) is used, which does not show
|
||||
/// symbol hashes and types of constant ints.
|
||||
///
|
||||
/// [$] It's `O(n * MAX_DEPTH)`, but `MAX_DEPTH` is a constant 300 and therefore it's `O(n)`
|
||||
/// [$$] Technically, bounded by `O(n^MAX_DEPTH)`, but this is practically exponential.
|
||||
DEMANGLE_NODISCARD overflow_status rust_demangle_display_demangle(struct demangle const *res, char *out, size_t len, bool alternate);
|
||||
|
||||
/// Returns true if `res` refers to a known valid Rust demangling style, false if it's an unknown style.
|
||||
bool rust_demangle_is_known(struct demangle *res);
|
||||
|
||||
#undef DEMANGLE_NODISCARD
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user