diff options
author | Jeff Vander Stoep <jeffv@google.com> | 2023-04-03 14:39:59 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2023-04-03 14:39:59 +0000 |
commit | c6125975f41ef8dc37ee4c90407e60440e10e65d (patch) | |
tree | a16b79785c5f9ff4bc29ff22d67cc2a219ce8e00 | |
parent | ea5cc4af1105efa01c0dd783d87380bd898ec9fa (diff) | |
parent | 176e4876fc9ffb33c1defc835cf13a221e7a5725 (diff) | |
download | rustc-demangle-android14-qpr1-release.tar.gz |
Upgrade rustc-demangle to 0.1.22 am: 4473366c85 am: 78e6f4de4e am: 801ba615f9 am: 176e4876fcandroid-14.0.0_r45android-14.0.0_r44android-14.0.0_r43android-14.0.0_r42android-14.0.0_r41android-14.0.0_r40android-14.0.0_r39android-14.0.0_r38android-14.0.0_r27android-14.0.0_r26android-14.0.0_r25android-14.0.0_r24android-14.0.0_r23android-14.0.0_r22android-14.0.0_r21android-14.0.0_r20android-14.0.0_r19android-14.0.0_r18android-14.0.0_r17android-14.0.0_r16android14-qpr1-s2-releaseandroid14-qpr1-releaseandroid14-d2-s5-releaseandroid14-d2-s4-releaseandroid14-d2-s3-releaseandroid14-d2-s2-releaseandroid14-d2-s1-releaseandroid14-d2-release
Original change: https://android-review.googlesource.com/c/platform/external/rust/crates/rustc-demangle/+/2519957
Change-Id: I45992171068d2acc659b6d14d5e0e7bc1326cc78
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r-- | .cargo_vcs_info.json | 7 | ||||
-rw-r--r-- | .github/workflows/main.yml | 3 | ||||
-rw-r--r-- | Android.bp | 4 | ||||
-rw-r--r-- | Cargo.toml | 30 | ||||
-rw-r--r-- | Cargo.toml.orig | 7 | ||||
-rw-r--r-- | METADATA | 14 | ||||
-rw-r--r-- | src/lib.rs | 89 |
7 files changed, 133 insertions, 21 deletions
diff --git a/.cargo_vcs_info.json b/.cargo_vcs_info.json index 8dc2ce5..3b16060 100644 --- a/.cargo_vcs_info.json +++ b/.cargo_vcs_info.json @@ -1,5 +1,6 @@ { "git": { - "sha1": "2811a1ad6f7c8bead2ef3671e4fdc10de1553e96" - } -} + "sha1": "69fb82bd9c2da8b8977809e4d5d0c03109519831" + }, + "path_in_vcs": "" +}
\ No newline at end of file diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6ae8d0c..4397394 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -14,6 +14,7 @@ jobs: run: rustup update ${{ matrix.rust }} && rustup default ${{ matrix.rust }} - run: cargo build --all - run: cargo test --all + - run: cargo build --features std fuzz_targets: name: Fuzz Targets @@ -23,7 +24,7 @@ jobs: # Note that building with fuzzers requires nightly since it uses unstable # flags to rustc. - run: rustup update nightly && rustup default nightly - - run: cargo install cargo-fuzz --vers "^0.10" + - run: cargo install cargo-fuzz --vers "^0.11" - run: cargo fuzz build --dev rustfmt: @@ -44,7 +44,7 @@ rust_library { host_supported: true, crate_name: "rustc_demangle", cargo_env_compat: true, - cargo_pkg_version: "0.1.21", + cargo_pkg_version: "0.1.22", srcs: ["src/lib.rs"], edition: "2015", apex_available: [ @@ -67,7 +67,7 @@ rust_test { host_supported: true, crate_name: "rustc_demangle", cargo_env_compat: true, - cargo_pkg_version: "0.1.21", + cargo_pkg_version: "0.1.22", srcs: ["src/lib.rs"], test_suites: ["general-tests"], auto_gen_config: true, @@ -3,25 +3,35 @@ # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies -# to registry (e.g., crates.io) dependencies +# to registry (e.g., crates.io) dependencies. # -# If you believe there's an error in this file please file an -# issue against the rust-lang/cargo repository. If you're -# editing this file be aware that the upstream Cargo.toml -# will likely look very different (and much more reasonable) +# If you are reading this file be aware that the original Cargo.toml +# will likely look very different (and much more reasonable). +# See Cargo.toml.orig for the original contents. [package] name = "rustc-demangle" -version = "0.1.21" +version = "0.1.22" authors = ["Alex Crichton <alex@alexcrichton.com>"] -description = "Rust compiler symbol demangling.\n" +description = """ +Rust compiler symbol demangling. +""" homepage = "https://github.com/alexcrichton/rustc-demangle" documentation = "https://docs.rs/rustc-demangle" readme = "README.md" license = "MIT/Apache-2.0" repository = "https://github.com/alexcrichton/rustc-demangle" + +[package.metadata.docs.rs] +features = ["std"] +rustdoc-args = [ + "--cfg", + "docsrs", +] + [profile.release] lto = true + [dependencies.compiler_builtins] version = "0.1.2" optional = true @@ -32,4 +42,8 @@ optional = true package = "rustc-std-workspace-core" [features] -rustc-dep-of-std = ["core", "compiler_builtins"] +rustc-dep-of-std = [ + "core", + "compiler_builtins", +] +std = [] diff --git a/Cargo.toml.orig b/Cargo.toml.orig index 552e069..1deb42f 100644 --- a/Cargo.toml.orig +++ b/Cargo.toml.orig @@ -1,6 +1,6 @@ [package] name = "rustc-demangle" -version = "0.1.21" +version = "0.1.22" authors = ["Alex Crichton <alex@alexcrichton.com>"] license = "MIT/Apache-2.0" readme = "README.md" @@ -20,6 +20,11 @@ compiler_builtins = { version = '0.1.2', optional = true } [features] rustc-dep-of-std = ['core', 'compiler_builtins'] +std = [] [profile.release] lto = true + +[package.metadata.docs.rs] +features = ["std"] +rustdoc-args = ["--cfg", "docsrs"] @@ -1,3 +1,7 @@ +# This project was upgraded with external_updater. +# Usage: tools/external_updater/updater.sh update rust/crates/rustc-demangle +# For more info, check https://cs.android.com/android/platform/superproject/+/master:tools/external_updater/README.md + name: "rustc-demangle" description: "Rust compiler symbol demangling." third_party { @@ -7,13 +11,13 @@ third_party { } url { type: ARCHIVE - value: "https://static.crates.io/crates/rustc-demangle/rustc-demangle-0.1.21.crate" + value: "https://static.crates.io/crates/rustc-demangle/rustc-demangle-0.1.22.crate" } - version: "0.1.21" + version: "0.1.22" license_type: NOTICE last_upgrade_date { - year: 2021 - month: 9 - day: 22 + year: 2023 + month: 4 + day: 3 } } @@ -25,8 +25,9 @@ #![no_std] #![deny(missing_docs)] +#![cfg_attr(docsrs, feature(doc_cfg))] -#[cfg(test)] +#[cfg(any(test, feature = "std"))] #[macro_use] extern crate std; @@ -144,6 +145,74 @@ pub fn demangle(mut s: &str) -> Demangle { } } +#[cfg(feature = "std")] +fn demangle_line(line: &str, include_hash: bool) -> std::borrow::Cow<str> { + let mut line = std::borrow::Cow::Borrowed(line); + let mut head = 0; + loop { + // Move to the next potential match + head = match (line[head..].find("_ZN"), line[head..].find("_R")) { + (Some(idx), None) | (None, Some(idx)) => head + idx, + (Some(idx1), Some(idx2)) => head + idx1.min(idx2), + (None, None) => { + // No more matches, we can return our line. + return line; + } + }; + // Find the non-matching character. + // + // If we do not find a character, then until the end of the line is the + // thing to demangle. + let match_end = line[head..] + .find(|ch: char| !(ch == '$' || ch == '.' || ch == '_' || ch.is_ascii_alphanumeric())) + .map(|idx| head + idx) + .unwrap_or(line.len()); + + let mangled = &line[head..match_end]; + if let Ok(demangled) = try_demangle(mangled) { + let demangled = if include_hash { + format!("{}", demangled) + } else { + format!("{:#}", demangled) + }; + line.to_mut().replace_range(head..match_end, &demangled); + // Start again after the replacement. + head = head + demangled.len(); + } else { + // Skip over the full symbol. We don't try to find a partial Rust symbol in the wider + // matched text today. + head = head + mangled.len(); + } + } +} + +/// Process a stream of data from `input` into the provided `output`, demangling any symbols found +/// within. +/// +/// This currently is implemented by buffering each line of input in memory, but that may be +/// changed in the future. Symbols never cross line boundaries so this is just an implementation +/// detail. +#[cfg(feature = "std")] +#[cfg_attr(docsrs, doc(cfg(feature = "std")))] +pub fn demangle_stream<R: std::io::BufRead, W: std::io::Write>( + input: &mut R, + output: &mut W, + include_hash: bool, +) -> std::io::Result<()> { + let mut buf = std::string::String::new(); + // We read in lines to reduce the memory usage at any time. + // + // demangle_line is also more efficient with relatively small buffers as it will copy around + // trailing data during demangling. In the future we might directly stream to the output but at + // least right now that seems to be less efficient. + while input.read_line(&mut buf)? > 0 { + let demangled_line = demangle_line(&buf, include_hash); + output.write_all(demangled_line.as_bytes())?; + buf.clear(); + } + Ok(()) +} + /// Error returned from the `try_demangle` function below when demangling fails. #[derive(Debug, Clone)] pub struct TryDemangleError { @@ -490,4 +559,22 @@ mod tests { "{size limit reached}" ); } + + #[test] + #[cfg(feature = "std")] + fn find_multiple() { + assert_eq!( + super::demangle_line("_ZN3fooE.llvm moocow _ZN3fooE.llvm", false), + "foo.llvm moocow foo.llvm" + ); + } + + #[test] + #[cfg(feature = "std")] + fn interleaved_new_legacy() { + assert_eq!( + super::demangle_line("_ZN3fooE.llvm moocow _RNvMNtNtNtNtCs8a2262Dv4r_3mio3sys4unix8selector5epollNtB2_8Selector6select _ZN3fooE.llvm", false), + "foo.llvm moocow <mio::sys::unix::selector::epoll::Selector>::select foo.llvm" + ); + } } |