From nobody Sat Oct 25 06:51:32 2025 Received: from mail-oo1-f74.google.com (mail-oo1-f74.google.com [209.85.161.74]) (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 44463254B1B for ; Tue, 29 Apr 2025 18:59:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.161.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745953157; cv=none; b=jQjXUHJIvw7MVlpYz0keOIFPY8KazQRfb0O1slIuiKR6E2BNP49svB3i9xdJ9wPnSSSvBPUFefRQ8Pl/ZMB4uTue7a/RoNeX+yWxNnBv3uAzcWsWqbJ0lkJzqMchp3m8Vkm/7lMiTTIwPUG91tFGKDXOx9CGSzMd4RTsrKVuh6c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745953157; c=relaxed/simple; bh=Ue9nBlH5+cpkAWpy3xS5x2aDum/rfACDGDSXckDBQ6U=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=b3xYK6pWxN4c+UX9XEgSgVbe9+ECyjegOwiXMFT9ZjfXOGhBRlUTZx1WPRlSw3/eR3Eqf8HZzpMl746DylP3CwFa4FhThmHQ1TLhV+blpAT4mgF6ec5nbYQC/PYPHP1PV2Dr5GnaNUbbX2/4noCE/vLP+PIEJflJ9CZKt5gJJQU= 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=GZcoDj+G; arc=none smtp.client-ip=209.85.161.74 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="GZcoDj+G" Received: by mail-oo1-f74.google.com with SMTP id 006d021491bc7-604aa7573f9so4797152eaf.1 for ; Tue, 29 Apr 2025 11:59:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1745953154; x=1746557954; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=V3LacVyFweeSGcTkDzNuZ/uQ5X4VwRZmHM3h5Mf2qTI=; b=GZcoDj+GLPK3jd+Ou+k8KzVzH+uWqA+igyMfIRmDUFs+b79nkSY9zOkSpY5hgCsKss 3hVlHfOLpNaENDqfV5wXW68mzsdtG6dYPiUS3irXDDzABNE3uIJFw9KyM+Rn3E/ATyRL Mu7Qa/UHpOWAk4d0cxb5zE5jtaJrskwkD7har4Z3oT+9kkUmMrt43SiziRhXy7o5r8bT uTfFZxKUQ+ilm82ljIaZCJy/y2xWYctWjMMpLfmMrNCVEnYKKjux2v8TID3wUwyLe/hn 4QIff0JKK3iy7EOxqweuOzmkFNBZxDW2Fdigu8F0wLtN/tP6H8MM+kVCRzzMEmINIP5Y cAGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745953154; x=1746557954; h=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=V3LacVyFweeSGcTkDzNuZ/uQ5X4VwRZmHM3h5Mf2qTI=; b=LIcZLw46vjhWdBAPPXjN0sNtqcbm1q2Ldhu86CPMXDichILmAzrqmEYnPNaiLKo1cq 8PkQsuFODcSFRA8sA+CyUn/hUId4TX+rfKYy1WScN31PKgxK/utmIGk6/nV1seg7vl4p KG7Q7LMGMFY4GsRT91B5Fmn8cOQW6FNXJFtz1e0u4NBahKOznXb6z9giUBJF6WeTDWub +eziKT+SrNkchJQrY5tw1Q2gvX5518dILNoGrXnCtwhCFAriwsqmvJYxaEWqxCJYI383 KHJQMIGgU7klDAAcPcrAN/fgUGJjH06N3WNaAkz0FYu+VCOMSVO/vrIhcv9IBLPwYejV CYgw== X-Forwarded-Encrypted: i=1; AJvYcCXpMsw6FKI3x65rBJ2kAerCISzO9g2Ywr411gSbcP84ZjZ43QxRbwerO9HEMgmtpQVtNzqW5JztbPwhaBA=@vger.kernel.org X-Gm-Message-State: AOJu0Yz57CINMPAo8YwTGdNn1hT0F+HDXY2ofuS1oATBJiU8aic6Tz4Z nhUCqtrxJaP08oUgkRSMRKGNMD9UDv7HpONmfenXm5Oy3QCvpe7JyTOscnMtsFfs4rPVwOzjgRO OIt/Kxg== X-Google-Smtp-Source: AGHT+IHo8G7rLNbyqpArjSn7VMDCd6TuEa5QJkNy4GHvHjVDGnlwNyMISwWDpJlDVXCjOyGw8WYcgr1naxp2 X-Received: from oabhp13.prod.google.com ([2002:a05:6870:9a8d:b0:2c8:7d3c:12cc]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6870:e2d6:b0:2c1:51f7:e648 with SMTP id 586e51a60fabf-2da6a38e449mr115049fac.35.1745953154406; Tue, 29 Apr 2025 11:59:14 -0700 (PDT) Date: Tue, 29 Apr 2025 11:58:35 -0700 In-Reply-To: <20250429185839.1807005-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: <20250429185839.1807005-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.901.g37484f566f-goog Message-ID: <20250429185839.1807005-4-irogers@google.com> Subject: [PATCH v1 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 , Ian Rogers , 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 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Code is unused since the introduction of rustc-demangle demangler. Signed-off-by: Ian Rogers Reviewed-by: Miguel Ojeda --- 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