Received: by 2002:a05:6a10:1a4d:0:0:0:0 with SMTP id nk13csp1278026pxb; Wed, 2 Feb 2022 00:49:54 -0800 (PST) X-Google-Smtp-Source: ABdhPJzjDHBXNOBdyZPUJLKf6PKj1sI9/in8qUjcOD8hINRYhjkKy4aC8kkvmsOpQTMj7NthAcPa X-Received: by 2002:a17:907:1c90:: with SMTP id nb16mr12633767ejc.413.1643791794459; Wed, 02 Feb 2022 00:49:54 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643791794; cv=none; d=google.com; s=arc-20160816; b=V4P7vYx6CB+9UoNAzzS0n4ckwezbhF5LeEHAk3lcju+6aLQ2xrcHBwiXl7I+vMefzF K7fkHj5HCoCJCxwQUZ2l1chodH/JJZ7/GpcxGONecsk+kM72kofuepXQhPiaxazXdKrU bwWRHR1tuxPgdm1F0CmQPprYZ8ch/Z9gC4dJfFIm44l5LXv8hpbDaWEWns2TDzwMT1zI ZAn4mDiKnE+wieNUIOfzF5xtvIKUpaXPAG9CTtQQpjrI61MjgXRrI2/o2obgslTJ4uHu JsgFAyEb8UuG/3+E2MHwdpqW6HfEyB8mj7SCDSYgVdlghvPyfcbJpYf+WRCZY17bJH78 p0xA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:dkim-signature; bh=jk0N5E0lPpkI7cw4UUToLFYuoKFBMKvhdDOxCK0UdPs=; b=arlB0Xq/LGaC3FG0dGvSRd+KPOANg7DUyjIRYXtZf4JI6c9ZP94cbqsZy54BVzeieM REyJ25+QwI0oUdtPTV7DnHuPT1Bw2GdgWejep26g+Wy9bgh6poYW6A4B+QYn1ycGIXoZ iYQHun3ZWPA3NQtdMTPzQov6udIZ1CqoN5sJtylDeQqL81KcFHs/5AP88+DBDbNd3Tqv biUEvLkwrKplAXIapB60QPsOXswKWYM4xiZ856CGRvgAmPt5ESJ9t9ojjyijgsB2Au+6 xBclD1eoKmGYmid84qDxu5K6e9aCG8KvaBiZ+vl8Mnvg9PWHRe6x1f51n0Z4g/Z+1ivK DVaA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=RQWao8PX; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id e18si7468506ejs.226.2022.02.02.00.49.29; Wed, 02 Feb 2022 00:49:54 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=RQWao8PX; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243195AbiBBANC (ORCPT + 99 others); Tue, 1 Feb 2022 19:13:02 -0500 Received: from dfw.source.kernel.org ([139.178.84.217]:57886 "EHLO dfw.source.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243373AbiBBAM5 (ORCPT ); Tue, 1 Feb 2022 19:12:57 -0500 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 29A5A61520; Wed, 2 Feb 2022 00:12:57 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3AFA9C340EB; Wed, 2 Feb 2022 00:12:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1643760776; bh=eK7RrEe6x5KYHO+ICUNYViwytxw03TGumLdm6KZYGjk=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=RQWao8PXF3DWRd9376XfQouWvnxMfhoFfNUgR8PzyoXHuQBP+6Lc7sbgx5uF8nJH2 6Q65WoojIyBrG0+qRlTGJkELndggI5MRs87h4wxOoZzldYuF1eszfjyBt15tnWiwfS 6FAUCtHvS3sHAJ0zd0yMdKJIHxuncmYDF93KE+pHVUiuEY2UcoW7iw7rLkuej5CfSi HO8GTMa7dLvonOQYMfD0VwBijn8uRPL8zItBwRdbixHj2YurS9Ut2dNkaFoc9Xpn7l N6y4qQd5i7qywcG5yGa2ZDfC3GMyIPy5WfCKZbCCuTOJCCrCga4Z51JL7UGYto1ByE gGB26eEgMLtpA== Received: by quaco.ghostprotocols.net (Postfix, from userid 1000) id 90D8E40466; Tue, 1 Feb 2022 21:12:54 -0300 (-03) Date: Tue, 1 Feb 2022 21:12:54 -0300 From: Arnaldo Carvalho de Melo To: German Gomez Cc: linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim Subject: Re: [PATCH] perf symbols: Remove demangle-rust files as superfluous Message-ID: References: <20220201185054.1041917-1-german.gomez@arm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20220201185054.1041917-1-german.gomez@arm.com> X-Url: http://acmel.wordpress.com Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Em Tue, Feb 01, 2022 at 06:50:53PM +0000, German Gomez escreveu: > Demangling of Rust legacy symbols has been working through libbfd for > some time now, making these files no longer needed, so remove them. Can this be made dependent of the versions of the components that provide this feature? - Arnaldo > 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::Visitor>::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) += cap.o > > perf-y += demangle-ocaml.o > perf-y += demangle-java.o > -perf-y += demangle-rust.o > > ifdef CONFIG_JITDUMP > perf-$(CONFIG_LIBELF) += jitdump.o > diff --git a/tools/perf/util/demangle-rust.c b/tools/perf/util/demangle-rust.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::hc68340e1baa4987a > - * > - * The original symbol is: > - * > - * ::drop > - * > - * The last component of the path is a 64-bit hash in lowercase hex, prefixed > - * with "h". Rust does not have a global namespace between crates, an illusion > - * 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: > - * > - * "," => $C$ > - * "@" => $SP$ > - * "*" => $BP$ > - * "&" => $RF$ > - * "<" => $LT$ > - * ">" => $GT$ > - * "(" => $LP$ > - * ")" => $RP$ > - * " " => $u20$ > - * "'" => $u27$ > - * "[" => $u5b$ > - * "]" => $u5d$ > - * "~" => $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 = "::h"; > -static const size_t hash_prefix_len = 3; > -static const size_t hash_len = 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 value); > - > -/* > - * 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 possible > - * 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 that > - * 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 = strlen(sym); > - if (len <= hash_prefix_len + hash_len) > - /* Not long enough to contain "::h" + hash + something else */ > - return false; > - > - len_without_hash = 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 += hash_prefix_len; > - > - memset(seen, false, sizeof(seen)); > - for (end = str + hash_len; str < end; str++) > - if (*str >= '0' && *str <= '9') > - seen[*str - '0'] = true; > - else if (*str >= 'a' && *str <= 'f') > - seen[*str - 'a' + 10] = true; > - else > - return false; > - > - /* Count how many distinct digits seen */ > - count = 0; > - for (i = 0; i < 16; i++) > - if (seen[i]) > - count++; > - > - return count >= 5 && count <= 15; > -} > - > -static bool looks_like_rust(const char *str, size_t len) > -{ > - const char *end = str + len; > - > - while (str < end) > - switch (*str) { > - case '$': > - if (!strncmp(str, "$C$", 3)) > - str += 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 += 4; > - else if (!strncmp(str, "$u20$", 5) > - || !strncmp(str, "$u27$", 5) > - || !strncmp(str, "$u5b$", 5) > - || !strncmp(str, "$u5d$", 5) > - || !strncmp(str, "$u7e$", 5)) > - str += 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 longer > - * than the demangled one. > - */ > -void > -rust_demangle_sym(char *sym) > -{ > - const char *in; > - char *out; > - const char *end; > - > - if (!sym) > - return; > - > - in = sym; > - out = sym; > - end = 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 == sym || in[-1] == ':') && in[1] == '$') > - in++; > - else > - *out++ = *in++; > - break; > - case '.': > - if (in[1] == '.') { > - /* ".." becomes "::" */ > - *out++ = ':'; > - *out++ = ':'; > - in += 2; > - } else { > - /* "." becomes "-" */ > - *out++ = '-'; > - in++; > - } > - break; > - case 'a' ... 'z': > - case 'A' ... 'Z': > - case '0' ... '9': > - case ':': > - *out++ = *in++; > - break; > - default: > - pr_err("demangle-rust: unexpected character '%c' in symbol\n", > - *in); > - goto done; > - } > - > -done: > - *out = '\0'; > -} > - > -static bool unescape(const char **in, char **out, const char *seq, char value) > -{ > - size_t len = strlen(seq); > - > - if (strncmp(*in, seq, len)) > - return false; > - > - **out = value; > - > - *in += len; > - *out += 1; > - > - return true; > -} > diff --git a/tools/perf/util/demangle-rust.h b/tools/perf/util/demangle-rust.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 = 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); > > return demangled; > } > -- > 2.25.1 -- - Arnaldo