From nobody Fri Sep 5 20:10:01 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A789EBA53 for ; Wed, 30 Apr 2025 00:41:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745973706; cv=none; b=DlgAal0e7y4au88Z9O3MtLSgLTVjG60w4JtyU9W3BR75cC0dMPvpsgKHYYrPjJMgb03gmVo/u98Z7tztMebBmW6vrLEHrDBgHOh4Ur1P9nJtFFZUGjtJ+HO5s2UHo6Fn+hPnS2l8SEPegdj7PNc7xcy+hYbEIYcVJqsJPDpEaSI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745973706; c=relaxed/simple; bh=bQOUZ5ooNOtzWZnFpHAynQKZLkRbyLSyu+YVQL5hQ8U=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=GAMAXRgPZ/GwooIU4xrp3+SEyEe4bl8Isktz6sfTDfqymIOwzBKJJ2sM0z7NOzrGl2NQSrTo0kA3V2AKphj42j3ETnvIHuOqMQ3Sn7g4MjLNvqZZDoc+uHbOLA3346ItejwFcrWgz1myW0pofU+0Y5Y4GsNuociYu5rmTpJdIBU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=spaBFm9+; arc=none smtp.client-ip=209.85.214.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="spaBFm9+" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-225107fbdc7so62103255ad.0 for ; Tue, 29 Apr 2025 17:41:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1745973704; x=1746578504; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=3P8+0W8rcJSWHrA+D5OrYMrXp40a4gp5I5ey87XHEMw=; b=spaBFm9+O3gnVkVsjA8+1JMAuYnv+kV30KqWLfd73qsOO8OwEBZ+SeaHWpmuJ3K+AV WT/mt0RXDhRqKZI+GSddbO3ZZ4p+FdZm4+mdskNDngR0AsrRjvzjcfTeEWybDbwTsFc+ 1rHL1QA0uBdi4Y1pvpgaGKRIhmj/wnhzaV160qb3sjCbwmU3WDYmUrEs46idpUjHiiTE M/dwXJ2LX8ZiCTjRUfCZeJ5MBULmStqh98nzCL/D2wSUQ0d61k9yMrnt29T1HKGPNrbd LAY/dVSDpN58t2MhEfNqJ1mIbuL3QUCwiVTw+RLSIM7lmY4pjUkPl2iQXNpz93rtxOen K/Yw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745973704; x=1746578504; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=3P8+0W8rcJSWHrA+D5OrYMrXp40a4gp5I5ey87XHEMw=; b=jivi0KM25Xdc+Ckt4ygg0puSQugSncah9DveOgo/m6R9soIwY74LlI4U3fbB89rf2t YSPQCfT9vLGX9CZmKGx+otK4f5is/YTW8cnPKRUxlrdyInrw+3qv/XoliBaw+gnrxHGh JjrdVQRm5Sa5OdjNXJcJTOpqY8UN/ysY6tOSjij1m3kYIK+4qrKP1yOdin4XQeswSyUd geN0c8YuUpyLsBKQQGAgEDGu2zakovqVqJwkT8nrvoDBtga4TiGhfXTtAEb1zTgVNPz1 OInKenL0xrGk+U3l/TVpDX3rtAR7vwH9PdJchZoqjXviXb4tQ98Q7tkPU11nWJMf1Gib m+gA== X-Forwarded-Encrypted: i=1; AJvYcCVrSoXUcuyGj1Z/seexVq4GWzBDchJHigy7ZyToqsuqHi20C7WlkJYuZvgdSVANlGgv4EYx+2YNNSq5FLk=@vger.kernel.org X-Gm-Message-State: AOJu0Yy5lsBYxBJ+snQK1E9xoAgd/jU5pi//yrC6plrjwhu6DD6joXIL p9GWOvf2aV+Y6AR/8blH85j20bkJtIPeqo+KH3O6B3Muw/YW7lJyZHb+fi9nQtAgiHkJ8ZJxakz Y8gkPMA== X-Google-Smtp-Source: AGHT+IF6rGQczrBYLKeu5PIevKkC9hGr0+f3qbWmXMTSLnxpnnROvoClomrm5O7BzJV9EQmtFyeGFOVFy560 X-Received: from plbja7.prod.google.com ([2002:a17:902:efc7:b0:223:f59e:ae50]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:d4d1:b0:223:669f:ca2d with SMTP id d9443c01a7336-22df356d961mr21753095ad.35.1745973703883; Tue, 29 Apr 2025 17:41:43 -0700 (PDT) Date: Tue, 29 Apr 2025 17:41:25 -0700 In-Reply-To: <20250430004128.474388-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250430004128.474388-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.901.g37484f566f-goog Message-ID: <20250430004128.474388-4-irogers@google.com> Subject: [PATCH v2 3/6] perf demangle-rust: Remove previous legacy rust decoder From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Adrian Hunter , Kan Liang , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , "=?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?=" , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , James Clark , Howard Chu , Jiapeng Chong , Ravi Bangoria , "Masami Hiramatsu (Google)" , Stephen Brennan , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, rust-for-linux@vger.kernel.org, llvm@lists.linux.dev, Daniel Xu , Ariel Ben-Yehuda Cc: Ian Rogers Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Code is unused since the introduction of rustc-demangle demangler. Reviewed-by: Miguel Ojeda Signed-off-by: Ian Rogers --- tools/perf/util/demangle-rust.c | 269 -------------------------------- tools/perf/util/demangle-rust.h | 8 - 2 files changed, 277 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/demangle-rust.c b/tools/perf/util/demangle-rus= t.c deleted file mode 100644 index a659fc69f73a..000000000000 --- 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 2fca618b1aa5..000000000000 --- 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 */ --=20 2.49.0.901.g37484f566f-goog