diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-18 02:49:42 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-18 02:49:42 +0000 |
commit | 837b550238aa671a591ccf282dddeab29cadb206 (patch) | |
tree | 914b6b8862bace72bd3245ca184d374b08d8a672 /vendor/addr2line-0.17.0 | |
parent | Adding debian version 1.70.0+dfsg2-1. (diff) | |
download | rustc-837b550238aa671a591ccf282dddeab29cadb206.tar.xz rustc-837b550238aa671a591ccf282dddeab29cadb206.zip |
Merging upstream version 1.71.1+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/addr2line-0.17.0')
-rw-r--r-- | vendor/addr2line-0.17.0/.cargo-checksum.json | 1 | ||||
-rw-r--r-- | vendor/addr2line-0.17.0/CHANGELOG.md | 260 | ||||
-rw-r--r-- | vendor/addr2line-0.17.0/Cargo.lock | 430 | ||||
-rw-r--r-- | vendor/addr2line-0.17.0/Cargo.toml | 120 | ||||
-rw-r--r-- | vendor/addr2line-0.17.0/LICENSE-APACHE | 201 | ||||
-rw-r--r-- | vendor/addr2line-0.17.0/LICENSE-MIT | 25 | ||||
-rw-r--r-- | vendor/addr2line-0.17.0/README.md | 48 | ||||
-rw-r--r-- | vendor/addr2line-0.17.0/bench.plot.r | 23 | ||||
-rwxr-xr-x | vendor/addr2line-0.17.0/benchmark.sh | 112 | ||||
-rw-r--r-- | vendor/addr2line-0.17.0/coverage.sh | 5 | ||||
-rw-r--r-- | vendor/addr2line-0.17.0/examples/addr2line.rs | 299 | ||||
-rw-r--r-- | vendor/addr2line-0.17.0/rustfmt.toml | 1 | ||||
-rw-r--r-- | vendor/addr2line-0.17.0/src/function.rs | 520 | ||||
-rw-r--r-- | vendor/addr2line-0.17.0/src/lazy.rs | 29 | ||||
-rw-r--r-- | vendor/addr2line-0.17.0/src/lib.rs | 1192 | ||||
-rw-r--r-- | vendor/addr2line-0.17.0/tests/correctness.rs | 91 | ||||
-rw-r--r-- | vendor/addr2line-0.17.0/tests/output_equivalence.rs | 145 | ||||
-rw-r--r-- | vendor/addr2line-0.17.0/tests/parse.rs | 118 |
18 files changed, 0 insertions, 3620 deletions
diff --git a/vendor/addr2line-0.17.0/.cargo-checksum.json b/vendor/addr2line-0.17.0/.cargo-checksum.json deleted file mode 100644 index b43ad3bbf..000000000 --- a/vendor/addr2line-0.17.0/.cargo-checksum.json +++ /dev/null @@ -1 +0,0 @@ -{"files":{"CHANGELOG.md":"d4ef249a0a4eff26a34a1f847a3c367dfd9988b4da972ac9c16b1d258b62ad87","Cargo.lock":"290a48d58d1ebfef0f5eaec66191f6c1a41080b89e10e931c6984052008479ab","Cargo.toml":"68243a813e2e6ba40d3e939b9ade5489b3f39a58d7dc391ae447a60591315f4a","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"e99d88d232bf57d70f0fb87f6b496d44b6653f99f8a63d250a54c61ea4bcde40","README.md":"76d28502bd2e83f6a9e3576bd45e9a7fe5308448c4b5384b0d249515b5f67a5c","bench.plot.r":"6a5d7a4d36ed6b3d9919be703a479bef47698bf947818b483ff03951df2d4e01","benchmark.sh":"b35f89b1ca2c1dc0476cdd07f0284b72d41920d1c7b6054072f50ffba296d78d","coverage.sh":"4677e81922d08a82e83068a911717a247c66af12e559f37b78b6be3337ac9f07","examples/addr2line.rs":"75ef29e1d07d49d247990ad970892d64f629766bafa36afddff5a88976e58060","rustfmt.toml":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","src/function.rs":"395f37cdf03201d416d66bc11abeea627be0abb4585104acd927224a26cb9369","src/lazy.rs":"14ec61761369c21d426673f549c21394221533f444b68cd2a8370952eb19f345","src/lib.rs":"5696c0aee67df576f78935c66bb124f4e5fa19cbc9b25faf8f750e7e8dda113c","tests/correctness.rs":"c9325ffdec577bf5e56f5dd72fdff4927153d0a4c34c0fda5aefaeb44a8d26fd","tests/output_equivalence.rs":"38d7b585b7a2ca43b07eef6b34c11f489d1deae138a010123c33188dfb881c11","tests/parse.rs":"9e421ea9d9348721f6c6533cdba1db5b84287fc685f870c7905dea06b596b4db"},"package":"b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b"}
\ No newline at end of file diff --git a/vendor/addr2line-0.17.0/CHANGELOG.md b/vendor/addr2line-0.17.0/CHANGELOG.md deleted file mode 100644 index 914139400..000000000 --- a/vendor/addr2line-0.17.0/CHANGELOG.md +++ /dev/null @@ -1,260 +0,0 @@ -## 0.17.0 (2021/10/24) - -### Breaking changes - -* Updated `gimli` and `object` dependencies. - -### Changed - -* Use `skip_attributes` to improve performance. - [#236](https://github.com/gimli-rs/addr2line/pull/236) - --------------------------------------------------------------------------------- - -## 0.16.0 (2021/07/26) - -### Breaking changes - -* Updated `gimli` and `object` dependencies. - --------------------------------------------------------------------------------- - -## 0.15.2 (2021/06/04) - -### Fixed - -* Allow `Context` to be `Send`. - [#219](https://github.com/gimli-rs/addr2line/pull/219) - --------------------------------------------------------------------------------- - -## 0.15.1 (2021/05/02) - -### Fixed - -* Don't ignore aranges with address 0. - [#217](https://github.com/gimli-rs/addr2line/pull/217) - --------------------------------------------------------------------------------- - -## 0.15.0 (2021/05/02) - -### Breaking changes - -* Updated `gimli` and `object` dependencies. - [#215](https://github.com/gimli-rs/addr2line/pull/215) - -* Added `debug_aranges` parameter to `Context::from_sections`. - [#200](https://github.com/gimli-rs/addr2line/pull/200) - -### Added - -* Added `.debug_aranges` support. - [#200](https://github.com/gimli-rs/addr2line/pull/200) - -* Added supplementary object file support. - [#208](https://github.com/gimli-rs/addr2line/pull/208) - -### Fixed - -* Fixed handling of Windows paths in locations. - [#209](https://github.com/gimli-rs/addr2line/pull/209) - -* examples/addr2line: Flush stdout after each response. - [#210](https://github.com/gimli-rs/addr2line/pull/210) - -* examples/addr2line: Avoid copying every section. - [#213](https://github.com/gimli-rs/addr2line/pull/213) - --------------------------------------------------------------------------------- - -## 0.14.1 (2020/12/31) - -### Fixed - -* Fix location lookup for skeleton units. - [#201](https://github.com/gimli-rs/addr2line/pull/201) - -### Added - -* Added `Context::find_location_range`. - [#196](https://github.com/gimli-rs/addr2line/pull/196) - [#199](https://github.com/gimli-rs/addr2line/pull/199) - --------------------------------------------------------------------------------- - -## 0.14.0 (2020/10/27) - -### Breaking changes - -* Updated `gimli` and `object` dependencies. - -### Fixed - -* Handle units that only have line information. - [#188](https://github.com/gimli-rs/addr2line/pull/188) - -* Handle DWARF units with version <= 4 and no `DW_AT_name`. - [#191](https://github.com/gimli-rs/addr2line/pull/191) - -* Fix handling of `DW_FORM_ref_addr`. - [#193](https://github.com/gimli-rs/addr2line/pull/193) - --------------------------------------------------------------------------------- - -## 0.13.0 (2020/07/07) - -### Breaking changes - -* Updated `gimli` and `object` dependencies. - -* Added `rustc-dep-of-std` feature. - [#166](https://github.com/gimli-rs/addr2line/pull/166) - -### Changed - -* Improve performance by parsing function contents lazily. - [#178](https://github.com/gimli-rs/addr2line/pull/178) - -* Don't skip `.debug_info` and `.debug_line` entries with a zero address. - [#182](https://github.com/gimli-rs/addr2line/pull/182) - --------------------------------------------------------------------------------- - -## 0.12.2 (2020/06/21) - -### Fixed - -* Avoid linear search for `DW_FORM_ref_addr`. - [#175](https://github.com/gimli-rs/addr2line/pull/175) - --------------------------------------------------------------------------------- - -## 0.12.1 (2020/05/19) - -### Fixed - -* Handle units with overlapping address ranges. - [#163](https://github.com/gimli-rs/addr2line/pull/163) - -* Don't assert for functions with overlapping address ranges. - [#168](https://github.com/gimli-rs/addr2line/pull/168) - --------------------------------------------------------------------------------- - -## 0.12.0 (2020/05/12) - -### Breaking changes - -* Updated `gimli` and `object` dependencies. - -* Added more optional features: `smallvec` and `fallible-iterator`. - [#160](https://github.com/gimli-rs/addr2line/pull/160) - -### Added - -* Added `Context::dwarf` and `Context::find_dwarf_unit`. - [#159](https://github.com/gimli-rs/addr2line/pull/159) - -### Changed - -* Removed `lazycell` dependency. - [#160](https://github.com/gimli-rs/addr2line/pull/160) - --------------------------------------------------------------------------------- - -## 0.11.0 (2020/01/11) - -### Breaking changes - -* Updated `gimli` and `object` dependencies. - -* [#130](https://github.com/gimli-rs/addr2line/pull/130) - Changed `Location::file` from `Option<String>` to `Option<&str>`. - This required adding lifetime parameters to `Location` and other structs that - contain it. - -* [#152](https://github.com/gimli-rs/addr2line/pull/152) - Changed `Location::line` and `Location::column` from `Option<u64>`to `Option<u32>`. - -* [#156](https://github.com/gimli-rs/addr2line/pull/156) - Deleted `alloc` feature, and fixed `no-std` builds with stable rust. - Removed default `Reader` parameter for `Context`, and added `ObjectContext` instead. - -### Added - -* [#134](https://github.com/gimli-rs/addr2line/pull/134) - Added `Context::from_dwarf`. - -### Changed - -* [#133](https://github.com/gimli-rs/addr2line/pull/133) - Fixed handling of units that can't be parsed. - -* [#155](https://github.com/gimli-rs/addr2line/pull/155) - Fixed `addr2line` output to match binutils. - -* [#130](https://github.com/gimli-rs/addr2line/pull/130) - Improved `.debug_line` parsing performance. - -* [#148](https://github.com/gimli-rs/addr2line/pull/148) - [#150](https://github.com/gimli-rs/addr2line/pull/150) - [#151](https://github.com/gimli-rs/addr2line/pull/151) - [#152](https://github.com/gimli-rs/addr2line/pull/152) - Improved `.debug_info` parsing performance. - -* [#137](https://github.com/gimli-rs/addr2line/pull/137) - [#138](https://github.com/gimli-rs/addr2line/pull/138) - [#139](https://github.com/gimli-rs/addr2line/pull/139) - [#140](https://github.com/gimli-rs/addr2line/pull/140) - [#146](https://github.com/gimli-rs/addr2line/pull/146) - Improved benchmarks. - --------------------------------------------------------------------------------- - -## 0.10.0 (2019/07/07) - -### Breaking changes - -* [#127](https://github.com/gimli-rs/addr2line/pull/127) - Update `gimli`. - --------------------------------------------------------------------------------- - -## 0.9.0 (2019/05/02) - -### Breaking changes - -* [#121](https://github.com/gimli-rs/addr2line/pull/121) - Update `gimli`, `object`, and `fallible-iterator` dependencies. - -### Added - -* [#121](https://github.com/gimli-rs/addr2line/pull/121) - Reexport `gimli`, `object`, and `fallible-iterator`. - --------------------------------------------------------------------------------- - -## 0.8.0 (2019/02/06) - -### Breaking changes - -* [#107](https://github.com/gimli-rs/addr2line/pull/107) - Update `object` dependency to 0.11. This is part of the public API. - -### Added - -* [#101](https://github.com/gimli-rs/addr2line/pull/101) - Add `object` feature (enabled by default). Disable this feature to remove - the `object` dependency and `Context::new` API. - -* [#102](https://github.com/gimli-rs/addr2line/pull/102) - Add `std` (enabled by default) and `alloc` features. - -### Changed - -* [#108](https://github.com/gimli-rs/addr2line/issues/108) - `demangle` no longer ouputs the hash for rust symbols. - -* [#109](https://github.com/gimli-rs/addr2line/issues/109) - Set default `R` for `Context<R>`. diff --git a/vendor/addr2line-0.17.0/Cargo.lock b/vendor/addr2line-0.17.0/Cargo.lock deleted file mode 100644 index 630d72438..000000000 --- a/vendor/addr2line-0.17.0/Cargo.lock +++ /dev/null @@ -1,430 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e61f2b7f93d2c7d2b08263acaa4a363b3e276806c68af6134c44f523bf1aacd" -dependencies = [ - "gimli 0.25.0", -] - -[[package]] -name = "addr2line" -version = "0.17.0" -dependencies = [ - "backtrace", - "clap", - "compiler_builtins", - "cpp_demangle", - "fallible-iterator", - "findshlibs", - "gimli 0.26.0", - "memmap", - "object", - "rustc-demangle", - "rustc-std-workspace-alloc", - "rustc-std-workspace-core", - "rustc-test", - "smallvec", - "typed-arena", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "ansi_term" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi", - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "autocfg" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" - -[[package]] -name = "backtrace" -version = "0.3.62" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "091bcdf2da9950f96aa522681ce805e6857f6ca8df73833d35736ab2dc78e152" -dependencies = [ - "addr2line 0.16.0", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "cc" -version = "1.0.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79c2681d6594606957bbb8631c4b90a7fcaaa72cdb714743a437b156d6a7eedd" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "clap" -version = "2.33.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" -dependencies = [ - "ansi_term", - "atty", - "bitflags", - "strsim", - "textwrap", - "unicode-width", - "vec_map", -] - -[[package]] -name = "compiler_builtins" -version = "0.1.51" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3587b3669d6f2c1cfd34c475272dabcfef29d52703933f6f72ebb36d6bd81a97" - -[[package]] -name = "cpp_demangle" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea47428dc9d2237f3c6bc134472edfd63ebba0af932e783506dcfd66f10d18a" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crc32fast" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "fallible-iterator" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" - -[[package]] -name = "findshlibs" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d691fdb3f817632d259d09220d4cf0991dbb2c9e59e044a02a59194bf6e14484" -dependencies = [ - "cc", - "lazy_static", - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "flate2" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" -dependencies = [ - "cfg-if", - "crc32fast", - "libc", - "miniz_oxide", -] - -[[package]] -name = "getopts" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "gimli" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0a01e0497841a3b2db4f8afa483cce65f7e96a3498bd6c541734792aeac8fe7" - -[[package]] -name = "gimli" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81a03ce013ffccead76c11a15751231f777d9295b845cc1266ed4d34fcbd7977" -dependencies = [ - "compiler_builtins", - "fallible-iterator", - "rustc-std-workspace-alloc", - "rustc-std-workspace-core", - "stable_deref_trait", -] - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "libc" -version = "0.2.105" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "869d572136620d55835903746bcb5cdc54cb2851fd0aeec53220b4bb65ef3013" - -[[package]] -name = "memchr" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" - -[[package]] -name = "memmap" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" -dependencies = [ - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "miniz_oxide" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" -dependencies = [ - "adler", - "autocfg", -] - -[[package]] -name = "object" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ac1d3f9a1d3616fd9a60c8d74296f22406a238b6a72f5cc1e6f314df4ffbf9" -dependencies = [ - "flate2", - "memchr", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" - -[[package]] -name = "rustc-serialize" -version = "0.3.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" - -[[package]] -name = "rustc-std-workspace-alloc" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff66d57013a5686e1917ed6a025d54dd591fcda71a41fe07edf4d16726aefa86" - -[[package]] -name = "rustc-std-workspace-core" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1956f5517128a2b6f23ab2dadf1a976f4f5b27962e7724c2bf3d45e539ec098c" - -[[package]] -name = "rustc-test" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aacc7967b0ae83af208c8caf2781cbf96f01dac0157cd89f7f05324d6d4e59bb" -dependencies = [ - "getopts", - "libc", - "rustc-serialize", - "rustc_version", - "term", - "time", -] - -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver", -] - -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - -[[package]] -name = "smallvec" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - -[[package]] -name = "term" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa63644f74ce96fbeb9b794f66aff2a52d601cbd5e80f4b97123e3899f4570f1" -dependencies = [ - "kernel32-sys", - "winapi 0.2.8", -] - -[[package]] -name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "time" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" -dependencies = [ - "libc", - "wasi", - "winapi 0.3.9", -] - -[[package]] -name = "typed-arena" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0685c84d5d54d1c26f7d3eb96cd41550adb97baed141a761cf335d3d33bcd0ae" - -[[package]] -name = "unicode-width" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" - -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - -[[package]] -name = "winapi" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/vendor/addr2line-0.17.0/Cargo.toml b/vendor/addr2line-0.17.0/Cargo.toml deleted file mode 100644 index 358995e53..000000000 --- a/vendor/addr2line-0.17.0/Cargo.toml +++ /dev/null @@ -1,120 +0,0 @@ -# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO -# -# 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 -# -# 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) - -[package] -name = "addr2line" -version = "0.17.0" -exclude = ["/benches/*", "/fixtures/*", ".github"] -description = "A cross-platform symbolication library written in Rust, using `gimli`" -documentation = "https://docs.rs/addr2line" -readme = "./README.md" -keywords = ["DWARF", "debug", "elf", "symbolicate", "atos"] -categories = ["development-tools::debugging"] -license = "Apache-2.0 OR MIT" -repository = "https://github.com/gimli-rs/addr2line" -[profile.bench] -codegen-units = 1 -debug = true -split-debuginfo = "packed" - -[profile.dev] -split-debuginfo = "packed" - -[profile.release] -debug = true -split-debuginfo = "packed" - -[profile.test] -split-debuginfo = "packed" - -[[example]] -name = "addr2line" -required-features = ["std-object"] - -[[test]] -name = "output_equivalence" -harness = false -required-features = ["std-object"] - -[[test]] -name = "correctness" -required-features = ["default"] - -[[test]] -name = "parse" -required-features = ["std-object"] -[dependencies.alloc] -version = "1.0.0" -optional = true -package = "rustc-std-workspace-alloc" - -[dependencies.compiler_builtins] -version = "0.1.2" -optional = true - -[dependencies.core] -version = "1.0.0" -optional = true -package = "rustc-std-workspace-core" - -[dependencies.cpp_demangle] -version = "0.3" -optional = true -default-features = false - -[dependencies.fallible-iterator] -version = "0.2" -optional = true -default-features = false - -[dependencies.gimli] -version = "0.26" -features = ["read"] -default-features = false - -[dependencies.object] -version = "0.27.1" -features = ["read"] -optional = true -default-features = false - -[dependencies.rustc-demangle] -version = "0.1" -optional = true - -[dependencies.smallvec] -version = "1" -optional = true -default-features = false -[dev-dependencies.backtrace] -version = "0.3.13" - -[dev-dependencies.clap] -version = "2" - -[dev-dependencies.findshlibs] -version = "0.10" - -[dev-dependencies.memmap] -version = "0.7" - -[dev-dependencies.rustc-test] -version = "0.3" - -[dev-dependencies.typed-arena] -version = "2" - -[features] -default = ["rustc-demangle", "cpp_demangle", "std-object", "fallible-iterator", "smallvec"] -rustc-dep-of-std = ["core", "alloc", "compiler_builtins", "gimli/rustc-dep-of-std"] -std = ["gimli/std"] -std-object = ["std", "object", "object/std", "object/compression", "gimli/endian-reader"] diff --git a/vendor/addr2line-0.17.0/LICENSE-APACHE b/vendor/addr2line-0.17.0/LICENSE-APACHE deleted file mode 100644 index 16fe87b06..000000000 --- a/vendor/addr2line-0.17.0/LICENSE-APACHE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/vendor/addr2line-0.17.0/LICENSE-MIT b/vendor/addr2line-0.17.0/LICENSE-MIT deleted file mode 100644 index 3a03f1f85..000000000 --- a/vendor/addr2line-0.17.0/LICENSE-MIT +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2016-2018 The gimli Developers - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/vendor/addr2line-0.17.0/README.md b/vendor/addr2line-0.17.0/README.md deleted file mode 100644 index dc6cb9344..000000000 --- a/vendor/addr2line-0.17.0/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# addr2line - -[![](https://img.shields.io/crates/v/addr2line.svg)](https://crates.io/crates/addr2line) -[![](https://img.shields.io/docsrs/addr2line.svg)](https://docs.rs/addr2line) -[![Coverage Status](https://coveralls.io/repos/github/gimli-rs/addr2line/badge.svg?branch=master)](https://coveralls.io/github/gimli-rs/addr2line?branch=master) - -A cross-platform library for retrieving per-address debug information -from files with DWARF debug information. - -`addr2line` uses [`gimli`](https://github.com/gimli-rs/gimli) to parse -the debug information, and exposes an interface for finding -the source file, line number, and wrapping function for instruction -addresses within the target program. These lookups can either be -performed programmatically through `Context::find_location` and -`Context::find_frames`, or via the included example binary, -`addr2line` (named and modelled after the equivalent utility from -[GNU binutils](https://sourceware.org/binutils/docs/binutils/addr2line.html)). - -# Quickstart - - Add the [`addr2line` crate](https://crates.io/crates/addr2line) to your `Cargo.toml` - - Load the file and parse it with [`addr2line::object::read::File::parse`](https://docs.rs/object/*/object/read/struct.File.html#method.parse) - - Pass the parsed file to [`addr2line::Context::new` ](https://docs.rs/addr2line/*/addr2line/struct.Context.html#method.new) - - Use [`addr2line::Context::find_location`](https://docs.rs/addr2line/*/addr2line/struct.Context.html#method.find_location) - or [`addr2line::Context::find_frames`](https://docs.rs/addr2line/*/addr2line/struct.Context.html#method.find_frames) - to look up debug information for an address - -# Performance - -`addr2line` optimizes for speed over memory by caching parsed information. -The DWARF information is parsed lazily where possible. - -The library aims to perform similarly to equivalent existing tools such -as `addr2line` from binutils, `eu-addr2line` from elfutils, and -`llvm-symbolize` from the llvm project, and in the past some benchmarking -was done that indicates a comparable performance. - -## License - -Licensed under either of - - * Apache License, Version 2.0 ([`LICENSE-APACHE`](./LICENSE-APACHE) or https://www.apache.org/licenses/LICENSE-2.0) - * MIT license ([`LICENSE-MIT`](./LICENSE-MIT) or https://opensource.org/licenses/MIT) - -at your option. - -Unless you explicitly state otherwise, any contribution intentionally submitted -for inclusion in the work by you, as defined in the Apache-2.0 license, shall be -dual licensed as above, without any additional terms or conditions. diff --git a/vendor/addr2line-0.17.0/bench.plot.r b/vendor/addr2line-0.17.0/bench.plot.r deleted file mode 100644 index ecbf24893..000000000 --- a/vendor/addr2line-0.17.0/bench.plot.r +++ /dev/null @@ -1,23 +0,0 @@ -v <- read.table(file("stdin")) -t <- data.frame(prog=v[,1], funcs=(v[,2]=="func"), time=v[,3], mem=v[,4], stringsAsFactors=FALSE) - -t$prog <- as.character(t$prog) -t$prog[t$prog == "master"] <- "gimli-rs/addr2line" -t$funcs[t$funcs == TRUE] <- "With functions" -t$funcs[t$funcs == FALSE] <- "File/line only" -t$mem = t$mem / 1024.0 - -library(ggplot2) -p <- ggplot(data=t, aes(x=prog, y=time, fill=prog)) -p <- p + geom_bar(stat = "identity") -p <- p + facet_wrap(~ funcs) -p <- p + theme(axis.title.x=element_blank(), axis.text.x=element_blank(), axis.ticks.x=element_blank()) -p <- p + ylab("time (s)") + ggtitle("addr2line runtime") -ggsave('time.png',plot=p,width=10,height=6) - -p <- ggplot(data=t, aes(x=prog, y=mem, fill=prog)) -p <- p + geom_bar(stat = "identity") -p <- p + facet_wrap(~ funcs) -p <- p + theme(axis.title.x=element_blank(), axis.text.x=element_blank(), axis.ticks.x=element_blank()) -p <- p + ylab("memory (kB)") + ggtitle("addr2line memory usage") -ggsave('memory.png',plot=p,width=10,height=6) diff --git a/vendor/addr2line-0.17.0/benchmark.sh b/vendor/addr2line-0.17.0/benchmark.sh deleted file mode 100755 index ca4c4f6ec..000000000 --- a/vendor/addr2line-0.17.0/benchmark.sh +++ /dev/null @@ -1,112 +0,0 @@ -#!/bin/bash -if [[ $# -le 1 ]]; then - echo "Usage: $0 <executable> [<addresses>] REFS..." - exit 1 -fi -target="$1" -shift - -addresses="" -if [[ -e "$1" ]]; then - addresses="$1" - shift -fi - -# path to "us" -# readlink -f, but more portable: -dirname=$(perl -e 'use Cwd "abs_path";print abs_path(shift)' "$(dirname "$0")") - -# https://stackoverflow.com/a/2358432/472927 -{ - # compile all refs - pushd "$dirname" > /dev/null - # if the user has some local changes, preserve them - nstashed=$(git stash list | wc -l) - echo "==> Stashing any local modifications" - git stash --keep-index > /dev/null - popstash() { - # https://stackoverflow.com/q/24520791/472927 - if [[ "$(git stash list | wc -l)" -ne "$nstashed" ]]; then - echo "==> Restoring stashed state" - git stash pop > /dev/null - fi - } - # if the user has added stuff to the index, abort - if ! git diff-index --quiet HEAD --; then - echo "Refusing to overwrite outstanding git changes" - popstash - exit 2 - fi - current=$(git symbolic-ref --short HEAD) - for ref in "$@"; do - echo "==> Compiling $ref" - git checkout -q "$ref" - commit=$(git rev-parse HEAD) - fn="target/release/addr2line-$commit" - if [[ ! -e "$fn" ]]; then - cargo build --release --example addr2line - cp target/release/examples/addr2line "$fn" - fi - if [[ "$ref" != "$commit" ]]; then - ln -sfn "addr2line-$commit" target/release/addr2line-"$ref" - fi - done - git checkout -q "$current" - popstash - popd > /dev/null - - # get us some addresses to look up - if [[ -z "$addresses" ]]; then - echo "==> Looking for benchmarking addresses (this may take a while)" - addresses=$(mktemp tmp.XXXXXXXXXX) - objdump -C -x --disassemble -l "$target" \ - | grep -P '0[048]:' \ - | awk '{print $1}' \ - | sed 's/:$//' \ - > "$addresses" - echo " -> Addresses stored in $addresses; you should re-use it next time" - fi - - run() { - func="$1" - name="$2" - cmd="$3" - args="$4" - printf "%s\t%s\t" "$name" "$func" - if [[ "$cmd" =~ llvm-symbolizer ]]; then - /usr/bin/time -f '%e\t%M' "$cmd" $args -obj="$target" < "$addresses" 2>&1 >/dev/null - else - /usr/bin/time -f '%e\t%M' "$cmd" $args -e "$target" < "$addresses" 2>&1 >/dev/null - fi - } - - # run without functions - log1=$(mktemp tmp.XXXXXXXXXX) - echo "==> Benchmarking" - run nofunc binutils addr2line >> "$log1" - #run nofunc elfutils eu-addr2line >> "$log1" - run nofunc llvm-sym llvm-symbolizer -functions=none >> "$log1" - for ref in "$@"; do - run nofunc "$ref" "$dirname/target/release/addr2line-$ref" >> "$log1" - done - cat "$log1" | column -t - - # run with functions - log2=$(mktemp tmp.XXXXXXXXXX) - echo "==> Benchmarking with -f" - run func binutils addr2line "-f -i" >> "$log2" - #run func elfutils eu-addr2line "-f -i" >> "$log2" - run func llvm-sym llvm-symbolizer "-functions=linkage -demangle=0" >> "$log2" - for ref in "$@"; do - run func "$ref" "$dirname/target/release/addr2line-$ref" "-f -i" >> "$log2" - done - cat "$log2" | column -t - cat "$log2" >> "$log1"; rm "$log2" - - echo "==> Plotting" - Rscript --no-readline --no-restore --no-save "$dirname/bench.plot.r" < "$log1" - - echo "==> Cleaning up" - rm "$log1" - exit 0 -} diff --git a/vendor/addr2line-0.17.0/coverage.sh b/vendor/addr2line-0.17.0/coverage.sh deleted file mode 100644 index 892c0b7fa..000000000 --- a/vendor/addr2line-0.17.0/coverage.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -# Run tarpaulin and pycobertura to generate coverage.html. - -cargo tarpaulin --skip-clean --out Xml -pycobertura show --format html --output coverage.html cobertura.xml diff --git a/vendor/addr2line-0.17.0/examples/addr2line.rs b/vendor/addr2line-0.17.0/examples/addr2line.rs deleted file mode 100644 index 4b228a706..000000000 --- a/vendor/addr2line-0.17.0/examples/addr2line.rs +++ /dev/null @@ -1,299 +0,0 @@ -extern crate addr2line; -extern crate clap; -extern crate fallible_iterator; -extern crate gimli; -extern crate memmap; -extern crate object; -extern crate typed_arena; - -use std::borrow::Cow; -use std::fs::File; -use std::io::{BufRead, Lines, StdinLock, Write}; -use std::path::Path; - -use clap::{App, Arg, Values}; -use fallible_iterator::FallibleIterator; -use object::{Object, ObjectSection}; -use typed_arena::Arena; - -use addr2line::{Context, Location}; - -fn parse_uint_from_hex_string(string: &str) -> u64 { - if string.len() > 2 && string.starts_with("0x") { - u64::from_str_radix(&string[2..], 16).expect("Failed to parse address") - } else { - u64::from_str_radix(string, 16).expect("Failed to parse address") - } -} - -enum Addrs<'a> { - Args(Values<'a>), - Stdin(Lines<StdinLock<'a>>), -} - -impl<'a> Iterator for Addrs<'a> { - type Item = u64; - - fn next(&mut self) -> Option<u64> { - let text = match *self { - Addrs::Args(ref mut vals) => vals.next().map(Cow::from), - Addrs::Stdin(ref mut lines) => lines.next().map(Result::unwrap).map(Cow::from), - }; - text.as_ref() - .map(Cow::as_ref) - .map(parse_uint_from_hex_string) - } -} - -fn print_loc(loc: &Option<Location>, basenames: bool, llvm: bool) { - if let Some(ref loc) = *loc { - let file = loc.file.as_ref().unwrap(); - let path = if basenames { - Path::new(Path::new(file).file_name().unwrap()) - } else { - Path::new(file) - }; - print!("{}:", path.display()); - if llvm { - print!("{}:{}", loc.line.unwrap_or(0), loc.column.unwrap_or(0)); - } else if let Some(line) = loc.line { - print!("{}", line); - } else { - print!("?"); - } - println!(); - } else if llvm { - println!("??:0:0"); - } else { - println!("??:?"); - } -} - -fn print_function(name: &str, language: Option<gimli::DwLang>, demangle: bool) { - if demangle { - print!("{}", addr2line::demangle_auto(Cow::from(name), language)); - } else { - print!("{}", name); - } -} - -fn load_file_section<'input, 'arena, Endian: gimli::Endianity>( - id: gimli::SectionId, - file: &object::File<'input>, - endian: Endian, - arena_data: &'arena Arena<Cow<'input, [u8]>>, -) -> Result<gimli::EndianSlice<'arena, Endian>, ()> { - // TODO: Unify with dwarfdump.rs in gimli. - let name = id.name(); - match file.section_by_name(name) { - Some(section) => match section.uncompressed_data().unwrap() { - Cow::Borrowed(b) => Ok(gimli::EndianSlice::new(b, endian)), - Cow::Owned(b) => Ok(gimli::EndianSlice::new(arena_data.alloc(b.into()), endian)), - }, - None => Ok(gimli::EndianSlice::new(&[][..], endian)), - } -} - -fn main() { - let matches = App::new("hardliner") - .version("0.1") - .about("A fast addr2line clone") - .arg( - Arg::with_name("exe") - .short("e") - .long("exe") - .value_name("filename") - .help( - "Specify the name of the executable for which addresses should be translated.", - ) - .required(true), - ) - .arg( - Arg::with_name("sup") - .long("sup") - .value_name("filename") - .help("Path to supplementary object file."), - ) - .arg( - Arg::with_name("functions") - .short("f") - .long("functions") - .help("Display function names as well as file and line number information."), - ) - .arg( - Arg::with_name("pretty") - .short("p") - .long("pretty-print") - .help( - "Make the output more human friendly: each location are printed on \ - one line.", - ), - ) - .arg(Arg::with_name("inlines").short("i").long("inlines").help( - "If the address belongs to a function that was inlined, the source \ - information for all enclosing scopes back to the first non-inlined \ - function will also be printed.", - )) - .arg( - Arg::with_name("addresses") - .short("a") - .long("addresses") - .help( - "Display the address before the function name, file and line \ - number information.", - ), - ) - .arg( - Arg::with_name("basenames") - .short("s") - .long("basenames") - .help("Display only the base of each file name."), - ) - .arg(Arg::with_name("demangle").short("C").long("demangle").help( - "Demangle function names. \ - Specifying a specific demangling style (like GNU addr2line) \ - is not supported. (TODO)", - )) - .arg( - Arg::with_name("llvm") - .long("llvm") - .help("Display output in the same format as llvm-symbolizer."), - ) - .arg( - Arg::with_name("addrs") - .takes_value(true) - .multiple(true) - .help("Addresses to use instead of reading from stdin."), - ) - .get_matches(); - - let arena_data = Arena::new(); - - let do_functions = matches.is_present("functions"); - let do_inlines = matches.is_present("inlines"); - let pretty = matches.is_present("pretty"); - let print_addrs = matches.is_present("addresses"); - let basenames = matches.is_present("basenames"); - let demangle = matches.is_present("demangle"); - let llvm = matches.is_present("llvm"); - let path = matches.value_of("exe").unwrap(); - - let file = File::open(path).unwrap(); - let map = unsafe { memmap::Mmap::map(&file).unwrap() }; - let object = &object::File::parse(&*map).unwrap(); - - let endian = if object.is_little_endian() { - gimli::RunTimeEndian::Little - } else { - gimli::RunTimeEndian::Big - }; - - let mut load_section = |id: gimli::SectionId| -> Result<_, _> { - load_file_section(id, object, endian, &arena_data) - }; - - let sup_map; - let sup_object = if let Some(sup_path) = matches.value_of("sup") { - let sup_file = File::open(sup_path).unwrap(); - sup_map = unsafe { memmap::Mmap::map(&sup_file).unwrap() }; - Some(object::File::parse(&*sup_map).unwrap()) - } else { - None - }; - - let symbols = object.symbol_map(); - let mut dwarf = gimli::Dwarf::load(&mut load_section).unwrap(); - if let Some(ref sup_object) = sup_object { - let mut load_sup_section = |id: gimli::SectionId| -> Result<_, _> { - load_file_section(id, sup_object, endian, &arena_data) - }; - dwarf.load_sup(&mut load_sup_section).unwrap(); - } - - let ctx = Context::from_dwarf(dwarf).unwrap(); - - let stdin = std::io::stdin(); - let addrs = matches - .values_of("addrs") - .map(Addrs::Args) - .unwrap_or_else(|| Addrs::Stdin(stdin.lock().lines())); - - for probe in addrs { - if print_addrs { - if llvm { - print!("0x{:x}", probe); - } else { - print!("0x{:016x}", probe); - } - if pretty { - print!(": "); - } else { - println!(); - } - } - - if do_functions || do_inlines { - let mut printed_anything = false; - let mut frames = ctx.find_frames(probe).unwrap().enumerate(); - while let Some((i, frame)) = frames.next().unwrap() { - if pretty && i != 0 { - print!(" (inlined by) "); - } - - if do_functions { - if let Some(func) = frame.function { - print_function(&func.raw_name().unwrap(), func.language, demangle); - } else if let Some(name) = symbols.get(probe).map(|x| x.name()) { - print_function(name, None, demangle); - } else { - print!("??"); - } - - if pretty { - print!(" at "); - } else { - println!(); - } - } - - print_loc(&frame.location, basenames, llvm); - - printed_anything = true; - - if !do_inlines { - break; - } - } - - if !printed_anything { - if do_functions { - if let Some(name) = symbols.get(probe).map(|x| x.name()) { - print_function(name, None, demangle); - } else { - print!("??"); - } - - if pretty { - print!(" at "); - } else { - println!(); - } - } - - if llvm { - println!("??:0:0"); - } else { - println!("??:?"); - } - } - } else { - let loc = ctx.find_location(probe).unwrap(); - print_loc(&loc, basenames, llvm); - } - - if llvm { - println!(); - } - std::io::stdout().flush().unwrap(); - } -} diff --git a/vendor/addr2line-0.17.0/rustfmt.toml b/vendor/addr2line-0.17.0/rustfmt.toml deleted file mode 100644 index 8b1378917..000000000 --- a/vendor/addr2line-0.17.0/rustfmt.toml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/vendor/addr2line-0.17.0/src/function.rs b/vendor/addr2line-0.17.0/src/function.rs deleted file mode 100644 index 1589acdbe..000000000 --- a/vendor/addr2line-0.17.0/src/function.rs +++ /dev/null @@ -1,520 +0,0 @@ -use alloc::boxed::Box; -use alloc::vec::Vec; -use core::cmp::Ordering; -use core::iter; - -use crate::lazy::LazyCell; -use crate::maybe_small; -use crate::{Error, RangeAttributes, ResDwarf}; - -pub(crate) struct Functions<R: gimli::Reader> { - /// List of all `DW_TAG_subprogram` details in the unit. - pub(crate) functions: Box< - [( - gimli::UnitOffset<R::Offset>, - LazyCell<Result<Function<R>, Error>>, - )], - >, - /// List of `DW_TAG_subprogram` address ranges in the unit. - pub(crate) addresses: Box<[FunctionAddress]>, -} - -/// A single address range for a function. -/// -/// It is possible for a function to have multiple address ranges; this -/// is handled by having multiple `FunctionAddress` entries with the same -/// `function` field. -pub(crate) struct FunctionAddress { - range: gimli::Range, - /// An index into `Functions::functions`. - pub(crate) function: usize, -} - -pub(crate) struct Function<R: gimli::Reader> { - pub(crate) dw_die_offset: gimli::UnitOffset<R::Offset>, - pub(crate) name: Option<R>, - /// List of all `DW_TAG_inlined_subroutine` details in this function. - inlined_functions: Box<[InlinedFunction<R>]>, - /// List of `DW_TAG_inlined_subroutine` address ranges in this function. - inlined_addresses: Box<[InlinedFunctionAddress]>, -} - -pub(crate) struct InlinedFunctionAddress { - range: gimli::Range, - call_depth: usize, - /// An index into `Function::inlined_functions`. - function: usize, -} - -pub(crate) struct InlinedFunction<R: gimli::Reader> { - pub(crate) dw_die_offset: gimli::UnitOffset<R::Offset>, - pub(crate) name: Option<R>, - pub(crate) call_file: u64, - pub(crate) call_line: u32, - pub(crate) call_column: u32, -} - -impl<R: gimli::Reader> Functions<R> { - pub(crate) fn parse(unit: &gimli::Unit<R>, dwarf: &ResDwarf<R>) -> Result<Functions<R>, Error> { - let mut functions = Vec::new(); - let mut addresses = Vec::new(); - let mut entries = unit.entries_raw(None)?; - while !entries.is_empty() { - let dw_die_offset = entries.next_offset(); - if let Some(abbrev) = entries.read_abbreviation()? { - if abbrev.tag() == gimli::DW_TAG_subprogram { - let mut ranges = RangeAttributes::default(); - for spec in abbrev.attributes() { - match entries.read_attribute(*spec) { - Ok(ref attr) => { - match attr.name() { - gimli::DW_AT_low_pc => { - if let gimli::AttributeValue::Addr(val) = attr.value() { - ranges.low_pc = Some(val); - } - } - gimli::DW_AT_high_pc => match attr.value() { - gimli::AttributeValue::Addr(val) => { - ranges.high_pc = Some(val) - } - gimli::AttributeValue::Udata(val) => { - ranges.size = Some(val) - } - _ => {} - }, - gimli::DW_AT_ranges => { - ranges.ranges_offset = dwarf - .sections - .attr_ranges_offset(unit, attr.value())?; - } - _ => {} - }; - } - Err(e) => return Err(e), - } - } - - let function_index = functions.len(); - if ranges.for_each_range(&dwarf.sections, unit, |range| { - addresses.push(FunctionAddress { - range, - function: function_index, - }); - })? { - functions.push((dw_die_offset, LazyCell::new())); - } - } else { - entries.skip_attributes(abbrev.attributes())?; - } - } - } - - // The binary search requires the addresses to be sorted. - // - // It also requires them to be non-overlapping. In practice, overlapping - // function ranges are unlikely, so we don't try to handle that yet. - // - // It's possible for multiple functions to have the same address range if the - // compiler can detect and remove functions with identical code. In that case - // we'll nondeterministically return one of them. - addresses.sort_by_key(|x| x.range.begin); - - Ok(Functions { - functions: functions.into_boxed_slice(), - addresses: addresses.into_boxed_slice(), - }) - } - - pub(crate) fn find_address(&self, probe: u64) -> Option<usize> { - self.addresses - .binary_search_by(|address| { - if probe < address.range.begin { - Ordering::Greater - } else if probe >= address.range.end { - Ordering::Less - } else { - Ordering::Equal - } - }) - .ok() - } - - pub(crate) fn parse_inlined_functions( - &self, - unit: &gimli::Unit<R>, - dwarf: &ResDwarf<R>, - ) -> Result<(), Error> { - for function in &*self.functions { - function - .1 - .borrow_with(|| Function::parse(function.0, unit, dwarf)) - .as_ref() - .map_err(Error::clone)?; - } - Ok(()) - } -} - -impl<R: gimli::Reader> Function<R> { - pub(crate) fn parse( - dw_die_offset: gimli::UnitOffset<R::Offset>, - unit: &gimli::Unit<R>, - dwarf: &ResDwarf<R>, - ) -> Result<Self, Error> { - let mut entries = unit.entries_raw(Some(dw_die_offset))?; - let depth = entries.next_depth(); - let abbrev = entries.read_abbreviation()?.unwrap(); - debug_assert_eq!(abbrev.tag(), gimli::DW_TAG_subprogram); - - let mut name = None; - for spec in abbrev.attributes() { - match entries.read_attribute(*spec) { - Ok(ref attr) => { - match attr.name() { - gimli::DW_AT_linkage_name | gimli::DW_AT_MIPS_linkage_name => { - if let Ok(val) = dwarf.sections.attr_string(unit, attr.value()) { - name = Some(val); - } - } - gimli::DW_AT_name => { - if name.is_none() { - name = dwarf.sections.attr_string(unit, attr.value()).ok(); - } - } - gimli::DW_AT_abstract_origin | gimli::DW_AT_specification => { - if name.is_none() { - name = name_attr(attr.value(), unit, dwarf, 16)?; - } - } - _ => {} - }; - } - Err(e) => return Err(e), - } - } - - let mut inlined_functions = Vec::new(); - let mut inlined_addresses = Vec::new(); - Function::parse_children( - &mut entries, - depth, - unit, - dwarf, - &mut inlined_functions, - &mut inlined_addresses, - 0, - )?; - - // Sort ranges in "breadth-first traversal order", i.e. first by call_depth - // and then by range.begin. This allows finding the range containing an - // address at a certain depth using binary search. - // Note: Using DFS order, i.e. ordering by range.begin first and then by - // call_depth, would not work! Consider the two examples - // "[0..10 at depth 0], [0..2 at depth 1], [6..8 at depth 1]" and - // "[0..5 at depth 0], [0..2 at depth 1], [5..10 at depth 0], [6..8 at depth 1]". - // In this example, if you want to look up address 7 at depth 0, and you - // encounter [0..2 at depth 1], are you before or after the target range? - // You don't know. - inlined_addresses.sort_by(|r1, r2| { - if r1.call_depth < r2.call_depth { - Ordering::Less - } else if r1.call_depth > r2.call_depth { - Ordering::Greater - } else if r1.range.begin < r2.range.begin { - Ordering::Less - } else if r1.range.begin > r2.range.begin { - Ordering::Greater - } else { - Ordering::Equal - } - }); - - Ok(Function { - dw_die_offset, - name, - inlined_functions: inlined_functions.into_boxed_slice(), - inlined_addresses: inlined_addresses.into_boxed_slice(), - }) - } - - fn parse_children( - entries: &mut gimli::EntriesRaw<R>, - depth: isize, - unit: &gimli::Unit<R>, - dwarf: &ResDwarf<R>, - inlined_functions: &mut Vec<InlinedFunction<R>>, - inlined_addresses: &mut Vec<InlinedFunctionAddress>, - inlined_depth: usize, - ) -> Result<(), Error> { - loop { - let dw_die_offset = entries.next_offset(); - let next_depth = entries.next_depth(); - if next_depth <= depth { - return Ok(()); - } - if let Some(abbrev) = entries.read_abbreviation()? { - match abbrev.tag() { - gimli::DW_TAG_subprogram => { - Function::skip(entries, abbrev, next_depth)?; - } - gimli::DW_TAG_inlined_subroutine => { - InlinedFunction::parse( - dw_die_offset, - entries, - abbrev, - next_depth, - unit, - dwarf, - inlined_functions, - inlined_addresses, - inlined_depth, - )?; - } - _ => { - entries.skip_attributes(abbrev.attributes())?; - } - } - } - } - } - - fn skip( - entries: &mut gimli::EntriesRaw<R>, - abbrev: &gimli::Abbreviation, - depth: isize, - ) -> Result<(), Error> { - // TODO: use DW_AT_sibling - entries.skip_attributes(abbrev.attributes())?; - while entries.next_depth() > depth { - if let Some(abbrev) = entries.read_abbreviation()? { - entries.skip_attributes(abbrev.attributes())?; - } - } - Ok(()) - } - - /// Build the list of inlined functions that contain `probe`. - pub(crate) fn find_inlined_functions( - &self, - probe: u64, - ) -> iter::Rev<maybe_small::IntoIter<&InlinedFunction<R>>> { - // `inlined_functions` is ordered from outside to inside. - let mut inlined_functions = maybe_small::Vec::new(); - let mut inlined_addresses = &self.inlined_addresses[..]; - loop { - let current_depth = inlined_functions.len(); - // Look up (probe, current_depth) in inline_ranges. - // `inlined_addresses` is sorted in "breadth-first traversal order", i.e. - // by `call_depth` first, and then by `range.begin`. See the comment at - // the sort call for more information about why. - let search = inlined_addresses.binary_search_by(|range| { - if range.call_depth > current_depth { - Ordering::Greater - } else if range.call_depth < current_depth { - Ordering::Less - } else if range.range.begin > probe { - Ordering::Greater - } else if range.range.end <= probe { - Ordering::Less - } else { - Ordering::Equal - } - }); - if let Ok(index) = search { - let function_index = inlined_addresses[index].function; - inlined_functions.push(&self.inlined_functions[function_index]); - inlined_addresses = &inlined_addresses[index + 1..]; - } else { - break; - } - } - inlined_functions.into_iter().rev() - } -} - -impl<R: gimli::Reader> InlinedFunction<R> { - fn parse( - dw_die_offset: gimli::UnitOffset<R::Offset>, - entries: &mut gimli::EntriesRaw<R>, - abbrev: &gimli::Abbreviation, - depth: isize, - unit: &gimli::Unit<R>, - dwarf: &ResDwarf<R>, - inlined_functions: &mut Vec<InlinedFunction<R>>, - inlined_addresses: &mut Vec<InlinedFunctionAddress>, - inlined_depth: usize, - ) -> Result<(), Error> { - let mut ranges = RangeAttributes::default(); - let mut name = None; - let mut call_file = 0; - let mut call_line = 0; - let mut call_column = 0; - for spec in abbrev.attributes() { - match entries.read_attribute(*spec) { - Ok(ref attr) => match attr.name() { - gimli::DW_AT_low_pc => { - if let gimli::AttributeValue::Addr(val) = attr.value() { - ranges.low_pc = Some(val); - } - } - gimli::DW_AT_high_pc => match attr.value() { - gimli::AttributeValue::Addr(val) => ranges.high_pc = Some(val), - gimli::AttributeValue::Udata(val) => ranges.size = Some(val), - _ => {} - }, - gimli::DW_AT_ranges => { - ranges.ranges_offset = - dwarf.sections.attr_ranges_offset(unit, attr.value())?; - } - gimli::DW_AT_linkage_name | gimli::DW_AT_MIPS_linkage_name => { - if let Ok(val) = dwarf.sections.attr_string(unit, attr.value()) { - name = Some(val); - } - } - gimli::DW_AT_name => { - if name.is_none() { - name = dwarf.sections.attr_string(unit, attr.value()).ok(); - } - } - gimli::DW_AT_abstract_origin | gimli::DW_AT_specification => { - if name.is_none() { - name = name_attr(attr.value(), unit, dwarf, 16)?; - } - } - gimli::DW_AT_call_file => { - if let gimli::AttributeValue::FileIndex(fi) = attr.value() { - call_file = fi; - } - } - gimli::DW_AT_call_line => { - call_line = attr.udata_value().unwrap_or(0) as u32; - } - gimli::DW_AT_call_column => { - call_column = attr.udata_value().unwrap_or(0) as u32; - } - _ => {} - }, - Err(e) => return Err(e), - } - } - - let function_index = inlined_functions.len(); - inlined_functions.push(InlinedFunction { - dw_die_offset, - name, - call_file, - call_line, - call_column, - }); - - ranges.for_each_range(&dwarf.sections, unit, |range| { - inlined_addresses.push(InlinedFunctionAddress { - range, - call_depth: inlined_depth, - function: function_index, - }); - })?; - - Function::parse_children( - entries, - depth, - unit, - dwarf, - inlined_functions, - inlined_addresses, - inlined_depth + 1, - ) - } -} - -fn name_attr<R>( - attr: gimli::AttributeValue<R>, - unit: &gimli::Unit<R>, - dwarf: &ResDwarf<R>, - recursion_limit: usize, -) -> Result<Option<R>, Error> -where - R: gimli::Reader, -{ - if recursion_limit == 0 { - return Ok(None); - } - - match attr { - gimli::AttributeValue::UnitRef(offset) => name_entry(unit, offset, dwarf, recursion_limit), - gimli::AttributeValue::DebugInfoRef(dr) => { - let res_unit = dwarf.find_unit(dr)?; - name_entry( - &res_unit.dw_unit, - gimli::UnitOffset(dr.0 - res_unit.offset.0), - dwarf, - recursion_limit, - ) - } - gimli::AttributeValue::DebugInfoRefSup(dr) => { - if let Some(sup_dwarf) = dwarf.sup.as_ref() { - let res_unit = sup_dwarf.find_unit(dr)?; - name_entry( - &res_unit.dw_unit, - gimli::UnitOffset(dr.0 - res_unit.offset.0), - sup_dwarf, - recursion_limit, - ) - } else { - Ok(None) - } - } - _ => Ok(None), - } -} - -fn name_entry<R>( - unit: &gimli::Unit<R>, - offset: gimli::UnitOffset<R::Offset>, - dwarf: &ResDwarf<R>, - recursion_limit: usize, -) -> Result<Option<R>, Error> -where - R: gimli::Reader, -{ - let mut entries = unit.entries_raw(Some(offset))?; - let abbrev = if let Some(abbrev) = entries.read_abbreviation()? { - abbrev - } else { - return Err(gimli::Error::NoEntryAtGivenOffset); - }; - - let mut name = None; - let mut next = None; - for spec in abbrev.attributes() { - match entries.read_attribute(*spec) { - Ok(ref attr) => match attr.name() { - gimli::DW_AT_linkage_name | gimli::DW_AT_MIPS_linkage_name => { - if let Ok(val) = dwarf.sections.attr_string(unit, attr.value()) { - return Ok(Some(val)); - } - } - gimli::DW_AT_name => { - if let Ok(val) = dwarf.sections.attr_string(unit, attr.value()) { - name = Some(val); - } - } - gimli::DW_AT_abstract_origin | gimli::DW_AT_specification => { - next = Some(attr.value()); - } - _ => {} - }, - Err(e) => return Err(e), - } - } - - if name.is_some() { - return Ok(name); - } - - if let Some(next) = next { - return name_attr(next, unit, dwarf, recursion_limit - 1); - } - - Ok(None) -} diff --git a/vendor/addr2line-0.17.0/src/lazy.rs b/vendor/addr2line-0.17.0/src/lazy.rs deleted file mode 100644 index 280c76b46..000000000 --- a/vendor/addr2line-0.17.0/src/lazy.rs +++ /dev/null @@ -1,29 +0,0 @@ -use core::cell::UnsafeCell; - -pub struct LazyCell<T> { - contents: UnsafeCell<Option<T>>, -} -impl<T> LazyCell<T> { - pub fn new() -> LazyCell<T> { - LazyCell { - contents: UnsafeCell::new(None), - } - } - - pub fn borrow_with(&self, closure: impl FnOnce() -> T) -> &T { - unsafe { - // First check if we're already initialized... - let ptr = self.contents.get(); - if let Some(val) = &*ptr { - return val; - } - // Note that while we're executing `closure` our `borrow_with` may - // be called recursively. This means we need to check again after - // the closure has executed. For that we use the `get_or_insert` - // method which will only perform mutation if we aren't already - // `Some`. - let val = closure(); - (*ptr).get_or_insert(val) - } - } -} diff --git a/vendor/addr2line-0.17.0/src/lib.rs b/vendor/addr2line-0.17.0/src/lib.rs deleted file mode 100644 index b46a98393..000000000 --- a/vendor/addr2line-0.17.0/src/lib.rs +++ /dev/null @@ -1,1192 +0,0 @@ -//! This crate provides a cross-platform library and binary for translating addresses into -//! function names, file names and line numbers. Given an address in an executable or an -//! offset in a section of a relocatable object, it uses the debugging information to -//! figure out which file name and line number are associated with it. -//! -//! When used as a library, files must first be loaded using the -//! [`object`](https://github.com/gimli-rs/object) crate. -//! A context can then be created with [`Context::new`](./struct.Context.html#method.new). -//! The context caches some of the parsed information so that multiple lookups are -//! efficient. -//! Location information is obtained with -//! [`Context::find_location`](./struct.Context.html#method.find_location) or -//! [`Context::find_location_range`](./struct.Context.html#method.find_location_range). -//! Function information is obtained with -//! [`Context::find_frames`](./struct.Context.html#method.find_frames), which returns -//! a frame for each inline function. Each frame contains both name and location. -//! -//! The crate has an example CLI wrapper around the library which provides some of -//! the functionality of the `addr2line` command line tool distributed with [GNU -//! binutils](https://www.gnu.org/software/binutils/). -//! -//! Currently this library only provides information from the DWARF debugging information, -//! which is parsed using [`gimli`](https://github.com/gimli-rs/gimli). The example CLI -//! wrapper also uses symbol table information provided by the `object` crate. -#![deny(missing_docs)] -#![no_std] - -#[allow(unused_imports)] -#[macro_use] -extern crate alloc; - -#[cfg(feature = "cpp_demangle")] -extern crate cpp_demangle; -#[cfg(feature = "fallible-iterator")] -pub extern crate fallible_iterator; -pub extern crate gimli; -#[cfg(feature = "object")] -pub extern crate object; -#[cfg(feature = "rustc-demangle")] -extern crate rustc_demangle; - -use alloc::borrow::Cow; -use alloc::boxed::Box; -#[cfg(feature = "object")] -use alloc::rc::Rc; -use alloc::string::{String, ToString}; -use alloc::sync::Arc; -use alloc::vec::Vec; - -use core::cmp::{self, Ordering}; -use core::iter; -use core::mem; -use core::num::NonZeroU64; -use core::u64; - -use crate::function::{Function, Functions, InlinedFunction}; -use crate::lazy::LazyCell; - -#[cfg(feature = "smallvec")] -mod maybe_small { - pub type Vec<T> = smallvec::SmallVec<[T; 16]>; - pub type IntoIter<T> = smallvec::IntoIter<[T; 16]>; -} -#[cfg(not(feature = "smallvec"))] -mod maybe_small { - pub type Vec<T> = alloc::vec::Vec<T>; - pub type IntoIter<T> = alloc::vec::IntoIter<T>; -} - -mod function; -mod lazy; - -type Error = gimli::Error; - -/// The state necessary to perform address to line translation. -/// -/// Constructing a `Context` is somewhat costly, so users should aim to reuse `Context`s -/// when performing lookups for many addresses in the same executable. -pub struct Context<R: gimli::Reader> { - dwarf: ResDwarf<R>, -} - -/// The type of `Context` that supports the `new` method. -#[cfg(feature = "std-object")] -pub type ObjectContext = Context<gimli::EndianRcSlice<gimli::RunTimeEndian>>; - -#[cfg(feature = "std-object")] -impl Context<gimli::EndianRcSlice<gimli::RunTimeEndian>> { - /// Construct a new `Context`. - /// - /// The resulting `Context` uses `gimli::EndianRcSlice<gimli::RunTimeEndian>`. - /// This means it is not thread safe, has no lifetime constraints (since it copies - /// the input data), and works for any endianity. - /// - /// Performance sensitive applications may want to use `Context::from_dwarf` - /// with a more specialised `gimli::Reader` implementation. - #[inline] - pub fn new<'data: 'file, 'file, O: object::Object<'data, 'file>>( - file: &'file O, - ) -> Result<Self, Error> { - Self::new_with_sup(file, None) - } - - /// Construct a new `Context`. - /// - /// Optionally also use a supplementary object file. - /// - /// The resulting `Context` uses `gimli::EndianRcSlice<gimli::RunTimeEndian>`. - /// This means it is not thread safe, has no lifetime constraints (since it copies - /// the input data), and works for any endianity. - /// - /// Performance sensitive applications may want to use `Context::from_dwarf_with_sup` - /// with a more specialised `gimli::Reader` implementation. - pub fn new_with_sup<'data: 'file, 'file, O: object::Object<'data, 'file>>( - file: &'file O, - sup_file: Option<&'file O>, - ) -> Result<Self, Error> { - let endian = if file.is_little_endian() { - gimli::RunTimeEndian::Little - } else { - gimli::RunTimeEndian::Big - }; - - fn load_section<'data: 'file, 'file, O, Endian>( - id: gimli::SectionId, - file: &'file O, - endian: Endian, - ) -> Result<gimli::EndianRcSlice<Endian>, Error> - where - O: object::Object<'data, 'file>, - Endian: gimli::Endianity, - { - use object::ObjectSection; - - let data = file - .section_by_name(id.name()) - .and_then(|section| section.uncompressed_data().ok()) - .unwrap_or(Cow::Borrowed(&[])); - Ok(gimli::EndianRcSlice::new(Rc::from(&*data), endian)) - } - - let mut dwarf = gimli::Dwarf::load(|id| load_section(id, file, endian))?; - if let Some(sup_file) = sup_file { - dwarf.load_sup(|id| load_section(id, sup_file, endian))?; - } - Context::from_dwarf(dwarf) - } -} - -impl<R: gimli::Reader> Context<R> { - /// Construct a new `Context` from DWARF sections. - /// - /// This method does not support using a supplementary object file. - pub fn from_sections( - debug_abbrev: gimli::DebugAbbrev<R>, - debug_addr: gimli::DebugAddr<R>, - debug_aranges: gimli::DebugAranges<R>, - debug_info: gimli::DebugInfo<R>, - debug_line: gimli::DebugLine<R>, - debug_line_str: gimli::DebugLineStr<R>, - debug_ranges: gimli::DebugRanges<R>, - debug_rnglists: gimli::DebugRngLists<R>, - debug_str: gimli::DebugStr<R>, - debug_str_offsets: gimli::DebugStrOffsets<R>, - default_section: R, - ) -> Result<Self, Error> { - Self::from_dwarf(gimli::Dwarf { - debug_abbrev, - debug_addr, - debug_aranges, - debug_info, - debug_line, - debug_line_str, - debug_str, - debug_str_offsets, - debug_types: default_section.clone().into(), - locations: gimli::LocationLists::new( - default_section.clone().into(), - default_section.clone().into(), - ), - ranges: gimli::RangeLists::new(debug_ranges, debug_rnglists), - file_type: gimli::DwarfFileType::Main, - sup: None, - }) - } - - /// Construct a new `Context` from an existing [`gimli::Dwarf`] object. - #[inline] - pub fn from_dwarf(sections: gimli::Dwarf<R>) -> Result<Self, Error> { - let mut dwarf = ResDwarf::parse(Arc::new(sections))?; - dwarf.sup = match dwarf.sections.sup.clone() { - Some(sup_sections) => Some(Box::new(ResDwarf::parse(sup_sections)?)), - None => None, - }; - Ok(Context { dwarf }) - } - - /// The dwarf sections associated with this `Context`. - pub fn dwarf(&self) -> &gimli::Dwarf<R> { - &self.dwarf.sections - } - - /// Finds the CUs for the function address given. - /// - /// There might be multiple CUs whose range contains this address. - /// Weak symbols have shown up in the wild which cause this to happen - /// but otherwise this can happen if the CU has non-contiguous functions - /// but only reports a single range. - /// - /// Consequently we return an iterator for all CUs which may contain the - /// address, and the caller must check if there is actually a function or - /// location in the CU for that address. - fn find_units(&self, probe: u64) -> impl Iterator<Item = &ResUnit<R>> { - self.find_units_range(probe, probe + 1) - .map(|(unit, _range)| unit) - } - - /// Finds the CUs covering the range of addresses given. - /// - /// The range is [low, high) (ie, the upper bound is exclusive). This can return multiple - /// ranges for the same unit. - #[inline] - fn find_units_range( - &self, - probe_low: u64, - probe_high: u64, - ) -> impl Iterator<Item = (&ResUnit<R>, &gimli::Range)> { - // First up find the position in the array which could have our function - // address. - let pos = match self - .dwarf - .unit_ranges - .binary_search_by_key(&probe_high, |i| i.range.begin) - { - // Although unlikely, we could find an exact match. - Ok(i) => i + 1, - // No exact match was found, but this probe would fit at slot `i`. - // This means that slot `i` is bigger than `probe`, along with all - // indices greater than `i`, so we need to search all previous - // entries. - Err(i) => i, - }; - - // Once we have our index we iterate backwards from that position - // looking for a matching CU. - self.dwarf.unit_ranges[..pos] - .iter() - .rev() - .take_while(move |i| { - // We know that this CU's start is beneath the probe already because - // of our sorted array. - debug_assert!(i.range.begin <= probe_high); - - // Each entry keeps track of the maximum end address seen so far, - // starting from the beginning of the array of unit ranges. We're - // iterating in reverse so if our probe is beyond the maximum range - // of this entry, then it's guaranteed to not fit in any prior - // entries, so we break out. - probe_low < i.max_end - }) - .filter_map(move |i| { - // If this CU doesn't actually contain this address, move to the - // next CU. - if probe_low >= i.range.end || probe_high <= i.range.begin { - return None; - } - Some((&self.dwarf.units[i.unit_id], &i.range)) - }) - } - - /// Find the DWARF unit corresponding to the given virtual memory address. - pub fn find_dwarf_unit(&self, probe: u64) -> Option<&gimli::Unit<R>> { - for unit in self.find_units(probe) { - match unit.find_function_or_location(probe, &self.dwarf) { - Ok((Some(_), _)) | Ok((_, Some(_))) => return Some(&unit.dw_unit), - _ => {} - } - } - None - } - - /// Find the source file and line corresponding to the given virtual memory address. - pub fn find_location(&self, probe: u64) -> Result<Option<Location<'_>>, Error> { - for unit in self.find_units(probe) { - if let Some(location) = unit.find_location(probe, &self.dwarf.sections)? { - return Ok(Some(location)); - } - } - Ok(None) - } - - /// Return source file and lines for a range of addresses. For each location it also - /// returns the address and size of the range of the underlying instructions. - pub fn find_location_range( - &self, - probe_low: u64, - probe_high: u64, - ) -> Result<LocationRangeIter<'_, R>, Error> { - LocationRangeIter::new(self, probe_low, probe_high) - } - - /// Return an iterator for the function frames corresponding to the given virtual - /// memory address. - /// - /// If the probe address is not for an inline function then only one frame is - /// returned. - /// - /// If the probe address is for an inline function then the first frame corresponds - /// to the innermost inline function. Subsequent frames contain the caller and call - /// location, until an non-inline caller is reached. - pub fn find_frames(&self, probe: u64) -> Result<FrameIter<R>, Error> { - for unit in self.find_units(probe) { - match unit.find_function_or_location(probe, &self.dwarf)? { - (Some(function), location) => { - let inlined_functions = function.find_inlined_functions(probe); - return Ok(FrameIter(FrameIterState::Frames(FrameIterFrames { - unit, - sections: &self.dwarf.sections, - function, - inlined_functions, - next: location, - }))); - } - (None, Some(location)) => { - return Ok(FrameIter(FrameIterState::Location(Some(location)))); - } - _ => {} - } - } - Ok(FrameIter(FrameIterState::Empty)) - } - - /// Initialize all line data structures. This is used for benchmarks. - #[doc(hidden)] - pub fn parse_lines(&self) -> Result<(), Error> { - for unit in &self.dwarf.units { - unit.parse_lines(&self.dwarf.sections)?; - } - Ok(()) - } - - /// Initialize all function data structures. This is used for benchmarks. - #[doc(hidden)] - pub fn parse_functions(&self) -> Result<(), Error> { - for unit in &self.dwarf.units { - unit.parse_functions(&self.dwarf)?; - } - Ok(()) - } - - /// Initialize all inlined function data structures. This is used for benchmarks. - #[doc(hidden)] - pub fn parse_inlined_functions(&self) -> Result<(), Error> { - for unit in &self.dwarf.units { - unit.parse_inlined_functions(&self.dwarf)?; - } - Ok(()) - } -} - -struct UnitRange { - unit_id: usize, - max_end: u64, - range: gimli::Range, -} - -struct ResDwarf<R: gimli::Reader> { - unit_ranges: Vec<UnitRange>, - units: Vec<ResUnit<R>>, - sections: Arc<gimli::Dwarf<R>>, - sup: Option<Box<ResDwarf<R>>>, -} - -impl<R: gimli::Reader> ResDwarf<R> { - fn parse(sections: Arc<gimli::Dwarf<R>>) -> Result<Self, Error> { - // Find all the references to compilation units in .debug_aranges. - // Note that we always also iterate through all of .debug_info to - // find compilation units, because .debug_aranges may be missing some. - let mut aranges = Vec::new(); - let mut headers = sections.debug_aranges.headers(); - while let Some(header) = headers.next()? { - aranges.push((header.debug_info_offset(), header.offset())); - } - aranges.sort_by_key(|i| i.0); - - let mut unit_ranges = Vec::new(); - let mut res_units = Vec::new(); - let mut units = sections.units(); - while let Some(header) = units.next()? { - let unit_id = res_units.len(); - let offset = match header.offset().as_debug_info_offset() { - Some(offset) => offset, - None => continue, - }; - // We mainly want compile units, but we may need to follow references to entries - // within other units for function names. We don't need anything from type units. - match header.type_() { - gimli::UnitType::Type { .. } | gimli::UnitType::SplitType { .. } => continue, - _ => {} - } - let dw_unit = match sections.unit(header) { - Ok(dw_unit) => dw_unit, - Err(_) => continue, - }; - - let mut lang = None; - { - let mut entries = dw_unit.entries_raw(None)?; - - let abbrev = match entries.read_abbreviation()? { - Some(abbrev) => abbrev, - None => continue, - }; - - let mut ranges = RangeAttributes::default(); - for spec in abbrev.attributes() { - let attr = entries.read_attribute(*spec)?; - match attr.name() { - gimli::DW_AT_low_pc => { - if let gimli::AttributeValue::Addr(val) = attr.value() { - ranges.low_pc = Some(val); - } - } - gimli::DW_AT_high_pc => match attr.value() { - gimli::AttributeValue::Addr(val) => ranges.high_pc = Some(val), - gimli::AttributeValue::Udata(val) => ranges.size = Some(val), - _ => {} - }, - gimli::DW_AT_ranges => { - ranges.ranges_offset = - sections.attr_ranges_offset(&dw_unit, attr.value())?; - } - gimli::DW_AT_language => { - if let gimli::AttributeValue::Language(val) = attr.value() { - lang = Some(val); - } - } - _ => {} - } - } - - // Find the address ranges for the CU, using in order of preference: - // - DW_AT_ranges - // - .debug_aranges - // - DW_AT_low_pc/DW_AT_high_pc - // - // Using DW_AT_ranges before .debug_aranges is possibly an arbitrary choice, - // but the feeling is that DW_AT_ranges is more likely to be reliable or complete - // if it is present. - // - // .debug_aranges must be used before DW_AT_low_pc/DW_AT_high_pc because - // it has been observed on macOS that DW_AT_ranges was not emitted even for - // discontiguous CUs. - let i = match ranges.ranges_offset { - Some(_) => None, - None => aranges.binary_search_by_key(&offset, |x| x.0).ok(), - }; - if let Some(mut i) = i { - // There should be only one set per CU, but in practice multiple - // sets have been observed. This is probably a compiler bug, but - // either way we need to handle it. - while i > 0 && aranges[i - 1].0 == offset { - i -= 1; - } - for (_, aranges_offset) in aranges[i..].iter().take_while(|x| x.0 == offset) { - let aranges_header = sections.debug_aranges.header(*aranges_offset)?; - let mut aranges = aranges_header.entries(); - while let Some(arange) = aranges.next()? { - if arange.length() != 0 { - unit_ranges.push(UnitRange { - range: arange.range(), - unit_id, - max_end: 0, - }); - } - } - } - } else { - ranges.for_each_range(§ions, &dw_unit, |range| { - unit_ranges.push(UnitRange { - range, - unit_id, - max_end: 0, - }); - })?; - } - } - - res_units.push(ResUnit { - offset, - dw_unit, - lang, - lines: LazyCell::new(), - funcs: LazyCell::new(), - }); - } - - // Sort this for faster lookup in `find_unit_and_address` below. - unit_ranges.sort_by_key(|i| i.range.begin); - - // Calculate the `max_end` field now that we've determined the order of - // CUs. - let mut max = 0; - for i in unit_ranges.iter_mut() { - max = max.max(i.range.end); - i.max_end = max; - } - - Ok(ResDwarf { - units: res_units, - unit_ranges, - sections, - sup: None, - }) - } - - fn find_unit(&self, offset: gimli::DebugInfoOffset<R::Offset>) -> Result<&ResUnit<R>, Error> { - match self - .units - .binary_search_by_key(&offset.0, |unit| unit.offset.0) - { - // There is never a DIE at the unit offset or before the first unit. - Ok(_) | Err(0) => Err(gimli::Error::NoEntryAtGivenOffset), - Err(i) => Ok(&self.units[i - 1]), - } - } -} - -struct Lines { - files: Box<[String]>, - sequences: Box<[LineSequence]>, -} - -struct LineSequence { - start: u64, - end: u64, - rows: Box<[LineRow]>, -} - -struct LineRow { - address: u64, - file_index: u64, - line: u32, - column: u32, -} - -struct ResUnit<R: gimli::Reader> { - offset: gimli::DebugInfoOffset<R::Offset>, - dw_unit: gimli::Unit<R>, - lang: Option<gimli::DwLang>, - lines: LazyCell<Result<Lines, Error>>, - funcs: LazyCell<Result<Functions<R>, Error>>, -} - -impl<R: gimli::Reader> ResUnit<R> { - fn parse_lines(&self, sections: &gimli::Dwarf<R>) -> Result<Option<&Lines>, Error> { - let ilnp = match self.dw_unit.line_program { - Some(ref ilnp) => ilnp, - None => return Ok(None), - }; - self.lines - .borrow_with(|| { - let mut sequences = Vec::new(); - let mut sequence_rows = Vec::<LineRow>::new(); - let mut rows = ilnp.clone().rows(); - while let Some((_, row)) = rows.next_row()? { - if row.end_sequence() { - if let Some(start) = sequence_rows.first().map(|x| x.address) { - let end = row.address(); - let mut rows = Vec::new(); - mem::swap(&mut rows, &mut sequence_rows); - sequences.push(LineSequence { - start, - end, - rows: rows.into_boxed_slice(), - }); - } - continue; - } - - let address = row.address(); - let file_index = row.file_index(); - let line = row.line().map(NonZeroU64::get).unwrap_or(0) as u32; - let column = match row.column() { - gimli::ColumnType::LeftEdge => 0, - gimli::ColumnType::Column(x) => x.get() as u32, - }; - - if let Some(last_row) = sequence_rows.last_mut() { - if last_row.address == address { - last_row.file_index = file_index; - last_row.line = line; - last_row.column = column; - continue; - } - } - - sequence_rows.push(LineRow { - address, - file_index, - line, - column, - }); - } - sequences.sort_by_key(|x| x.start); - - let mut files = Vec::new(); - let header = ilnp.header(); - match header.file(0) { - Some(file) => files.push(self.render_file(file, header, sections)?), - None => files.push(String::from("")), // DWARF version <= 4 may not have 0th index - } - let mut index = 1; - while let Some(file) = header.file(index) { - files.push(self.render_file(file, header, sections)?); - index += 1; - } - - Ok(Lines { - files: files.into_boxed_slice(), - sequences: sequences.into_boxed_slice(), - }) - }) - .as_ref() - .map(Some) - .map_err(Error::clone) - } - - fn parse_functions(&self, dwarf: &ResDwarf<R>) -> Result<&Functions<R>, Error> { - self.funcs - .borrow_with(|| Functions::parse(&self.dw_unit, dwarf)) - .as_ref() - .map_err(Error::clone) - } - - fn parse_inlined_functions(&self, dwarf: &ResDwarf<R>) -> Result<(), Error> { - self.funcs - .borrow_with(|| Functions::parse(&self.dw_unit, dwarf)) - .as_ref() - .map_err(Error::clone)? - .parse_inlined_functions(&self.dw_unit, dwarf) - } - - fn find_location( - &self, - probe: u64, - sections: &gimli::Dwarf<R>, - ) -> Result<Option<Location<'_>>, Error> { - if let Some(mut iter) = LocationRangeUnitIter::new(self, sections, probe, probe + 1)? { - match iter.next() { - None => Ok(None), - Some((_addr, _len, loc)) => Ok(Some(loc)), - } - } else { - Ok(None) - } - } - - #[inline] - fn find_location_range( - &self, - probe_low: u64, - probe_high: u64, - sections: &gimli::Dwarf<R>, - ) -> Result<Option<LocationRangeUnitIter<'_>>, Error> { - LocationRangeUnitIter::new(self, sections, probe_low, probe_high) - } - - fn find_function_or_location( - &self, - probe: u64, - dwarf: &ResDwarf<R>, - ) -> Result<(Option<&Function<R>>, Option<Location<'_>>), Error> { - let functions = self.parse_functions(dwarf)?; - let function = match functions.find_address(probe) { - Some(address) => { - let function_index = functions.addresses[address].function; - let (offset, ref function) = functions.functions[function_index]; - Some( - function - .borrow_with(|| Function::parse(offset, &self.dw_unit, dwarf)) - .as_ref() - .map_err(Error::clone)?, - ) - } - None => None, - }; - let location = self.find_location(probe, &dwarf.sections)?; - Ok((function, location)) - } - - fn render_file( - &self, - file: &gimli::FileEntry<R, R::Offset>, - header: &gimli::LineProgramHeader<R, R::Offset>, - sections: &gimli::Dwarf<R>, - ) -> Result<String, gimli::Error> { - let mut path = if let Some(ref comp_dir) = self.dw_unit.comp_dir { - comp_dir.to_string_lossy()?.into_owned() - } else { - String::new() - }; - - if let Some(directory) = file.directory(header) { - path_push( - &mut path, - sections - .attr_string(&self.dw_unit, directory)? - .to_string_lossy()? - .as_ref(), - ); - } - - path_push( - &mut path, - sections - .attr_string(&self.dw_unit, file.path_name())? - .to_string_lossy()? - .as_ref(), - ); - - Ok(path) - } -} - -/// Iterator over `Location`s in a range of addresses, returned by `Context::find_location_range`. -pub struct LocationRangeIter<'ctx, R: gimli::Reader> { - unit_iter: Box<dyn Iterator<Item = (&'ctx ResUnit<R>, &'ctx gimli::Range)> + 'ctx>, - iter: Option<LocationRangeUnitIter<'ctx>>, - - probe_low: u64, - probe_high: u64, - sections: &'ctx gimli::Dwarf<R>, -} - -impl<'ctx, R: gimli::Reader> LocationRangeIter<'ctx, R> { - #[inline] - fn new(ctx: &'ctx Context<R>, probe_low: u64, probe_high: u64) -> Result<Self, Error> { - let sections = &ctx.dwarf.sections; - let unit_iter = ctx.find_units_range(probe_low, probe_high); - Ok(Self { - unit_iter: Box::new(unit_iter), - iter: None, - probe_low, - probe_high, - sections, - }) - } - - fn next_loc(&mut self) -> Result<Option<(u64, u64, Location<'ctx>)>, Error> { - loop { - let iter = self.iter.take(); - match iter { - None => match self.unit_iter.next() { - Some((unit, range)) => { - self.iter = unit.find_location_range( - cmp::max(self.probe_low, range.begin), - cmp::min(self.probe_high, range.end), - self.sections, - )?; - } - None => return Ok(None), - }, - Some(mut iter) => { - if let item @ Some(_) = iter.next() { - self.iter = Some(iter); - return Ok(item); - } - } - } - } - } -} - -impl<'ctx, R> Iterator for LocationRangeIter<'ctx, R> -where - R: gimli::Reader + 'ctx, -{ - type Item = (u64, u64, Location<'ctx>); - - #[inline] - fn next(&mut self) -> Option<Self::Item> { - match self.next_loc() { - Err(_) => None, - Ok(loc) => loc, - } - } -} - -#[cfg(feature = "fallible-iterator")] -impl<'ctx, R> fallible_iterator::FallibleIterator for LocationRangeIter<'ctx, R> -where - R: gimli::Reader + 'ctx, -{ - type Item = (u64, u64, Location<'ctx>); - type Error = Error; - - #[inline] - fn next(&mut self) -> Result<Option<Self::Item>, Self::Error> { - self.next_loc() - } -} - -struct LocationRangeUnitIter<'ctx> { - lines: &'ctx Lines, - seqs: &'ctx [LineSequence], - seq_idx: usize, - row_idx: usize, - probe_high: u64, -} - -impl<'ctx> LocationRangeUnitIter<'ctx> { - fn new<R: gimli::Reader>( - resunit: &'ctx ResUnit<R>, - sections: &gimli::Dwarf<R>, - probe_low: u64, - probe_high: u64, - ) -> Result<Option<Self>, Error> { - let lines = resunit.parse_lines(sections)?; - - if let Some(lines) = lines { - // Find index for probe_low. - let seq_idx = lines.sequences.binary_search_by(|sequence| { - if probe_low < sequence.start { - Ordering::Greater - } else if probe_low >= sequence.end { - Ordering::Less - } else { - Ordering::Equal - } - }); - let seq_idx = match seq_idx { - Ok(x) => x, - Err(0) => 0, // probe below sequence, but range could overlap - Err(_) => lines.sequences.len(), - }; - - let row_idx = if let Some(seq) = lines.sequences.get(seq_idx) { - let idx = seq.rows.binary_search_by(|row| row.address.cmp(&probe_low)); - let idx = match idx { - Ok(x) => x, - Err(0) => 0, // probe below sequence, but range could overlap - Err(x) => x - 1, - }; - idx - } else { - 0 - }; - - Ok(Some(Self { - lines, - seqs: &*lines.sequences, - seq_idx, - row_idx, - probe_high, - })) - } else { - Ok(None) - } - } -} - -impl<'ctx> Iterator for LocationRangeUnitIter<'ctx> { - type Item = (u64, u64, Location<'ctx>); - - fn next(&mut self) -> Option<(u64, u64, Location<'ctx>)> { - loop { - let seq = match self.seqs.get(self.seq_idx) { - Some(seq) => seq, - None => break, - }; - - if seq.start >= self.probe_high { - break; - } - - match seq.rows.get(self.row_idx) { - Some(row) => { - if row.address >= self.probe_high { - break; - } - - let file = self - .lines - .files - .get(row.file_index as usize) - .map(String::as_str); - let nextaddr = seq - .rows - .get(self.row_idx + 1) - .map(|row| row.address) - .unwrap_or(seq.end); - - let item = ( - row.address, - nextaddr - row.address, - Location { - file, - line: if row.line != 0 { Some(row.line) } else { None }, - column: if row.column != 0 { - Some(row.column) - } else { - None - }, - }, - ); - self.row_idx += 1; - - return Some(item); - } - None => { - self.seq_idx += 1; - self.row_idx = 0; - } - } - } - None - } -} - -fn path_push(path: &mut String, p: &str) { - if has_unix_root(p) || has_windows_root(p) { - *path = p.to_string(); - } else { - let dir_separator = if has_windows_root(path.as_str()) { - '\\' - } else { - '/' - }; - - if !path.ends_with(dir_separator) { - path.push(dir_separator); - } - *path += p; - } -} - -/// Check if the path in the given string has a unix style root -fn has_unix_root(p: &str) -> bool { - p.starts_with('/') -} - -/// Check if the path in the given string has a windows style root -fn has_windows_root(p: &str) -> bool { - p.starts_with('\\') || p.get(1..3) == Some(":\\") -} -struct RangeAttributes<R: gimli::Reader> { - low_pc: Option<u64>, - high_pc: Option<u64>, - size: Option<u64>, - ranges_offset: Option<gimli::RangeListsOffset<<R as gimli::Reader>::Offset>>, -} - -impl<R: gimli::Reader> Default for RangeAttributes<R> { - fn default() -> Self { - RangeAttributes { - low_pc: None, - high_pc: None, - size: None, - ranges_offset: None, - } - } -} - -impl<R: gimli::Reader> RangeAttributes<R> { - fn for_each_range<F: FnMut(gimli::Range)>( - &self, - sections: &gimli::Dwarf<R>, - unit: &gimli::Unit<R>, - mut f: F, - ) -> Result<bool, Error> { - let mut added_any = false; - let mut add_range = |range: gimli::Range| { - if range.begin < range.end { - f(range); - added_any = true - } - }; - if let Some(ranges_offset) = self.ranges_offset { - let mut range_list = sections.ranges(unit, ranges_offset)?; - while let Some(range) = range_list.next()? { - add_range(range); - } - } else if let (Some(begin), Some(end)) = (self.low_pc, self.high_pc) { - add_range(gimli::Range { begin, end }); - } else if let (Some(begin), Some(size)) = (self.low_pc, self.size) { - add_range(gimli::Range { - begin, - end: begin + size, - }); - } - Ok(added_any) - } -} - -/// An iterator over function frames. -pub struct FrameIter<'ctx, R>(FrameIterState<'ctx, R>) -where - R: gimli::Reader + 'ctx; - -enum FrameIterState<'ctx, R> -where - R: gimli::Reader + 'ctx, -{ - Empty, - Location(Option<Location<'ctx>>), - Frames(FrameIterFrames<'ctx, R>), -} - -struct FrameIterFrames<'ctx, R> -where - R: gimli::Reader + 'ctx, -{ - unit: &'ctx ResUnit<R>, - sections: &'ctx gimli::Dwarf<R>, - function: &'ctx Function<R>, - inlined_functions: iter::Rev<maybe_small::IntoIter<&'ctx InlinedFunction<R>>>, - next: Option<Location<'ctx>>, -} - -impl<'ctx, R> FrameIter<'ctx, R> -where - R: gimli::Reader + 'ctx, -{ - /// Advances the iterator and returns the next frame. - pub fn next(&mut self) -> Result<Option<Frame<'ctx, R>>, Error> { - let frames = match &mut self.0 { - FrameIterState::Empty => return Ok(None), - FrameIterState::Location(location) => { - // We can't move out of a mutable reference, so use `take` instead. - let location = location.take(); - self.0 = FrameIterState::Empty; - return Ok(Some(Frame { - dw_die_offset: None, - function: None, - location, - })); - } - FrameIterState::Frames(frames) => frames, - }; - - let loc = frames.next.take(); - let func = match frames.inlined_functions.next() { - Some(func) => func, - None => { - let frame = Frame { - dw_die_offset: Some(frames.function.dw_die_offset), - function: frames.function.name.clone().map(|name| FunctionName { - name, - language: frames.unit.lang, - }), - location: loc, - }; - self.0 = FrameIterState::Empty; - return Ok(Some(frame)); - } - }; - - let mut next = Location { - file: None, - line: if func.call_line != 0 { - Some(func.call_line) - } else { - None - }, - column: if func.call_column != 0 { - Some(func.call_column) - } else { - None - }, - }; - if func.call_file != 0 { - if let Some(lines) = frames.unit.parse_lines(frames.sections)? { - next.file = lines.files.get(func.call_file as usize).map(String::as_str); - } - } - frames.next = Some(next); - - Ok(Some(Frame { - dw_die_offset: Some(func.dw_die_offset), - function: func.name.clone().map(|name| FunctionName { - name, - language: frames.unit.lang, - }), - location: loc, - })) - } -} - -#[cfg(feature = "fallible-iterator")] -impl<'ctx, R> fallible_iterator::FallibleIterator for FrameIter<'ctx, R> -where - R: gimli::Reader + 'ctx, -{ - type Item = Frame<'ctx, R>; - type Error = Error; - - #[inline] - fn next(&mut self) -> Result<Option<Frame<'ctx, R>>, Error> { - self.next() - } -} - -/// A function frame. -pub struct Frame<'ctx, R: gimli::Reader> { - /// The DWARF unit offset corresponding to the DIE of the function. - pub dw_die_offset: Option<gimli::UnitOffset<R::Offset>>, - /// The name of the function. - pub function: Option<FunctionName<R>>, - /// The source location corresponding to this frame. - pub location: Option<Location<'ctx>>, -} - -/// A function name. -pub struct FunctionName<R: gimli::Reader> { - /// The name of the function. - pub name: R, - /// The language of the compilation unit containing this function. - pub language: Option<gimli::DwLang>, -} - -impl<R: gimli::Reader> FunctionName<R> { - /// The raw name of this function before demangling. - pub fn raw_name(&self) -> Result<Cow<str>, Error> { - self.name.to_string_lossy() - } - - /// The name of this function after demangling (if applicable). - pub fn demangle(&self) -> Result<Cow<str>, Error> { - self.raw_name().map(|x| demangle_auto(x, self.language)) - } -} - -/// Demangle a symbol name using the demangling scheme for the given language. -/// -/// Returns `None` if demangling failed or is not required. -#[allow(unused_variables)] -pub fn demangle(name: &str, language: gimli::DwLang) -> Option<String> { - match language { - #[cfg(feature = "rustc-demangle")] - gimli::DW_LANG_Rust => rustc_demangle::try_demangle(name) - .ok() - .as_ref() - .map(|x| format!("{:#}", x)), - #[cfg(feature = "cpp_demangle")] - gimli::DW_LANG_C_plus_plus - | gimli::DW_LANG_C_plus_plus_03 - | gimli::DW_LANG_C_plus_plus_11 - | gimli::DW_LANG_C_plus_plus_14 => cpp_demangle::Symbol::new(name) - .ok() - .and_then(|x| x.demangle(&Default::default()).ok()), - _ => None, - } -} - -/// Apply 'best effort' demangling of a symbol name. -/// -/// If `language` is given, then only the demangling scheme for that language -/// is used. -/// -/// If `language` is `None`, then heuristics are used to determine how to -/// demangle the name. Currently, these heuristics are very basic. -/// -/// If demangling fails or is not required, then `name` is returned unchanged. -pub fn demangle_auto(name: Cow<str>, language: Option<gimli::DwLang>) -> Cow<str> { - match language { - Some(language) => demangle(name.as_ref(), language), - None => demangle(name.as_ref(), gimli::DW_LANG_Rust) - .or_else(|| demangle(name.as_ref(), gimli::DW_LANG_C_plus_plus)), - } - .map(Cow::from) - .unwrap_or(name) -} - -/// A source location. -pub struct Location<'a> { - /// The file name. - pub file: Option<&'a str>, - /// The line number. - pub line: Option<u32>, - /// The column number. - pub column: Option<u32>, -} - -#[cfg(test)] -mod tests { - #[test] - fn context_is_send() { - fn assert_is_send<T: Send>() {} - assert_is_send::<crate::Context<gimli::read::EndianSlice<gimli::LittleEndian>>>(); - } -} diff --git a/vendor/addr2line-0.17.0/tests/correctness.rs b/vendor/addr2line-0.17.0/tests/correctness.rs deleted file mode 100644 index 3f7b43373..000000000 --- a/vendor/addr2line-0.17.0/tests/correctness.rs +++ /dev/null @@ -1,91 +0,0 @@ -extern crate addr2line; -extern crate fallible_iterator; -extern crate findshlibs; -extern crate gimli; -extern crate memmap; -extern crate object; - -use addr2line::Context; -use fallible_iterator::FallibleIterator; -use findshlibs::{IterationControl, SharedLibrary, TargetSharedLibrary}; -use object::Object; -use std::fs::File; - -fn find_debuginfo() -> memmap::Mmap { - let path = std::env::current_exe().unwrap(); - let file = File::open(&path).unwrap(); - let map = unsafe { memmap::Mmap::map(&file).unwrap() }; - let file = &object::File::parse(&*map).unwrap(); - if let Ok(uuid) = file.mach_uuid() { - for candidate in path.parent().unwrap().read_dir().unwrap() { - let path = candidate.unwrap().path(); - if !path.to_str().unwrap().ends_with(".dSYM") { - continue; - } - for candidate in path.join("Contents/Resources/DWARF").read_dir().unwrap() { - let path = candidate.unwrap().path(); - let file = File::open(&path).unwrap(); - let map = unsafe { memmap::Mmap::map(&file).unwrap() }; - let file = &object::File::parse(&*map).unwrap(); - if file.mach_uuid().unwrap() == uuid { - return map; - } - } - } - } - - return map; -} - -#[test] -fn correctness() { - let map = find_debuginfo(); - let file = &object::File::parse(&*map).unwrap(); - let ctx = Context::new(file).unwrap(); - - let mut bias = None; - TargetSharedLibrary::each(|lib| { - bias = Some(lib.virtual_memory_bias().0 as u64); - IterationControl::Break - }); - - let test = |sym: u64, expected_prefix: &str| { - let ip = sym.wrapping_sub(bias.unwrap()); - - let frames = ctx.find_frames(ip).unwrap(); - let frame = frames.last().unwrap().unwrap(); - let name = frame.function.as_ref().unwrap().demangle().unwrap(); - // Old rust versions generate DWARF with wrong linkage name, - // so only check the start. - if !name.starts_with(expected_prefix) { - panic!("incorrect name '{}', expected {:?}", name, expected_prefix); - } - }; - - test(test_function as u64, "correctness::test_function"); - test( - small::test_function as u64, - "correctness::small::test_function", - ); - test(auxiliary::foo as u64, "auxiliary::foo"); -} - -mod small { - pub fn test_function() { - println!("y"); - } -} - -fn test_function() { - println!("x"); -} - -#[test] -fn zero_function() { - let map = find_debuginfo(); - let file = &object::File::parse(&*map).unwrap(); - let ctx = Context::new(file).unwrap(); - for probe in 0..10 { - assert!(ctx.find_frames(probe).unwrap().count().unwrap() < 10); - } -} diff --git a/vendor/addr2line-0.17.0/tests/output_equivalence.rs b/vendor/addr2line-0.17.0/tests/output_equivalence.rs deleted file mode 100644 index 9dc366672..000000000 --- a/vendor/addr2line-0.17.0/tests/output_equivalence.rs +++ /dev/null @@ -1,145 +0,0 @@ -extern crate backtrace; -extern crate findshlibs; -extern crate rustc_test as test; - -use std::env; -use std::ffi::OsStr; -use std::path::Path; -use std::process::Command; - -use backtrace::Backtrace; -use findshlibs::{IterationControl, SharedLibrary, TargetSharedLibrary}; -use test::{ShouldPanic, TestDesc, TestDescAndFn, TestFn, TestName}; - -fn make_trace() -> Vec<String> { - fn foo() -> Backtrace { - bar() - } - #[inline(never)] - fn bar() -> Backtrace { - baz() - } - #[inline(always)] - fn baz() -> Backtrace { - Backtrace::new_unresolved() - } - - let mut base_addr = None; - TargetSharedLibrary::each(|lib| { - base_addr = Some(lib.virtual_memory_bias().0 as isize); - IterationControl::Break - }); - let addrfix = -base_addr.unwrap(); - - let trace = foo(); - trace - .frames() - .iter() - .take(5) - .map(|x| format!("{:p}", (x.ip() as *const u8).wrapping_offset(addrfix))) - .collect() -} - -fn run_cmd<P: AsRef<OsStr>>(exe: P, me: &Path, flags: Option<&str>, trace: &str) -> String { - let mut cmd = Command::new(exe); - cmd.env("LC_ALL", "C"); // GNU addr2line is localized, we aren't - cmd.env("RUST_BACKTRACE", "1"); // if a child crashes, we want to know why - - if let Some(flags) = flags { - cmd.arg(flags); - } - cmd.arg("--exe").arg(me).arg(trace); - - let output = cmd.output().unwrap(); - - assert!(output.status.success()); - String::from_utf8(output.stdout).unwrap() -} - -fn run_test(flags: Option<&str>) { - let me = env::current_exe().unwrap(); - let mut exe = me.clone(); - assert!(exe.pop()); - if exe.file_name().unwrap().to_str().unwrap() == "deps" { - assert!(exe.pop()); - } - exe.push("examples"); - exe.push("addr2line"); - - assert!(exe.is_file()); - - let trace = make_trace(); - - // HACK: GNU addr2line has a bug where looking up multiple addresses can cause the second - // lookup to fail. Workaround by doing one address at a time. - for addr in &trace { - let theirs = run_cmd("addr2line", &me, flags, addr); - let ours = run_cmd(&exe, &me, flags, addr); - - // HACK: GNU addr2line does not tidy up paths properly, causing double slashes to be printed. - // We consider our behavior to be correct, so we fix their output to match ours. - let theirs = theirs.replace("//", "/"); - - assert!( - theirs == ours, - "Output not equivalent: - -$ addr2line {0} --exe {1} {2} -{4} -$ {3} {0} --exe {1} {2} -{5} - - -", - flags.unwrap_or(""), - me.display(), - trace.join(" "), - exe.display(), - theirs, - ours - ); - } -} - -static FLAGS: &'static str = "aipsf"; - -fn make_tests() -> Vec<TestDescAndFn> { - (0..(1 << FLAGS.len())) - .map(|bits| { - if bits == 0 { - None - } else { - let mut param = String::new(); - param.push('-'); - for (i, flag) in FLAGS.chars().enumerate() { - if (bits & (1 << i)) != 0 { - param.push(flag); - } - } - Some(param) - } - }) - .map(|param| TestDescAndFn { - desc: TestDesc { - name: TestName::DynTestName(format!( - "addr2line {}", - param.as_ref().map_or("", String::as_str) - )), - ignore: false, - should_panic: ShouldPanic::No, - allow_fail: false, - }, - testfn: TestFn::DynTestFn(Box::new(move || { - run_test(param.as_ref().map(String::as_str)) - })), - }) - .collect() -} - -fn main() { - if !cfg!(target_os = "linux") { - return; - } - let args: Vec<_> = env::args().collect(); - test::test_main(&args, make_tests()); -} diff --git a/vendor/addr2line-0.17.0/tests/parse.rs b/vendor/addr2line-0.17.0/tests/parse.rs deleted file mode 100644 index 91d66e382..000000000 --- a/vendor/addr2line-0.17.0/tests/parse.rs +++ /dev/null @@ -1,118 +0,0 @@ -extern crate addr2line; -extern crate memmap; -extern crate object; - -use std::borrow::Cow; -use std::env; -use std::fs::File; -use std::path::{self, PathBuf}; - -use object::Object; - -fn release_fixture_path() -> PathBuf { - if let Ok(p) = env::var("ADDR2LINE_FIXTURE_PATH") { - return p.into(); - } - - let mut path = PathBuf::new(); - if let Ok(dir) = env::var("CARGO_MANIFEST_DIR") { - path.push(dir); - } - path.push("fixtures"); - path.push("addr2line-release"); - path -} - -fn with_file<F: FnOnce(&object::File)>(target: &path::Path, f: F) { - let file = File::open(target).unwrap(); - let map = unsafe { memmap::Mmap::map(&file).unwrap() }; - let file = object::File::parse(&*map).unwrap(); - f(&file) -} - -fn dwarf_load<'a>(object: &object::File<'a>) -> gimli::Dwarf<Cow<'a, [u8]>> { - let load_section = |id: gimli::SectionId| -> Result<Cow<'a, [u8]>, gimli::Error> { - use object::ObjectSection; - - let data = object - .section_by_name(id.name()) - .and_then(|section| section.data().ok()) - .unwrap_or(&[][..]); - Ok(Cow::Borrowed(data)) - }; - gimli::Dwarf::load(&load_section).unwrap() -} - -fn dwarf_borrow<'a>( - dwarf: &'a gimli::Dwarf<Cow<[u8]>>, -) -> gimli::Dwarf<gimli::EndianSlice<'a, gimli::LittleEndian>> { - let borrow_section: &dyn for<'b> Fn( - &'b Cow<[u8]>, - ) -> gimli::EndianSlice<'b, gimli::LittleEndian> = - &|section| gimli::EndianSlice::new(&*section, gimli::LittleEndian); - dwarf.borrow(&borrow_section) -} - -#[test] -fn parse_base_rc() { - let target = release_fixture_path(); - - with_file(&target, |file| { - addr2line::ObjectContext::new(file).unwrap(); - }); -} - -#[test] -fn parse_base_slice() { - let target = release_fixture_path(); - - with_file(&target, |file| { - let dwarf = dwarf_load(file); - let dwarf = dwarf_borrow(&dwarf); - addr2line::Context::from_dwarf(dwarf).unwrap(); - }); -} - -#[test] -fn parse_lines_rc() { - let target = release_fixture_path(); - - with_file(&target, |file| { - let context = addr2line::ObjectContext::new(file).unwrap(); - context.parse_lines().unwrap(); - }); -} - -#[test] -fn parse_lines_slice() { - let target = release_fixture_path(); - - with_file(&target, |file| { - let dwarf = dwarf_load(file); - let dwarf = dwarf_borrow(&dwarf); - let context = addr2line::Context::from_dwarf(dwarf).unwrap(); - context.parse_lines().unwrap(); - }); -} - -#[test] -fn parse_functions_rc() { - let target = release_fixture_path(); - - with_file(&target, |file| { - let context = addr2line::ObjectContext::new(file).unwrap(); - context.parse_functions().unwrap(); - }); -} - -#[test] -fn parse_functions_slice() { - let target = release_fixture_path(); - - with_file(&target, |file| { - let dwarf = dwarf_load(file); - let dwarf = dwarf_borrow(&dwarf); - let context = addr2line::Context::from_dwarf(dwarf).unwrap(); - context.parse_functions().unwrap(); - }); -} |