From nobody Mon Jun 29 22:18:04 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 81D71C433EF for ; Tue, 1 Feb 2022 18:51:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242032AbiBASvf (ORCPT ); Tue, 1 Feb 2022 13:51:35 -0500 Received: from foss.arm.com ([217.140.110.172]:58718 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229915AbiBASvd (ORCPT ); Tue, 1 Feb 2022 13:51:33 -0500 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 5A35511B3; Tue, 1 Feb 2022 10:51:33 -0800 (PST) Received: from e127744.arm.com (unknown [10.57.88.62]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 4925D3F40C; Tue, 1 Feb 2022 10:51:31 -0800 (PST) From: German Gomez To: linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, acme@kernel.org Cc: German Gomez , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim Subject: [PATCH] perf symbols: Remove demangle-rust files as superfluous Date: Tue, 1 Feb 2022 18:50:53 +0000 Message-Id: <20220201185054.1041917-1-german.gomez@arm.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Demangling of Rust legacy symbols has been working through libbfd for some time now, making these files no longer needed, so remove them. Signed-off-by: German Gomez --- Before and after the commit: $ perf record rustc $ perf report 2.98% rustc rustc [.] ::write 2.77% rustc rustc [.] std::collections::= hash::map::HashMap::entry 2.09% rustc rustc [.] <::deserialize::ValueVisitor as serde::de::Visi= tor>::visit_map 2.05% rustc rustc [.] ::next_key_seed 1.52% rustc rustc [.] std::collections::= hash::map::HashMap::get 0.59% rustc rustc [.] ::next_value_seed --- tools/perf/util/Build | 1 - tools/perf/util/demangle-rust.c | 269 -------------------------------- tools/perf/util/demangle-rust.h | 8 - tools/perf/util/symbol-elf.c | 7 - 4 files changed, 285 deletions(-) delete mode 100644 tools/perf/util/demangle-rust.c delete mode 100644 tools/perf/util/demangle-rust.h diff --git a/tools/perf/util/Build b/tools/perf/util/Build index 2a403cefc..e59788ef6 100644 --- a/tools/perf/util/Build +++ b/tools/perf/util/Build @@ -193,7 +193,6 @@ perf-$(CONFIG_LIBCAP) +=3D cap.o =20 perf-y +=3D demangle-ocaml.o perf-y +=3D demangle-java.o -perf-y +=3D demangle-rust.o =20 ifdef CONFIG_JITDUMP perf-$(CONFIG_LIBELF) +=3D jitdump.o diff --git a/tools/perf/util/demangle-rust.c b/tools/perf/util/demangle-rus= t.c deleted file mode 100644 index a659fc69f..000000000 --- a/tools/perf/util/demangle-rust.c +++ /dev/null @@ -1,269 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -#include -#include "debug.h" - -#include "demangle-rust.h" - -/* - * Mangled Rust symbols look like this: - * - * _$LT$std..sys..fd..FileDesc$u20$as$u20$core..ops..Drop$GT$::drop::h= c68340e1baa4987a - * - * The original symbol is: - * - * ::drop - * - * The last component of the path is a 64-bit hash in lowercase hex, prefi= xed - * with "h". Rust does not have a global namespace between crates, an illu= sion - * which Rust maintains by using the hash to distinguish things that would - * otherwise have the same symbol. - * - * Any path component not starting with a XID_Start character is prefixed = with - * "_". - * - * The following escape sequences are used: - * - * "," =3D> $C$ - * "@" =3D> $SP$ - * "*" =3D> $BP$ - * "&" =3D> $RF$ - * "<" =3D> $LT$ - * ">" =3D> $GT$ - * "(" =3D> $LP$ - * ")" =3D> $RP$ - * " " =3D> $u20$ - * "'" =3D> $u27$ - * "[" =3D> $u5b$ - * "]" =3D> $u5d$ - * "~" =3D> $u7e$ - * - * A double ".." means "::" and a single "." means "-". - * - * The only characters allowed in the mangled symbol are a-zA-Z0-9 and _.:$ - */ - -static const char *hash_prefix =3D "::h"; -static const size_t hash_prefix_len =3D 3; -static const size_t hash_len =3D 16; - -static bool is_prefixed_hash(const char *start); -static bool looks_like_rust(const char *sym, size_t len); -static bool unescape(const char **in, char **out, const char *seq, char va= lue); - -/* - * INPUT: - * sym: symbol that has been through BFD-demangling - * - * This function looks for the following indicators: - * - * 1. The hash must consist of "h" followed by 16 lowercase hex digits. - * - * 2. As a sanity check, the hash must use between 5 and 15 of the 16 pos= sible - * hex digits. This is true of 99.9998% of hashes so once in your life= you - * may see a false negative. The point is to notice path components th= at - * could be Rust hashes but are probably not, like "haaaaaaaaaaaaaaaa"= . In - * this case a false positive (non-Rust symbol has an important path - * component removed because it looks like a Rust hash) is worse than a - * false negative (the rare Rust symbol is not demangled) so this sets= the - * balance in favor of false negatives. - * - * 3. There must be no characters other than a-zA-Z0-9 and _.:$ - * - * 4. There must be no unrecognized $-sign sequences. - * - * 5. There must be no sequence of three or more dots in a row ("..."). - */ -bool -rust_is_mangled(const char *sym) -{ - size_t len, len_without_hash; - - if (!sym) - return false; - - len =3D strlen(sym); - if (len <=3D hash_prefix_len + hash_len) - /* Not long enough to contain "::h" + hash + something else */ - return false; - - len_without_hash =3D len - (hash_prefix_len + hash_len); - if (!is_prefixed_hash(sym + len_without_hash)) - return false; - - return looks_like_rust(sym, len_without_hash); -} - -/* - * A hash is the prefix "::h" followed by 16 lowercase hex digits. The hex - * digits must comprise between 5 and 15 (inclusive) distinct digits. - */ -static bool is_prefixed_hash(const char *str) -{ - const char *end; - bool seen[16]; - size_t i; - int count; - - if (strncmp(str, hash_prefix, hash_prefix_len)) - return false; - str +=3D hash_prefix_len; - - memset(seen, false, sizeof(seen)); - for (end =3D str + hash_len; str < end; str++) - if (*str >=3D '0' && *str <=3D '9') - seen[*str - '0'] =3D true; - else if (*str >=3D 'a' && *str <=3D 'f') - seen[*str - 'a' + 10] =3D true; - else - return false; - - /* Count how many distinct digits seen */ - count =3D 0; - for (i =3D 0; i < 16; i++) - if (seen[i]) - count++; - - return count >=3D 5 && count <=3D 15; -} - -static bool looks_like_rust(const char *str, size_t len) -{ - const char *end =3D str + len; - - while (str < end) - switch (*str) { - case '$': - if (!strncmp(str, "$C$", 3)) - str +=3D 3; - else if (!strncmp(str, "$SP$", 4) - || !strncmp(str, "$BP$", 4) - || !strncmp(str, "$RF$", 4) - || !strncmp(str, "$LT$", 4) - || !strncmp(str, "$GT$", 4) - || !strncmp(str, "$LP$", 4) - || !strncmp(str, "$RP$", 4)) - str +=3D 4; - else if (!strncmp(str, "$u20$", 5) - || !strncmp(str, "$u27$", 5) - || !strncmp(str, "$u5b$", 5) - || !strncmp(str, "$u5d$", 5) - || !strncmp(str, "$u7e$", 5)) - str +=3D 5; - else - return false; - break; - case '.': - /* Do not allow three or more consecutive dots */ - if (!strncmp(str, "...", 3)) - return false; - /* Fall through */ - case 'a' ... 'z': - case 'A' ... 'Z': - case '0' ... '9': - case '_': - case ':': - str++; - break; - default: - return false; - } - - return true; -} - -/* - * INPUT: - * sym: symbol for which rust_is_mangled(sym) returns true - * - * The input is demangled in-place because the mangled name is always long= er - * than the demangled one. - */ -void -rust_demangle_sym(char *sym) -{ - const char *in; - char *out; - const char *end; - - if (!sym) - return; - - in =3D sym; - out =3D sym; - end =3D sym + strlen(sym) - (hash_prefix_len + hash_len); - - while (in < end) - switch (*in) { - case '$': - if (!(unescape(&in, &out, "$C$", ',') - || unescape(&in, &out, "$SP$", '@') - || unescape(&in, &out, "$BP$", '*') - || unescape(&in, &out, "$RF$", '&') - || unescape(&in, &out, "$LT$", '<') - || unescape(&in, &out, "$GT$", '>') - || unescape(&in, &out, "$LP$", '(') - || unescape(&in, &out, "$RP$", ')') - || unescape(&in, &out, "$u20$", ' ') - || unescape(&in, &out, "$u27$", '\'') - || unescape(&in, &out, "$u5b$", '[') - || unescape(&in, &out, "$u5d$", ']') - || unescape(&in, &out, "$u7e$", '~'))) { - pr_err("demangle-rust: unexpected escape sequence"); - goto done; - } - break; - case '_': - /* - * If this is the start of a path component and the next - * character is an escape sequence, ignore the - * underscore. The mangler inserts an underscore to make - * sure the path component begins with a XID_Start - * character. - */ - if ((in =3D=3D sym || in[-1] =3D=3D ':') && in[1] =3D=3D '$') - in++; - else - *out++ =3D *in++; - break; - case '.': - if (in[1] =3D=3D '.') { - /* ".." becomes "::" */ - *out++ =3D ':'; - *out++ =3D ':'; - in +=3D 2; - } else { - /* "." becomes "-" */ - *out++ =3D '-'; - in++; - } - break; - case 'a' ... 'z': - case 'A' ... 'Z': - case '0' ... '9': - case ':': - *out++ =3D *in++; - break; - default: - pr_err("demangle-rust: unexpected character '%c' in symbol\n", - *in); - goto done; - } - -done: - *out =3D '\0'; -} - -static bool unescape(const char **in, char **out, const char *seq, char va= lue) -{ - size_t len =3D strlen(seq); - - if (strncmp(*in, seq, len)) - return false; - - **out =3D value; - - *in +=3D len; - *out +=3D 1; - - return true; -} diff --git a/tools/perf/util/demangle-rust.h b/tools/perf/util/demangle-rus= t.h deleted file mode 100644 index 2fca618b1..000000000 --- a/tools/perf/util/demangle-rust.h +++ /dev/null @@ -1,8 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef __PERF_DEMANGLE_RUST -#define __PERF_DEMANGLE_RUST 1 - -bool rust_is_mangled(const char *str); -void rust_demangle_sym(char *str); - -#endif /* __PERF_DEMANGLE_RUST */ diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c index 31cd59a2b..3ed0bef81 100644 --- a/tools/perf/util/symbol-elf.c +++ b/tools/perf/util/symbol-elf.c @@ -14,7 +14,6 @@ #include "symsrc.h" #include "demangle-ocaml.h" #include "demangle-java.h" -#include "demangle-rust.h" #include "machine.h" #include "vdso.h" #include "debug.h" @@ -258,12 +257,6 @@ static char *demangle_sym(struct dso *dso, int kmodule= , const char *elf_name) demangled =3D 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); =20 return demangled; } --=20 2.25.1