mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-24 21:31:04 +00:00
Bug 1498247 - Part 2 - cargo vendor; r=jgraham
Depends on D8577 Differential Revision: https://phabricator.services.mozilla.com/D8578 --HG-- extra : moz-landing-system : lando
This commit is contained in:
parent
b796049372
commit
c01581a74e
80
Cargo.lock
generated
80
Cargo.lock
generated
@ -37,6 +37,15 @@ dependencies = [
|
||||
"serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "argon2rs"
|
||||
version = "0.2.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"scoped_threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "arrayref"
|
||||
version = "0.3.4"
|
||||
@ -136,6 +145,27 @@ dependencies = [
|
||||
"tokio-uds 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "backtrace"
|
||||
version = "0.3.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-demangle 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "backtrace-sys"
|
||||
version = "0.1.24"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"cc 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "baldrdash"
|
||||
version = "0.1.0"
|
||||
@ -244,6 +274,15 @@ name = "bitreader"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "blake2-rfc"
|
||||
version = "0.2.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"arrayvec 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "boxfnonce"
|
||||
version = "0.0.3"
|
||||
@ -347,6 +386,11 @@ dependencies = [
|
||||
"cc 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "constant_time_eq"
|
||||
version = "0.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "cookie"
|
||||
version = "0.11.0"
|
||||
@ -667,6 +711,16 @@ name = "diff"
|
||||
version = "0.1.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "dirs"
|
||||
version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_users 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "docopt"
|
||||
version = "0.8.3"
|
||||
@ -778,6 +832,7 @@ name = "failure"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"failure_derive 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
@ -1481,6 +1536,7 @@ dependencies = [
|
||||
name = "mozrunner"
|
||||
version = "0.8.0"
|
||||
dependencies = [
|
||||
"dirs 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"mozprofile 0.4.0",
|
||||
"winreg 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -1918,6 +1974,17 @@ dependencies = [
|
||||
"redox_syscall 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "redox_users"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"argon2rs 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"failure 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_syscall 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "0.2.2"
|
||||
@ -2044,6 +2111,11 @@ name = "scoped-tls"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "scoped_threadpool"
|
||||
version = "0.1.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "scopeguard"
|
||||
version = "0.3.2"
|
||||
@ -3001,12 +3073,15 @@ dependencies = [
|
||||
"checksum aho-corasick 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "68f56c7353e5a9547cbd76ed90f7bb5ffc3ba09d4ea9bd1d8c06c8b1142eeb5a"
|
||||
"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
|
||||
"checksum app_units 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9dadc668390b373e73e4abbfc1f07238b09a25858f2f39c06cebc6d8e141d774"
|
||||
"checksum argon2rs 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3f67b0b6a86dae6e67ff4ca2b6201396074996379fba2b92ff649126f37cb392"
|
||||
"checksum arrayref 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0fd1479b7c29641adbd35ff3b5c293922d696a92f25c8c975da3e0acbc87258f"
|
||||
"checksum arrayvec 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2f0ef4a9820019a0c91d918918c93dc71d469f581a49b47ddc1d285d4270bbe2"
|
||||
"checksum ascii-canvas 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b385d69402821a1c254533a011a312531cbcc0e3e24f19bbb4747a5a2daf37e2"
|
||||
"checksum atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fb2dcb6e6d35f20276943cc04bb98e538b348d525a04ac79c10021561d202f21"
|
||||
"checksum atty 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d0fd4c0631f06448cc45a6bbb3b710ebb7ff8ccb96a0800c994afe23a70d5df2"
|
||||
"checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652"
|
||||
"checksum backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "89a47830402e9981c5c41223151efcced65a0510c13097c769cede7efb34782a"
|
||||
"checksum backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)" = "c66d56ac8dabd07f6aacdaf633f4b8262f5b3601a810a0dcddffd5c22c69daa0"
|
||||
"checksum base64 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "85415d2594767338a74a30c1d370b2f3262ec1b4ed2d7bba5b3faf4de40467d9"
|
||||
"checksum binary-space-partition 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "88ceb0d16c4fd0e42876e298d7d3ce3780dd9ebdcbe4199816a32c77e08597ff"
|
||||
"checksum bincode 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bda13183df33055cbb84b847becce220d392df502ebe7a4a78d7021771ed94d0"
|
||||
@ -3016,6 +3091,7 @@ dependencies = [
|
||||
"checksum bit-vec 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "02b4ff8b16e6076c3e14220b39fbc1fabb6737522281a388998046859400895f"
|
||||
"checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12"
|
||||
"checksum bitreader 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "80b13e2ab064ff3aa0bdbf1eff533f9822dc37899821f5f98c67f263eab51707"
|
||||
"checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400"
|
||||
"checksum boxfnonce 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8380105befe91099e6f69206164072c05bc92427ff6aa8a5171388317346dd75"
|
||||
"checksum build_const 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e90dc84f5e62d2ebe7676b83c22d33b6db8bd27340fb6ffbff0a364efa0cb9c9"
|
||||
"checksum byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "652805b7e73fada9d85e9a6682a4abd490cb52d96aeecc12e33a0de34dfd0d23"
|
||||
@ -3029,6 +3105,7 @@ dependencies = [
|
||||
"checksum clang-sys 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d7f7c04e52c35222fffcc3a115b5daf5f7e2bfb71c13c4e2321afe1fc71859c2"
|
||||
"checksum clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f0f16b89cbb9ee36d87483dc939fe9f1e13c05898d56d7b230a0d4dff033a536"
|
||||
"checksum cmake 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)" = "56d741ea7a69e577f6d06b36b7dff4738f680593dc27a701ffa8506b73ce28bb"
|
||||
"checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e"
|
||||
"checksum cookie 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1465f8134efa296b4c19db34d909637cb2bf0f7aaf21299e23e18fa29ac557cf"
|
||||
"checksum core-foundation 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c7caa6cb9e76ddddbea09a03266d6b3bc98cd41e9fb9b017c473e7cca593ec25"
|
||||
"checksum core-foundation-sys 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b2a53cce0ddcf7e7e1f998738d757d5a3bf08bf799a180e50ebe50d298f52f5a"
|
||||
@ -3062,6 +3139,7 @@ dependencies = [
|
||||
"checksum darling_macro 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eb69a38fdeaeaf3db712e1df170de67ee9dfc24fb88ca3e9d21e703ec25a4d8e"
|
||||
"checksum devd-rs 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e7c9ac481c38baf400d3b732e4a06850dfaa491d1b6379a249d9d40d14c2434c"
|
||||
"checksum diff 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "3c2b69f912779fbb121ceb775d74d51e915af17aaebc38d28a592843a2dd0a3a"
|
||||
"checksum dirs 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "88972de891f6118092b643d85a0b28e0678e0f948d7f879aa32f2d5aafe97d2a"
|
||||
"checksum docopt 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d8acd393692c503b168471874953a2531df0e9ab77d0b6bbc582395743300a4a"
|
||||
"checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab"
|
||||
"checksum dtoa-short 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "068d4026697c1a18f0b0bb8cfcad1b0c151b90d8edb9bf4c235ad68128920d1d"
|
||||
@ -3176,6 +3254,7 @@ dependencies = [
|
||||
"checksum rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d24ad214285a7729b174ed6d3bcfcb80177807f959d95fafd5bfc5c4f201ac8"
|
||||
"checksum redox_syscall 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "ab105df655884ede59d45b7070c8a65002d921461ee813a024558ca16030eea0"
|
||||
"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76"
|
||||
"checksum redox_users 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "214a97e49be64fd2c86f568dd0cb2c757d2cc53de95b273b6ad0a1c908482f26"
|
||||
"checksum regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1731164734096285ec2a5ec7fea5248ae2f5485b3feeb0115af4fda2183b2d1b"
|
||||
"checksum regex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "75ecf88252dce580404a22444fc7d626c01815debba56a7f4f536772a5ff19d3"
|
||||
"checksum regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad890a5eef7953f55427c50575c680c42841653abd2b028b68cd223d157f62db"
|
||||
@ -3190,6 +3269,7 @@ dependencies = [
|
||||
"checksum safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e27a8b19b835f7aea908818e871f5cc3a5a186550c30773be987e155e8163d8f"
|
||||
"checksum same-file 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cfb6eded0b06a0b512c8ddbcf04089138c9b4362c2f696f3c3d76039d68f3637"
|
||||
"checksum scoped-tls 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f417c22df063e9450888a7561788e9bd46d3bb3c1466435b4eccb903807f147d"
|
||||
"checksum scoped_threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8"
|
||||
"checksum scopeguard 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c79eb2c3ac4bc2507cda80e7f3ac5b88bd8eae4c0914d5663e6a8933994be918"
|
||||
"checksum scroll 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f84d114ef17fd144153d608fba7c446b0145d038985e7a8cc5d08bb0ce20383"
|
||||
"checksum scroll_derive 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8f1aa96c45e7f5a91cb7fabe7b279f02fea7126239fc40b732316e8b6a2d0fcb"
|
||||
|
1
third_party/rust/argon2rs/.cargo-checksum.json
vendored
Normal file
1
third_party/rust/argon2rs/.cargo-checksum.json
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"files":{".gitmodules":"7216d7210fd87dc33496c12a95a5f91341b5151a1d8c98b07a61c5e5e3aa1645",".nvimrc":"ba232d7fd57a10c3763055f6996666f145cdddddb9f8ae81b18cb77138a28fbb",".travis.yml":"2c709eff7f8df6eb3dc9407299c8c83a578516d386331e1d4f10fb35a28e676f","Cargo.toml":"a99751ee9da6e08a9ebf5e7f487c72dcc4996abfc28935c8c11e25b574ee69d7","README.md":"faba523bf765838fccfaea0fbb8836ab9e0ff58d5727824dec8fb4cb55475a95","benches/constant_eq.rs":"b78eca133968a53f3e883df52c14d2ae4d7de29298d0562fe8d507abc887136f","benches/versus_cargon.rs":"1d4c40f6d301cc2ca0ff190998105714a0c4c5aeaa838b5460c2625c5d4b4e3c","examples/cli.rs":"c1d6ba660a7e8e6d66614f284566a532aa67d0bc5d9576d383eb6262375825a3","examples/helloworld.rs":"f60b6ed3c9e68fb2313c3142064297a56e70cd30a1df37d75f2fcfcacd5c7973","examples/verifier.rs":"bf189d7540a6176c7f4f6acbed774385ed767bd4aab08967625819661110020b","kats/argon2d":"9883b3f1e171c04cd4dba40a66bfa0b3ed5bc7def1930e7ce94af13ba4e4b372","kats/argon2d.shasum":"7fdc8bc0bdead02232d49c085f4fe7705a01e8540cbc3267907821e1332f075b","kats/argon2i":"82ca18d6df38a67b1a52f610f19f1917e5b118014fe31995c83350b92319fa06","kats/argon2i.shasum":"e6045b4b7ada41a1b272e34f99245ff156a55ee90115cf559fea169c77e4066b","src/argon2.rs":"73ad1ef56087884747d994c81171e927a14ec0d647ab452e19b61533a90b2e03","src/block.rs":"92cd1e6a9295e464494f8844b44bcc45e5a752fb180c5fbf128a4071aa5bf522","src/lib.rs":"e2001c8f89b65ad52aba649fdc93baa43db872296adab64b691936169750af16","src/octword.rs":"14fbe93d7c147aafdfa6ec8d38de8214a8f1c13754ce5b81ee61f04e3b31f38f","src/verifier.rs":"341bab5073004d55341476afb1d1974b22edbfceed139ed979335ee2c69c0f97","travis.sh":"a6be33811f5f82f6f0bf64092ba5ddb90e8c215623ade5e7b5b6010a397186ca"},"package":"3f67b0b6a86dae6e67ff4ca2b6201396074996379fba2b92ff649126f37cb392"}
|
3
third_party/rust/argon2rs/.gitmodules
vendored
Normal file
3
third_party/rust/argon2rs/.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
[submodule "benches/cargon/phc-winner-argon2"]
|
||||
path = benches/cargon/phc-winner-argon2
|
||||
url = git://github.com/p-h-c/phc-winner-argon2
|
1
third_party/rust/argon2rs/.nvimrc
vendored
Normal file
1
third_party/rust/argon2rs/.nvimrc
vendored
Normal file
@ -0,0 +1 @@
|
||||
noremap <Leader>r :!rsync -aviz ~/dev/argon2rs cas9:~/dev/<CR>
|
6
third_party/rust/argon2rs/.travis.yml
vendored
Normal file
6
third_party/rust/argon2rs/.travis.yml
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
language: rust
|
||||
rust:
|
||||
- nightly
|
||||
- stable
|
||||
sudo: false
|
||||
script: ./travis.sh
|
21
third_party/rust/argon2rs/Cargo.toml
vendored
Normal file
21
third_party/rust/argon2rs/Cargo.toml
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
[package]
|
||||
name = "argon2rs"
|
||||
version = "0.2.5"
|
||||
authors = ["bryant <bryant@defrag.in>"]
|
||||
repository = "https://github.com/bryant/argon2rs"
|
||||
documentation = "http://bryant.github.io/argon2rs/argon2rs/"
|
||||
description = "The pure Rust password hashing library that runs on Argon2."
|
||||
readme = "README.md"
|
||||
keywords = ["crypto", "argon2", "argon2i", "argon2d", "hash"]
|
||||
license = "MIT"
|
||||
|
||||
[features]
|
||||
default = []
|
||||
simd = ["blake2-rfc/simd_asm"]
|
||||
|
||||
[dependencies]
|
||||
blake2-rfc = "0.2.16"
|
||||
scoped_threadpool = "0.1.7"
|
||||
|
||||
[dev-dependencies]
|
||||
cargon = { path = "benches/cargon", version = "0.0.1" }
|
114
third_party/rust/argon2rs/README.md
vendored
Normal file
114
third_party/rust/argon2rs/README.md
vendored
Normal file
@ -0,0 +1,114 @@
|
||||
argon2rs
|
||||
========
|
||||
|
||||
[![Build
|
||||
Status](https://travis-ci.org/bryant/argon2rs.svg?branch=master)](https://travis-ci.org/bryant/argon2rs)
|
||||
|
||||
This is a purely Rust-based library that provides both variants of the
|
||||
state-of-the-art Argon2 hashing algorithm, suitable for password hashing and
|
||||
password-based key derivation.
|
||||
|
||||
[Documentation](http://bryant.github.io/argon2rs/argon2rs/)
|
||||
|
||||
## Installation
|
||||
|
||||
Via cargo:
|
||||
|
||||
```bash
|
||||
$ cd $PROJECT_ROOT
|
||||
$ cargo install --features "simd"
|
||||
```
|
||||
|
||||
From git:
|
||||
|
||||
```bash
|
||||
$ git clone https://github.com/bryant/argon2rs $ARGON_DIR && cd $ARGON_DIR
|
||||
$ cargo build --features "simd"
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
From `examples/helloworld.rs`:
|
||||
|
||||
```rust
|
||||
extern crate argon2rs;
|
||||
|
||||
pub fn main() {
|
||||
let (password, salt) = ("argon2i!", "delicious salt");
|
||||
println!("argon2i(\"argon2i\", \"delicious\"):");
|
||||
for byte in argon2rs::simple2i(&password, &salt).iter() {
|
||||
print!("{:02x}", byte);
|
||||
}
|
||||
println!("");
|
||||
}
|
||||
```
|
||||
|
||||
outputs:
|
||||
|
||||
```
|
||||
argon2i("argon2i", "delicious"):
|
||||
e254b28d820f26706a19309f1888cefd5d48d91384f35dc2e3fe75c3a8f665a6
|
||||
```
|
||||
|
||||
There are two variants of Argon2 that differ in the manner by which reference
|
||||
indices are computed during block-filling rounds. Argon2d does this in a faster
|
||||
but data-dependent fashion that could be vulnerable to side-channel
|
||||
[attacks][1], whereas Argon2i ("i" denoting independence from plaintext input)
|
||||
works slower but is immune to such attacks and is therefore the preferred choice
|
||||
for password hashing.
|
||||
|
||||
## TODO
|
||||
|
||||
- [x] Parallelize.
|
||||
- [x] Incorporate SIMD into compression function.
|
||||
- [x] Zero-on-drop trait for sensitive(s): `Matrix`
|
||||
- [x] Constant-time verification API.
|
||||
- [x] Benchmarks.
|
||||
- [ ] Support NEON and SIMD on other arches.
|
||||
- [ ] Fuzz.
|
||||
|
||||
## LICENSE
|
||||
|
||||
MIT.
|
||||
|
||||
## Benchmarks
|
||||
|
||||
Our primary benchmarks are single- and multi-threaded runs of Argon2i with
|
||||
default parameters against the [reference implementation][2]. In order to
|
||||
compile and run this, first pull in the C sources:
|
||||
|
||||
```bash
|
||||
$ git submodule init
|
||||
$ git submodule update benches/cargon/phc-winner-argon2
|
||||
```
|
||||
|
||||
and then benchmark with Cargo as usual:
|
||||
|
||||
```
|
||||
$ rustc --version
|
||||
rustc 1.11.0-dev (4b240fe96 2016-06-08)
|
||||
|
||||
$ export RUSTFLAGS='-C target-feature=+avx'
|
||||
$ cargo bench --features=simd
|
||||
|
||||
# output trimmed for brevity
|
||||
|
||||
Running target/release/versus_cargon-b5955411e1594c85
|
||||
|
||||
running 5 tests
|
||||
test ensure_identical_hashes ... ignored
|
||||
test bench_argon2rs_i ... bench: 9,547,031 ns/iter (+/- 15,964)
|
||||
test bench_argon2rs_threaded ... bench: 4,584,163 ns/iter (+/- 398,803)
|
||||
test bench_cargon_i ... bench: 10,013,015 ns/iter (+/- 177,482)
|
||||
test bench_cargon_threaded ... bench: 3,753,022 ns/iter (+/- 48,688)
|
||||
|
||||
test result: ok. 0 passed; 0 failed; 0 ignored; 2 measured
|
||||
```
|
||||
|
||||
## References
|
||||
|
||||
["Argon2: The Memory-Hard Function for Password Hashing and Other
|
||||
Applications"][1]
|
||||
|
||||
[1]: https://github.com/P-H-C/phc-winner-argon2/raw/master/argon2-specs.pdf
|
||||
[2]: https://github.com/p-h-c/phc-winner-argon2
|
21
third_party/rust/argon2rs/benches/constant_eq.rs
vendored
Normal file
21
third_party/rust/argon2rs/benches/constant_eq.rs
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
// demonstrates (to some degree of certainty modulo process scheduling) that the
|
||||
// run time of `verifier::constant_eq` is independent of its inputs.
|
||||
#![feature(test)]
|
||||
|
||||
extern crate test;
|
||||
extern crate argon2rs;
|
||||
use argon2rs::verifier::constant_eq;
|
||||
|
||||
#[bench]
|
||||
fn param_are_equal(b: &mut test::Bencher) {
|
||||
let lhs = (0..255).cycle().take(9001).collect::<Vec<u8>>();
|
||||
b.iter(|| constant_eq(&lhs[..], &lhs[..]));
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn params_are_unequal(b: &mut test::Bencher) {
|
||||
let lhs = (0..255).cycle().take(9001).collect::<Vec<u8>>();
|
||||
let mut rhs = lhs.clone();
|
||||
rhs[0] += 24;
|
||||
b.iter(|| constant_eq(&lhs[..], &rhs[..]));
|
||||
}
|
90
third_party/rust/argon2rs/benches/versus_cargon.rs
vendored
Normal file
90
third_party/rust/argon2rs/benches/versus_cargon.rs
vendored
Normal file
@ -0,0 +1,90 @@
|
||||
// benches argon2rs against the reference c implementation at
|
||||
// https://github.com/p-h-c/phc-winner-argon2
|
||||
|
||||
#![feature(test)]
|
||||
|
||||
extern crate test;
|
||||
extern crate argon2rs;
|
||||
extern crate cargon;
|
||||
|
||||
use argon2rs::{Argon2, defaults};
|
||||
use argon2rs::Variant::Argon2i;
|
||||
use std::ptr;
|
||||
|
||||
const PASSWORD: &'static [u8] = b"cargo bench --feature=simd";
|
||||
const SALT: &'static [u8] = b"cargo test --release";
|
||||
|
||||
#[bench]
|
||||
fn bench_argon2rs_i(b: &mut test::Bencher) {
|
||||
let a2 = Argon2::default(Argon2i);
|
||||
let mut out = [0; defaults::LENGTH];
|
||||
b.iter(|| a2.hash(&mut out, PASSWORD, SALT, &[], &[]));
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn bench_cargon_i(b: &mut test::Bencher) {
|
||||
let a2 = Argon2::default(Argon2i);
|
||||
let mut out = [0; defaults::LENGTH];
|
||||
let mut ctx = mk_cargon(a2, &mut out, PASSWORD, SALT, &[], &[]);
|
||||
b.iter(|| unsafe { cargon::argon2_ctx(&mut ctx, Argon2i as usize) });
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn bench_argon2rs_threaded(b: &mut test::Bencher) {
|
||||
let a2 = Argon2::new(defaults::PASSES, 4, defaults::KIB, Argon2i).unwrap();
|
||||
let mut out = [0; defaults::LENGTH];
|
||||
b.iter(|| a2.hash(&mut out, PASSWORD, SALT, &[], &[]));
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn bench_cargon_threaded(b: &mut test::Bencher) {
|
||||
let a2 = Argon2::new(defaults::PASSES, 4, defaults::KIB, Argon2i).unwrap();
|
||||
let mut out = [0; defaults::LENGTH];
|
||||
let mut ctx = mk_cargon(a2, &mut out, PASSWORD, SALT, &[], &[]);
|
||||
b.iter(|| unsafe { cargon::argon2_ctx(&mut ctx, Argon2i as usize) });
|
||||
}
|
||||
|
||||
fn mk_cargon(a2: Argon2, out: &mut [u8], p: &[u8], s: &[u8], k: &[u8], x: &[u8])
|
||||
-> cargon::CargonContext {
|
||||
let (_, kib, passes, lanes) = a2.params();
|
||||
cargon::CargonContext {
|
||||
out: out.as_mut_ptr(),
|
||||
outlen: out.len() as u32,
|
||||
pwd: p.as_ptr(),
|
||||
pwdlen: p.len() as u32,
|
||||
salt: s.as_ptr(),
|
||||
saltlen: s.len() as u32,
|
||||
secret: k.as_ptr(),
|
||||
secretlen: k.len() as u32,
|
||||
ad: x.as_ptr(),
|
||||
adlen: x.len() as u32,
|
||||
|
||||
t_cost: passes,
|
||||
m_cost: kib,
|
||||
lanes: lanes,
|
||||
threads: lanes,
|
||||
version: 0x10,
|
||||
allocate_fptr: ptr::null(),
|
||||
deallocate_fptr: ptr::null(),
|
||||
flags: cargon::ARGON2_FLAG_CLEAR_MEMORY,
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ensure_identical_hashes() {
|
||||
fn comp(lanes: u32) {
|
||||
let mut outrs = [0; defaults::LENGTH];
|
||||
let mut outca = [0; defaults::LENGTH];
|
||||
let a2 = Argon2::new(defaults::PASSES, lanes, defaults::KIB, Argon2i)
|
||||
.unwrap();
|
||||
a2.hash(&mut outrs, PASSWORD, SALT, &[], &[]);
|
||||
|
||||
let mut ctx = mk_cargon(a2, &mut outca, PASSWORD, SALT, &[], &[]);
|
||||
unsafe {
|
||||
cargon::argon2_ctx(&mut ctx, Argon2i as usize);
|
||||
}
|
||||
assert_eq!(outrs, outca);
|
||||
}
|
||||
comp(1);
|
||||
comp(4);
|
||||
}
|
55
third_party/rust/argon2rs/examples/cli.rs
vendored
Normal file
55
third_party/rust/argon2rs/examples/cli.rs
vendored
Normal file
@ -0,0 +1,55 @@
|
||||
extern crate argon2rs;
|
||||
|
||||
use argon2rs::{Argon2, Variant};
|
||||
use std::string::String;
|
||||
use std::env;
|
||||
use std::io::{Read, stdin};
|
||||
|
||||
const CLI_TOOL_SALT_LEN: usize = 16;
|
||||
|
||||
fn that_cli_tool(msg: &[u8], salt: &[u8], passes: u32, lanes: u32, logkib: u32)
|
||||
-> [u8; argon2rs::defaults::LENGTH] {
|
||||
assert!(salt.len() <= CLI_TOOL_SALT_LEN && passes > 0 && logkib > 0 &&
|
||||
lanes > 0);
|
||||
let a = Argon2::new(passes, lanes, 1 << logkib, Variant::Argon2i)
|
||||
.ok()
|
||||
.unwrap();
|
||||
let mut s = [0; CLI_TOOL_SALT_LEN];
|
||||
for (&v, mut k) in salt.iter().zip(s.iter_mut()) {
|
||||
*k = v;
|
||||
}
|
||||
|
||||
let mut out = [0 as u8; argon2rs::defaults::LENGTH];
|
||||
a.hash(&mut out, msg, &s, &[], &[]);
|
||||
out
|
||||
}
|
||||
|
||||
fn to_string(bs: &[u8]) -> String {
|
||||
let mut rv = String::new();
|
||||
for b in bs.iter() {
|
||||
rv.push_str(&format!("{:02x}", b));
|
||||
}
|
||||
rv
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let args: Vec<String> = env::args().collect();
|
||||
|
||||
if args.len() != 5 {
|
||||
println!("Usage: {} passes lanes logkib salt", args[0]);
|
||||
println!("where salt.len() <= {}, memory usage is 2^logkib, and \
|
||||
plaintext is read from stdin.", CLI_TOOL_SALT_LEN);
|
||||
return;
|
||||
}
|
||||
|
||||
let t: u32 = args[1].parse().unwrap();
|
||||
let l: u32 = args[2].parse().unwrap();
|
||||
let logm: u32 = args[3].parse().unwrap();
|
||||
let salt = args[4].as_ref();
|
||||
|
||||
let mut msg = String::new();
|
||||
stdin().read_to_string(&mut msg).unwrap();
|
||||
let p = msg.as_bytes();
|
||||
|
||||
println!("Hash: {}", to_string(&that_cli_tool(p, salt, t, l, logm)));
|
||||
}
|
10
third_party/rust/argon2rs/examples/helloworld.rs
vendored
Normal file
10
third_party/rust/argon2rs/examples/helloworld.rs
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
extern crate argon2rs;
|
||||
|
||||
pub fn main() {
|
||||
let (password, salt) = ("argon2i!", "delicious salt");
|
||||
println!("argon2i(\"argon2i\", \"delicious\"):");
|
||||
for byte in argon2rs::argon2i_simple(&password, &salt).iter() {
|
||||
print!("{:02x}", byte);
|
||||
}
|
||||
println!("");
|
||||
}
|
35
third_party/rust/argon2rs/examples/verifier.rs
vendored
Normal file
35
third_party/rust/argon2rs/examples/verifier.rs
vendored
Normal file
@ -0,0 +1,35 @@
|
||||
extern crate argon2rs;
|
||||
use argon2rs::verifier::Encoded;
|
||||
use argon2rs::defaults::{KIB, LANES, PASSES};
|
||||
use argon2rs::{Argon2, Variant};
|
||||
|
||||
pub fn main() {
|
||||
// A typical password hashing scenario:
|
||||
//
|
||||
// 1. Hash a password into a secure, storable encoding:
|
||||
let a2 = Argon2::new(PASSES, LANES, KIB, Variant::Argon2i).unwrap();
|
||||
let enc0 = Encoded::new(a2,
|
||||
b"password goes here",
|
||||
b"sodium chloride",
|
||||
b"",
|
||||
b"");
|
||||
let bytes0 = enc0.to_u8();
|
||||
println!("storable encoding 0: {}",
|
||||
String::from_utf8(bytes0.clone()).unwrap());
|
||||
|
||||
// or, if you're in a hurry and/or would rather rely on algorithm defaults:
|
||||
let bytes1 = Encoded::default2i(b"another password",
|
||||
b"salt required",
|
||||
b"key",
|
||||
b"")
|
||||
.to_u8();
|
||||
println!("storable encoding 1: {}",
|
||||
String::from_utf8(bytes1.clone()).unwrap());
|
||||
|
||||
// 2. Verify later-received input against a previously created encoding.
|
||||
let enc0 = Encoded::from_u8(&bytes0[..]).unwrap();
|
||||
assert!(enc0.verify(b"password goes here"));
|
||||
|
||||
let enc1 = Encoded::from_u8(&bytes1[..]).unwrap();
|
||||
assert!(enc1.verify(b"another password"));
|
||||
}
|
12302
third_party/rust/argon2rs/kats/argon2d
vendored
Normal file
12302
third_party/rust/argon2rs/kats/argon2d
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1
third_party/rust/argon2rs/kats/argon2d.shasum
vendored
Normal file
1
third_party/rust/argon2rs/kats/argon2d.shasum
vendored
Normal file
@ -0,0 +1 @@
|
||||
9883b3f1e171c04cd4dba40a66bfa0b3ed5bc7def1930e7ce94af13ba4e4b372 argon2d
|
12302
third_party/rust/argon2rs/kats/argon2i
vendored
Normal file
12302
third_party/rust/argon2rs/kats/argon2i
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1
third_party/rust/argon2rs/kats/argon2i.shasum
vendored
Normal file
1
third_party/rust/argon2rs/kats/argon2i.shasum
vendored
Normal file
@ -0,0 +1 @@
|
||||
82ca18d6df38a67b1a52f610f19f1917e5b118014fe31995c83350b92319fa06 argon2i
|
612
third_party/rust/argon2rs/src/argon2.rs
vendored
Normal file
612
third_party/rust/argon2rs/src/argon2.rs
vendored
Normal file
@ -0,0 +1,612 @@
|
||||
extern crate blake2_rfc;
|
||||
extern crate scoped_threadpool;
|
||||
|
||||
use std::{fmt, mem};
|
||||
use std::error::Error;
|
||||
use self::blake2_rfc::blake2b::Blake2b;
|
||||
use octword::u64x2;
|
||||
use block::{ARGON2_BLOCK_BYTES, Block, Matrix};
|
||||
use block;
|
||||
|
||||
#[derive(Eq, PartialEq, Copy, Clone, Debug)]
|
||||
pub enum Variant {
|
||||
Argon2d = 0,
|
||||
Argon2i = 1,
|
||||
}
|
||||
|
||||
const ARGON2_VERSION: u32 = 0x10;
|
||||
const DEF_B2HASH_LEN: usize = 64;
|
||||
const SLICES_PER_LANE: u32 = 4;
|
||||
|
||||
pub mod defaults {
|
||||
// from run.c
|
||||
pub const PASSES: u32 = 3;
|
||||
pub const KIB: u32 = 4096;
|
||||
pub const LANES: u32 = 1;
|
||||
pub const LENGTH: usize = 32;
|
||||
}
|
||||
|
||||
fn split_u64(n: u64) -> (u32, u32) {
|
||||
((n & 0xffffffff) as u32, (n >> 32) as u32)
|
||||
}
|
||||
|
||||
fn xor_all(blocks: &Vec<&Block>) -> Block {
|
||||
if blocks.len() == 0 {
|
||||
block::zero()
|
||||
} else {
|
||||
let mut rv = blocks[0].clone();
|
||||
for &block in blocks.iter().skip(1) {
|
||||
rv ^= block;
|
||||
}
|
||||
rv
|
||||
}
|
||||
}
|
||||
|
||||
fn as32le(k: u32) -> [u8; 4] { unsafe { mem::transmute(k.to_le()) } }
|
||||
|
||||
fn len32(t: &[u8]) -> [u8; 4] { as32le(t.len() as u32) }
|
||||
|
||||
macro_rules! b2hash {
|
||||
($($bytes: expr),*) => {
|
||||
{
|
||||
let mut out: [u8; DEF_B2HASH_LEN] = unsafe { mem::uninitialized() };
|
||||
b2hash!(&mut out; $($bytes),*);
|
||||
out
|
||||
}
|
||||
};
|
||||
($out: expr; $($bytes: expr),*) => {
|
||||
{
|
||||
let mut b = Blake2b::new($out.len());
|
||||
$(b.update($bytes));*;
|
||||
$out.clone_from_slice(b.finalize().as_bytes());
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#[cfg_attr(rustfmt, rustfmt_skip)]
|
||||
fn h0(lanes: u32, hash_length: u32, memory_kib: u32, passes: u32, version: u32,
|
||||
variant: Variant, p: &[u8], s: &[u8], k: &[u8], x: &[u8])
|
||||
-> [u8; 72] {
|
||||
let mut rv = [0 as u8; 72];
|
||||
b2hash!(&mut rv[0..DEF_B2HASH_LEN];
|
||||
&as32le(lanes), &as32le(hash_length), &as32le(memory_kib),
|
||||
&as32le(passes), &as32le(version), &as32le(variant as u32),
|
||||
&len32(p), p,
|
||||
&len32(s), s,
|
||||
&len32(k), k,
|
||||
&len32(x), x);
|
||||
rv
|
||||
}
|
||||
|
||||
/// Main entry point for running Argon2 on customized parameters (cf. note for
|
||||
/// `Argon2::new`).
|
||||
pub struct Argon2 {
|
||||
passes: u32,
|
||||
lanes: u32,
|
||||
lanelen: u32,
|
||||
kib: u32,
|
||||
variant: Variant,
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
|
||||
pub enum ParamErr {
|
||||
TooFewPasses,
|
||||
TooFewLanes,
|
||||
TooManyLanes,
|
||||
MinKiB(u64),
|
||||
}
|
||||
|
||||
impl fmt::Display for ParamErr {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
use ParamErr::*;
|
||||
match *self {
|
||||
TooFewPasses | TooFewLanes | TooManyLanes => {
|
||||
write!(f, "{}", self.description())
|
||||
}
|
||||
MinKiB(k) => write!(f, "Memory parameter must be >= {} KiB.", k),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Error for ParamErr {
|
||||
fn description(&self) -> &str {
|
||||
use ParamErr::*;
|
||||
match *self {
|
||||
TooFewPasses => "Argon2 requires one or more passes to be run.",
|
||||
TooFewLanes | TooManyLanes => {
|
||||
"The number of lanes must be between one and 2^24 - 1."
|
||||
}
|
||||
MinKiB(_) => "Specified size of block matrix was too small.",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Argon2 {
|
||||
/// Returns an `Argon2` set to default input parameters. See below for a
|
||||
/// description of these parameters.
|
||||
pub fn default(v: Variant) -> Argon2 {
|
||||
Argon2::new(defaults::PASSES, defaults::LANES, defaults::KIB, v)
|
||||
.ok()
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
/// Use this to customize Argon2's time and memory cost parameters.
|
||||
/// Adjusting any of these will affect the value of the final hash result.
|
||||
///
|
||||
/// `passes`: The number of block matrix iterations to perform. Increasing
|
||||
/// this forces hashing to take longer. Must be between 1 and 2^32 - 1.
|
||||
///
|
||||
/// `lanes`: The degree of parallelism by which memory is filled during hash
|
||||
/// computation. Setting this to N instructs argon2rs to partition the block
|
||||
/// matrix into N lanes, simultaneously filling each lane in parallel with N
|
||||
/// threads. Must be between 1 and 2^24 - 1.
|
||||
///
|
||||
/// `kib`: Desired total size of block matrix, in kibbibytes (1 KiB = 1024
|
||||
/// bytes). Increasing this forces hashing to use more memory in order to
|
||||
/// thwart ASIC-based attacks. Must be >= 8 * lanes.
|
||||
///
|
||||
/// `variant`: Set this to `Variant::Argon2i` when hashing passwords.
|
||||
pub fn new(passes: u32, lanes: u32, kib: u32, variant: Variant)
|
||||
-> Result<Argon2, ParamErr> {
|
||||
if passes < 1 {
|
||||
Result::Err(ParamErr::TooFewPasses)
|
||||
} else if lanes < 1 {
|
||||
Result::Err(ParamErr::TooFewLanes)
|
||||
} else if 0x00ffffff < lanes {
|
||||
Result::Err(ParamErr::TooManyLanes)
|
||||
} else if (kib as u64) < 8 * lanes as u64 {
|
||||
Result::Err(ParamErr::MinKiB(8 * lanes as u64))
|
||||
} else {
|
||||
Result::Ok(Argon2 {
|
||||
passes: passes,
|
||||
lanes: lanes,
|
||||
lanelen: kib / (4 * lanes) * 4,
|
||||
kib: kib,
|
||||
variant: variant,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/// Runs the selected Argon2 variant over provided inputs, writing the final
|
||||
/// hash to the byte slice `out`. Note that the output length is assumed to
|
||||
/// be `out.len()` and must be between 4 and 2^32 - 1. The inputs are:
|
||||
///
|
||||
/// `p`, the byte slice containing, typically, the plaintext (length 0 to
|
||||
/// 2^32-1);
|
||||
///
|
||||
/// a salt `s` of length 8 to 2^32-1 bytes;
|
||||
///
|
||||
/// `k`, an optional (length 0 to 32 bytes) secret value; and
|
||||
///
|
||||
/// `x`, optional associated data length 0 to 2^32 - 1.
|
||||
pub fn hash(&self, out: &mut [u8], p: &[u8], s: &[u8], k: &[u8], x: &[u8]) {
|
||||
self.hash_impl(out, p, s, k, x, |_| {}, |_, _| {});
|
||||
}
|
||||
|
||||
#[cfg_attr(rustfmt, rustfmt_skip)]
|
||||
fn hash_impl<F, G>(&self, out: &mut [u8], p: &[u8], s: &[u8], k: &[u8],
|
||||
x: &[u8], mut h0_fn: F, mut pass_fn: G)
|
||||
where F: FnMut(&[u8]) -> (),
|
||||
G: FnMut(u32, &Matrix) -> ()
|
||||
{
|
||||
assert!(4 <= out.len() && out.len() <= 0xffffffff);
|
||||
assert!(p.len() <= 0xffffffff);
|
||||
assert!(8 <= s.len() && s.len() <= 0xffffffff);
|
||||
assert!(k.len() <= 32);
|
||||
assert!(x.len() <= 0xffffffff);
|
||||
|
||||
let mut blocks = Matrix::new(self.lanes, self.lanelen);
|
||||
let h0 = h0(self.lanes, out.len() as u32, self.kib, self.passes,
|
||||
ARGON2_VERSION, self.variant, p, s, k, x);
|
||||
h0_fn(&h0); // kats
|
||||
|
||||
let mut pool = scoped_threadpool::Pool::new(self.lanes);
|
||||
if self.lanes > 1 {
|
||||
pool.scoped(|sc| {
|
||||
for (l, bref) in (0..self.lanes).zip(blocks.lanes_as_mut()) {
|
||||
sc.execute(move || self.fill_first_slice(bref, h0, l));
|
||||
}
|
||||
});
|
||||
} else {
|
||||
self.fill_first_slice(&mut blocks, h0, 0);
|
||||
}
|
||||
|
||||
// finish first pass. slices have to be filled in sync.
|
||||
self.fill_segment(0, 1, &mut blocks, &mut pool);
|
||||
pass_fn(0, &blocks); // kats
|
||||
|
||||
for p in 1..self.passes {
|
||||
self.fill_segment(p, 0, &mut blocks, &mut pool);
|
||||
pass_fn(p, &blocks); // kats
|
||||
}
|
||||
|
||||
h_prime(out, block::as_u8(&xor_all(&blocks.col(self.lanelen - 1))));
|
||||
}
|
||||
|
||||
// `Matrix` is an array of 1-KiB blocks and organized as follows:
|
||||
//
|
||||
// +------------------------ `lanelen` columns ------------------------+
|
||||
// | +-----------------+ |
|
||||
// +--- slice ---+ +--- slice ---+ | +--- slice ---+ | +--- slice ---+
|
||||
// | | | | | | | | | |
|
||||
// +- b b b b ... b b b b b ... b | b b b b ... b | b b b b ... b
|
||||
// | b | |
|
||||
// | ... | |
|
||||
// +- b b b b ... b b b b b ... b | b b b b ... b | b b b b ... b
|
||||
// | | |
|
||||
// +--`lane` rows +---- segment ----+
|
||||
//
|
||||
// where each `b` represents a 1-KiB block.
|
||||
//
|
||||
// Some invariants:
|
||||
// - There are always four slices.
|
||||
// - `lanelen * lane = self.kib`.
|
||||
// - Filling is done segment-by-segment.
|
||||
#[inline(always)]
|
||||
fn fill_segment(&self, pass: u32, slice_begin: u32, blocks: &mut Matrix,
|
||||
pool: &mut scoped_threadpool::Pool) {
|
||||
if self.lanes == 1 {
|
||||
for slice in slice_begin..SLICES_PER_LANE {
|
||||
self.fill_slice(blocks, pass, 0, slice, 0);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
for slice in slice_begin..SLICES_PER_LANE {
|
||||
pool.scoped(|sc| {
|
||||
for (l, bref) in (0..self.lanes).zip(blocks.lanes_as_mut()) {
|
||||
sc.execute(move || self.fill_slice(bref, pass, l, slice, 0));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
fn fill_first_slice(&self, blks: &mut Matrix, mut h0: [u8; 72], lane: u32) {
|
||||
// fill the first (of four) slice
|
||||
h0[68..72].clone_from_slice(&as32le(lane));
|
||||
|
||||
h0[64..68].clone_from_slice(&as32le(0));
|
||||
h_prime(block::as_u8_mut(&mut blks[(lane, 0)]), &h0);
|
||||
|
||||
h0[64..68].clone_from_slice(&as32le(1));
|
||||
h_prime(block::as_u8_mut(&mut blks[(lane, 1)]), &h0);
|
||||
|
||||
// finish rest of first slice
|
||||
self.fill_slice(blks, 0, lane, 0, 2);
|
||||
}
|
||||
|
||||
#[cfg_attr(rustfmt, rustfmt_skip)]
|
||||
fn fill_slice(&self, blks: &mut Matrix, pass: u32, lane: u32, slice: u32,
|
||||
offset: u32) {
|
||||
let mut jgen = Gen2i::new(offset as usize, pass, lane, slice,
|
||||
self.lanes * self.lanelen, self.passes);
|
||||
let slicelen = self.lanelen / SLICES_PER_LANE;
|
||||
|
||||
for idx in offset..slicelen {
|
||||
let (j1, j2) = if self.variant == Variant::Argon2i {
|
||||
jgen.nextj()
|
||||
} else {
|
||||
let col = self.prev(slice * slicelen + idx);
|
||||
split_u64((blks[(lane, col)])[0].0)
|
||||
};
|
||||
self.fill_block(blks, pass, lane, slice, idx, j1, j2);
|
||||
}
|
||||
}
|
||||
|
||||
fn fill_block(&self, blks: &mut Matrix, pass: u32, lane: u32, slice: u32,
|
||||
idx: u32, j1: u32, j2: u32) {
|
||||
let slicelen = self.lanelen / SLICES_PER_LANE;
|
||||
let ls = self.lanes;
|
||||
let z = index_alpha(pass, lane, slice, ls, idx, slicelen, j1, j2);
|
||||
|
||||
let zth = match (pass, slice) {
|
||||
(0, 0) => (lane, z),
|
||||
_ => (j2 % self.lanes, z),
|
||||
};
|
||||
|
||||
let cur = (lane, slice * slicelen + idx);
|
||||
let pre = (lane, self.prev(cur.1));
|
||||
let (wr, rd, refblk) = blks.get3(cur, pre, zth);
|
||||
g(wr, rd, refblk);
|
||||
}
|
||||
|
||||
fn prev(&self, n: u32) -> u32 {
|
||||
if n > 0 { n - 1 } else { self.lanelen - 1 }
|
||||
}
|
||||
|
||||
/// Provides read-only access to `(variant, kibbibytes, passes, lanes)`.
|
||||
pub fn params(&self) -> (Variant, u32, u32, u32) {
|
||||
(self.variant, self.kib, self.passes, self.lanes)
|
||||
}
|
||||
}
|
||||
|
||||
/// Convenience wrapper around Argon2i for the majority of use cases where only
|
||||
/// a password and salt are supplied. Note that a salt between 8 and 2^32-1
|
||||
/// bytes must be provided.
|
||||
pub fn argon2i_simple(password: &str, salt: &str) -> [u8; defaults::LENGTH] {
|
||||
let mut out = [0; defaults::LENGTH];
|
||||
let a2 = Argon2::default(Variant::Argon2i);
|
||||
a2.hash(&mut out, password.as_bytes(), salt.as_bytes(), &[], &[]);
|
||||
out
|
||||
}
|
||||
|
||||
/// Convenience wrapper around Argon2d for the majority of use cases where only
|
||||
/// a password and salt are supplied. Note that a salt between 8 and 2^32-1
|
||||
/// bytes must be provided.
|
||||
pub fn argon2d_simple(password: &str, salt: &str) -> [u8; defaults::LENGTH] {
|
||||
let mut out = [0; defaults::LENGTH];
|
||||
let a2 = Argon2::default(Variant::Argon2d);
|
||||
a2.hash(&mut out, password.as_bytes(), salt.as_bytes(), &[], &[]);
|
||||
out
|
||||
}
|
||||
|
||||
fn h_prime(out: &mut [u8], input: &[u8]) {
|
||||
if out.len() <= DEF_B2HASH_LEN {
|
||||
b2hash!(out; &len32(out), input);
|
||||
} else {
|
||||
let mut tmp = b2hash!(&len32(out), input);
|
||||
out[0..DEF_B2HASH_LEN].clone_from_slice(&tmp);
|
||||
let mut wr_at: usize = 32;
|
||||
|
||||
while out.len() - wr_at > DEF_B2HASH_LEN {
|
||||
b2hash!(&mut tmp; &tmp);
|
||||
out[wr_at..wr_at + DEF_B2HASH_LEN].clone_from_slice(&tmp);
|
||||
wr_at += DEF_B2HASH_LEN / 2;
|
||||
}
|
||||
|
||||
let len = out.len() - wr_at;
|
||||
b2hash!(&mut out[wr_at..wr_at + len]; &tmp);
|
||||
}
|
||||
}
|
||||
|
||||
// from opt.c
|
||||
fn index_alpha(pass: u32, lane: u32, slice: u32, lanes: u32, sliceidx: u32,
|
||||
slicelen: u32, j1: u32, j2: u32)
|
||||
-> u32 {
|
||||
let lanelen = slicelen * 4;
|
||||
let r: u32 = match (pass, slice, j2 % lanes == lane) {
|
||||
(0, 0, _) => sliceidx - 1,
|
||||
(0, _, false) => slice * slicelen - if sliceidx == 0 { 1 } else { 0 },
|
||||
(0, _, true) => slice * slicelen + sliceidx - 1,
|
||||
(_, _, false) => lanelen - slicelen - if sliceidx == 0 { 1 } else { 0 },
|
||||
(_, _, true) => lanelen - slicelen + sliceidx - 1,
|
||||
};
|
||||
|
||||
let (r_, j1_) = (r as u64, j1 as u64);
|
||||
let relpos: u32 = (r_ - 1 - (r_ * (j1_ * j1_ >> 32) >> 32)) as u32;
|
||||
|
||||
match (pass, slice) {
|
||||
(0, _) | (_, 3) => relpos % lanelen,
|
||||
_ => (slicelen * (slice + 1) + relpos) % lanelen,
|
||||
}
|
||||
}
|
||||
|
||||
struct Gen2i {
|
||||
arg: Block,
|
||||
pseudos: Block,
|
||||
idx: usize,
|
||||
}
|
||||
|
||||
impl Gen2i {
|
||||
#[cfg_attr(rustfmt, rustfmt_skip)]
|
||||
fn new(start_at: usize, pass: u32, lane: u32, slice: u32, totblocks: u32,
|
||||
totpasses: u32)
|
||||
-> Gen2i {
|
||||
use block::zero;
|
||||
|
||||
let mut rv = Gen2i { arg: zero(), pseudos: zero(), idx: start_at };
|
||||
let args = [(pass, lane), (slice, totblocks),
|
||||
(totpasses, Variant::Argon2i as u32)];
|
||||
for (k, &(lo, hi)) in rv.arg.iter_mut().zip(args.into_iter()) {
|
||||
*k = u64x2(lo as u64, hi as u64);
|
||||
}
|
||||
rv.more();
|
||||
rv
|
||||
}
|
||||
|
||||
fn more(&mut self) {
|
||||
self.arg[3].0 += 1;
|
||||
g_two(&mut self.pseudos, &self.arg);
|
||||
}
|
||||
|
||||
fn nextj(&mut self) -> (u32, u32) {
|
||||
let rv = split_u64(block::as_u64(&self.pseudos)[self.idx]);
|
||||
self.idx = (self.idx + 1) % per_kib!(u64);
|
||||
if self.idx == 0 {
|
||||
self.more();
|
||||
}
|
||||
rv
|
||||
}
|
||||
}
|
||||
|
||||
// g x y = let r = x `xor` y in p_col (p_row r) `xor` r,
|
||||
fn g(dest: &mut Block, lhs: &Block, rhs: &Block) {
|
||||
for (d, (l, r)) in dest.iter_mut().zip(lhs.iter().zip(rhs.iter())) {
|
||||
*d = *l ^ *r;
|
||||
}
|
||||
|
||||
for row in 0..8 {
|
||||
p_row(row, dest);
|
||||
}
|
||||
// column-wise, 2x u64 groups
|
||||
for col in 0..8 {
|
||||
p_col(col, dest);
|
||||
}
|
||||
|
||||
*dest ^= (lhs, rhs);
|
||||
}
|
||||
|
||||
/// ``` g2 y = let g' y = g 0 y in g' . g' ```
|
||||
/// Used for data-independent index generation.
|
||||
fn g_two(dest: &mut Block, src: &Block) {
|
||||
*dest = src.clone();
|
||||
|
||||
for row in 0..8 {
|
||||
p_row(row, dest);
|
||||
}
|
||||
for col in 0..8 {
|
||||
p_col(col, dest);
|
||||
}
|
||||
|
||||
*dest ^= src;
|
||||
|
||||
let tmp: Block = dest.clone();
|
||||
|
||||
for row in 0..8 {
|
||||
p_row(row, dest);
|
||||
}
|
||||
for col in 0..8 {
|
||||
p_col(col, dest);
|
||||
}
|
||||
|
||||
*dest ^= &tmp;
|
||||
}
|
||||
|
||||
macro_rules! p {
|
||||
($v0v1: expr, $v2v3: expr, $v4v5: expr, $v6v7: expr,
|
||||
$v8v9: expr, $v10v11: expr, $v12v13: expr, $v14v15: expr) => {
|
||||
{
|
||||
g_blake2b!($v0v1, $v4v5, $v8v9, $v12v13);
|
||||
g_blake2b!($v2v3, $v6v7, $v10v11, $v14v15);
|
||||
|
||||
let (mut v7v4, mut v5v6) = $v4v5.cross_swap($v6v7);
|
||||
let (mut v15v12, mut v13v14) = $v12v13.cross_swap($v14v15);
|
||||
|
||||
g_blake2b!($v0v1, v5v6, $v10v11, v15v12);
|
||||
g_blake2b!($v2v3, v7v4, $v8v9, v13v14);
|
||||
|
||||
let (v4v5, v6v7) = v5v6.cross_swap(v7v4);
|
||||
let (v12v13, v14v15) = v13v14.cross_swap(v15v12);
|
||||
$v4v5 = v4v5;
|
||||
$v6v7 = v6v7;
|
||||
$v12v13 = v12v13;
|
||||
$v14v15 = v14v15;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
macro_rules! g_blake2b {
|
||||
($a: expr, $b: expr, $c: expr, $d: expr) => {
|
||||
$a = $a + $b + $a.lower_mult($b) * u64x2(2, 2);
|
||||
$d = ($d ^ $a).rotate_right(32);
|
||||
$c = $c + $d + $c.lower_mult($d) * u64x2(2, 2);
|
||||
$b = ($b ^ $c).rotate_right(24);
|
||||
$a = $a + $b + $a.lower_mult($b) * u64x2(2, 2);
|
||||
$d = ($d ^ $a).rotate_right(16);
|
||||
$c = $c + $d + $c.lower_mult($d) * u64x2(2, 2);
|
||||
$b = ($b ^ $c).rotate_right(63);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
#[cfg_attr(rustfmt, rustfmt_skip)]
|
||||
fn p_row(row: usize, b: &mut Block) {
|
||||
p!(b[8 * row + 0], b[8 * row + 1], b[8 * row + 2], b[8 * row + 3],
|
||||
b[8 * row + 4], b[8 * row + 5], b[8 * row + 6], b[8 * row + 7]);
|
||||
}
|
||||
|
||||
#[cfg_attr(rustfmt, rustfmt_skip)]
|
||||
fn p_col(col: usize, b: &mut Block) {
|
||||
p!(b[8 * 0 + col], b[8 * 1 + col], b[8 * 2 + col], b[8 * 3 + col],
|
||||
b[8 * 4 + col], b[8 * 5 + col], b[8 * 6 + col], b[8 * 7 + col]);
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use std::fs::File;
|
||||
use std::io::Read;
|
||||
use super::Argon2;
|
||||
use block;
|
||||
use std::fmt::Write;
|
||||
|
||||
// from genkat.c
|
||||
const TEST_OUTLEN: usize = 32;
|
||||
const TEST_PWDLEN: usize = 32;
|
||||
const TEST_SALTLEN: usize = 16;
|
||||
const TEST_SECRETLEN: usize = 8;
|
||||
const TEST_ADLEN: usize = 12;
|
||||
|
||||
macro_rules! w { ($($args: expr),*) => { let _ = write!($($args),*); }; }
|
||||
macro_rules! wl { ($($args: expr),*) => { let _ = writeln!($($args),*); }; }
|
||||
|
||||
fn u8info(prefix: &str, bytes: &[u8], print_length: bool) -> String {
|
||||
let bs = bytes.iter()
|
||||
.fold(String::new(), |xs, b| xs + &format!("{:02x} ", b));
|
||||
let len = match print_length {
|
||||
false => ": ".to_string(),
|
||||
true => format!("[{}]: ", bytes.len()),
|
||||
};
|
||||
prefix.to_string() + &len + &bs
|
||||
|
||||
}
|
||||
|
||||
fn block_info(i: usize, b: &block::Block) -> String {
|
||||
let blk = block::as_u64(b);
|
||||
blk.iter().enumerate().fold(String::new(), |xs, (j, octword)| {
|
||||
xs + "Block " + &format!("{:004} ", i) + &format!("[{:>3}]: ", j) +
|
||||
&format!("{:0016x}", octword) + "\n"
|
||||
})
|
||||
}
|
||||
|
||||
fn run_and_collect(arg: &Argon2, out: &mut [u8], p: &[u8], s: &[u8],
|
||||
k: &[u8], x: &[u8])
|
||||
-> (String, String) {
|
||||
let (mut h0output, mut blockoutput) = (String::new(), String::new());
|
||||
|
||||
{
|
||||
let h0fn = |h0: &[u8]| {
|
||||
wl!(&mut h0output,
|
||||
"{}",
|
||||
u8info("Pre-hashing digest",
|
||||
&h0[..super::DEF_B2HASH_LEN],
|
||||
false));
|
||||
};
|
||||
|
||||
let passfn = |p: u32, matrix: &block::Matrix| {
|
||||
wl!(&mut blockoutput, "\n After pass {}:", p);
|
||||
for (i, block) in matrix.iter().flat_map(|ls| ls).enumerate() {
|
||||
w!(&mut blockoutput, "{}", block_info(i, block));
|
||||
}
|
||||
};
|
||||
|
||||
arg.hash_impl(out, p, s, k, x, h0fn, passfn);
|
||||
}
|
||||
|
||||
(h0output, blockoutput)
|
||||
}
|
||||
|
||||
fn compare_kats(fexpected: &str, variant: super::Variant) {
|
||||
let mut f = File::open(fexpected).unwrap();
|
||||
let mut expected = String::new();
|
||||
f.read_to_string(&mut expected).unwrap();
|
||||
|
||||
let (p, s) = (&[1; TEST_PWDLEN], &[2; TEST_SALTLEN]);
|
||||
let (k, x) = (&[3; TEST_SECRETLEN], &[4; TEST_ADLEN]);
|
||||
let mut out = [0 as u8; TEST_OUTLEN];
|
||||
let a2 = Argon2::new(3, 4, 32, variant).ok().unwrap();
|
||||
let (h0, blocks) = run_and_collect(&a2, &mut out, p, s, k, x);
|
||||
|
||||
let mut rv = String::new();
|
||||
wl!(rv, "======================================={:?}", a2.variant);
|
||||
w!(rv, "Memory: {} KiB, Iterations: {}, ", a2.kib, a2.passes);
|
||||
w!(rv, "Parallelism: {} lanes, ", a2.lanes);
|
||||
wl!(rv, "Tag length: {} bytes", out.len());
|
||||
wl!(rv, "{}", u8info("Password", p, true));
|
||||
wl!(rv, "{}", u8info("Salt", s, true));
|
||||
wl!(rv, "{}", u8info("Secret", k, true));
|
||||
wl!(rv, "{}", u8info("Associated data", x, true));
|
||||
w!(rv, "{}", h0 + &blocks);
|
||||
wl!(rv, "{}", u8info("Tag", &out, false));
|
||||
|
||||
if expected.trim() != rv.trim() {
|
||||
println!("{}", rv);
|
||||
assert!(false);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn argon2i_kat() { compare_kats("kats/argon2i", super::Variant::Argon2i); }
|
||||
|
||||
#[test]
|
||||
fn argon2d_kat() { compare_kats("kats/argon2d", super::Variant::Argon2d); }
|
||||
}
|
129
third_party/rust/argon2rs/src/block.rs
vendored
Normal file
129
third_party/rust/argon2rs/src/block.rs
vendored
Normal file
@ -0,0 +1,129 @@
|
||||
use octword::u64x2;
|
||||
use std::ops::{BitXorAssign, Index, IndexMut};
|
||||
use std::mem;
|
||||
use std::slice::{Iter, IterMut};
|
||||
|
||||
pub const ARGON2_BLOCK_BYTES: usize = 1024;
|
||||
|
||||
macro_rules! per_kib {
|
||||
(u8) => { ARGON2_BLOCK_BYTES };
|
||||
(u64) => { ARGON2_BLOCK_BYTES / 8 };
|
||||
(u64x2) => { ARGON2_BLOCK_BYTES / 16 };
|
||||
}
|
||||
|
||||
pub struct Block([u64x2; per_kib!(u64x2)]);
|
||||
|
||||
impl Clone for Block {
|
||||
#[inline(always)]
|
||||
fn clone(&self) -> Self {
|
||||
let inner = self.0;
|
||||
Block(inner)
|
||||
}
|
||||
}
|
||||
|
||||
impl Block {
|
||||
pub fn iter_mut(&mut self) -> IterMut<u64x2> { self.0.iter_mut() }
|
||||
|
||||
pub fn iter(&self) -> Iter<u64x2> { self.0.iter() }
|
||||
}
|
||||
|
||||
impl<'a> BitXorAssign<&'a Block> for Block {
|
||||
#[inline(always)]
|
||||
fn bitxor_assign(&mut self, rhs: &Block) {
|
||||
for (d, r) in self.0.iter_mut().zip(rhs.0.iter()) {
|
||||
*d = *d ^ *r;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b> BitXorAssign<(&'a Block, &'b Block)> for Block {
|
||||
#[inline(always)]
|
||||
fn bitxor_assign(&mut self, (a, b): (&Block, &Block)) {
|
||||
for (d, (l, r)) in self.0.iter_mut().zip(a.0.iter().zip(b.0.iter())) {
|
||||
*d = *d ^ *l ^ *r;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Index<usize> for Block {
|
||||
type Output = u64x2;
|
||||
#[inline(always)]
|
||||
fn index(&self, idx: usize) -> &Self::Output { &self.0[idx] }
|
||||
}
|
||||
|
||||
impl IndexMut<usize> for Block {
|
||||
#[inline(always)]
|
||||
fn index_mut(&mut self, idx: usize) -> &mut u64x2 { &mut self.0[idx] }
|
||||
}
|
||||
|
||||
pub fn zero() -> Block { Block([u64x2(0, 0); per_kib!(u64x2)]) }
|
||||
|
||||
pub fn as_u8_mut(b: &mut Block) -> &mut [u8] {
|
||||
let rv: &mut [u8; per_kib!(u8)] = unsafe { mem::transmute(&mut b.0) };
|
||||
rv
|
||||
}
|
||||
|
||||
pub fn as_u8(b: &Block) -> &[u8] {
|
||||
let rv: &[u8; per_kib!(u8)] = unsafe { mem::transmute(&b.0) };
|
||||
rv
|
||||
}
|
||||
|
||||
pub fn as_u64(b: &Block) -> &[u64] {
|
||||
let rv: &[u64; per_kib!(u64)] = unsafe { mem::transmute(&b.0) };
|
||||
rv
|
||||
}
|
||||
|
||||
pub struct Matrix(Vec<Vec<Block>>);
|
||||
|
||||
impl Index<(u32, u32)> for Matrix {
|
||||
type Output = Block;
|
||||
fn index(&self, idx: (u32, u32)) -> &Block {
|
||||
match idx {
|
||||
(row, col) => &(self.0[row as usize])[col as usize],
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl IndexMut<(u32, u32)> for Matrix {
|
||||
fn index_mut(&mut self, idx: (u32, u32)) -> &mut Block {
|
||||
match idx {
|
||||
(row, col) => &mut (self.0[row as usize])[col as usize],
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Matrix {
|
||||
pub fn new(lanes: u32, lanelen: u32) -> Self {
|
||||
let newlane = || (0..lanelen).map(|_| zero()).collect();
|
||||
Matrix((0..lanes).map(|_| newlane()).collect())
|
||||
}
|
||||
|
||||
pub fn get3(&mut self, wr: (u32, u32), rd0: (u32, u32), rd1: (u32, u32))
|
||||
-> (&mut Block, &Block, &Block) {
|
||||
assert!(wr != rd0 && wr != rd1);
|
||||
let p: *mut Matrix = self;
|
||||
let rv = unsafe { (&mut (*p)[wr], &(*p)[rd0], &(*p)[rd1]) };
|
||||
rv
|
||||
}
|
||||
|
||||
pub fn lanes_as_mut(&mut self) -> Vec<&mut Self> {
|
||||
let p: *mut Self = self;
|
||||
(0..self.0.len()).map(|_| unsafe { &mut (*p) }).collect()
|
||||
}
|
||||
|
||||
pub fn col(&self, col: u32) -> Vec<&Block> {
|
||||
self.0.iter().map(|l| &l[col as usize]).collect()
|
||||
}
|
||||
|
||||
pub fn iter(&self) -> Iter<Vec<Block>> { self.0.iter() }
|
||||
}
|
||||
|
||||
impl Drop for Matrix {
|
||||
fn drop(&mut self) {
|
||||
for lane in self.0.iter_mut() {
|
||||
for blk in lane.iter_mut() {
|
||||
*blk = zero();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
10
third_party/rust/argon2rs/src/lib.rs
vendored
Normal file
10
third_party/rust/argon2rs/src/lib.rs
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
#![cfg_attr(feature = "simd", feature(repr_simd, platform_intrinsics))]
|
||||
|
||||
mod octword;
|
||||
#[macro_use]
|
||||
mod block;
|
||||
mod argon2;
|
||||
pub mod verifier;
|
||||
|
||||
pub use argon2::{Argon2, ParamErr, Variant, argon2d_simple, argon2i_simple,
|
||||
defaults};
|
186
third_party/rust/argon2rs/src/octword.rs
vendored
Normal file
186
third_party/rust/argon2rs/src/octword.rs
vendored
Normal file
@ -0,0 +1,186 @@
|
||||
#[cfg(feature = "simd")]
|
||||
use std::mem::transmute;
|
||||
use std::ops::{Add, BitXor, Mul};
|
||||
|
||||
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
||||
#[cfg_attr(feature = "simd", repr(simd))]
|
||||
#[allow(non_camel_case_types)]
|
||||
pub struct u64x2(pub u64, pub u64);
|
||||
|
||||
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
||||
#[cfg_attr(feature = "simd", repr(simd))]
|
||||
#[allow(non_camel_case_types)]
|
||||
struct u32x4(u32, u32, u32, u32);
|
||||
|
||||
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
||||
#[cfg_attr(feature = "simd", repr(simd))]
|
||||
#[allow(non_camel_case_types)]
|
||||
struct u8x16(u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8);
|
||||
|
||||
#[cfg(feature = "simd")]
|
||||
extern "platform-intrinsic" {
|
||||
fn x86_mm_mul_epu32(x: u32x4, y: u32x4) -> u64x2;
|
||||
fn simd_add<T>(x: T, y: T) -> T;
|
||||
fn simd_mul<T>(x: T, y: T) -> T;
|
||||
fn simd_xor<T>(x: T, y: T) -> T;
|
||||
fn simd_shr<T>(x: T, y: T) -> T;
|
||||
fn simd_shl<T>(x: T, y: T) -> T;
|
||||
fn simd_shuffle16<T, U>(x: T, y: T, idx: [u32; 16]) -> U;
|
||||
}
|
||||
|
||||
impl Add for u64x2 {
|
||||
type Output = Self;
|
||||
#[cfg(feature = "simd")]
|
||||
#[inline(always)]
|
||||
fn add(self, r: Self) -> Self { unsafe { simd_add(self, r) } }
|
||||
#[cfg(not(feature = "simd"))]
|
||||
#[inline(always)]
|
||||
fn add(self, r: Self) -> Self {
|
||||
u64x2(self.0.wrapping_add(r.0), self.1.wrapping_add(r.1))
|
||||
}
|
||||
}
|
||||
|
||||
impl Mul for u64x2 {
|
||||
type Output = Self;
|
||||
#[cfg(feature = "simd")]
|
||||
#[inline(always)]
|
||||
fn mul(self, r: Self) -> Self { unsafe { simd_mul(self, r) } }
|
||||
#[cfg(not(feature = "simd"))]
|
||||
fn mul(self, r: Self) -> Self {
|
||||
u64x2(self.0.wrapping_mul(r.0), self.1.wrapping_mul(r.1))
|
||||
}
|
||||
}
|
||||
|
||||
impl BitXor for u64x2 {
|
||||
type Output = Self;
|
||||
#[cfg(feature = "simd")]
|
||||
#[inline(always)]
|
||||
fn bitxor(self, r: Self) -> u64x2 { unsafe { simd_xor(self, r) } }
|
||||
#[cfg(not(feature = "simd"))]
|
||||
#[inline(always)]
|
||||
fn bitxor(self, r: Self) -> u64x2 { u64x2(self.0 ^ r.0, self.1 ^ r.1) }
|
||||
}
|
||||
|
||||
#[cfg_attr(rustfmt, rustfmt_skip)]
|
||||
#[cfg(feature = "simd")]
|
||||
impl u8x16 {
|
||||
#[inline(always)]
|
||||
fn rotr_32_u64x2(self) -> u64x2 {
|
||||
unsafe {
|
||||
let rv: Self = simd_shuffle16(self, self, [4, 5, 6, 7, 0, 1, 2, 3,
|
||||
12, 13, 14, 15, 8, 9, 10, 11]);
|
||||
transmute(rv)
|
||||
}
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
fn rotr_24_u64x2(self) -> u64x2 {
|
||||
// recall that rotating right = rotating towards lsb
|
||||
unsafe {
|
||||
let rv: Self = simd_shuffle16(self, self, [3, 4, 5, 6, 7, 0, 1, 2,
|
||||
11, 12, 13, 14, 15, 8, 9, 10]);
|
||||
transmute(rv)
|
||||
}
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
fn rotr_16_u64x2(self) -> u64x2 {
|
||||
unsafe {
|
||||
let rv: Self = simd_shuffle16(self, self, [2, 3, 4, 5, 6, 7, 0, 1,
|
||||
10, 11, 12, 13, 14, 15, 8, 9]);
|
||||
transmute(rv)
|
||||
}
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
fn rotr_8_u64x2(self) -> u64x2 {
|
||||
unsafe {
|
||||
let rv: Self = simd_shuffle16(self, self, [1, 2, 3, 4, 5, 6, 7, 0,
|
||||
9, 10, 11, 12, 13, 14, 15, 8]);
|
||||
transmute(rv)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn lo(n: u64) -> u64 { n & 0xffffffff }
|
||||
|
||||
impl u64x2 {
|
||||
#[cfg(feature = "simd")]
|
||||
#[inline(always)]
|
||||
fn as_u8x16(self) -> u8x16 { unsafe { transmute(self) } }
|
||||
|
||||
#[cfg(feature = "simd")]
|
||||
#[inline(always)]
|
||||
pub fn lower_mult(self, r: Self) -> Self {
|
||||
unsafe {
|
||||
let (lhs, rhs): (u32x4, u32x4) = (transmute(self), transmute(r));
|
||||
x86_mm_mul_epu32(lhs, rhs)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "simd"))]
|
||||
#[inline(always)]
|
||||
pub fn lower_mult(self, r: Self) -> Self {
|
||||
u64x2(lo(self.0) * lo(r.0), lo(self.1) * lo(r.1))
|
||||
}
|
||||
|
||||
#[cfg(feature = "simd")]
|
||||
#[inline(always)]
|
||||
pub fn rotate_right(self, n: u32) -> Self {
|
||||
match n {
|
||||
32 => self.as_u8x16().rotr_32_u64x2(),
|
||||
24 => self.as_u8x16().rotr_24_u64x2(),
|
||||
16 => self.as_u8x16().rotr_16_u64x2(),
|
||||
8 => self.as_u8x16().rotr_8_u64x2(),
|
||||
_ => unsafe {
|
||||
let k = (64 - n) as u64;
|
||||
simd_shl(self, u64x2(k, k)) ^
|
||||
simd_shr(self, u64x2(n as u64, n as u64))
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "simd"))]
|
||||
#[inline(always)]
|
||||
pub fn rotate_right(self, n: u32) -> Self {
|
||||
u64x2(self.0.rotate_right(n), self.1.rotate_right(n))
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub fn cross_swap(self, r: Self) -> (Self, Self) {
|
||||
let u64x2(v4, v5) = self; // so the rule is:
|
||||
let u64x2(v6, v7) = r; // +--+
|
||||
(u64x2(v7, v4), u64x2(v5, v6)) // \/
|
||||
// /\
|
||||
// 1 0
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::u64x2;
|
||||
|
||||
// XXX Use function call to workaround rust-lang/rust#33764.
|
||||
fn t0() -> u64x2 {
|
||||
u64x2(0xdeadbeef_01234567, 0xcafe3210_babe9932)
|
||||
}
|
||||
fn t1() -> u64x2 {
|
||||
u64x2(0x09990578_01234567, 0x1128f9a9_88e89448)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_rotate_right() {
|
||||
for &s in [8 as u32, 16, 24, 32].iter() {
|
||||
assert_eq!(t0().rotate_right(s).0, t0().0.rotate_right(s));
|
||||
assert_eq!(t0().rotate_right(s).1, t0().1.rotate_right(s));
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_lower_mult() {
|
||||
use super::lo;
|
||||
assert_eq!(t0().lower_mult(t1()), t1().lower_mult(t0()));
|
||||
assert_eq!(t0().lower_mult(t1()).0, lo(t0().0) * lo(t1().0));
|
||||
assert_eq!(t0().lower_mult(t1()).1, lo(t0().1) * lo(t1().1));
|
||||
}
|
||||
}
|
417
third_party/rust/argon2rs/src/verifier.rs
vendored
Normal file
417
third_party/rust/argon2rs/src/verifier.rs
vendored
Normal file
@ -0,0 +1,417 @@
|
||||
/// The main export here is `Encoded`. See `examples/verify.rs` for usage
|
||||
/// examples.
|
||||
|
||||
use std::{fmt, str};
|
||||
use std::error::Error;
|
||||
use argon2::{Argon2, ParamErr, Variant, defaults};
|
||||
|
||||
macro_rules! maybe {
|
||||
($e: expr) => {
|
||||
match $e {
|
||||
None => return None,
|
||||
Some(v) => v,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
const LUT64: &'static [u8; 64] =
|
||||
b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
|
||||
fn lut(n: u8) -> u8 { LUT64[n as usize & 0x3f] }
|
||||
|
||||
fn delut(c: u8) -> Option<u8> {
|
||||
match c {
|
||||
43 => Some(62),
|
||||
47 => Some(63),
|
||||
_ if 65 <= c && c <= 90 => Some(c - 65),
|
||||
_ if 97 <= c && c <= 122 => Some(c - 71),
|
||||
_ if 48 <= c && c <= 57 => Some(c + 4),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
fn quad(n: &[u8]) -> [u8; 4] {
|
||||
assert!(n.len() == 3);
|
||||
let (b, c) = (n[1] >> 4 | n[0] << 4, n[2] >> 6 | n[1] << 2);
|
||||
[lut(n[0] >> 2), lut(b), lut(c), lut(n[2])]
|
||||
}
|
||||
|
||||
fn triplet(n: &[u8]) -> Option<[u8; 3]> {
|
||||
assert!(n.len() == 4);
|
||||
let a = maybe!(delut(n[0]));
|
||||
let b = maybe!(delut(n[1]));
|
||||
let c = maybe!(delut(n[2]));
|
||||
let d = maybe!(delut(n[3]));
|
||||
Some([a << 2 | b >> 4, b << 4 | c >> 2, c << 6 | d])
|
||||
}
|
||||
|
||||
fn base64_no_pad(bytes: &[u8]) -> Vec<u8> {
|
||||
let mut rv = vec![];
|
||||
let mut pos = 0;
|
||||
while pos + 3 <= bytes.len() {
|
||||
rv.extend_from_slice(&quad(&bytes[pos..pos + 3]));
|
||||
pos += 3;
|
||||
}
|
||||
|
||||
if bytes.len() - pos == 1 {
|
||||
rv.push(lut(bytes[pos] >> 2));
|
||||
rv.push(lut((bytes[pos] & 0x03) << 4));
|
||||
} else if bytes.len() - pos == 2 {
|
||||
rv.extend_from_slice(&quad(&[bytes[pos], bytes[pos + 1], 0]));
|
||||
rv.pop();
|
||||
}
|
||||
rv
|
||||
}
|
||||
|
||||
fn debase64_no_pad(bytes: &[u8]) -> Option<Vec<u8>> {
|
||||
if bytes.len() % 4 != 1 && bytes.len() > 0 {
|
||||
let mut rv = vec![];
|
||||
let mut pos = 0;
|
||||
while pos + 4 <= bytes.len() {
|
||||
let s = maybe!(triplet(&bytes[pos..pos + 4]));
|
||||
rv.extend_from_slice(&s);
|
||||
pos += 4;
|
||||
}
|
||||
|
||||
if bytes.len() - pos == 2 {
|
||||
let a = maybe!(delut(bytes[pos]));
|
||||
let b = maybe!(delut(bytes[pos + 1]));
|
||||
rv.push(a << 2 | b >> 4);
|
||||
} else if bytes.len() - pos == 3 {
|
||||
let a = maybe!(delut(bytes[pos]));
|
||||
let b = maybe!(delut(bytes[pos + 1]));
|
||||
let c = maybe!(delut(bytes[pos + 2]));
|
||||
rv.push(a << 2 | b >> 4);
|
||||
rv.push(b << 4 | c >> 2);
|
||||
}
|
||||
Some(rv)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
struct Parser<'a> {
|
||||
enc: &'a [u8],
|
||||
pos: usize,
|
||||
}
|
||||
|
||||
type Parsed<T> = Result<T, usize>;
|
||||
|
||||
impl<'a> Parser<'a> {
|
||||
fn expect(&mut self, exp: &[u8]) -> Parsed<()> {
|
||||
assert!(self.pos < self.enc.len());
|
||||
if self.enc.len() - self.pos < exp.len() ||
|
||||
&self.enc[self.pos..self.pos + exp.len()] != exp {
|
||||
self.err()
|
||||
} else {
|
||||
self.pos += exp.len();
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
fn one_of(&mut self, chars: &[u8]) -> Parsed<u8> {
|
||||
if self.enc.len() > 0 {
|
||||
for &c in chars {
|
||||
if c == self.enc[self.pos] {
|
||||
self.pos += 1;
|
||||
return Ok(c);
|
||||
}
|
||||
}
|
||||
}
|
||||
self.err()
|
||||
}
|
||||
|
||||
fn read_u32(&mut self) -> Parsed<u32> {
|
||||
let is_digit = |c: u8| 48 <= c && c <= 57;
|
||||
let mut end = self.pos;
|
||||
while end < self.enc.len() && is_digit(self.enc[end]) {
|
||||
end += 1;
|
||||
}
|
||||
match str::from_utf8(&self.enc[self.pos..end]) {
|
||||
Err(_) => self.err(),
|
||||
Ok(s) => {
|
||||
match s.parse() {
|
||||
Err(_) => self.err(),
|
||||
Ok(n) => {
|
||||
self.pos = end;
|
||||
Ok(n)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn decode64_till(&mut self, stopchar: Option<&[u8]>) -> Parsed<Vec<u8>> {
|
||||
let end = match stopchar {
|
||||
None => self.enc.len(),
|
||||
Some(c) => {
|
||||
self.enc[self.pos..]
|
||||
.iter()
|
||||
.take_while(|k| **k != c[0])
|
||||
.fold(0, |c, _| c + 1) + self.pos
|
||||
}
|
||||
};
|
||||
match debase64_no_pad(&self.enc[self.pos..end]) {
|
||||
None => self.err(),
|
||||
Some(rv) => {
|
||||
self.pos = end;
|
||||
Ok(rv)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn err<T>(&self) -> Parsed<T> { Err(self.pos) }
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
|
||||
pub enum DecodeError {
|
||||
/// Byte position of first parse error
|
||||
ParseError(usize),
|
||||
/// Invalid Argon2 parameters given in encoding
|
||||
InvalidParams(ParamErr),
|
||||
}
|
||||
|
||||
impl fmt::Display for DecodeError {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
use self::DecodeError::*;
|
||||
match *self {
|
||||
ParseError(pos) => write!(f, "Parse error at position {}", pos),
|
||||
InvalidParams(ref perr) => {
|
||||
write!(f, "Invalid hash parameters given by encoded: {}", perr)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Error for DecodeError {
|
||||
fn description(&self) -> &str {
|
||||
match *self {
|
||||
DecodeError::ParseError(_) => "Hash string parse error.",
|
||||
DecodeError::InvalidParams(ref perr) => perr.description(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Represents a single Argon2 hashing session. A hash session comprises of the
|
||||
/// hash algorithm parameters, salt, key, and data used to hash a given input.
|
||||
pub struct Encoded {
|
||||
params: Argon2,
|
||||
hash: Vec<u8>,
|
||||
salt: Vec<u8>,
|
||||
key: Vec<u8>,
|
||||
data: Vec<u8>,
|
||||
}
|
||||
|
||||
macro_rules! try_unit {
|
||||
($e: expr) => {
|
||||
match $e {
|
||||
Ok(()) => {},
|
||||
Err(e) => return Err(e)
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
type Packed = (Variant, u32, u32, u32, Vec<u8>, Vec<u8>, Vec<u8>, Vec<u8>);
|
||||
|
||||
impl Encoded {
|
||||
fn parse(encoded: &[u8]) -> Result<Packed, usize> {
|
||||
let mut p = Parser {
|
||||
enc: encoded,
|
||||
pos: 0,
|
||||
};
|
||||
|
||||
try_unit!(p.expect(b"$argon2"));
|
||||
|
||||
let variant = match try!(p.one_of(b"di")) {
|
||||
v if v == 'd' as u8 => Variant::Argon2d,
|
||||
v if v == 'i' as u8 => Variant::Argon2i,
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
try_unit!(p.expect(b"$m="));
|
||||
let kib = try!(p.read_u32());
|
||||
try_unit!(p.expect(b",t="));
|
||||
let passes = try!(p.read_u32());
|
||||
try_unit!(p.expect(b",p="));
|
||||
let lanes = try!(p.read_u32());
|
||||
|
||||
let key = match p.expect(b",keyid=") {
|
||||
Err(_) => vec![],
|
||||
Ok(()) => try!(p.decode64_till(Some(b","))),
|
||||
};
|
||||
|
||||
let data = match p.expect(b",data=") {
|
||||
Ok(()) => try!(p.decode64_till(Some(b"$"))),
|
||||
Err(_) => vec![],
|
||||
};
|
||||
|
||||
try_unit!(p.expect(b"$"));
|
||||
let salt = try!(p.decode64_till(Some(b"$")));
|
||||
try_unit!(p.expect(b"$"));
|
||||
let hash = try!(p.decode64_till(None));
|
||||
Ok((variant, kib, passes, lanes, key, data, salt, hash))
|
||||
}
|
||||
|
||||
/// Reconstruct a previous hash session from serialized bytes.
|
||||
pub fn from_u8(encoded: &[u8]) -> Result<Self, DecodeError> {
|
||||
match Self::parse(encoded) {
|
||||
Err(pos) => Err(DecodeError::ParseError(pos)),
|
||||
Ok((v, kib, passes, lanes, key, data, salt, hash)) => {
|
||||
match Argon2::new(passes, lanes, kib, v) {
|
||||
Err(e) => Err(DecodeError::InvalidParams(e)),
|
||||
Ok(a2) => {
|
||||
Ok(Encoded {
|
||||
params: a2,
|
||||
hash: hash,
|
||||
salt: salt,
|
||||
key: key,
|
||||
data: data,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Serialize this hashing session into raw bytes that can later be
|
||||
/// recovered by `Encoded::from_u8`.
|
||||
#[cfg_attr(rustfmt, rustfmt_skip)]
|
||||
pub fn to_u8(&self) -> Vec<u8> {
|
||||
let vcode = |v| match v {
|
||||
Variant::Argon2i => "i",
|
||||
Variant::Argon2d => "d",
|
||||
};
|
||||
let b64 = |x| String::from_utf8(base64_no_pad(x)).unwrap()
|
||||
;
|
||||
let k_ = match &b64(&self.key[..]) {
|
||||
bytes if bytes.len() > 0 => format!(",keyid={}", bytes),
|
||||
_ => String::new(),
|
||||
};
|
||||
let x_ = match &b64(&self.data[..]) {
|
||||
bytes if bytes.len() > 0 => format!(",data={}", bytes),
|
||||
_ => String::new(),
|
||||
};
|
||||
let (var, m, t, p) = self.params.params();
|
||||
format!("$argon2{}$m={},t={},p={}{}{}${}${}", vcode(var), m, t, p,
|
||||
k_, x_, b64(&self.salt[..]), b64(&self.hash))
|
||||
.into_bytes()
|
||||
}
|
||||
|
||||
/// Generates a new hashing session from password, salt, and other byte
|
||||
/// input. Parameters are:
|
||||
///
|
||||
/// `argon`: An `Argon2` struct representative of the desired hash algorithm
|
||||
/// parameters.
|
||||
///
|
||||
/// `p`: Password input.
|
||||
///
|
||||
/// `s`: Salt.
|
||||
///
|
||||
/// `k`: An optional secret value.
|
||||
///
|
||||
/// `x`: Optional, miscellaneous associated data.
|
||||
///
|
||||
/// Note that `p, s, k, x` must conform to the same length constraints
|
||||
/// dictated by `Argon2::hash`.
|
||||
pub fn new(argon: Argon2, p: &[u8], s: &[u8], k: &[u8], x: &[u8]) -> Self {
|
||||
let mut out = vec![0 as u8; defaults::LENGTH];
|
||||
argon.hash(&mut out[..], p, s, k, x);
|
||||
Encoded {
|
||||
params: argon,
|
||||
hash: out,
|
||||
salt: s.iter().cloned().collect(),
|
||||
key: k.iter().cloned().collect(),
|
||||
data: x.iter().cloned().collect(),
|
||||
}
|
||||
}
|
||||
|
||||
/// Same as `Encoded::new`, but with the default Argon2i hash algorithm
|
||||
/// parameters.
|
||||
pub fn default2i(p: &[u8], s: &[u8], k: &[u8], x: &[u8]) -> Self {
|
||||
Self::new(Argon2::default(Variant::Argon2i), p, s, k, x)
|
||||
}
|
||||
|
||||
/// Same as `Encoded::new`, but with the default _Argon2d_ hash algorithm
|
||||
/// parameters.
|
||||
pub fn default2d(p: &[u8], s: &[u8], k: &[u8], x: &[u8]) -> Self {
|
||||
Self::new(Argon2::default(Variant::Argon2d), p, s, k, x)
|
||||
}
|
||||
|
||||
/// Verifies password input against the hash that was previously created in
|
||||
/// this hashing session.
|
||||
pub fn verify(&self, p: &[u8]) -> bool {
|
||||
let mut out = [0 as u8; defaults::LENGTH];
|
||||
let s = &self.salt[..];
|
||||
self.params.hash(&mut out, p, s, &self.key[..], &self.data[..]);
|
||||
constant_eq(&out, &self.hash)
|
||||
}
|
||||
}
|
||||
|
||||
/// Compares two byte arrays for equality. Assumes that both are already of
|
||||
/// equal length.
|
||||
#[inline(never)]
|
||||
pub fn constant_eq(xs: &[u8], ys: &[u8]) -> bool {
|
||||
if xs.len() != ys.len() {
|
||||
false
|
||||
} else {
|
||||
let rv = xs.iter().zip(ys.iter()).fold(0, |rv, (x, y)| rv | (x ^ y));
|
||||
// this kills the optimizer.
|
||||
(1 & (rv as u32).wrapping_sub(1) >> 8).wrapping_sub(1) == 0
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::{Encoded, base64_no_pad, debase64_no_pad};
|
||||
|
||||
const BASE64_CASES: [(&'static [u8], &'static [u8]); 5] =
|
||||
[(b"any carnal pleasure.", b"YW55IGNhcm5hbCBwbGVhc3VyZS4"),
|
||||
(b"any carnal pleasure", b"YW55IGNhcm5hbCBwbGVhc3VyZQ"),
|
||||
(b"any carnal pleasur", b"YW55IGNhcm5hbCBwbGVhc3Vy"),
|
||||
(b"any carnal pleasu", b"YW55IGNhcm5hbCBwbGVhc3U"),
|
||||
(b"any carnal pleas", b"YW55IGNhcm5hbCBwbGVhcw")];
|
||||
|
||||
const ENCODED: &'static [u8] =
|
||||
b"$argon2i$m=4096,t=3,p=1$dG9kbzogZnV6eiB0ZXN0cw\
|
||||
$Eh1lW3mjkhlMLRQdE7vXZnvwDXSGLBfXa6BGK4a1J3s";
|
||||
|
||||
#[test]
|
||||
fn test_base64_no_pad() {
|
||||
for &(s, exp) in BASE64_CASES.iter() {
|
||||
assert_eq!(&base64_no_pad(s)[..], exp);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_debase64_no_pad() {
|
||||
for &(exp, s) in BASE64_CASES.iter() {
|
||||
assert_eq!(debase64_no_pad(s).unwrap(), exp);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_verify() {
|
||||
let v = Encoded::from_u8(ENCODED).unwrap();
|
||||
assert_eq!(v.verify(b"argon2i!"), true);
|
||||
assert_eq!(v.verify(b"nope"), false);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn bad_encoded() {
|
||||
use super::DecodeError::*;
|
||||
use argon2::ParamErr::*;
|
||||
let cases: &[(&'static [u8], super::DecodeError)] =
|
||||
&[(b"$argon2y$m=4096", ParseError(7)),
|
||||
(b"$argon2i$m=-2,t=-4,p=-4$aaaaaaaa$ffffff", ParseError(11)),
|
||||
(b"$argon2i$m=0,t=0,p=0$aaaaaaaa$ffffff*", ParseError(30)),
|
||||
(b"$argon2i$m=0,t=0,p=0$aaaaaaaa$ffffff",
|
||||
InvalidParams(TooFewPasses)),
|
||||
// intentionally fail Encoded::expect with undersized input
|
||||
(b"$argon2i$m", ParseError(8))];
|
||||
for &(case, err) in cases.iter() {
|
||||
let v = Encoded::from_u8(case);
|
||||
assert!(v.is_err());
|
||||
assert_eq!(v.err().unwrap(), err);
|
||||
}
|
||||
}
|
||||
}
|
16
third_party/rust/argon2rs/travis.sh
vendored
Executable file
16
third_party/rust/argon2rs/travis.sh
vendored
Executable file
@ -0,0 +1,16 @@
|
||||
cargo build
|
||||
cargo test
|
||||
# benches use `extern crate test` which requires nightly.
|
||||
if [ "$TRAVIS_RUST_VERSION" = "nightly" ]
|
||||
then
|
||||
if [ ! -z "`grep '\<avx\>' /proc/cpuinfo`" ]
|
||||
then
|
||||
echo "=== benching with '-C target-feature=+avx' ==="
|
||||
export RUSTFLAGS='-C target-feature=+avx'
|
||||
cargo clean && cargo bench --features simd
|
||||
fi
|
||||
|
||||
unset RUSTFLAGS
|
||||
echo "=== benching without avx ==="
|
||||
cargo clean && cargo bench --features simd
|
||||
fi
|
1
third_party/rust/backtrace-sys/.cargo-checksum.json
vendored
Normal file
1
third_party/rust/backtrace-sys/.cargo-checksum.json
vendored
Normal file
File diff suppressed because one or more lines are too long
26
third_party/rust/backtrace-sys/Cargo.toml
vendored
Normal file
26
third_party/rust/backtrace-sys/Cargo.toml
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
# 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 = "backtrace-sys"
|
||||
version = "0.1.24"
|
||||
authors = ["Alex Crichton <alex@alexcrichton.com>"]
|
||||
build = "build.rs"
|
||||
description = "Bindings to the libbacktrace gcc library\n"
|
||||
homepage = "https://github.com/alexcrichton/backtrace-rs"
|
||||
documentation = "http://alexcrichton.com/backtrace-rs"
|
||||
license = "MIT/Apache-2.0"
|
||||
repository = "https://github.com/alexcrichton/backtrace-rs"
|
||||
[dependencies.libc]
|
||||
version = "0.2"
|
||||
[build-dependencies.cc]
|
||||
version = "1.0"
|
201
third_party/rust/backtrace-sys/LICENSE-APACHE
vendored
Normal file
201
third_party/rust/backtrace-sys/LICENSE-APACHE
vendored
Normal file
@ -0,0 +1,201 @@
|
||||
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.
|
25
third_party/rust/backtrace-sys/LICENSE-MIT
vendored
Normal file
25
third_party/rust/backtrace-sys/LICENSE-MIT
vendored
Normal file
@ -0,0 +1,25 @@
|
||||
Copyright (c) 2014 Alex Crichton
|
||||
|
||||
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.
|
94
third_party/rust/backtrace-sys/build.rs
vendored
Normal file
94
third_party/rust/backtrace-sys/build.rs
vendored
Normal file
@ -0,0 +1,94 @@
|
||||
extern crate cc;
|
||||
|
||||
use std::env;
|
||||
use std::path::PathBuf;
|
||||
use std::fs::File;
|
||||
|
||||
fn main() {
|
||||
let target = env::var("TARGET").unwrap();
|
||||
|
||||
// libbacktrace isn't used on windows
|
||||
if target.contains("windows") {
|
||||
return
|
||||
}
|
||||
|
||||
// no way this will ever compile for emscripten
|
||||
if target.contains("emscripten") {
|
||||
return
|
||||
}
|
||||
|
||||
let out_dir = PathBuf::from(env::var_os("OUT_DIR").unwrap());
|
||||
|
||||
let mut build = cc::Build::new();
|
||||
build
|
||||
.include("src/libbacktrace")
|
||||
.include(&out_dir)
|
||||
.warnings(false)
|
||||
.file("src/libbacktrace/alloc.c")
|
||||
.file("src/libbacktrace/dwarf.c")
|
||||
.file("src/libbacktrace/fileline.c")
|
||||
.file("src/libbacktrace/posix.c")
|
||||
.file("src/libbacktrace/read.c")
|
||||
.file("src/libbacktrace/sort.c")
|
||||
.file("src/libbacktrace/state.c");
|
||||
|
||||
if target.contains("darwin") {
|
||||
build.file("src/libbacktrace/macho.c");
|
||||
} else if target.contains("windows") {
|
||||
build.file("src/libbacktrace/pecoff.c");
|
||||
} else {
|
||||
build.flag("-fvisibility=hidden");
|
||||
build.file("src/libbacktrace/elf.c");
|
||||
|
||||
let pointer_width = env::var("CARGO_CFG_TARGET_POINTER_WIDTH").unwrap();
|
||||
if pointer_width == "64" {
|
||||
build.define("BACKTRACE_ELF_SIZE", "64");
|
||||
} else {
|
||||
build.define("BACKTRACE_ELF_SIZE", "32");
|
||||
}
|
||||
}
|
||||
|
||||
File::create(out_dir.join("backtrace-supported.h")).unwrap();
|
||||
build.define("BACKTRACE_SUPPORTED", "1");
|
||||
build.define("BACKTRACE_USES_MALLOC", "1");
|
||||
build.define("BACKTRACE_SUPPORTS_THREADS", "0");
|
||||
build.define("BACKTRACE_SUPPORTS_DATA", "0");
|
||||
|
||||
File::create(out_dir.join("config.h")).unwrap();
|
||||
if !target.contains("apple-ios") &&
|
||||
!target.contains("solaris") &&
|
||||
!target.contains("redox") &&
|
||||
!target.contains("android") &&
|
||||
!target.contains("haiku") {
|
||||
build.define("HAVE_DL_ITERATE_PHDR", "1");
|
||||
}
|
||||
build.define("_GNU_SOURCE", "1");
|
||||
build.define("_LARGE_FILES", "1");
|
||||
|
||||
let syms = [
|
||||
"backtrace_full",
|
||||
"backtrace_dwarf_add",
|
||||
"backtrace_initialize",
|
||||
"backtrace_pcinfo",
|
||||
"backtrace_syminfo",
|
||||
"backtrace_get_view",
|
||||
"backtrace_release_view",
|
||||
"backtrace_alloc",
|
||||
"backtrace_free",
|
||||
"backtrace_vector_finish",
|
||||
"backtrace_vector_grow",
|
||||
"backtrace_vector_release",
|
||||
"backtrace_close",
|
||||
"backtrace_open",
|
||||
"backtrace_print",
|
||||
"backtrace_simple",
|
||||
"backtrace_qsort",
|
||||
"backtrace_create_state",
|
||||
"backtrace_uncompress_zdebug",
|
||||
];
|
||||
for sym in syms.iter() {
|
||||
build.define(sym, &format!("__rbt_{}", sym)[..]);
|
||||
}
|
||||
|
||||
build.compile("backtrace");
|
||||
}
|
44
third_party/rust/backtrace-sys/src/lib.rs
vendored
Normal file
44
third_party/rust/backtrace-sys/src/lib.rs
vendored
Normal file
@ -0,0 +1,44 @@
|
||||
#![allow(bad_style)]
|
||||
|
||||
extern crate libc;
|
||||
|
||||
use libc::uintptr_t;
|
||||
use std::os::raw::{c_void, c_char, c_int};
|
||||
|
||||
pub type backtrace_syminfo_callback =
|
||||
extern fn(data: *mut c_void,
|
||||
pc: uintptr_t,
|
||||
symname: *const c_char,
|
||||
symval: uintptr_t,
|
||||
symsize: uintptr_t);
|
||||
pub type backtrace_full_callback =
|
||||
extern fn(data: *mut c_void,
|
||||
pc: uintptr_t,
|
||||
filename: *const c_char,
|
||||
lineno: c_int,
|
||||
function: *const c_char) -> c_int;
|
||||
pub type backtrace_error_callback =
|
||||
extern fn(data: *mut c_void,
|
||||
msg: *const c_char,
|
||||
errnum: c_int);
|
||||
pub enum backtrace_state {}
|
||||
|
||||
extern {
|
||||
#[link_name = "__rbt_backtrace_create_state"]
|
||||
pub fn backtrace_create_state(filename: *const c_char,
|
||||
threaded: c_int,
|
||||
error: backtrace_error_callback,
|
||||
data: *mut c_void) -> *mut backtrace_state;
|
||||
#[link_name = "__rbt_backtrace_syminfo"]
|
||||
pub fn backtrace_syminfo(state: *mut backtrace_state,
|
||||
addr: uintptr_t,
|
||||
cb: backtrace_syminfo_callback,
|
||||
error: backtrace_error_callback,
|
||||
data: *mut c_void) -> c_int;
|
||||
#[link_name = "__rbt_backtrace_pcinfo"]
|
||||
pub fn backtrace_pcinfo(state: *mut backtrace_state,
|
||||
addr: uintptr_t,
|
||||
cb: backtrace_full_callback,
|
||||
error: backtrace_error_callback,
|
||||
data: *mut c_void) -> c_int;
|
||||
}
|
29
third_party/rust/backtrace-sys/src/libbacktrace/LICENSE
vendored
Normal file
29
third_party/rust/backtrace-sys/src/libbacktrace/LICENSE
vendored
Normal file
@ -0,0 +1,29 @@
|
||||
# Copyright (C) 2012-2016 Free Software Foundation, Inc.
|
||||
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
|
||||
# (1) Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
|
||||
# (2) Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in
|
||||
# the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
|
||||
# (3) The name of the author may not be used to
|
||||
# endorse or promote products derived from this software without
|
||||
# specific prior written permission.
|
||||
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
206
third_party/rust/backtrace-sys/src/libbacktrace/Makefile.am
vendored
Normal file
206
third_party/rust/backtrace-sys/src/libbacktrace/Makefile.am
vendored
Normal file
@ -0,0 +1,206 @@
|
||||
# Makefile.am -- Backtrace Makefile.
|
||||
# Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
||||
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
|
||||
# (1) Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
|
||||
# (2) Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in
|
||||
# the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
|
||||
# (3) The name of the author may not be used to
|
||||
# endorse or promote products derived from this software without
|
||||
# specific prior written permission.
|
||||
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
ACLOCAL_AMFLAGS = -I config
|
||||
|
||||
AM_CFLAGS = $(EXTRA_FLAGS) $(WARN_FLAGS) $(PIC_FLAG)
|
||||
|
||||
include_HEADERS = backtrace.h backtrace-supported.h
|
||||
|
||||
lib_LTLIBRARIES = libbacktrace.la
|
||||
|
||||
libbacktrace_la_SOURCES = \
|
||||
backtrace.h \
|
||||
atomic.c \
|
||||
dwarf.c \
|
||||
fileline.c \
|
||||
internal.h \
|
||||
posix.c \
|
||||
print.c \
|
||||
sort.c \
|
||||
state.c
|
||||
|
||||
BACKTRACE_FILES = \
|
||||
backtrace.c \
|
||||
simple.c \
|
||||
nounwind.c
|
||||
|
||||
FORMAT_FILES = \
|
||||
elf.c \
|
||||
pecoff.c \
|
||||
unknown.c \
|
||||
xcoff.c
|
||||
|
||||
VIEW_FILES = \
|
||||
read.c \
|
||||
mmapio.c
|
||||
|
||||
ALLOC_FILES = \
|
||||
alloc.c \
|
||||
mmap.c
|
||||
|
||||
EXTRA_libbacktrace_la_SOURCES = \
|
||||
$(BACKTRACE_FILES) \
|
||||
$(FORMAT_FILES) \
|
||||
$(VIEW_FILES) \
|
||||
$(ALLOC_FILES)
|
||||
|
||||
libbacktrace_la_LIBADD = \
|
||||
$(BACKTRACE_FILE) \
|
||||
$(FORMAT_FILE) \
|
||||
$(VIEW_FILE) \
|
||||
$(ALLOC_FILE)
|
||||
|
||||
libbacktrace_la_DEPENDENCIES = $(libbacktrace_la_LIBADD)
|
||||
|
||||
# Testsuite.
|
||||
|
||||
check_PROGRAMS =
|
||||
CLEANFILES =
|
||||
|
||||
TESTS = $(check_PROGRAMS)
|
||||
|
||||
if NATIVE
|
||||
|
||||
btest_SOURCES = btest.c testlib.c
|
||||
btest_CFLAGS = $(AM_CFLAGS) -g -O
|
||||
btest_LDADD = libbacktrace.la
|
||||
|
||||
check_PROGRAMS += btest
|
||||
|
||||
btest_static_SOURCES = btest.c testlib.c
|
||||
btest_static_CFLAGS = $(AM_CFLAGS) -g -O
|
||||
btest_static_LDADD = libbacktrace.la
|
||||
btest_static_LDFLAGS = -static-libtool-libs
|
||||
|
||||
check_PROGRAMS += btest_static
|
||||
|
||||
stest_SOURCES = stest.c
|
||||
stest_LDADD = libbacktrace.la
|
||||
|
||||
check_PROGRAMS += stest
|
||||
|
||||
ztest_SOURCES = ztest.c testlib.c
|
||||
ztest_CFLAGS = -DSRCDIR=\"$(srcdir)\"
|
||||
ztest_LDADD = libbacktrace.la
|
||||
|
||||
if HAVE_ZLIB
|
||||
ztest_LDADD += -lz
|
||||
endif
|
||||
ztest_LDADD += $(CLOCK_GETTIME_LINK)
|
||||
|
||||
check_PROGRAMS += ztest
|
||||
|
||||
edtest_SOURCES = edtest.c edtest2_build.c testlib.c
|
||||
edtest_LDADD = libbacktrace.la
|
||||
|
||||
check_PROGRAMS += edtest
|
||||
|
||||
edtest2_build.c: gen_edtest2_build; @true
|
||||
gen_edtest2_build: $(srcdir)/edtest2.c
|
||||
cat $(srcdir)/edtest2.c > tmp-edtest2_build.c
|
||||
$(SHELL) $(srcdir)/move-if-change tmp-edtest2_build.c edtest2_build.c
|
||||
echo timestamp > $@
|
||||
|
||||
CLEANFILES += edtest2_build.c gen_edtest2_build
|
||||
|
||||
if HAVE_PTHREAD
|
||||
|
||||
check_PROGRAMS += ttest
|
||||
|
||||
ttest_SOURCES = ttest.c testlib.c
|
||||
ttest_CFLAGS = $(AM_CFLAGS) -pthread
|
||||
ttest_LDADD = libbacktrace.la
|
||||
|
||||
endif HAVE_PTHREAD
|
||||
|
||||
if HAVE_OBJCOPY_DEBUGLINK
|
||||
|
||||
TESTS += dtest
|
||||
|
||||
dtest: btest_static
|
||||
$(OBJCOPY) --only-keep-debug btest_static btest.debug
|
||||
$(OBJCOPY) --strip-debug --add-gnu-debuglink=btest.debug btest_static dtest
|
||||
|
||||
CLEANFILES += dtest btest.debug
|
||||
|
||||
endif HAVE_OBJCOPY_DEBUGLINK
|
||||
|
||||
if HAVE_COMPRESSED_DEBUG
|
||||
|
||||
ctestg_SOURCES = btest.c testlib.c
|
||||
ctestg_CFLAGS = $(AM_CFLAGS) -g
|
||||
ctestg_LDFLAGS = -Wl,--compress-debug-sections=zlib-gnu
|
||||
ctestg_LDADD = libbacktrace.la
|
||||
|
||||
ctesta_SOURCES = btest.c testlib.c
|
||||
ctesta_CFLAGS = $(AM_CFLAGS) -g
|
||||
ctesta_LDFLAGS = -Wl,--compress-debug-sections=zlib-gabi
|
||||
ctesta_LDADD = libbacktrace.la
|
||||
|
||||
check_PROGRAMS += ctestg ctesta
|
||||
|
||||
endif
|
||||
|
||||
endif NATIVE
|
||||
|
||||
# We can't use automake's automatic dependency tracking, because it
|
||||
# breaks when using bootstrap-lean. Automatic dependency tracking
|
||||
# with GCC bootstrap will cause some of the objects to depend on
|
||||
# header files in prev-gcc/include, e.g., stddef.h and stdarg.h. When
|
||||
# using bootstrap-lean, prev-gcc is removed after each stage. When
|
||||
# running "make install", those header files will be gone, causing the
|
||||
# library to be rebuilt at install time. That may not succeed.
|
||||
|
||||
# These manual dependencies do not include dependencies on unwind.h,
|
||||
# even though that is part of GCC, because where to find it depends on
|
||||
# whether we are being built as a host library or a target library.
|
||||
|
||||
alloc.lo: config.h backtrace.h internal.h
|
||||
backtrace.lo: config.h backtrace.h internal.h
|
||||
btest.lo: backtrace.h backtrace-supported.h filenames.h
|
||||
dwarf.lo: config.h filenames.h backtrace.h internal.h
|
||||
elf.lo: config.h backtrace.h internal.h
|
||||
fileline.lo: config.h backtrace.h internal.h
|
||||
mmap.lo: config.h backtrace.h internal.h
|
||||
mmapio.lo: config.h backtrace.h internal.h
|
||||
nounwind.lo: config.h internal.h
|
||||
pecoff.lo: config.h backtrace.h internal.h
|
||||
posix.lo: config.h backtrace.h internal.h
|
||||
print.lo: config.h backtrace.h internal.h
|
||||
read.lo: config.h backtrace.h internal.h
|
||||
simple.lo: config.h backtrace.h internal.h
|
||||
sort.lo: config.h backtrace.h internal.h
|
||||
stest.lo: config.h backtrace.h internal.h
|
||||
state.lo: config.h backtrace.h backtrace-supported.h internal.h
|
||||
unknown.lo: config.h backtrace.h internal.h
|
||||
xcoff.lo: config.h backtrace.h internal.h
|
||||
|
1021
third_party/rust/backtrace-sys/src/libbacktrace/Makefile.in
vendored
Normal file
1021
third_party/rust/backtrace-sys/src/libbacktrace/Makefile.in
vendored
Normal file
File diff suppressed because it is too large
Load Diff
8465
third_party/rust/backtrace-sys/src/libbacktrace/Mark.Twain-Tom.Sawyer.txt
vendored
Normal file
8465
third_party/rust/backtrace-sys/src/libbacktrace/Mark.Twain-Tom.Sawyer.txt
vendored
Normal file
File diff suppressed because it is too large
Load Diff
33
third_party/rust/backtrace-sys/src/libbacktrace/README.md
vendored
Normal file
33
third_party/rust/backtrace-sys/src/libbacktrace/README.md
vendored
Normal file
@ -0,0 +1,33 @@
|
||||
# libbacktrace
|
||||
A C library that may be linked into a C/C++ program to produce symbolic backtraces
|
||||
|
||||
Initially written by Ian Lance Taylor <iant@golang.org>.
|
||||
|
||||
This is version 1.0.
|
||||
It is likely that this will always be version 1.0.
|
||||
|
||||
The libbacktrace library may be linked into a program or library and
|
||||
used to produce symbolic backtraces.
|
||||
Sample uses would be to print a detailed backtrace when an error
|
||||
occurs or to gather detailed profiling information.
|
||||
|
||||
The libbacktrace library is provided under a BSD license.
|
||||
See the source files for the exact license text.
|
||||
|
||||
The public functions are declared and documented in the header file
|
||||
backtrace.h, which should be #include'd by a user of the library.
|
||||
|
||||
Building libbacktrace will generate a file backtrace-supported.h,
|
||||
which a user of the library may use to determine whether backtraces
|
||||
will work.
|
||||
See the source file backtrace-supported.h.in for the macros that it
|
||||
defines.
|
||||
|
||||
As of January 2018, libbacktrace only supports ELF, PE/COFF, and XCOFF
|
||||
executables with DWARF debugging information.
|
||||
The library is written to make it straightforward to add support for
|
||||
other object file and debugging formats.
|
||||
|
||||
The library relies on the C++ unwind API defined at
|
||||
https://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html
|
||||
This API is provided by GCC.
|
72
third_party/rust/backtrace-sys/src/libbacktrace/acinclude.m4
vendored
Normal file
72
third_party/rust/backtrace-sys/src/libbacktrace/acinclude.m4
vendored
Normal file
@ -0,0 +1,72 @@
|
||||
dnl
|
||||
dnl Check whether _Unwind_GetIPInfo is available without doing a link
|
||||
dnl test so we can use this with libstdc++-v3 and libjava. Need to
|
||||
dnl use $target to set defaults because automatic checking is not possible
|
||||
dnl without a link test (and maybe even with a link test).
|
||||
dnl
|
||||
|
||||
AC_DEFUN([GCC_CHECK_UNWIND_GETIPINFO], [
|
||||
AC_ARG_WITH(system-libunwind,
|
||||
[ --with-system-libunwind use installed libunwind])
|
||||
# If system-libunwind was not specifically set, pick a default setting.
|
||||
if test x$with_system_libunwind = x; then
|
||||
case ${target} in
|
||||
ia64-*-hpux*) with_system_libunwind=yes ;;
|
||||
*) with_system_libunwind=no ;;
|
||||
esac
|
||||
fi
|
||||
# Based on system-libunwind and target, do we have ipinfo?
|
||||
if test x$with_system_libunwind = xyes; then
|
||||
case ${target} in
|
||||
ia64-*-*) have_unwind_getipinfo=no ;;
|
||||
*) have_unwind_getipinfo=yes ;;
|
||||
esac
|
||||
else
|
||||
# Darwin before version 9 does not have _Unwind_GetIPInfo.
|
||||
changequote(,)
|
||||
case ${target} in
|
||||
*-*-darwin[3-8]|*-*-darwin[3-8].*) have_unwind_getipinfo=no ;;
|
||||
*) have_unwind_getipinfo=yes ;;
|
||||
esac
|
||||
changequote([,])
|
||||
fi
|
||||
|
||||
if test x$have_unwind_getipinfo = xyes; then
|
||||
AC_DEFINE(HAVE_GETIPINFO, 1, [Define if _Unwind_GetIPInfo is available.])
|
||||
fi
|
||||
])
|
||||
|
||||
# ACX_PROG_CC_WARNING_OPTS(WARNINGS, [VARIABLE = WARN_CFLAGS])
|
||||
# Sets @VARIABLE@ to the subset of the given options which the
|
||||
# compiler accepts.
|
||||
AC_DEFUN([ACX_PROG_CC_WARNING_OPTS],
|
||||
[AC_REQUIRE([AC_PROG_CC])dnl
|
||||
AC_LANG_PUSH(C)
|
||||
m4_pushdef([acx_Var], [m4_default([$2], [WARN_CFLAGS])])dnl
|
||||
AC_SUBST(acx_Var)dnl
|
||||
m4_expand_once([acx_Var=
|
||||
],m4_quote(acx_Var=))dnl
|
||||
save_CFLAGS="$CFLAGS"
|
||||
for real_option in $1; do
|
||||
# Do the check with the no- prefix removed since gcc silently
|
||||
# accepts any -Wno-* option on purpose
|
||||
case $real_option in
|
||||
-Wno-*) option=-W`expr x$real_option : 'x-Wno-\(.*\)'` ;;
|
||||
*) option=$real_option ;;
|
||||
esac
|
||||
AS_VAR_PUSHDEF([acx_Woption], [acx_cv_prog_cc_warning_$option])
|
||||
AC_CACHE_CHECK([whether $CC supports $option], acx_Woption,
|
||||
[CFLAGS="$option"
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[])],
|
||||
[AS_VAR_SET(acx_Woption, yes)],
|
||||
[AS_VAR_SET(acx_Woption, no)])
|
||||
])
|
||||
AS_IF([test AS_VAR_GET(acx_Woption) = yes],
|
||||
[acx_Var="$acx_Var${acx_Var:+ }$real_option"])
|
||||
AS_VAR_POPDEF([acx_Woption])dnl
|
||||
done
|
||||
CFLAGS="$save_CFLAGS"
|
||||
m4_popdef([acx_Var])dnl
|
||||
AC_LANG_POP(C)
|
||||
])# ACX_PROG_CC_WARNING_OPTS
|
||||
|
767
third_party/rust/backtrace-sys/src/libbacktrace/aclocal.m4
vendored
Normal file
767
third_party/rust/backtrace-sys/src/libbacktrace/aclocal.m4
vendored
Normal file
@ -0,0 +1,767 @@
|
||||
# generated automatically by aclocal 1.11.6 -*- Autoconf -*-
|
||||
|
||||
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
|
||||
# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
|
||||
# Inc.
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE.
|
||||
|
||||
m4_ifndef([AC_AUTOCONF_VERSION],
|
||||
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
|
||||
m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.64],,
|
||||
[m4_warning([this file was generated for autoconf 2.64.
|
||||
You have another version of autoconf. It may work, but is not guaranteed to.
|
||||
If you have problems, you may need to regenerate the build system entirely.
|
||||
To do so, use the procedure documented by the package, typically `autoreconf'.])])
|
||||
|
||||
# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software
|
||||
# Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 1
|
||||
|
||||
# AM_AUTOMAKE_VERSION(VERSION)
|
||||
# ----------------------------
|
||||
# Automake X.Y traces this macro to ensure aclocal.m4 has been
|
||||
# generated from the m4 files accompanying Automake X.Y.
|
||||
# (This private macro should not be called outside this file.)
|
||||
AC_DEFUN([AM_AUTOMAKE_VERSION],
|
||||
[am__api_version='1.11'
|
||||
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
|
||||
dnl require some minimum version. Point them to the right macro.
|
||||
m4_if([$1], [1.11.6], [],
|
||||
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
|
||||
])
|
||||
|
||||
# _AM_AUTOCONF_VERSION(VERSION)
|
||||
# -----------------------------
|
||||
# aclocal traces this macro to find the Autoconf version.
|
||||
# This is a private macro too. Using m4_define simplifies
|
||||
# the logic in aclocal, which can simply ignore this definition.
|
||||
m4_define([_AM_AUTOCONF_VERSION], [])
|
||||
|
||||
# AM_SET_CURRENT_AUTOMAKE_VERSION
|
||||
# -------------------------------
|
||||
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
|
||||
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
|
||||
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
|
||||
[AM_AUTOMAKE_VERSION([1.11.6])dnl
|
||||
m4_ifndef([AC_AUTOCONF_VERSION],
|
||||
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
|
||||
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
|
||||
|
||||
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
|
||||
|
||||
# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 1
|
||||
|
||||
# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
|
||||
# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
|
||||
# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
|
||||
#
|
||||
# Of course, Automake must honor this variable whenever it calls a
|
||||
# tool from the auxiliary directory. The problem is that $srcdir (and
|
||||
# therefore $ac_aux_dir as well) can be either absolute or relative,
|
||||
# depending on how configure is run. This is pretty annoying, since
|
||||
# it makes $ac_aux_dir quite unusable in subdirectories: in the top
|
||||
# source directory, any form will work fine, but in subdirectories a
|
||||
# relative path needs to be adjusted first.
|
||||
#
|
||||
# $ac_aux_dir/missing
|
||||
# fails when called from a subdirectory if $ac_aux_dir is relative
|
||||
# $top_srcdir/$ac_aux_dir/missing
|
||||
# fails if $ac_aux_dir is absolute,
|
||||
# fails when called from a subdirectory in a VPATH build with
|
||||
# a relative $ac_aux_dir
|
||||
#
|
||||
# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
|
||||
# are both prefixed by $srcdir. In an in-source build this is usually
|
||||
# harmless because $srcdir is `.', but things will broke when you
|
||||
# start a VPATH build or use an absolute $srcdir.
|
||||
#
|
||||
# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
|
||||
# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
|
||||
# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
|
||||
# and then we would define $MISSING as
|
||||
# MISSING="\${SHELL} $am_aux_dir/missing"
|
||||
# This will work as long as MISSING is not called from configure, because
|
||||
# unfortunately $(top_srcdir) has no meaning in configure.
|
||||
# However there are other variables, like CC, which are often used in
|
||||
# configure, and could therefore not use this "fixed" $ac_aux_dir.
|
||||
#
|
||||
# Another solution, used here, is to always expand $ac_aux_dir to an
|
||||
# absolute PATH. The drawback is that using absolute paths prevent a
|
||||
# configured tree to be moved without reconfiguration.
|
||||
|
||||
AC_DEFUN([AM_AUX_DIR_EXPAND],
|
||||
[dnl Rely on autoconf to set up CDPATH properly.
|
||||
AC_PREREQ([2.50])dnl
|
||||
# expand $ac_aux_dir to an absolute path
|
||||
am_aux_dir=`cd $ac_aux_dir && pwd`
|
||||
])
|
||||
|
||||
# AM_CONDITIONAL -*- Autoconf -*-
|
||||
|
||||
# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
|
||||
# Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 9
|
||||
|
||||
# AM_CONDITIONAL(NAME, SHELL-CONDITION)
|
||||
# -------------------------------------
|
||||
# Define a conditional.
|
||||
AC_DEFUN([AM_CONDITIONAL],
|
||||
[AC_PREREQ(2.52)dnl
|
||||
ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
|
||||
[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
|
||||
AC_SUBST([$1_TRUE])dnl
|
||||
AC_SUBST([$1_FALSE])dnl
|
||||
_AM_SUBST_NOTMAKE([$1_TRUE])dnl
|
||||
_AM_SUBST_NOTMAKE([$1_FALSE])dnl
|
||||
m4_define([_AM_COND_VALUE_$1], [$2])dnl
|
||||
if $2; then
|
||||
$1_TRUE=
|
||||
$1_FALSE='#'
|
||||
else
|
||||
$1_TRUE='#'
|
||||
$1_FALSE=
|
||||
fi
|
||||
AC_CONFIG_COMMANDS_PRE(
|
||||
[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
|
||||
AC_MSG_ERROR([[conditional "$1" was never defined.
|
||||
Usually this means the macro was only invoked conditionally.]])
|
||||
fi])])
|
||||
|
||||
# Do all the work for Automake. -*- Autoconf -*-
|
||||
|
||||
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
|
||||
# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 16
|
||||
|
||||
# This macro actually does too much. Some checks are only needed if
|
||||
# your package does certain things. But this isn't really a big deal.
|
||||
|
||||
# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
|
||||
# AM_INIT_AUTOMAKE([OPTIONS])
|
||||
# -----------------------------------------------
|
||||
# The call with PACKAGE and VERSION arguments is the old style
|
||||
# call (pre autoconf-2.50), which is being phased out. PACKAGE
|
||||
# and VERSION should now be passed to AC_INIT and removed from
|
||||
# the call to AM_INIT_AUTOMAKE.
|
||||
# We support both call styles for the transition. After
|
||||
# the next Automake release, Autoconf can make the AC_INIT
|
||||
# arguments mandatory, and then we can depend on a new Autoconf
|
||||
# release and drop the old call support.
|
||||
AC_DEFUN([AM_INIT_AUTOMAKE],
|
||||
[AC_PREREQ([2.62])dnl
|
||||
dnl Autoconf wants to disallow AM_ names. We explicitly allow
|
||||
dnl the ones we care about.
|
||||
m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
|
||||
AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
|
||||
AC_REQUIRE([AC_PROG_INSTALL])dnl
|
||||
if test "`cd $srcdir && pwd`" != "`pwd`"; then
|
||||
# Use -I$(srcdir) only when $(srcdir) != ., so that make's output
|
||||
# is not polluted with repeated "-I."
|
||||
AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
|
||||
# test to see if srcdir already configured
|
||||
if test -f $srcdir/config.status; then
|
||||
AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
|
||||
fi
|
||||
fi
|
||||
|
||||
# test whether we have cygpath
|
||||
if test -z "$CYGPATH_W"; then
|
||||
if (cygpath --version) >/dev/null 2>/dev/null; then
|
||||
CYGPATH_W='cygpath -w'
|
||||
else
|
||||
CYGPATH_W=echo
|
||||
fi
|
||||
fi
|
||||
AC_SUBST([CYGPATH_W])
|
||||
|
||||
# Define the identity of the package.
|
||||
dnl Distinguish between old-style and new-style calls.
|
||||
m4_ifval([$2],
|
||||
[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
|
||||
AC_SUBST([PACKAGE], [$1])dnl
|
||||
AC_SUBST([VERSION], [$2])],
|
||||
[_AM_SET_OPTIONS([$1])dnl
|
||||
dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
|
||||
m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
|
||||
[m4_fatal([AC_INIT should be called with package and version arguments])])dnl
|
||||
AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
|
||||
AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
|
||||
|
||||
_AM_IF_OPTION([no-define],,
|
||||
[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
|
||||
AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
|
||||
|
||||
# Some tools Automake needs.
|
||||
AC_REQUIRE([AM_SANITY_CHECK])dnl
|
||||
AC_REQUIRE([AC_ARG_PROGRAM])dnl
|
||||
AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
|
||||
AM_MISSING_PROG(AUTOCONF, autoconf)
|
||||
AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
|
||||
AM_MISSING_PROG(AUTOHEADER, autoheader)
|
||||
AM_MISSING_PROG(MAKEINFO, makeinfo)
|
||||
AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
|
||||
AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
|
||||
AC_REQUIRE([AM_PROG_MKDIR_P])dnl
|
||||
# We need awk for the "check" target. The system "awk" is bad on
|
||||
# some platforms.
|
||||
AC_REQUIRE([AC_PROG_AWK])dnl
|
||||
AC_REQUIRE([AC_PROG_MAKE_SET])dnl
|
||||
AC_REQUIRE([AM_SET_LEADING_DOT])dnl
|
||||
_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
|
||||
[_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
|
||||
[_AM_PROG_TAR([v7])])])
|
||||
_AM_IF_OPTION([no-dependencies],,
|
||||
[AC_PROVIDE_IFELSE([AC_PROG_CC],
|
||||
[_AM_DEPENDENCIES(CC)],
|
||||
[define([AC_PROG_CC],
|
||||
defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
|
||||
AC_PROVIDE_IFELSE([AC_PROG_CXX],
|
||||
[_AM_DEPENDENCIES(CXX)],
|
||||
[define([AC_PROG_CXX],
|
||||
defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
|
||||
AC_PROVIDE_IFELSE([AC_PROG_OBJC],
|
||||
[_AM_DEPENDENCIES(OBJC)],
|
||||
[define([AC_PROG_OBJC],
|
||||
defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
|
||||
])
|
||||
_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
|
||||
dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
|
||||
dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro
|
||||
dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
|
||||
AC_CONFIG_COMMANDS_PRE(dnl
|
||||
[m4_provide_if([_AM_COMPILER_EXEEXT],
|
||||
[AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
|
||||
])
|
||||
|
||||
dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not
|
||||
dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
|
||||
dnl mangled by Autoconf and run in a shell conditional statement.
|
||||
m4_define([_AC_COMPILER_EXEEXT],
|
||||
m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
|
||||
|
||||
|
||||
# When config.status generates a header, we must update the stamp-h file.
|
||||
# This file resides in the same directory as the config header
|
||||
# that is generated. The stamp files are numbered to have different names.
|
||||
|
||||
# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
|
||||
# loop where config.status creates the headers, so we can generate
|
||||
# our stamp files there.
|
||||
AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
|
||||
[# Compute $1's index in $config_headers.
|
||||
_am_arg=$1
|
||||
_am_stamp_count=1
|
||||
for _am_header in $config_headers :; do
|
||||
case $_am_header in
|
||||
$_am_arg | $_am_arg:* )
|
||||
break ;;
|
||||
* )
|
||||
_am_stamp_count=`expr $_am_stamp_count + 1` ;;
|
||||
esac
|
||||
done
|
||||
echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
|
||||
|
||||
# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation,
|
||||
# Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 1
|
||||
|
||||
# AM_PROG_INSTALL_SH
|
||||
# ------------------
|
||||
# Define $install_sh.
|
||||
AC_DEFUN([AM_PROG_INSTALL_SH],
|
||||
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
|
||||
if test x"${install_sh}" != xset; then
|
||||
case $am_aux_dir in
|
||||
*\ * | *\ *)
|
||||
install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
|
||||
*)
|
||||
install_sh="\${SHELL} $am_aux_dir/install-sh"
|
||||
esac
|
||||
fi
|
||||
AC_SUBST(install_sh)])
|
||||
|
||||
# Copyright (C) 2003, 2005 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 2
|
||||
|
||||
# Check whether the underlying file-system supports filenames
|
||||
# with a leading dot. For instance MS-DOS doesn't.
|
||||
AC_DEFUN([AM_SET_LEADING_DOT],
|
||||
[rm -rf .tst 2>/dev/null
|
||||
mkdir .tst 2>/dev/null
|
||||
if test -d .tst; then
|
||||
am__leading_dot=.
|
||||
else
|
||||
am__leading_dot=_
|
||||
fi
|
||||
rmdir .tst 2>/dev/null
|
||||
AC_SUBST([am__leading_dot])])
|
||||
|
||||
# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
|
||||
# From Jim Meyering
|
||||
|
||||
# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008,
|
||||
# 2011 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 5
|
||||
|
||||
# AM_MAINTAINER_MODE([DEFAULT-MODE])
|
||||
# ----------------------------------
|
||||
# Control maintainer-specific portions of Makefiles.
|
||||
# Default is to disable them, unless `enable' is passed literally.
|
||||
# For symmetry, `disable' may be passed as well. Anyway, the user
|
||||
# can override the default with the --enable/--disable switch.
|
||||
AC_DEFUN([AM_MAINTAINER_MODE],
|
||||
[m4_case(m4_default([$1], [disable]),
|
||||
[enable], [m4_define([am_maintainer_other], [disable])],
|
||||
[disable], [m4_define([am_maintainer_other], [enable])],
|
||||
[m4_define([am_maintainer_other], [enable])
|
||||
m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
|
||||
AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
|
||||
dnl maintainer-mode's default is 'disable' unless 'enable' is passed
|
||||
AC_ARG_ENABLE([maintainer-mode],
|
||||
[ --][am_maintainer_other][-maintainer-mode am_maintainer_other make rules and dependencies not useful
|
||||
(and sometimes confusing) to the casual installer],
|
||||
[USE_MAINTAINER_MODE=$enableval],
|
||||
[USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
|
||||
AC_MSG_RESULT([$USE_MAINTAINER_MODE])
|
||||
AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
|
||||
MAINT=$MAINTAINER_MODE_TRUE
|
||||
AC_SUBST([MAINT])dnl
|
||||
]
|
||||
)
|
||||
|
||||
AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
|
||||
|
||||
# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
|
||||
|
||||
# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
|
||||
# Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 6
|
||||
|
||||
# AM_MISSING_PROG(NAME, PROGRAM)
|
||||
# ------------------------------
|
||||
AC_DEFUN([AM_MISSING_PROG],
|
||||
[AC_REQUIRE([AM_MISSING_HAS_RUN])
|
||||
$1=${$1-"${am_missing_run}$2"}
|
||||
AC_SUBST($1)])
|
||||
|
||||
|
||||
# AM_MISSING_HAS_RUN
|
||||
# ------------------
|
||||
# Define MISSING if not defined so far and test if it supports --run.
|
||||
# If it does, set am_missing_run to use it, otherwise, to nothing.
|
||||
AC_DEFUN([AM_MISSING_HAS_RUN],
|
||||
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
|
||||
AC_REQUIRE_AUX_FILE([missing])dnl
|
||||
if test x"${MISSING+set}" != xset; then
|
||||
case $am_aux_dir in
|
||||
*\ * | *\ *)
|
||||
MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
|
||||
*)
|
||||
MISSING="\${SHELL} $am_aux_dir/missing" ;;
|
||||
esac
|
||||
fi
|
||||
# Use eval to expand $SHELL
|
||||
if eval "$MISSING --run true"; then
|
||||
am_missing_run="$MISSING --run "
|
||||
else
|
||||
am_missing_run=
|
||||
AC_MSG_WARN([`missing' script is too old or missing])
|
||||
fi
|
||||
])
|
||||
|
||||
# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation,
|
||||
# Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 1
|
||||
|
||||
# AM_PROG_MKDIR_P
|
||||
# ---------------
|
||||
# Check for `mkdir -p'.
|
||||
AC_DEFUN([AM_PROG_MKDIR_P],
|
||||
[AC_PREREQ([2.60])dnl
|
||||
AC_REQUIRE([AC_PROG_MKDIR_P])dnl
|
||||
dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P,
|
||||
dnl while keeping a definition of mkdir_p for backward compatibility.
|
||||
dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
|
||||
dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
|
||||
dnl Makefile.ins that do not define MKDIR_P, so we do our own
|
||||
dnl adjustment using top_builddir (which is defined more often than
|
||||
dnl MKDIR_P).
|
||||
AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
|
||||
case $mkdir_p in
|
||||
[[\\/$]]* | ?:[[\\/]]*) ;;
|
||||
*/*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
|
||||
esac
|
||||
])
|
||||
|
||||
# Copyright (C) 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2012
|
||||
# Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 6
|
||||
|
||||
# AM_ENABLE_MULTILIB([MAKEFILE], [REL-TO-TOP-SRCDIR])
|
||||
# ---------------------------------------------------
|
||||
# Add --enable-multilib to configure.
|
||||
AC_DEFUN([AM_ENABLE_MULTILIB],
|
||||
[m4_warn([obsolete], [$0 will be removed from Automake core soon.
|
||||
Files implementing the "multilib" feature are (and will remain) available
|
||||
to the 'contrib/' directory in the Automake distribution.])]dnl
|
||||
[# Default to --enable-multilib
|
||||
AC_ARG_ENABLE(multilib,
|
||||
[ --enable-multilib build many library versions (default)],
|
||||
[case "$enableval" in
|
||||
yes) multilib=yes ;;
|
||||
no) multilib=no ;;
|
||||
*) AC_MSG_ERROR([bad value $enableval for multilib option]) ;;
|
||||
esac],
|
||||
[multilib=yes])
|
||||
|
||||
# We may get other options which we leave undocumented:
|
||||
# --with-target-subdir, --with-multisrctop, --with-multisubdir
|
||||
# See config-ml.in if you want the gory details.
|
||||
|
||||
if test "$srcdir" = "."; then
|
||||
if test "$with_target_subdir" != "."; then
|
||||
multi_basedir="$srcdir/$with_multisrctop../$2"
|
||||
else
|
||||
multi_basedir="$srcdir/$with_multisrctop$2"
|
||||
fi
|
||||
else
|
||||
multi_basedir="$srcdir/$2"
|
||||
fi
|
||||
AC_SUBST(multi_basedir)
|
||||
|
||||
# Even if the default multilib is not a cross compilation,
|
||||
# it may be that some of the other multilibs are.
|
||||
if test $cross_compiling = no && test $multilib = yes \
|
||||
&& test "x${with_multisubdir}" != x ; then
|
||||
cross_compiling=maybe
|
||||
fi
|
||||
|
||||
AC_OUTPUT_COMMANDS([
|
||||
# Only add multilib support code if we just rebuilt the top-level
|
||||
# Makefile.
|
||||
case " $CONFIG_FILES " in
|
||||
*" ]m4_default([$1],Makefile)[ "*)
|
||||
ac_file=]m4_default([$1],Makefile)[ . ${multi_basedir}/config-ml.in
|
||||
;;
|
||||
esac],
|
||||
[
|
||||
srcdir="$srcdir"
|
||||
host="$host"
|
||||
target="$target"
|
||||
with_multisubdir="$with_multisubdir"
|
||||
with_multisrctop="$with_multisrctop"
|
||||
with_target_subdir="$with_target_subdir"
|
||||
ac_configure_args="${multilib_arg} ${ac_configure_args}"
|
||||
multi_basedir="$multi_basedir"
|
||||
CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
|
||||
CC="$CC"])])dnl
|
||||
|
||||
# Helper functions for option handling. -*- Autoconf -*-
|
||||
|
||||
# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software
|
||||
# Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 5
|
||||
|
||||
# _AM_MANGLE_OPTION(NAME)
|
||||
# -----------------------
|
||||
AC_DEFUN([_AM_MANGLE_OPTION],
|
||||
[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
|
||||
|
||||
# _AM_SET_OPTION(NAME)
|
||||
# --------------------
|
||||
# Set option NAME. Presently that only means defining a flag for this option.
|
||||
AC_DEFUN([_AM_SET_OPTION],
|
||||
[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
|
||||
|
||||
# _AM_SET_OPTIONS(OPTIONS)
|
||||
# ------------------------
|
||||
# OPTIONS is a space-separated list of Automake options.
|
||||
AC_DEFUN([_AM_SET_OPTIONS],
|
||||
[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
|
||||
|
||||
# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
|
||||
# -------------------------------------------
|
||||
# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
|
||||
AC_DEFUN([_AM_IF_OPTION],
|
||||
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
|
||||
|
||||
# Check to make sure that the build environment is sane. -*- Autoconf -*-
|
||||
|
||||
# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
|
||||
# Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 5
|
||||
|
||||
# AM_SANITY_CHECK
|
||||
# ---------------
|
||||
AC_DEFUN([AM_SANITY_CHECK],
|
||||
[AC_MSG_CHECKING([whether build environment is sane])
|
||||
# Just in case
|
||||
sleep 1
|
||||
echo timestamp > conftest.file
|
||||
# Reject unsafe characters in $srcdir or the absolute working directory
|
||||
# name. Accept space and tab only in the latter.
|
||||
am_lf='
|
||||
'
|
||||
case `pwd` in
|
||||
*[[\\\"\#\$\&\'\`$am_lf]]*)
|
||||
AC_MSG_ERROR([unsafe absolute working directory name]);;
|
||||
esac
|
||||
case $srcdir in
|
||||
*[[\\\"\#\$\&\'\`$am_lf\ \ ]]*)
|
||||
AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
|
||||
esac
|
||||
|
||||
# Do `set' in a subshell so we don't clobber the current shell's
|
||||
# arguments. Must try -L first in case configure is actually a
|
||||
# symlink; some systems play weird games with the mod time of symlinks
|
||||
# (eg FreeBSD returns the mod time of the symlink's containing
|
||||
# directory).
|
||||
if (
|
||||
set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
|
||||
if test "$[*]" = "X"; then
|
||||
# -L didn't work.
|
||||
set X `ls -t "$srcdir/configure" conftest.file`
|
||||
fi
|
||||
rm -f conftest.file
|
||||
if test "$[*]" != "X $srcdir/configure conftest.file" \
|
||||
&& test "$[*]" != "X conftest.file $srcdir/configure"; then
|
||||
|
||||
# If neither matched, then we have a broken ls. This can happen
|
||||
# if, for instance, CONFIG_SHELL is bash and it inherits a
|
||||
# broken ls alias from the environment. This has actually
|
||||
# happened. Such a system could not be considered "sane".
|
||||
AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
|
||||
alias in your environment])
|
||||
fi
|
||||
|
||||
test "$[2]" = conftest.file
|
||||
)
|
||||
then
|
||||
# Ok.
|
||||
:
|
||||
else
|
||||
AC_MSG_ERROR([newly created file is older than distributed files!
|
||||
Check your system clock])
|
||||
fi
|
||||
AC_MSG_RESULT(yes)])
|
||||
|
||||
# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 1
|
||||
|
||||
# AM_PROG_INSTALL_STRIP
|
||||
# ---------------------
|
||||
# One issue with vendor `install' (even GNU) is that you can't
|
||||
# specify the program used to strip binaries. This is especially
|
||||
# annoying in cross-compiling environments, where the build's strip
|
||||
# is unlikely to handle the host's binaries.
|
||||
# Fortunately install-sh will honor a STRIPPROG variable, so we
|
||||
# always use install-sh in `make install-strip', and initialize
|
||||
# STRIPPROG with the value of the STRIP variable (set by the user).
|
||||
AC_DEFUN([AM_PROG_INSTALL_STRIP],
|
||||
[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
|
||||
# Installed binaries are usually stripped using `strip' when the user
|
||||
# run `make install-strip'. However `strip' might not be the right
|
||||
# tool to use in cross-compilation environments, therefore Automake
|
||||
# will honor the `STRIP' environment variable to overrule this program.
|
||||
dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
|
||||
if test "$cross_compiling" != no; then
|
||||
AC_CHECK_TOOL([STRIP], [strip], :)
|
||||
fi
|
||||
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
|
||||
AC_SUBST([INSTALL_STRIP_PROGRAM])])
|
||||
|
||||
# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 3
|
||||
|
||||
# _AM_SUBST_NOTMAKE(VARIABLE)
|
||||
# ---------------------------
|
||||
# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
|
||||
# This macro is traced by Automake.
|
||||
AC_DEFUN([_AM_SUBST_NOTMAKE])
|
||||
|
||||
# AM_SUBST_NOTMAKE(VARIABLE)
|
||||
# --------------------------
|
||||
# Public sister of _AM_SUBST_NOTMAKE.
|
||||
AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
|
||||
|
||||
# Check how to create a tarball. -*- Autoconf -*-
|
||||
|
||||
# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 2
|
||||
|
||||
# _AM_PROG_TAR(FORMAT)
|
||||
# --------------------
|
||||
# Check how to create a tarball in format FORMAT.
|
||||
# FORMAT should be one of `v7', `ustar', or `pax'.
|
||||
#
|
||||
# Substitute a variable $(am__tar) that is a command
|
||||
# writing to stdout a FORMAT-tarball containing the directory
|
||||
# $tardir.
|
||||
# tardir=directory && $(am__tar) > result.tar
|
||||
#
|
||||
# Substitute a variable $(am__untar) that extract such
|
||||
# a tarball read from stdin.
|
||||
# $(am__untar) < result.tar
|
||||
AC_DEFUN([_AM_PROG_TAR],
|
||||
[# Always define AMTAR for backward compatibility. Yes, it's still used
|
||||
# in the wild :-( We should find a proper way to deprecate it ...
|
||||
AC_SUBST([AMTAR], ['$${TAR-tar}'])
|
||||
m4_if([$1], [v7],
|
||||
[am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
|
||||
[m4_case([$1], [ustar],, [pax],,
|
||||
[m4_fatal([Unknown tar format])])
|
||||
AC_MSG_CHECKING([how to create a $1 tar archive])
|
||||
# Loop over all known methods to create a tar archive until one works.
|
||||
_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
|
||||
_am_tools=${am_cv_prog_tar_$1-$_am_tools}
|
||||
# Do not fold the above two line into one, because Tru64 sh and
|
||||
# Solaris sh will not grok spaces in the rhs of `-'.
|
||||
for _am_tool in $_am_tools
|
||||
do
|
||||
case $_am_tool in
|
||||
gnutar)
|
||||
for _am_tar in tar gnutar gtar;
|
||||
do
|
||||
AM_RUN_LOG([$_am_tar --version]) && break
|
||||
done
|
||||
am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
|
||||
am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
|
||||
am__untar="$_am_tar -xf -"
|
||||
;;
|
||||
plaintar)
|
||||
# Must skip GNU tar: if it does not support --format= it doesn't create
|
||||
# ustar tarball either.
|
||||
(tar --version) >/dev/null 2>&1 && continue
|
||||
am__tar='tar chf - "$$tardir"'
|
||||
am__tar_='tar chf - "$tardir"'
|
||||
am__untar='tar xf -'
|
||||
;;
|
||||
pax)
|
||||
am__tar='pax -L -x $1 -w "$$tardir"'
|
||||
am__tar_='pax -L -x $1 -w "$tardir"'
|
||||
am__untar='pax -r'
|
||||
;;
|
||||
cpio)
|
||||
am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
|
||||
am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
|
||||
am__untar='cpio -i -H $1 -d'
|
||||
;;
|
||||
none)
|
||||
am__tar=false
|
||||
am__tar_=false
|
||||
am__untar=false
|
||||
;;
|
||||
esac
|
||||
|
||||
# If the value was cached, stop now. We just wanted to have am__tar
|
||||
# and am__untar set.
|
||||
test -n "${am_cv_prog_tar_$1}" && break
|
||||
|
||||
# tar/untar a dummy directory, and stop if the command works
|
||||
rm -rf conftest.dir
|
||||
mkdir conftest.dir
|
||||
echo GrepMe > conftest.dir/file
|
||||
AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
|
||||
rm -rf conftest.dir
|
||||
if test -s conftest.tar; then
|
||||
AM_RUN_LOG([$am__untar <conftest.tar])
|
||||
grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
|
||||
fi
|
||||
done
|
||||
rm -rf conftest.dir
|
||||
|
||||
AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
|
||||
AC_MSG_RESULT([$am_cv_prog_tar_$1])])
|
||||
AC_SUBST([am__tar])
|
||||
AC_SUBST([am__untar])
|
||||
]) # _AM_PROG_TAR
|
||||
|
||||
m4_include([config/libtool.m4])
|
||||
m4_include([config/ltoptions.m4])
|
||||
m4_include([config/ltsugar.m4])
|
||||
m4_include([config/ltversion.m4])
|
||||
m4_include([config/lt~obsolete.m4])
|
||||
m4_include([acinclude.m4])
|
156
third_party/rust/backtrace-sys/src/libbacktrace/alloc.c
vendored
Normal file
156
third_party/rust/backtrace-sys/src/libbacktrace/alloc.c
vendored
Normal file
@ -0,0 +1,156 @@
|
||||
/* alloc.c -- Memory allocation without mmap.
|
||||
Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
||||
Written by Ian Lance Taylor, Google.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "backtrace.h"
|
||||
#include "internal.h"
|
||||
|
||||
/* Allocation routines to use on systems that do not support anonymous
|
||||
mmap. This implementation just uses malloc, which means that the
|
||||
backtrace functions may not be safely invoked from a signal
|
||||
handler. */
|
||||
|
||||
/* Allocate memory like malloc. If ERROR_CALLBACK is NULL, don't
|
||||
report an error. */
|
||||
|
||||
void *
|
||||
backtrace_alloc (struct backtrace_state *state ATTRIBUTE_UNUSED,
|
||||
size_t size, backtrace_error_callback error_callback,
|
||||
void *data)
|
||||
{
|
||||
void *ret;
|
||||
|
||||
ret = malloc (size);
|
||||
if (ret == NULL)
|
||||
{
|
||||
if (error_callback)
|
||||
error_callback (data, "malloc", errno);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Free memory. */
|
||||
|
||||
void
|
||||
backtrace_free (struct backtrace_state *state ATTRIBUTE_UNUSED,
|
||||
void *p, size_t size ATTRIBUTE_UNUSED,
|
||||
backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
|
||||
void *data ATTRIBUTE_UNUSED)
|
||||
{
|
||||
free (p);
|
||||
}
|
||||
|
||||
/* Grow VEC by SIZE bytes. */
|
||||
|
||||
void *
|
||||
backtrace_vector_grow (struct backtrace_state *state ATTRIBUTE_UNUSED,
|
||||
size_t size, backtrace_error_callback error_callback,
|
||||
void *data, struct backtrace_vector *vec)
|
||||
{
|
||||
void *ret;
|
||||
|
||||
if (size > vec->alc)
|
||||
{
|
||||
size_t alc;
|
||||
void *base;
|
||||
|
||||
if (vec->size == 0)
|
||||
alc = 32 * size;
|
||||
else if (vec->size >= 4096)
|
||||
alc = vec->size + 4096;
|
||||
else
|
||||
alc = 2 * vec->size;
|
||||
|
||||
if (alc < vec->size + size)
|
||||
alc = vec->size + size;
|
||||
|
||||
base = realloc (vec->base, alc);
|
||||
if (base == NULL)
|
||||
{
|
||||
error_callback (data, "realloc", errno);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
vec->base = base;
|
||||
vec->alc = alc - vec->size;
|
||||
}
|
||||
|
||||
ret = (char *) vec->base + vec->size;
|
||||
vec->size += size;
|
||||
vec->alc -= size;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Finish the current allocation on VEC. */
|
||||
|
||||
void *
|
||||
backtrace_vector_finish (struct backtrace_state *state,
|
||||
struct backtrace_vector *vec,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data)
|
||||
{
|
||||
void *ret;
|
||||
|
||||
/* With this allocator we call realloc in backtrace_vector_grow,
|
||||
which means we can't easily reuse the memory here. So just
|
||||
release it. */
|
||||
if (!backtrace_vector_release (state, vec, error_callback, data))
|
||||
return NULL;
|
||||
ret = vec->base;
|
||||
vec->base = NULL;
|
||||
vec->size = 0;
|
||||
vec->alc = 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Release any extra space allocated for VEC. */
|
||||
|
||||
int
|
||||
backtrace_vector_release (struct backtrace_state *state ATTRIBUTE_UNUSED,
|
||||
struct backtrace_vector *vec,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data)
|
||||
{
|
||||
vec->base = realloc (vec->base, vec->size);
|
||||
if (vec->base == NULL)
|
||||
{
|
||||
error_callback (data, "realloc", errno);
|
||||
return 0;
|
||||
}
|
||||
vec->alc = 0;
|
||||
return 1;
|
||||
}
|
113
third_party/rust/backtrace-sys/src/libbacktrace/atomic.c
vendored
Normal file
113
third_party/rust/backtrace-sys/src/libbacktrace/atomic.c
vendored
Normal file
@ -0,0 +1,113 @@
|
||||
/* atomic.c -- Support for atomic functions if not present.
|
||||
Copyright (C) 2013-2018 Free Software Foundation, Inc.
|
||||
Written by Ian Lance Taylor, Google.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "backtrace.h"
|
||||
#include "backtrace-supported.h"
|
||||
#include "internal.h"
|
||||
|
||||
/* This file holds implementations of the atomic functions that are
|
||||
used if the host compiler has the sync functions but not the atomic
|
||||
functions, as is true of versions of GCC before 4.7. */
|
||||
|
||||
#if !defined (HAVE_ATOMIC_FUNCTIONS) && defined (HAVE_SYNC_FUNCTIONS)
|
||||
|
||||
/* Do an atomic load of a pointer. */
|
||||
|
||||
void *
|
||||
backtrace_atomic_load_pointer (void *arg)
|
||||
{
|
||||
void **pp;
|
||||
void *p;
|
||||
|
||||
pp = (void **) arg;
|
||||
p = *pp;
|
||||
while (!__sync_bool_compare_and_swap (pp, p, p))
|
||||
p = *pp;
|
||||
return p;
|
||||
}
|
||||
|
||||
/* Do an atomic load of an int. */
|
||||
|
||||
int
|
||||
backtrace_atomic_load_int (int *p)
|
||||
{
|
||||
int i;
|
||||
|
||||
i = *p;
|
||||
while (!__sync_bool_compare_and_swap (p, i, i))
|
||||
i = *p;
|
||||
return i;
|
||||
}
|
||||
|
||||
/* Do an atomic store of a pointer. */
|
||||
|
||||
void
|
||||
backtrace_atomic_store_pointer (void *arg, void *p)
|
||||
{
|
||||
void **pp;
|
||||
void *old;
|
||||
|
||||
pp = (void **) arg;
|
||||
old = *pp;
|
||||
while (!__sync_bool_compare_and_swap (pp, old, p))
|
||||
old = *pp;
|
||||
}
|
||||
|
||||
/* Do an atomic store of a size_t value. */
|
||||
|
||||
void
|
||||
backtrace_atomic_store_size_t (size_t *p, size_t v)
|
||||
{
|
||||
size_t old;
|
||||
|
||||
old = *p;
|
||||
while (!__sync_bool_compare_and_swap (p, old, v))
|
||||
old = *p;
|
||||
}
|
||||
|
||||
/* Do an atomic store of a int value. */
|
||||
|
||||
void
|
||||
backtrace_atomic_store_int (int *p, int v)
|
||||
{
|
||||
size_t old;
|
||||
|
||||
old = *p;
|
||||
while (!__sync_bool_compare_and_swap (p, old, v))
|
||||
old = *p;
|
||||
}
|
||||
|
||||
#endif
|
66
third_party/rust/backtrace-sys/src/libbacktrace/backtrace-supported.h.in
vendored
Normal file
66
third_party/rust/backtrace-sys/src/libbacktrace/backtrace-supported.h.in
vendored
Normal file
@ -0,0 +1,66 @@
|
||||
/* backtrace-supported.h.in -- Whether stack backtrace is supported.
|
||||
Copyright (C) 2012-2016 Free Software Foundation, Inc.
|
||||
Written by Ian Lance Taylor, Google.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
/* The file backtrace-supported.h.in is used by configure to generate
|
||||
the file backtrace-supported.h. The file backtrace-supported.h may
|
||||
be #include'd to see whether the backtrace library will be able to
|
||||
get a backtrace and produce symbolic information. */
|
||||
|
||||
|
||||
/* BACKTRACE_SUPPORTED will be #define'd as 1 if the backtrace library
|
||||
should work, 0 if it will not. Libraries may #include this to make
|
||||
other arrangements. */
|
||||
|
||||
#define BACKTRACE_SUPPORTED @BACKTRACE_SUPPORTED@
|
||||
|
||||
/* BACKTRACE_USES_MALLOC will be #define'd as 1 if the backtrace
|
||||
library will call malloc as it works, 0 if it will call mmap
|
||||
instead. This may be used to determine whether it is safe to call
|
||||
the backtrace functions from a signal handler. In general this
|
||||
only applies to calls like backtrace and backtrace_pcinfo. It does
|
||||
not apply to backtrace_simple, which never calls malloc. It does
|
||||
not apply to backtrace_print, which always calls fprintf and
|
||||
therefore malloc. */
|
||||
|
||||
#define BACKTRACE_USES_MALLOC @BACKTRACE_USES_MALLOC@
|
||||
|
||||
/* BACKTRACE_SUPPORTS_THREADS will be #define'd as 1 if the backtrace
|
||||
library is configured with threading support, 0 if not. If this is
|
||||
0, the threaded parameter to backtrace_create_state must be passed
|
||||
as 0. */
|
||||
|
||||
#define BACKTRACE_SUPPORTS_THREADS @BACKTRACE_SUPPORTS_THREADS@
|
||||
|
||||
/* BACKTRACE_SUPPORTS_DATA will be #defined'd as 1 if the backtrace_syminfo
|
||||
will work for variables. It will always work for functions. */
|
||||
|
||||
#define BACKTRACE_SUPPORTS_DATA @BACKTRACE_SUPPORTS_DATA@
|
129
third_party/rust/backtrace-sys/src/libbacktrace/backtrace.c
vendored
Normal file
129
third_party/rust/backtrace-sys/src/libbacktrace/backtrace.c
vendored
Normal file
@ -0,0 +1,129 @@
|
||||
/* backtrace.c -- Entry point for stack backtrace library.
|
||||
Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
||||
Written by Ian Lance Taylor, Google.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "unwind.h"
|
||||
#include "backtrace.h"
|
||||
#include "internal.h"
|
||||
|
||||
/* The main backtrace_full routine. */
|
||||
|
||||
/* Data passed through _Unwind_Backtrace. */
|
||||
|
||||
struct backtrace_data
|
||||
{
|
||||
/* Number of frames to skip. */
|
||||
int skip;
|
||||
/* Library state. */
|
||||
struct backtrace_state *state;
|
||||
/* Callback routine. */
|
||||
backtrace_full_callback callback;
|
||||
/* Error callback routine. */
|
||||
backtrace_error_callback error_callback;
|
||||
/* Data to pass to callback routines. */
|
||||
void *data;
|
||||
/* Value to return from backtrace_full. */
|
||||
int ret;
|
||||
/* Whether there is any memory available. */
|
||||
int can_alloc;
|
||||
};
|
||||
|
||||
/* Unwind library callback routine. This is passed to
|
||||
_Unwind_Backtrace. */
|
||||
|
||||
static _Unwind_Reason_Code
|
||||
unwind (struct _Unwind_Context *context, void *vdata)
|
||||
{
|
||||
struct backtrace_data *bdata = (struct backtrace_data *) vdata;
|
||||
uintptr_t pc;
|
||||
int ip_before_insn = 0;
|
||||
|
||||
#ifdef HAVE_GETIPINFO
|
||||
pc = _Unwind_GetIPInfo (context, &ip_before_insn);
|
||||
#else
|
||||
pc = _Unwind_GetIP (context);
|
||||
#endif
|
||||
|
||||
if (bdata->skip > 0)
|
||||
{
|
||||
--bdata->skip;
|
||||
return _URC_NO_REASON;
|
||||
}
|
||||
|
||||
if (!ip_before_insn)
|
||||
--pc;
|
||||
|
||||
if (!bdata->can_alloc)
|
||||
bdata->ret = bdata->callback (bdata->data, pc, NULL, 0, NULL);
|
||||
else
|
||||
bdata->ret = backtrace_pcinfo (bdata->state, pc, bdata->callback,
|
||||
bdata->error_callback, bdata->data);
|
||||
if (bdata->ret != 0)
|
||||
return _URC_END_OF_STACK;
|
||||
|
||||
return _URC_NO_REASON;
|
||||
}
|
||||
|
||||
/* Get a stack backtrace. */
|
||||
|
||||
int
|
||||
backtrace_full (struct backtrace_state *state, int skip,
|
||||
backtrace_full_callback callback,
|
||||
backtrace_error_callback error_callback, void *data)
|
||||
{
|
||||
struct backtrace_data bdata;
|
||||
void *p;
|
||||
|
||||
bdata.skip = skip + 1;
|
||||
bdata.state = state;
|
||||
bdata.callback = callback;
|
||||
bdata.error_callback = error_callback;
|
||||
bdata.data = data;
|
||||
bdata.ret = 0;
|
||||
|
||||
/* If we can't allocate any memory at all, don't try to produce
|
||||
file/line information. */
|
||||
p = backtrace_alloc (state, 4096, NULL, NULL);
|
||||
if (p == NULL)
|
||||
bdata.can_alloc = 0;
|
||||
else
|
||||
{
|
||||
backtrace_free (state, p, 4096, NULL, NULL);
|
||||
bdata.can_alloc = 1;
|
||||
}
|
||||
|
||||
_Unwind_Backtrace (unwind, &bdata);
|
||||
return bdata.ret;
|
||||
}
|
182
third_party/rust/backtrace-sys/src/libbacktrace/backtrace.h
vendored
Normal file
182
third_party/rust/backtrace-sys/src/libbacktrace/backtrace.h
vendored
Normal file
@ -0,0 +1,182 @@
|
||||
/* backtrace.h -- Public header file for stack backtrace library.
|
||||
Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
||||
Written by Ian Lance Taylor, Google.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#ifndef BACKTRACE_H
|
||||
#define BACKTRACE_H
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* The backtrace state. This struct is intentionally not defined in
|
||||
the public interface. */
|
||||
|
||||
struct backtrace_state;
|
||||
|
||||
/* The type of the error callback argument to backtrace functions.
|
||||
This function, if not NULL, will be called for certain error cases.
|
||||
The DATA argument is passed to the function that calls this one.
|
||||
The MSG argument is an error message. The ERRNUM argument, if
|
||||
greater than 0, holds an errno value. The MSG buffer may become
|
||||
invalid after this function returns.
|
||||
|
||||
As a special case, the ERRNUM argument will be passed as -1 if no
|
||||
debug info can be found for the executable, but the function
|
||||
requires debug info (e.g., backtrace_full, backtrace_pcinfo). The
|
||||
MSG in this case will be something along the lines of "no debug
|
||||
info". Similarly, ERRNUM will be passed as -1 if there is no
|
||||
symbol table, but the function requires a symbol table (e.g.,
|
||||
backtrace_syminfo). This may be used as a signal that some other
|
||||
approach should be tried. */
|
||||
|
||||
typedef void (*backtrace_error_callback) (void *data, const char *msg,
|
||||
int errnum);
|
||||
|
||||
/* Create state information for the backtrace routines. This must be
|
||||
called before any of the other routines, and its return value must
|
||||
be passed to all of the other routines. FILENAME is the path name
|
||||
of the executable file; if it is NULL the library will try
|
||||
system-specific path names. If not NULL, FILENAME must point to a
|
||||
permanent buffer. If THREADED is non-zero the state may be
|
||||
accessed by multiple threads simultaneously, and the library will
|
||||
use appropriate atomic operations. If THREADED is zero the state
|
||||
may only be accessed by one thread at a time. This returns a state
|
||||
pointer on success, NULL on error. If an error occurs, this will
|
||||
call the ERROR_CALLBACK routine. */
|
||||
|
||||
extern struct backtrace_state *backtrace_create_state (
|
||||
const char *filename, int threaded,
|
||||
backtrace_error_callback error_callback, void *data);
|
||||
|
||||
/* The type of the callback argument to the backtrace_full function.
|
||||
DATA is the argument passed to backtrace_full. PC is the program
|
||||
counter. FILENAME is the name of the file containing PC, or NULL
|
||||
if not available. LINENO is the line number in FILENAME containing
|
||||
PC, or 0 if not available. FUNCTION is the name of the function
|
||||
containing PC, or NULL if not available. This should return 0 to
|
||||
continuing tracing. The FILENAME and FUNCTION buffers may become
|
||||
invalid after this function returns. */
|
||||
|
||||
typedef int (*backtrace_full_callback) (void *data, uintptr_t pc,
|
||||
const char *filename, int lineno,
|
||||
const char *function);
|
||||
|
||||
/* Get a full stack backtrace. SKIP is the number of frames to skip;
|
||||
passing 0 will start the trace with the function calling
|
||||
backtrace_full. DATA is passed to the callback routine. If any
|
||||
call to CALLBACK returns a non-zero value, the stack backtrace
|
||||
stops, and backtrace returns that value; this may be used to limit
|
||||
the number of stack frames desired. If all calls to CALLBACK
|
||||
return 0, backtrace returns 0. The backtrace_full function will
|
||||
make at least one call to either CALLBACK or ERROR_CALLBACK. This
|
||||
function requires debug info for the executable. */
|
||||
|
||||
extern int backtrace_full (struct backtrace_state *state, int skip,
|
||||
backtrace_full_callback callback,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data);
|
||||
|
||||
/* The type of the callback argument to the backtrace_simple function.
|
||||
DATA is the argument passed to simple_backtrace. PC is the program
|
||||
counter. This should return 0 to continue tracing. */
|
||||
|
||||
typedef int (*backtrace_simple_callback) (void *data, uintptr_t pc);
|
||||
|
||||
/* Get a simple backtrace. SKIP is the number of frames to skip, as
|
||||
in backtrace. DATA is passed to the callback routine. If any call
|
||||
to CALLBACK returns a non-zero value, the stack backtrace stops,
|
||||
and backtrace_simple returns that value. Otherwise
|
||||
backtrace_simple returns 0. The backtrace_simple function will
|
||||
make at least one call to either CALLBACK or ERROR_CALLBACK. This
|
||||
function does not require any debug info for the executable. */
|
||||
|
||||
extern int backtrace_simple (struct backtrace_state *state, int skip,
|
||||
backtrace_simple_callback callback,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data);
|
||||
|
||||
/* Print the current backtrace in a user readable format to a FILE.
|
||||
SKIP is the number of frames to skip, as in backtrace_full. Any
|
||||
error messages are printed to stderr. This function requires debug
|
||||
info for the executable. */
|
||||
|
||||
extern void backtrace_print (struct backtrace_state *state, int skip, FILE *);
|
||||
|
||||
/* Given PC, a program counter in the current program, call the
|
||||
callback function with filename, line number, and function name
|
||||
information. This will normally call the callback function exactly
|
||||
once. However, if the PC happens to describe an inlined call, and
|
||||
the debugging information contains the necessary information, then
|
||||
this may call the callback function multiple times. This will make
|
||||
at least one call to either CALLBACK or ERROR_CALLBACK. This
|
||||
returns the first non-zero value returned by CALLBACK, or 0. */
|
||||
|
||||
extern int backtrace_pcinfo (struct backtrace_state *state, uintptr_t pc,
|
||||
backtrace_full_callback callback,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data);
|
||||
|
||||
/* The type of the callback argument to backtrace_syminfo. DATA and
|
||||
PC are the arguments passed to backtrace_syminfo. SYMNAME is the
|
||||
name of the symbol for the corresponding code. SYMVAL is the
|
||||
value and SYMSIZE is the size of the symbol. SYMNAME will be NULL
|
||||
if no error occurred but the symbol could not be found. */
|
||||
|
||||
typedef void (*backtrace_syminfo_callback) (void *data, uintptr_t pc,
|
||||
const char *symname,
|
||||
uintptr_t symval,
|
||||
uintptr_t symsize);
|
||||
|
||||
/* Given ADDR, an address or program counter in the current program,
|
||||
call the callback information with the symbol name and value
|
||||
describing the function or variable in which ADDR may be found.
|
||||
This will call either CALLBACK or ERROR_CALLBACK exactly once.
|
||||
This returns 1 on success, 0 on failure. This function requires
|
||||
the symbol table but does not require the debug info. Note that if
|
||||
the symbol table is present but ADDR could not be found in the
|
||||
table, CALLBACK will be called with a NULL SYMNAME argument.
|
||||
Returns 1 on success, 0 on error. */
|
||||
|
||||
extern int backtrace_syminfo (struct backtrace_state *state, uintptr_t addr,
|
||||
backtrace_syminfo_callback callback,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End extern "C". */
|
||||
#endif
|
||||
|
||||
#endif
|
500
third_party/rust/backtrace-sys/src/libbacktrace/btest.c
vendored
Normal file
500
third_party/rust/backtrace-sys/src/libbacktrace/btest.c
vendored
Normal file
@ -0,0 +1,500 @@
|
||||
/* btest.c -- Test for libbacktrace library
|
||||
Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
||||
Written by Ian Lance Taylor, Google.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
/* This program tests the externally visible interfaces of the
|
||||
libbacktrace library. */
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "filenames.h"
|
||||
|
||||
#include "backtrace.h"
|
||||
#include "backtrace-supported.h"
|
||||
|
||||
#include "testlib.h"
|
||||
|
||||
/* Test the backtrace function with non-inlined functions. */
|
||||
|
||||
static int test1 (void) __attribute__ ((noinline, unused));
|
||||
static int f2 (int) __attribute__ ((noinline));
|
||||
static int f3 (int, int) __attribute__ ((noinline));
|
||||
|
||||
static int
|
||||
test1 (void)
|
||||
{
|
||||
/* Returning a value here and elsewhere avoids a tailcall which
|
||||
would mess up the backtrace. */
|
||||
return f2 (__LINE__) + 1;
|
||||
}
|
||||
|
||||
static int
|
||||
f2 (int f1line)
|
||||
{
|
||||
return f3 (f1line, __LINE__) + 2;
|
||||
}
|
||||
|
||||
static int
|
||||
f3 (int f1line, int f2line)
|
||||
{
|
||||
struct info all[20];
|
||||
struct bdata data;
|
||||
int f3line;
|
||||
int i;
|
||||
|
||||
data.all = &all[0];
|
||||
data.index = 0;
|
||||
data.max = 20;
|
||||
data.failed = 0;
|
||||
|
||||
f3line = __LINE__ + 1;
|
||||
i = backtrace_full (state, 0, callback_one, error_callback_one, &data);
|
||||
|
||||
if (i != 0)
|
||||
{
|
||||
fprintf (stderr, "test1: unexpected return value %d\n", i);
|
||||
data.failed = 1;
|
||||
}
|
||||
|
||||
if (data.index < 3)
|
||||
{
|
||||
fprintf (stderr,
|
||||
"test1: not enough frames; got %zu, expected at least 3\n",
|
||||
data.index);
|
||||
data.failed = 1;
|
||||
}
|
||||
|
||||
check ("test1", 0, all, f3line, "f3", "btest.c", &data.failed);
|
||||
check ("test1", 1, all, f2line, "f2", "btest.c", &data.failed);
|
||||
check ("test1", 2, all, f1line, "test1", "btest.c", &data.failed);
|
||||
|
||||
printf ("%s: backtrace_full noinline\n", data.failed ? "FAIL" : "PASS");
|
||||
|
||||
if (data.failed)
|
||||
++failures;
|
||||
|
||||
return failures;
|
||||
}
|
||||
|
||||
/* Test the backtrace function with inlined functions. */
|
||||
|
||||
static inline int test2 (void) __attribute__ ((always_inline, unused));
|
||||
static inline int f12 (int) __attribute__ ((always_inline));
|
||||
static inline int f13 (int, int) __attribute__ ((always_inline));
|
||||
|
||||
static inline int
|
||||
test2 (void)
|
||||
{
|
||||
return f12 (__LINE__) + 1;
|
||||
}
|
||||
|
||||
static inline int
|
||||
f12 (int f1line)
|
||||
{
|
||||
return f13 (f1line, __LINE__) + 2;
|
||||
}
|
||||
|
||||
static inline int
|
||||
f13 (int f1line, int f2line)
|
||||
{
|
||||
struct info all[20];
|
||||
struct bdata data;
|
||||
int f3line;
|
||||
int i;
|
||||
|
||||
data.all = &all[0];
|
||||
data.index = 0;
|
||||
data.max = 20;
|
||||
data.failed = 0;
|
||||
|
||||
f3line = __LINE__ + 1;
|
||||
i = backtrace_full (state, 0, callback_one, error_callback_one, &data);
|
||||
|
||||
if (i != 0)
|
||||
{
|
||||
fprintf (stderr, "test2: unexpected return value %d\n", i);
|
||||
data.failed = 1;
|
||||
}
|
||||
|
||||
check ("test2", 0, all, f3line, "f13", "btest.c", &data.failed);
|
||||
check ("test2", 1, all, f2line, "f12", "btest.c", &data.failed);
|
||||
check ("test2", 2, all, f1line, "test2", "btest.c", &data.failed);
|
||||
|
||||
printf ("%s: backtrace_full inline\n", data.failed ? "FAIL" : "PASS");
|
||||
|
||||
if (data.failed)
|
||||
++failures;
|
||||
|
||||
return failures;
|
||||
}
|
||||
|
||||
/* Test the backtrace_simple function with non-inlined functions. */
|
||||
|
||||
static int test3 (void) __attribute__ ((noinline, unused));
|
||||
static int f22 (int) __attribute__ ((noinline));
|
||||
static int f23 (int, int) __attribute__ ((noinline));
|
||||
|
||||
static int
|
||||
test3 (void)
|
||||
{
|
||||
return f22 (__LINE__) + 1;
|
||||
}
|
||||
|
||||
static int
|
||||
f22 (int f1line)
|
||||
{
|
||||
return f23 (f1line, __LINE__) + 2;
|
||||
}
|
||||
|
||||
static int
|
||||
f23 (int f1line, int f2line)
|
||||
{
|
||||
uintptr_t addrs[20];
|
||||
struct sdata data;
|
||||
int f3line;
|
||||
int i;
|
||||
|
||||
data.addrs = &addrs[0];
|
||||
data.index = 0;
|
||||
data.max = 20;
|
||||
data.failed = 0;
|
||||
|
||||
f3line = __LINE__ + 1;
|
||||
i = backtrace_simple (state, 0, callback_two, error_callback_two, &data);
|
||||
|
||||
if (i != 0)
|
||||
{
|
||||
fprintf (stderr, "test3: unexpected return value %d\n", i);
|
||||
data.failed = 1;
|
||||
}
|
||||
|
||||
if (!data.failed)
|
||||
{
|
||||
struct info all[20];
|
||||
struct bdata bdata;
|
||||
int j;
|
||||
|
||||
bdata.all = &all[0];
|
||||
bdata.index = 0;
|
||||
bdata.max = 20;
|
||||
bdata.failed = 0;
|
||||
|
||||
for (j = 0; j < 3; ++j)
|
||||
{
|
||||
i = backtrace_pcinfo (state, addrs[j], callback_one,
|
||||
error_callback_one, &bdata);
|
||||
if (i != 0)
|
||||
{
|
||||
fprintf (stderr,
|
||||
("test3: unexpected return value "
|
||||
"from backtrace_pcinfo %d\n"),
|
||||
i);
|
||||
bdata.failed = 1;
|
||||
}
|
||||
if (!bdata.failed && bdata.index != (size_t) (j + 1))
|
||||
{
|
||||
fprintf (stderr,
|
||||
("wrong number of calls from backtrace_pcinfo "
|
||||
"got %u expected %d\n"),
|
||||
(unsigned int) bdata.index, j + 1);
|
||||
bdata.failed = 1;
|
||||
}
|
||||
}
|
||||
|
||||
check ("test3", 0, all, f3line, "f23", "btest.c", &bdata.failed);
|
||||
check ("test3", 1, all, f2line, "f22", "btest.c", &bdata.failed);
|
||||
check ("test3", 2, all, f1line, "test3", "btest.c", &bdata.failed);
|
||||
|
||||
if (bdata.failed)
|
||||
data.failed = 1;
|
||||
|
||||
for (j = 0; j < 3; ++j)
|
||||
{
|
||||
struct symdata symdata;
|
||||
|
||||
symdata.name = NULL;
|
||||
symdata.val = 0;
|
||||
symdata.size = 0;
|
||||
symdata.failed = 0;
|
||||
|
||||
i = backtrace_syminfo (state, addrs[j], callback_three,
|
||||
error_callback_three, &symdata);
|
||||
if (i == 0)
|
||||
{
|
||||
fprintf (stderr,
|
||||
("test3: [%d]: unexpected return value "
|
||||
"from backtrace_syminfo %d\n"),
|
||||
j, i);
|
||||
symdata.failed = 1;
|
||||
}
|
||||
|
||||
if (!symdata.failed)
|
||||
{
|
||||
const char *expected;
|
||||
|
||||
switch (j)
|
||||
{
|
||||
case 0:
|
||||
expected = "f23";
|
||||
break;
|
||||
case 1:
|
||||
expected = "f22";
|
||||
break;
|
||||
case 2:
|
||||
expected = "test3";
|
||||
break;
|
||||
default:
|
||||
assert (0);
|
||||
}
|
||||
|
||||
if (symdata.name == NULL)
|
||||
{
|
||||
fprintf (stderr, "test3: [%d]: NULL syminfo name\n", j);
|
||||
symdata.failed = 1;
|
||||
}
|
||||
/* Use strncmp, not strcmp, because GCC might create a
|
||||
clone. */
|
||||
else if (strncmp (symdata.name, expected, strlen (expected))
|
||||
!= 0)
|
||||
{
|
||||
fprintf (stderr,
|
||||
("test3: [%d]: unexpected syminfo name "
|
||||
"got %s expected %s\n"),
|
||||
j, symdata.name, expected);
|
||||
symdata.failed = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (symdata.failed)
|
||||
data.failed = 1;
|
||||
}
|
||||
}
|
||||
|
||||
printf ("%s: backtrace_simple noinline\n", data.failed ? "FAIL" : "PASS");
|
||||
|
||||
if (data.failed)
|
||||
++failures;
|
||||
|
||||
return failures;
|
||||
}
|
||||
|
||||
/* Test the backtrace_simple function with inlined functions. */
|
||||
|
||||
static inline int test4 (void) __attribute__ ((always_inline, unused));
|
||||
static inline int f32 (int) __attribute__ ((always_inline));
|
||||
static inline int f33 (int, int) __attribute__ ((always_inline));
|
||||
|
||||
static inline int
|
||||
test4 (void)
|
||||
{
|
||||
return f32 (__LINE__) + 1;
|
||||
}
|
||||
|
||||
static inline int
|
||||
f32 (int f1line)
|
||||
{
|
||||
return f33 (f1line, __LINE__) + 2;
|
||||
}
|
||||
|
||||
static inline int
|
||||
f33 (int f1line, int f2line)
|
||||
{
|
||||
uintptr_t addrs[20];
|
||||
struct sdata data;
|
||||
int f3line;
|
||||
int i;
|
||||
|
||||
data.addrs = &addrs[0];
|
||||
data.index = 0;
|
||||
data.max = 20;
|
||||
data.failed = 0;
|
||||
|
||||
f3line = __LINE__ + 1;
|
||||
i = backtrace_simple (state, 0, callback_two, error_callback_two, &data);
|
||||
|
||||
if (i != 0)
|
||||
{
|
||||
fprintf (stderr, "test3: unexpected return value %d\n", i);
|
||||
data.failed = 1;
|
||||
}
|
||||
|
||||
if (!data.failed)
|
||||
{
|
||||
struct info all[20];
|
||||
struct bdata bdata;
|
||||
|
||||
bdata.all = &all[0];
|
||||
bdata.index = 0;
|
||||
bdata.max = 20;
|
||||
bdata.failed = 0;
|
||||
|
||||
i = backtrace_pcinfo (state, addrs[0], callback_one, error_callback_one,
|
||||
&bdata);
|
||||
if (i != 0)
|
||||
{
|
||||
fprintf (stderr,
|
||||
("test4: unexpected return value "
|
||||
"from backtrace_pcinfo %d\n"),
|
||||
i);
|
||||
bdata.failed = 1;
|
||||
}
|
||||
|
||||
check ("test4", 0, all, f3line, "f33", "btest.c", &bdata.failed);
|
||||
check ("test4", 1, all, f2line, "f32", "btest.c", &bdata.failed);
|
||||
check ("test4", 2, all, f1line, "test4", "btest.c", &bdata.failed);
|
||||
|
||||
if (bdata.failed)
|
||||
data.failed = 1;
|
||||
}
|
||||
|
||||
printf ("%s: backtrace_simple inline\n", data.failed ? "FAIL" : "PASS");
|
||||
|
||||
if (data.failed)
|
||||
++failures;
|
||||
|
||||
return failures;
|
||||
}
|
||||
|
||||
static int test5 (void) __attribute__ ((unused));
|
||||
|
||||
int global = 1;
|
||||
|
||||
static int
|
||||
test5 (void)
|
||||
{
|
||||
struct symdata symdata;
|
||||
int i;
|
||||
uintptr_t addr = (uintptr_t) &global;
|
||||
|
||||
if (sizeof (global) > 1)
|
||||
addr += 1;
|
||||
|
||||
symdata.name = NULL;
|
||||
symdata.val = 0;
|
||||
symdata.size = 0;
|
||||
symdata.failed = 0;
|
||||
|
||||
i = backtrace_syminfo (state, addr, callback_three,
|
||||
error_callback_three, &symdata);
|
||||
if (i == 0)
|
||||
{
|
||||
fprintf (stderr,
|
||||
"test5: unexpected return value from backtrace_syminfo %d\n",
|
||||
i);
|
||||
symdata.failed = 1;
|
||||
}
|
||||
|
||||
if (!symdata.failed)
|
||||
{
|
||||
if (symdata.name == NULL)
|
||||
{
|
||||
fprintf (stderr, "test5: NULL syminfo name\n");
|
||||
symdata.failed = 1;
|
||||
}
|
||||
else if (strcmp (symdata.name, "global") != 0)
|
||||
{
|
||||
fprintf (stderr,
|
||||
"test5: unexpected syminfo name got %s expected %s\n",
|
||||
symdata.name, "global");
|
||||
symdata.failed = 1;
|
||||
}
|
||||
else if (symdata.val != (uintptr_t) &global)
|
||||
{
|
||||
fprintf (stderr,
|
||||
"test5: unexpected syminfo value got %lx expected %lx\n",
|
||||
(unsigned long) symdata.val,
|
||||
(unsigned long) (uintptr_t) &global);
|
||||
symdata.failed = 1;
|
||||
}
|
||||
else if (symdata.size != sizeof (global))
|
||||
{
|
||||
fprintf (stderr,
|
||||
"test5: unexpected syminfo size got %lx expected %lx\n",
|
||||
(unsigned long) symdata.size,
|
||||
(unsigned long) sizeof (global));
|
||||
symdata.failed = 1;
|
||||
}
|
||||
}
|
||||
|
||||
printf ("%s: backtrace_syminfo variable\n",
|
||||
symdata.failed ? "FAIL" : "PASS");
|
||||
|
||||
if (symdata.failed)
|
||||
++failures;
|
||||
|
||||
return failures;
|
||||
}
|
||||
|
||||
/* Check that are no files left open. */
|
||||
|
||||
static void
|
||||
check_open_files (void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 3; i < 10; i++)
|
||||
{
|
||||
if (close (i) == 0)
|
||||
{
|
||||
fprintf (stderr,
|
||||
"ERROR: descriptor %d still open after tests complete\n",
|
||||
i);
|
||||
++failures;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Run all the tests. */
|
||||
|
||||
int
|
||||
main (int argc ATTRIBUTE_UNUSED, char **argv)
|
||||
{
|
||||
state = backtrace_create_state (argv[0], BACKTRACE_SUPPORTS_THREADS,
|
||||
error_callback_create, NULL);
|
||||
|
||||
#if BACKTRACE_SUPPORTED
|
||||
test1 ();
|
||||
test2 ();
|
||||
test3 ();
|
||||
test4 ();
|
||||
#if BACKTRACE_SUPPORTS_DATA
|
||||
test5 ();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
check_open_files ();
|
||||
|
||||
exit (failures ? EXIT_FAILURE : EXIT_SUCCESS);
|
||||
}
|
1530
third_party/rust/backtrace-sys/src/libbacktrace/config.guess
vendored
Executable file
1530
third_party/rust/backtrace-sys/src/libbacktrace/config.guess
vendored
Executable file
File diff suppressed because it is too large
Load Diff
149
third_party/rust/backtrace-sys/src/libbacktrace/config.h.in
vendored
Normal file
149
third_party/rust/backtrace-sys/src/libbacktrace/config.h.in
vendored
Normal file
@ -0,0 +1,149 @@
|
||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||
|
||||
/* ELF size: 32 or 64 */
|
||||
#undef BACKTRACE_ELF_SIZE
|
||||
|
||||
/* XCOFF size: 32 or 64 */
|
||||
#undef BACKTRACE_XCOFF_SIZE
|
||||
|
||||
/* Define to 1 if you have the __atomic functions */
|
||||
#undef HAVE_ATOMIC_FUNCTIONS
|
||||
|
||||
/* Define to 1 if you have the `clock_gettime' function. */
|
||||
#undef HAVE_CLOCK_GETTIME
|
||||
|
||||
/* Define to 1 if you have the declaration of `strnlen', and to 0 if you
|
||||
don't. */
|
||||
#undef HAVE_DECL_STRNLEN
|
||||
|
||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
||||
#undef HAVE_DLFCN_H
|
||||
|
||||
/* Define if dl_iterate_phdr is available. */
|
||||
#undef HAVE_DL_ITERATE_PHDR
|
||||
|
||||
/* Define to 1 if you have the fcntl function */
|
||||
#undef HAVE_FCNTL
|
||||
|
||||
/* Define if getexecname is available. */
|
||||
#undef HAVE_GETEXECNAME
|
||||
|
||||
/* Define if _Unwind_GetIPInfo is available. */
|
||||
#undef HAVE_GETIPINFO
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#undef HAVE_INTTYPES_H
|
||||
|
||||
/* Define to 1 if you have the `z' library (-lz). */
|
||||
#undef HAVE_LIBZ
|
||||
|
||||
/* Define to 1 if you have the <link.h> header file. */
|
||||
#undef HAVE_LINK_H
|
||||
|
||||
/* Define if AIX loadquery is available. */
|
||||
#undef HAVE_LOADQUERY
|
||||
|
||||
/* Define to 1 if you have the `lstat' function. */
|
||||
#undef HAVE_LSTAT
|
||||
|
||||
/* Define to 1 if you have the <memory.h> header file. */
|
||||
#undef HAVE_MEMORY_H
|
||||
|
||||
/* Define to 1 if you have the `readlink' function. */
|
||||
#undef HAVE_READLINK
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#undef HAVE_STDINT_H
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#undef HAVE_STDLIB_H
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#undef HAVE_STRINGS_H
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#undef HAVE_STRING_H
|
||||
|
||||
/* Define to 1 if you have the __sync functions */
|
||||
#undef HAVE_SYNC_FUNCTIONS
|
||||
|
||||
/* Define to 1 if you have the <sys/ldr.h> header file. */
|
||||
#undef HAVE_SYS_LDR_H
|
||||
|
||||
/* Define to 1 if you have the <sys/mman.h> header file. */
|
||||
#undef HAVE_SYS_MMAN_H
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#undef HAVE_SYS_STAT_H
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#undef HAVE_SYS_TYPES_H
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#undef HAVE_UNISTD_H
|
||||
|
||||
/* Define if -lz is available. */
|
||||
#undef HAVE_ZLIB
|
||||
|
||||
/* Define to the sub-directory in which libtool stores uninstalled libraries.
|
||||
*/
|
||||
#undef LT_OBJDIR
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#undef PACKAGE_BUGREPORT
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#undef PACKAGE_NAME
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#undef PACKAGE_STRING
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#undef PACKAGE_TARNAME
|
||||
|
||||
/* Define to the home page for this package. */
|
||||
#undef PACKAGE_URL
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#undef PACKAGE_VERSION
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#undef STDC_HEADERS
|
||||
|
||||
/* Enable extensions on AIX 3, Interix. */
|
||||
#ifndef _ALL_SOURCE
|
||||
# undef _ALL_SOURCE
|
||||
#endif
|
||||
/* Enable GNU extensions on systems that have them. */
|
||||
#ifndef _GNU_SOURCE
|
||||
# undef _GNU_SOURCE
|
||||
#endif
|
||||
/* Enable threading extensions on Solaris. */
|
||||
#ifndef _POSIX_PTHREAD_SEMANTICS
|
||||
# undef _POSIX_PTHREAD_SEMANTICS
|
||||
#endif
|
||||
/* Enable extensions on HP NonStop. */
|
||||
#ifndef _TANDEM_SOURCE
|
||||
# undef _TANDEM_SOURCE
|
||||
#endif
|
||||
/* Enable general extensions on Solaris. */
|
||||
#ifndef __EXTENSIONS__
|
||||
# undef __EXTENSIONS__
|
||||
#endif
|
||||
|
||||
|
||||
/* Number of bits in a file offset, on hosts where this is settable. */
|
||||
#undef _FILE_OFFSET_BITS
|
||||
|
||||
/* Define for large files, on AIX-style hosts. */
|
||||
#undef _LARGE_FILES
|
||||
|
||||
/* Define to 1 if on MINIX. */
|
||||
#undef _MINIX
|
||||
|
||||
/* Define to 2 if the system does not provide POSIX.1 features except with
|
||||
this defined. */
|
||||
#undef _POSIX_1_SOURCE
|
||||
|
||||
/* Define to 1 if you need to in order for `stat' and other things to work. */
|
||||
#undef _POSIX_SOURCE
|
1794
third_party/rust/backtrace-sys/src/libbacktrace/config.sub
vendored
Executable file
1794
third_party/rust/backtrace-sys/src/libbacktrace/config.sub
vendored
Executable file
File diff suppressed because it is too large
Load Diff
7309
third_party/rust/backtrace-sys/src/libbacktrace/config/libtool.m4
vendored
Normal file
7309
third_party/rust/backtrace-sys/src/libbacktrace/config/libtool.m4
vendored
Normal file
File diff suppressed because it is too large
Load Diff
368
third_party/rust/backtrace-sys/src/libbacktrace/config/ltoptions.m4
vendored
Normal file
368
third_party/rust/backtrace-sys/src/libbacktrace/config/ltoptions.m4
vendored
Normal file
@ -0,0 +1,368 @@
|
||||
# Helper functions for option handling. -*- Autoconf -*-
|
||||
#
|
||||
# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
|
||||
# Written by Gary V. Vaughan, 2004
|
||||
#
|
||||
# This file is free software; the Free Software Foundation gives
|
||||
# unlimited permission to copy and/or distribute it, with or without
|
||||
# modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 6 ltoptions.m4
|
||||
|
||||
# This is to help aclocal find these macros, as it can't see m4_define.
|
||||
AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
|
||||
|
||||
|
||||
# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
|
||||
# ------------------------------------------
|
||||
m4_define([_LT_MANGLE_OPTION],
|
||||
[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
|
||||
|
||||
|
||||
# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
|
||||
# ---------------------------------------
|
||||
# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
|
||||
# matching handler defined, dispatch to it. Other OPTION-NAMEs are
|
||||
# saved as a flag.
|
||||
m4_define([_LT_SET_OPTION],
|
||||
[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
|
||||
m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
|
||||
_LT_MANGLE_DEFUN([$1], [$2]),
|
||||
[m4_warning([Unknown $1 option `$2'])])[]dnl
|
||||
])
|
||||
|
||||
|
||||
# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
|
||||
# ------------------------------------------------------------
|
||||
# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
|
||||
m4_define([_LT_IF_OPTION],
|
||||
[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
|
||||
|
||||
|
||||
# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
|
||||
# -------------------------------------------------------
|
||||
# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
|
||||
# are set.
|
||||
m4_define([_LT_UNLESS_OPTIONS],
|
||||
[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
|
||||
[m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
|
||||
[m4_define([$0_found])])])[]dnl
|
||||
m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
|
||||
])[]dnl
|
||||
])
|
||||
|
||||
|
||||
# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
|
||||
# ----------------------------------------
|
||||
# OPTION-LIST is a space-separated list of Libtool options associated
|
||||
# with MACRO-NAME. If any OPTION has a matching handler declared with
|
||||
# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
|
||||
# the unknown option and exit.
|
||||
m4_defun([_LT_SET_OPTIONS],
|
||||
[# Set options
|
||||
m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
|
||||
[_LT_SET_OPTION([$1], _LT_Option)])
|
||||
|
||||
m4_if([$1],[LT_INIT],[
|
||||
dnl
|
||||
dnl Simply set some default values (i.e off) if boolean options were not
|
||||
dnl specified:
|
||||
_LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
|
||||
])
|
||||
_LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
|
||||
])
|
||||
dnl
|
||||
dnl If no reference was made to various pairs of opposing options, then
|
||||
dnl we run the default mode handler for the pair. For example, if neither
|
||||
dnl `shared' nor `disable-shared' was passed, we enable building of shared
|
||||
dnl archives by default:
|
||||
_LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
|
||||
_LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
|
||||
_LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
|
||||
_LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
|
||||
[_LT_ENABLE_FAST_INSTALL])
|
||||
])
|
||||
])# _LT_SET_OPTIONS
|
||||
|
||||
|
||||
## --------------------------------- ##
|
||||
## Macros to handle LT_INIT options. ##
|
||||
## --------------------------------- ##
|
||||
|
||||
# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
|
||||
# -----------------------------------------
|
||||
m4_define([_LT_MANGLE_DEFUN],
|
||||
[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
|
||||
|
||||
|
||||
# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
|
||||
# -----------------------------------------------
|
||||
m4_define([LT_OPTION_DEFINE],
|
||||
[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
|
||||
])# LT_OPTION_DEFINE
|
||||
|
||||
|
||||
# dlopen
|
||||
# ------
|
||||
LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
|
||||
])
|
||||
|
||||
AU_DEFUN([AC_LIBTOOL_DLOPEN],
|
||||
[_LT_SET_OPTION([LT_INIT], [dlopen])
|
||||
AC_DIAGNOSE([obsolete],
|
||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
||||
put the `dlopen' option into LT_INIT's first parameter.])
|
||||
])
|
||||
|
||||
dnl aclocal-1.4 backwards compatibility:
|
||||
dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
|
||||
|
||||
|
||||
# win32-dll
|
||||
# ---------
|
||||
# Declare package support for building win32 dll's.
|
||||
LT_OPTION_DEFINE([LT_INIT], [win32-dll],
|
||||
[enable_win32_dll=yes
|
||||
|
||||
case $host in
|
||||
*-*-cygwin* | *-*-mingw* | *-*-pw32*)
|
||||
AC_CHECK_TOOL(AS, as, false)
|
||||
AC_CHECK_TOOL(DLLTOOL, dlltool, false)
|
||||
AC_CHECK_TOOL(OBJDUMP, objdump, false)
|
||||
;;
|
||||
esac
|
||||
|
||||
test -z "$AS" && AS=as
|
||||
_LT_DECL([], [AS], [0], [Assembler program])dnl
|
||||
|
||||
test -z "$DLLTOOL" && DLLTOOL=dlltool
|
||||
_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl
|
||||
|
||||
test -z "$OBJDUMP" && OBJDUMP=objdump
|
||||
_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl
|
||||
])# win32-dll
|
||||
|
||||
AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
|
||||
[AC_REQUIRE([AC_CANONICAL_HOST])dnl
|
||||
_LT_SET_OPTION([LT_INIT], [win32-dll])
|
||||
AC_DIAGNOSE([obsolete],
|
||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
||||
put the `win32-dll' option into LT_INIT's first parameter.])
|
||||
])
|
||||
|
||||
dnl aclocal-1.4 backwards compatibility:
|
||||
dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
|
||||
|
||||
|
||||
# _LT_ENABLE_SHARED([DEFAULT])
|
||||
# ----------------------------
|
||||
# implement the --enable-shared flag, and supports the `shared' and
|
||||
# `disable-shared' LT_INIT options.
|
||||
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
|
||||
m4_define([_LT_ENABLE_SHARED],
|
||||
[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
||||
AC_ARG_ENABLE([shared],
|
||||
[AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
|
||||
[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
|
||||
[p=${PACKAGE-default}
|
||||
case $enableval in
|
||||
yes) enable_shared=yes ;;
|
||||
no) enable_shared=no ;;
|
||||
*)
|
||||
enable_shared=no
|
||||
# Look at the argument we got. We use all the common list separators.
|
||||
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
||||
for pkg in $enableval; do
|
||||
IFS="$lt_save_ifs"
|
||||
if test "X$pkg" = "X$p"; then
|
||||
enable_shared=yes
|
||||
fi
|
||||
done
|
||||
IFS="$lt_save_ifs"
|
||||
;;
|
||||
esac],
|
||||
[enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
|
||||
|
||||
_LT_DECL([build_libtool_libs], [enable_shared], [0],
|
||||
[Whether or not to build shared libraries])
|
||||
])# _LT_ENABLE_SHARED
|
||||
|
||||
LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
|
||||
LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
|
||||
|
||||
# Old names:
|
||||
AC_DEFUN([AC_ENABLE_SHARED],
|
||||
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
|
||||
])
|
||||
|
||||
AC_DEFUN([AC_DISABLE_SHARED],
|
||||
[_LT_SET_OPTION([LT_INIT], [disable-shared])
|
||||
])
|
||||
|
||||
AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
|
||||
AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
|
||||
|
||||
dnl aclocal-1.4 backwards compatibility:
|
||||
dnl AC_DEFUN([AM_ENABLE_SHARED], [])
|
||||
dnl AC_DEFUN([AM_DISABLE_SHARED], [])
|
||||
|
||||
|
||||
|
||||
# _LT_ENABLE_STATIC([DEFAULT])
|
||||
# ----------------------------
|
||||
# implement the --enable-static flag, and support the `static' and
|
||||
# `disable-static' LT_INIT options.
|
||||
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
|
||||
m4_define([_LT_ENABLE_STATIC],
|
||||
[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
||||
AC_ARG_ENABLE([static],
|
||||
[AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
|
||||
[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
|
||||
[p=${PACKAGE-default}
|
||||
case $enableval in
|
||||
yes) enable_static=yes ;;
|
||||
no) enable_static=no ;;
|
||||
*)
|
||||
enable_static=no
|
||||
# Look at the argument we got. We use all the common list separators.
|
||||
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
||||
for pkg in $enableval; do
|
||||
IFS="$lt_save_ifs"
|
||||
if test "X$pkg" = "X$p"; then
|
||||
enable_static=yes
|
||||
fi
|
||||
done
|
||||
IFS="$lt_save_ifs"
|
||||
;;
|
||||
esac],
|
||||
[enable_static=]_LT_ENABLE_STATIC_DEFAULT)
|
||||
|
||||
_LT_DECL([build_old_libs], [enable_static], [0],
|
||||
[Whether or not to build static libraries])
|
||||
])# _LT_ENABLE_STATIC
|
||||
|
||||
LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
|
||||
LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
|
||||
|
||||
# Old names:
|
||||
AC_DEFUN([AC_ENABLE_STATIC],
|
||||
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
|
||||
])
|
||||
|
||||
AC_DEFUN([AC_DISABLE_STATIC],
|
||||
[_LT_SET_OPTION([LT_INIT], [disable-static])
|
||||
])
|
||||
|
||||
AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
|
||||
AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
|
||||
|
||||
dnl aclocal-1.4 backwards compatibility:
|
||||
dnl AC_DEFUN([AM_ENABLE_STATIC], [])
|
||||
dnl AC_DEFUN([AM_DISABLE_STATIC], [])
|
||||
|
||||
|
||||
|
||||
# _LT_ENABLE_FAST_INSTALL([DEFAULT])
|
||||
# ----------------------------------
|
||||
# implement the --enable-fast-install flag, and support the `fast-install'
|
||||
# and `disable-fast-install' LT_INIT options.
|
||||
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
|
||||
m4_define([_LT_ENABLE_FAST_INSTALL],
|
||||
[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
||||
AC_ARG_ENABLE([fast-install],
|
||||
[AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
|
||||
[optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
|
||||
[p=${PACKAGE-default}
|
||||
case $enableval in
|
||||
yes) enable_fast_install=yes ;;
|
||||
no) enable_fast_install=no ;;
|
||||
*)
|
||||
enable_fast_install=no
|
||||
# Look at the argument we got. We use all the common list separators.
|
||||
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
||||
for pkg in $enableval; do
|
||||
IFS="$lt_save_ifs"
|
||||
if test "X$pkg" = "X$p"; then
|
||||
enable_fast_install=yes
|
||||
fi
|
||||
done
|
||||
IFS="$lt_save_ifs"
|
||||
;;
|
||||
esac],
|
||||
[enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
|
||||
|
||||
_LT_DECL([fast_install], [enable_fast_install], [0],
|
||||
[Whether or not to optimize for fast installation])dnl
|
||||
])# _LT_ENABLE_FAST_INSTALL
|
||||
|
||||
LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
|
||||
LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
|
||||
|
||||
# Old names:
|
||||
AU_DEFUN([AC_ENABLE_FAST_INSTALL],
|
||||
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
|
||||
AC_DIAGNOSE([obsolete],
|
||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you put
|
||||
the `fast-install' option into LT_INIT's first parameter.])
|
||||
])
|
||||
|
||||
AU_DEFUN([AC_DISABLE_FAST_INSTALL],
|
||||
[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
|
||||
AC_DIAGNOSE([obsolete],
|
||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you put
|
||||
the `disable-fast-install' option into LT_INIT's first parameter.])
|
||||
])
|
||||
|
||||
dnl aclocal-1.4 backwards compatibility:
|
||||
dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
|
||||
dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
|
||||
|
||||
|
||||
# _LT_WITH_PIC([MODE])
|
||||
# --------------------
|
||||
# implement the --with-pic flag, and support the `pic-only' and `no-pic'
|
||||
# LT_INIT options.
|
||||
# MODE is either `yes' or `no'. If omitted, it defaults to `both'.
|
||||
m4_define([_LT_WITH_PIC],
|
||||
[AC_ARG_WITH([pic],
|
||||
[AS_HELP_STRING([--with-pic],
|
||||
[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
|
||||
[pic_mode="$withval"],
|
||||
[pic_mode=default])
|
||||
|
||||
test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
|
||||
|
||||
_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
|
||||
])# _LT_WITH_PIC
|
||||
|
||||
LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
|
||||
LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
|
||||
|
||||
# Old name:
|
||||
AU_DEFUN([AC_LIBTOOL_PICMODE],
|
||||
[_LT_SET_OPTION([LT_INIT], [pic-only])
|
||||
AC_DIAGNOSE([obsolete],
|
||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
||||
put the `pic-only' option into LT_INIT's first parameter.])
|
||||
])
|
||||
|
||||
dnl aclocal-1.4 backwards compatibility:
|
||||
dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
|
||||
|
||||
## ----------------- ##
|
||||
## LTDL_INIT Options ##
|
||||
## ----------------- ##
|
||||
|
||||
m4_define([_LTDL_MODE], [])
|
||||
LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
|
||||
[m4_define([_LTDL_MODE], [nonrecursive])])
|
||||
LT_OPTION_DEFINE([LTDL_INIT], [recursive],
|
||||
[m4_define([_LTDL_MODE], [recursive])])
|
||||
LT_OPTION_DEFINE([LTDL_INIT], [subproject],
|
||||
[m4_define([_LTDL_MODE], [subproject])])
|
||||
|
||||
m4_define([_LTDL_TYPE], [])
|
||||
LT_OPTION_DEFINE([LTDL_INIT], [installable],
|
||||
[m4_define([_LTDL_TYPE], [installable])])
|
||||
LT_OPTION_DEFINE([LTDL_INIT], [convenience],
|
||||
[m4_define([_LTDL_TYPE], [convenience])])
|
123
third_party/rust/backtrace-sys/src/libbacktrace/config/ltsugar.m4
vendored
Normal file
123
third_party/rust/backtrace-sys/src/libbacktrace/config/ltsugar.m4
vendored
Normal file
@ -0,0 +1,123 @@
|
||||
# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*-
|
||||
#
|
||||
# Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
|
||||
# Written by Gary V. Vaughan, 2004
|
||||
#
|
||||
# This file is free software; the Free Software Foundation gives
|
||||
# unlimited permission to copy and/or distribute it, with or without
|
||||
# modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 5 ltsugar.m4
|
||||
|
||||
# This is to help aclocal find these macros, as it can't see m4_define.
|
||||
AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
|
||||
|
||||
|
||||
# lt_join(SEP, ARG1, [ARG2...])
|
||||
# -----------------------------
|
||||
# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
|
||||
# associated separator.
|
||||
# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
|
||||
# versions in m4sugar had bugs.
|
||||
m4_define([lt_join],
|
||||
[m4_if([$#], [1], [],
|
||||
[$#], [2], [[$2]],
|
||||
[m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
|
||||
m4_define([_lt_join],
|
||||
[m4_if([$#$2], [2], [],
|
||||
[m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
|
||||
|
||||
|
||||
# lt_car(LIST)
|
||||
# lt_cdr(LIST)
|
||||
# ------------
|
||||
# Manipulate m4 lists.
|
||||
# These macros are necessary as long as will still need to support
|
||||
# Autoconf-2.59 which quotes differently.
|
||||
m4_define([lt_car], [[$1]])
|
||||
m4_define([lt_cdr],
|
||||
[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
|
||||
[$#], 1, [],
|
||||
[m4_dquote(m4_shift($@))])])
|
||||
m4_define([lt_unquote], $1)
|
||||
|
||||
|
||||
# lt_append(MACRO-NAME, STRING, [SEPARATOR])
|
||||
# ------------------------------------------
|
||||
# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
|
||||
# Note that neither SEPARATOR nor STRING are expanded; they are appended
|
||||
# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
|
||||
# No SEPARATOR is output if MACRO-NAME was previously undefined (different
|
||||
# than defined and empty).
|
||||
#
|
||||
# This macro is needed until we can rely on Autoconf 2.62, since earlier
|
||||
# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
|
||||
m4_define([lt_append],
|
||||
[m4_define([$1],
|
||||
m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
|
||||
|
||||
|
||||
|
||||
# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
|
||||
# ----------------------------------------------------------
|
||||
# Produce a SEP delimited list of all paired combinations of elements of
|
||||
# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list
|
||||
# has the form PREFIXmINFIXSUFFIXn.
|
||||
m4_define([lt_combine],
|
||||
[m4_if([$2], [], [],
|
||||
[m4_if([$4], [], [],
|
||||
[lt_join(m4_quote(m4_default([$1], [[, ]])),
|
||||
lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_prefix, [$2],
|
||||
[m4_foreach(_Lt_suffix, lt_car([m4_shiftn(3, $@)]),
|
||||
[_Lt_prefix[]$3[]_Lt_suffix ])])))))])])dnl
|
||||
])
|
||||
|
||||
|
||||
# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
|
||||
# -----------------------------------------------------------------------
|
||||
# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
|
||||
# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
|
||||
m4_define([lt_if_append_uniq],
|
||||
[m4_ifdef([$1],
|
||||
[m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
|
||||
[lt_append([$1], [$2], [$3])$4],
|
||||
[$5])],
|
||||
[lt_append([$1], [$2], [$3])$4])])
|
||||
|
||||
|
||||
# lt_dict_add(DICT, KEY, VALUE)
|
||||
# -----------------------------
|
||||
m4_define([lt_dict_add],
|
||||
[m4_define([$1($2)], [$3])])
|
||||
|
||||
|
||||
# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
|
||||
# --------------------------------------------
|
||||
m4_define([lt_dict_add_subkey],
|
||||
[m4_define([$1($2:$3)], [$4])])
|
||||
|
||||
|
||||
# lt_dict_fetch(DICT, KEY, [SUBKEY])
|
||||
# ----------------------------------
|
||||
m4_define([lt_dict_fetch],
|
||||
[m4_ifval([$3],
|
||||
m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
|
||||
m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
|
||||
|
||||
|
||||
# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
|
||||
# -----------------------------------------------------------------
|
||||
m4_define([lt_if_dict_fetch],
|
||||
[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
|
||||
[$5],
|
||||
[$6])])
|
||||
|
||||
|
||||
# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
|
||||
# --------------------------------------------------------------
|
||||
m4_define([lt_dict_filter],
|
||||
[m4_if([$5], [], [],
|
||||
[lt_join(m4_quote(m4_default([$4], [[, ]])),
|
||||
lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
|
||||
[lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
|
||||
])
|
23
third_party/rust/backtrace-sys/src/libbacktrace/config/ltversion.m4
vendored
Normal file
23
third_party/rust/backtrace-sys/src/libbacktrace/config/ltversion.m4
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
# ltversion.m4 -- version numbers -*- Autoconf -*-
|
||||
#
|
||||
# Copyright (C) 2004 Free Software Foundation, Inc.
|
||||
# Written by Scott James Remnant, 2004
|
||||
#
|
||||
# This file is free software; the Free Software Foundation gives
|
||||
# unlimited permission to copy and/or distribute it, with or without
|
||||
# modifications, as long as this notice is preserved.
|
||||
|
||||
# Generated from ltversion.in.
|
||||
|
||||
# serial 2976 ltversion.m4
|
||||
# This file is part of GNU Libtool
|
||||
|
||||
m4_define([LT_PACKAGE_VERSION], [2.2.4])
|
||||
m4_define([LT_PACKAGE_REVISION], [1.2976])
|
||||
|
||||
AC_DEFUN([LTVERSION_VERSION],
|
||||
[macro_version='2.2.4'
|
||||
macro_revision='1.2976'
|
||||
_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
|
||||
_LT_DECL(, macro_revision, 0)
|
||||
])
|
92
third_party/rust/backtrace-sys/src/libbacktrace/config/lt~obsolete.m4
vendored
Normal file
92
third_party/rust/backtrace-sys/src/libbacktrace/config/lt~obsolete.m4
vendored
Normal file
@ -0,0 +1,92 @@
|
||||
# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*-
|
||||
#
|
||||
# Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
|
||||
# Written by Scott James Remnant, 2004.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation gives
|
||||
# unlimited permission to copy and/or distribute it, with or without
|
||||
# modifications, as long as this notice is preserved.
|
||||
|
||||
# serial 4 lt~obsolete.m4
|
||||
|
||||
# These exist entirely to fool aclocal when bootstrapping libtool.
|
||||
#
|
||||
# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
|
||||
# which have later been changed to m4_define as they aren't part of the
|
||||
# exported API, or moved to Autoconf or Automake where they belong.
|
||||
#
|
||||
# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN
|
||||
# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
|
||||
# using a macro with the same name in our local m4/libtool.m4 it'll
|
||||
# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
|
||||
# and doesn't know about Autoconf macros at all.)
|
||||
#
|
||||
# So we provide this file, which has a silly filename so it's always
|
||||
# included after everything else. This provides aclocal with the
|
||||
# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
|
||||
# because those macros already exist, or will be overwritten later.
|
||||
# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6.
|
||||
#
|
||||
# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
|
||||
# Yes, that means every name once taken will need to remain here until
|
||||
# we give up compatibility with versions before 1.7, at which point
|
||||
# we need to keep only those names which we still refer to.
|
||||
|
||||
# This is to help aclocal find these macros, as it can't see m4_define.
|
||||
AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
|
||||
|
||||
m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
|
||||
m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])])
|
||||
m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
|
||||
m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])])
|
||||
m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
|
||||
m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])])
|
||||
m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])])
|
||||
m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
|
||||
m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])])
|
||||
m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])])
|
||||
m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])])
|
||||
m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
|
||||
m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
|
||||
m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
|
||||
m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
|
||||
m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])])
|
||||
m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])])
|
||||
m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
|
||||
m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
|
||||
m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])])
|
||||
m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])])
|
||||
m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
|
||||
m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
|
||||
m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
|
||||
m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
|
||||
m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
|
||||
m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
|
||||
m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
|
||||
m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])])
|
||||
m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])])
|
||||
m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])])
|
||||
m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
|
||||
m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])])
|
||||
m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])])
|
||||
m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])])
|
||||
m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])])
|
||||
m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
|
||||
m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])])
|
||||
m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
|
||||
m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])])
|
||||
m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])])
|
||||
m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])])
|
||||
m4_ifndef([AC_LIBTOOL_RC], [AC_DEFUN([AC_LIBTOOL_RC])])
|
||||
m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
|
||||
m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
|
||||
m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
|
||||
m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
|
||||
m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
|
||||
m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
|
||||
m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
|
||||
m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
|
||||
m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
|
||||
m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
|
||||
m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])])
|
||||
m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
|
14361
third_party/rust/backtrace-sys/src/libbacktrace/configure
vendored
Executable file
14361
third_party/rust/backtrace-sys/src/libbacktrace/configure
vendored
Executable file
File diff suppressed because it is too large
Load Diff
512
third_party/rust/backtrace-sys/src/libbacktrace/configure.ac
vendored
Normal file
512
third_party/rust/backtrace-sys/src/libbacktrace/configure.ac
vendored
Normal file
@ -0,0 +1,512 @@
|
||||
# configure.ac -- Backtrace configure script.
|
||||
# Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
||||
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
|
||||
# (1) Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
|
||||
# (2) Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in
|
||||
# the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
|
||||
# (3) The name of the author may not be used to
|
||||
# endorse or promote products derived from this software without
|
||||
# specific prior written permission.
|
||||
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
AC_PREREQ(2.64)
|
||||
AC_INIT(package-unused, version-unused,, libbacktrace)
|
||||
AC_CONFIG_SRCDIR(backtrace.h)
|
||||
AC_CONFIG_HEADER(config.h)
|
||||
AC_CONFIG_MACRO_DIR(config)
|
||||
|
||||
# with_target_subdir is used when configured as part of a GCC tree.
|
||||
if test -n "${with_target_subdir}"; then
|
||||
AM_ENABLE_MULTILIB(, ..)
|
||||
fi
|
||||
|
||||
AC_CANONICAL_SYSTEM
|
||||
target_alias=${target_alias-$host_alias}
|
||||
|
||||
AC_USE_SYSTEM_EXTENSIONS
|
||||
|
||||
libtool_VERSION=1:0:0
|
||||
AC_SUBST(libtool_VERSION)
|
||||
|
||||
# 1.11.1: Require that version of automake.
|
||||
# foreign: Don't require README, INSTALL, NEWS, etc.
|
||||
# no-define: Don't define PACKAGE and VERSION.
|
||||
# no-dependencies: Don't generate automatic dependencies.
|
||||
# (because it breaks when using bootstrap-lean, since some of the
|
||||
# headers are gone at "make install" time).
|
||||
# -Wall: Issue all automake warnings.
|
||||
# -Wno-portability: Don't warn about constructs supported by GNU make.
|
||||
# (because GCC requires GNU make anyhow).
|
||||
AM_INIT_AUTOMAKE([1.11.1 foreign no-dist no-define no-dependencies -Wall -Wno-portability])
|
||||
|
||||
AM_MAINTAINER_MODE
|
||||
|
||||
AC_ARG_WITH(target-subdir,
|
||||
[ --with-target-subdir=SUBDIR Configuring in a subdirectory for target])
|
||||
|
||||
# We must force CC to /not/ be precious variables; otherwise
|
||||
# the wrong, non-multilib-adjusted value will be used in multilibs.
|
||||
# As a side effect, we have to subst CFLAGS ourselves.
|
||||
m4_rename([_AC_ARG_VAR_PRECIOUS],[backtrace_PRECIOUS])
|
||||
m4_define([_AC_ARG_VAR_PRECIOUS],[])
|
||||
AC_PROG_CC
|
||||
m4_rename_force([backtrace_PRECIOUS],[_AC_ARG_VAR_PRECIOUS])
|
||||
|
||||
AC_SUBST(CFLAGS)
|
||||
|
||||
AC_PROG_AWK
|
||||
case "$AWK" in
|
||||
"") AC_MSG_ERROR([can't build without awk]) ;;
|
||||
esac
|
||||
|
||||
LT_INIT
|
||||
AM_PROG_LIBTOOL
|
||||
|
||||
AC_SYS_LARGEFILE
|
||||
|
||||
backtrace_supported=yes
|
||||
|
||||
if test -n "${with_target_subdir}"; then
|
||||
# We are compiling a GCC library. We can assume that the unwind
|
||||
# library exists.
|
||||
BACKTRACE_FILE="backtrace.lo simple.lo"
|
||||
else
|
||||
AC_CHECK_HEADER([unwind.h],
|
||||
[AC_CHECK_FUNC([_Unwind_Backtrace],
|
||||
[BACKTRACE_FILE="backtrace.lo simple.lo"],
|
||||
[BACKTRACE_FILE="nounwind.lo"
|
||||
backtrace_supported=no])],
|
||||
[BACKTRACE_FILE="nounwind.lo"
|
||||
backtrace_supported=no])
|
||||
fi
|
||||
AC_SUBST(BACKTRACE_FILE)
|
||||
|
||||
EXTRA_FLAGS=
|
||||
if test -n "${with_target_subdir}"; then
|
||||
EXTRA_FLAGS="-funwind-tables -frandom-seed=\$@"
|
||||
else
|
||||
AC_CACHE_CHECK([for -funwind-tables option],
|
||||
[libbacktrace_cv_c_unwind_tables],
|
||||
[CFLAGS_hold="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -funwind-tables"
|
||||
AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM([static int f() { return 0; }], [return f();])],
|
||||
[libbacktrace_cv_c_unwind_tables=yes],
|
||||
[libbacktrace_cv_c_unwind_tables=no])
|
||||
CFLAGS="$CFLAGS_hold"])
|
||||
if test "$libbacktrace_cv_c_unwind_tables" = "yes"; then
|
||||
EXTRA_FLAGS=-funwind-tables
|
||||
fi
|
||||
AC_CACHE_CHECK([for -frandom-seed=string option],
|
||||
[libbacktrace_cv_c_random_seed_string],
|
||||
[CFLAGS_hold="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -frandom-seed=conftest.lo"
|
||||
AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM([], [return 0;])],
|
||||
[libbacktrace_cv_c_random_seed_string=yes],
|
||||
[libbacktrace_cv_c_random_seed_string=no])
|
||||
CFLAGS="$CFLAGS_hold"])
|
||||
if test "$libbacktrace_cv_c_random_seed_string" = "yes"; then
|
||||
EXTRA_FLAGS="$EXTRA_FLAGS -frandom-seed=\$@"
|
||||
fi
|
||||
fi
|
||||
AC_SUBST(EXTRA_FLAGS)
|
||||
|
||||
ACX_PROG_CC_WARNING_OPTS([-W -Wall -Wwrite-strings -Wstrict-prototypes \
|
||||
-Wmissing-prototypes -Wold-style-definition \
|
||||
-Wmissing-format-attribute -Wcast-qual],
|
||||
[WARN_FLAGS])
|
||||
|
||||
if test -n "${with_target_subdir}"; then
|
||||
WARN_FLAGS="$WARN_FLAGS -Werror"
|
||||
fi
|
||||
|
||||
AC_SUBST(WARN_FLAGS)
|
||||
|
||||
if test -n "${with_target_subdir}"; then
|
||||
GCC_CHECK_UNWIND_GETIPINFO
|
||||
else
|
||||
ac_save_CFFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
|
||||
AC_MSG_CHECKING([for _Unwind_GetIPInfo])
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[#include "unwind.h"
|
||||
struct _Unwind_Context *context;
|
||||
int ip_before_insn = 0;],
|
||||
[return _Unwind_GetIPInfo (context, &ip_before_insn);])],
|
||||
[have_unwind_getipinfo=yes], [have_unwind_getipinfo=no])
|
||||
CFLAGS="$ac_save_CFLAGS"
|
||||
AC_MSG_RESULT([$have_unwind_getipinfo])
|
||||
if test "$have_unwind_getipinfo" = "yes"; then
|
||||
AC_DEFINE(HAVE_GETIPINFO, 1, [Define if _Unwind_GetIPInfo is available.])
|
||||
fi
|
||||
fi
|
||||
|
||||
# Enable --enable-host-shared.
|
||||
AC_ARG_ENABLE(host-shared,
|
||||
[AS_HELP_STRING([--enable-host-shared],
|
||||
[build host code as shared libraries])],
|
||||
[PIC_FLAG=-fPIC], [PIC_FLAG=])
|
||||
AC_SUBST(PIC_FLAG)
|
||||
|
||||
# Test for __sync support.
|
||||
AC_CACHE_CHECK([__sync extensions],
|
||||
[libbacktrace_cv_sys_sync],
|
||||
[if test -n "${with_target_subdir}"; then
|
||||
case "${host}" in
|
||||
hppa*-*-hpux*) libbacktrace_cv_sys_sync=no ;;
|
||||
*) libbacktrace_cv_sys_sync=yes ;;
|
||||
esac
|
||||
else
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_PROGRAM([int i;],
|
||||
[__sync_bool_compare_and_swap (&i, i, i);
|
||||
__sync_lock_test_and_set (&i, 1);
|
||||
__sync_lock_release (&i);])],
|
||||
[libbacktrace_cv_sys_sync=yes],
|
||||
[libbacktrace_cv_sys_sync=no])
|
||||
fi])
|
||||
BACKTRACE_SUPPORTS_THREADS=0
|
||||
if test "$libbacktrace_cv_sys_sync" = "yes"; then
|
||||
BACKTRACE_SUPPORTS_THREADS=1
|
||||
AC_DEFINE([HAVE_SYNC_FUNCTIONS], 1,
|
||||
[Define to 1 if you have the __sync functions])
|
||||
fi
|
||||
AC_SUBST(BACKTRACE_SUPPORTS_THREADS)
|
||||
|
||||
# Test for __atomic support.
|
||||
AC_CACHE_CHECK([__atomic extensions],
|
||||
[libbacktrace_cv_sys_atomic],
|
||||
[if test -n "${with_target_subdir}"; then
|
||||
libbacktrace_cv_sys_atomic=yes
|
||||
else
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_PROGRAM([int i;],
|
||||
[__atomic_load_n (&i, __ATOMIC_ACQUIRE);
|
||||
__atomic_store_n (&i, 1, __ATOMIC_RELEASE);])],
|
||||
[libbacktrace_cv_sys_atomic=yes],
|
||||
[libbacktrace_cv_sys_atomic=no])
|
||||
fi])
|
||||
if test "$libbacktrace_cv_sys_atomic" = "yes"; then
|
||||
AC_DEFINE([HAVE_ATOMIC_FUNCTIONS], 1,
|
||||
[Define to 1 if you have the __atomic functions])
|
||||
fi
|
||||
|
||||
# The library needs to be able to read the executable itself. Compile
|
||||
# a file to determine the executable format. The awk script
|
||||
# filetype.awk prints out the file type.
|
||||
AC_CACHE_CHECK([output filetype],
|
||||
[libbacktrace_cv_sys_filetype],
|
||||
[filetype=
|
||||
AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM([int i;], [int j;])],
|
||||
[filetype=`${AWK} -f $srcdir/filetype.awk conftest.$ac_objext`],
|
||||
[AC_MSG_FAILURE([compiler failed])])
|
||||
libbacktrace_cv_sys_filetype=$filetype])
|
||||
|
||||
# Match the file type to decide what files to compile.
|
||||
FORMAT_FILE=
|
||||
backtrace_supports_data=yes
|
||||
case "$libbacktrace_cv_sys_filetype" in
|
||||
elf*) FORMAT_FILE="elf.lo" ;;
|
||||
pecoff) FORMAT_FILE="pecoff.lo"
|
||||
backtrace_supports_data=no
|
||||
;;
|
||||
xcoff*) FORMAT_FILE="xcoff.lo"
|
||||
backtrace_supports_data=no
|
||||
;;
|
||||
macho*) FORMAT_FILE="macho.lo"
|
||||
backtrace_supports_data=no
|
||||
;;
|
||||
*) AC_MSG_WARN([could not determine output file type])
|
||||
FORMAT_FILE="unknown.lo"
|
||||
backtrace_supported=no
|
||||
;;
|
||||
esac
|
||||
AC_SUBST(FORMAT_FILE)
|
||||
|
||||
# ELF defines.
|
||||
elfsize=
|
||||
case "$libbacktrace_cv_sys_filetype" in
|
||||
elf32) elfsize=32 ;;
|
||||
elf64) elfsize=64 ;;
|
||||
*) elfsize=unused
|
||||
esac
|
||||
AC_DEFINE_UNQUOTED([BACKTRACE_ELF_SIZE], [$elfsize], [ELF size: 32 or 64])
|
||||
|
||||
# XCOFF defines.
|
||||
xcoffsize=
|
||||
case "$libbacktrace_cv_sys_filetype" in
|
||||
xcoff32) xcoffsize=32 ;;
|
||||
xcoff64) xcoffsize=64 ;;
|
||||
*) xcoffsize=unused
|
||||
esac
|
||||
AC_DEFINE_UNQUOTED([BACKTRACE_XCOFF_SIZE], [$xcoffsize], [XCOFF size: 32 or 64])
|
||||
|
||||
BACKTRACE_SUPPORTED=0
|
||||
if test "$backtrace_supported" = "yes"; then
|
||||
BACKTRACE_SUPPORTED=1
|
||||
fi
|
||||
AC_SUBST(BACKTRACE_SUPPORTED)
|
||||
|
||||
BACKTRACE_SUPPORTS_DATA=0
|
||||
if test "$backtrace_supports_data" = "yes"; then
|
||||
BACKTRACE_SUPPORTS_DATA=1
|
||||
fi
|
||||
AC_SUBST(BACKTRACE_SUPPORTS_DATA)
|
||||
|
||||
AC_CHECK_HEADERS(sys/mman.h)
|
||||
if test "$ac_cv_header_sys_mman_h" = "no"; then
|
||||
have_mmap=no
|
||||
else
|
||||
if test -n "${with_target_subdir}"; then
|
||||
# When built as a GCC target library, we can't do a link test. We
|
||||
# simply assume that if we have mman.h, we have mmap.
|
||||
have_mmap=yes
|
||||
case "${host}" in
|
||||
spu-*-*|*-*-msdosdjgpp)
|
||||
# The SPU does not have mmap, but it has a sys/mman.h header file
|
||||
# containing "mmap_eaddr" and the mmap flags, confusing the test.
|
||||
# DJGPP also has sys/man.h, but no mmap
|
||||
have_mmap=no ;;
|
||||
esac
|
||||
else
|
||||
AC_CHECK_FUNC(mmap, [have_mmap=yes], [have_mmap=no])
|
||||
fi
|
||||
fi
|
||||
|
||||
case "${host_os}" in
|
||||
darwin*)
|
||||
have_mmap=no ;;
|
||||
esac
|
||||
|
||||
if test "$have_mmap" = "no"; then
|
||||
VIEW_FILE=read.lo
|
||||
ALLOC_FILE=alloc.lo
|
||||
else
|
||||
VIEW_FILE=mmapio.lo
|
||||
AC_PREPROC_IFELSE([
|
||||
#include <sys/mman.h>
|
||||
#if !defined(MAP_ANONYMOUS) && !defined(MAP_ANON)
|
||||
#error no MAP_ANONYMOUS
|
||||
#endif
|
||||
], [ALLOC_FILE=mmap.lo], [ALLOC_FILE=alloc.lo])
|
||||
fi
|
||||
AC_SUBST(VIEW_FILE)
|
||||
AC_SUBST(ALLOC_FILE)
|
||||
|
||||
BACKTRACE_USES_MALLOC=0
|
||||
if test "$ALLOC_FILE" = "alloc.lo"; then
|
||||
BACKTRACE_USES_MALLOC=1
|
||||
fi
|
||||
AC_SUBST(BACKTRACE_USES_MALLOC)
|
||||
|
||||
# Check for dl_iterate_phdr.
|
||||
AC_CHECK_HEADERS(link.h)
|
||||
if test "$ac_cv_header_link_h" = "no"; then
|
||||
have_dl_iterate_phdr=no
|
||||
else
|
||||
if test -n "${with_target_subdir}"; then
|
||||
# When built as a GCC target library, we can't do a link test.
|
||||
AC_EGREP_HEADER([dl_iterate_phdr], [link.h], [have_dl_iterate_phdr=yes],
|
||||
[have_dl_iterate_phdr=no])
|
||||
case "${host}" in
|
||||
*-*-solaris2.10*)
|
||||
# Avoid dl_iterate_phdr on Solaris 10, where it is in the
|
||||
# header file but is only in -ldl.
|
||||
have_dl_iterate_phdr=no ;;
|
||||
esac
|
||||
else
|
||||
AC_CHECK_FUNC([dl_iterate_phdr], [have_dl_iterate_phdr=yes],
|
||||
[have_dl_iterate_phdr=no])
|
||||
fi
|
||||
fi
|
||||
if test "$have_dl_iterate_phdr" = "yes"; then
|
||||
AC_DEFINE(HAVE_DL_ITERATE_PHDR, 1, [Define if dl_iterate_phdr is available.])
|
||||
fi
|
||||
|
||||
# Check for loadquery.
|
||||
AC_CHECK_HEADERS(sys/ldr.h)
|
||||
if test "$ac_cv_header_sys_ldr_h" = "no"; then
|
||||
have_loadquery=no
|
||||
else
|
||||
if test -n "${with_target_subdir}"; then
|
||||
# When built as a GCC target library, we can't do a link test.
|
||||
AC_EGREP_HEADER([loadquery], [sys/ldr.h], [have_loadquery=yes],
|
||||
[have_loadquery=no])
|
||||
else
|
||||
AC_CHECK_FUNC([loadquery], [have_loadquery=yes],
|
||||
[have_loadquery=no])
|
||||
fi
|
||||
fi
|
||||
if test "$have_loadquery" = "yes"; then
|
||||
AC_DEFINE(HAVE_LOADQUERY, 1, [Define if AIX loadquery is available.])
|
||||
fi
|
||||
|
||||
# Check for the fcntl function.
|
||||
if test -n "${with_target_subdir}"; then
|
||||
case "${host}" in
|
||||
*-*-mingw*) have_fcntl=no ;;
|
||||
spu-*-*) have_fcntl=no ;;
|
||||
*) have_fcntl=yes ;;
|
||||
esac
|
||||
else
|
||||
AC_CHECK_FUNC(fcntl, [have_fcntl=yes], [have_fcntl=no])
|
||||
fi
|
||||
if test "$have_fcntl" = "yes"; then
|
||||
AC_DEFINE([HAVE_FCNTL], 1,
|
||||
[Define to 1 if you have the fcntl function])
|
||||
fi
|
||||
|
||||
AC_CHECK_DECLS(strnlen)
|
||||
AC_CHECK_FUNCS(lstat readlink)
|
||||
|
||||
# Check for getexecname function.
|
||||
if test -n "${with_target_subdir}"; then
|
||||
case "${host}" in
|
||||
*-*-solaris2*) have_getexecname=yes ;;
|
||||
*) have_getexecname=no ;;
|
||||
esac
|
||||
else
|
||||
AC_CHECK_FUNC(getexecname, [have_getexecname=yes], [have_getexecname=no])
|
||||
fi
|
||||
if test "$have_getexecname" = "yes"; then
|
||||
AC_DEFINE(HAVE_GETEXECNAME, 1, [Define if getexecname is available.])
|
||||
fi
|
||||
|
||||
# Check for the clock_gettime function.
|
||||
AC_CHECK_FUNCS(clock_gettime)
|
||||
clock_gettime_link=
|
||||
# At least for glibc, clock_gettime is in librt. But don't
|
||||
# pull that in if it still doesn't give us the function we want. This
|
||||
# test is copied from libgomp, and modified to not link in -lrt as
|
||||
# we're using this for test timing only.
|
||||
if test "$ac_cv_func_clock_gettime" = no; then
|
||||
AC_CHECK_LIB(rt, clock_gettime,
|
||||
[CLOCK_GETTIME_LINK=-lrt
|
||||
AC_DEFINE(HAVE_CLOCK_GETTIME, 1,
|
||||
[Define to 1 if you have the `clock_gettime' function.])])
|
||||
fi
|
||||
AC_SUBST(CLOCK_GETTIME_LINK)
|
||||
|
||||
dnl Test whether the compiler supports the -pthread option.
|
||||
AC_CACHE_CHECK([whether -pthread is supported],
|
||||
[libgo_cv_lib_pthread],
|
||||
[CFLAGS_hold=$CFLAGS
|
||||
CFLAGS="$CFLAGS -pthread"
|
||||
AC_COMPILE_IFELSE([[int i;]],
|
||||
[libgo_cv_lib_pthread=yes],
|
||||
[libgo_cv_lib_pthread=no])
|
||||
CFLAGS=$CFLAGS_hold])
|
||||
PTHREAD_CFLAGS=
|
||||
if test "$libgo_cv_lib_pthread" = yes; then
|
||||
PTHREAD_CFLAGS=-pthread
|
||||
fi
|
||||
AC_SUBST(PTHREAD_CFLAGS)
|
||||
|
||||
AM_CONDITIONAL(HAVE_PTHREAD, test "$libgo_cv_lib_pthread" = yes)
|
||||
|
||||
AC_CHECK_LIB([z], [compress], [])
|
||||
if test $ac_cv_lib_z_compress = "yes"; then
|
||||
AC_DEFINE(HAVE_ZLIB, 1, [Define if -lz is available.])
|
||||
fi
|
||||
AM_CONDITIONAL(HAVE_ZLIB, test "$ac_cv_lib_z_compress" = yes)
|
||||
|
||||
dnl Test whether the linker supports the --compress_debug_sections option.
|
||||
AC_CACHE_CHECK([whether --compress-debug-sections is supported],
|
||||
[libgo_cv_ld_compress],
|
||||
[LDFLAGS_hold=$LDFLAGS
|
||||
LDFLAGS="$LDFLAGS -Wl,--compress-debug-sections=zlib-gnu"
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM(,)],
|
||||
[libgo_cv_ld_compress=yes],
|
||||
[libgo_cv_ld_compress=no])
|
||||
LDFLAGS=$LDFLAGS_hold])
|
||||
AM_CONDITIONAL(HAVE_COMPRESSED_DEBUG, test "$libgo_cv_ld_compress" = yes)
|
||||
|
||||
AC_ARG_VAR(OBJCOPY, [location of objcopy])
|
||||
AC_CHECK_PROG(OBJCOPY, objcopy, objcopy,)
|
||||
AC_CACHE_CHECK([whether objcopy supports debuglink],
|
||||
[libbacktrace_cv_objcopy_debuglink],
|
||||
[if test -n "${with_target_subdir}"; then
|
||||
libbacktrace_cv_objcopy_debuglink=no
|
||||
elif ${OBJCOPY} --add-gnu-debuglink=x /bin/ls /tmp/ls$$; then
|
||||
rm -f /tmp/ls$$
|
||||
libbacktrace_cv_objcopy_debuglink=yes
|
||||
else
|
||||
libbacktrace_cv_objcopy_debuglink=no
|
||||
fi])
|
||||
AM_CONDITIONAL(HAVE_OBJCOPY_DEBUGLINK, test "$libbacktrace_cv_objcopy_debuglink" = yes)
|
||||
|
||||
AC_CACHE_CHECK([whether tests can run],
|
||||
[libbacktrace_cv_sys_native],
|
||||
[AC_RUN_IFELSE([AC_LANG_PROGRAM([], [return 0;])],
|
||||
[libbacktrace_cv_sys_native=yes],
|
||||
[libbacktrace_cv_sys_native=no],
|
||||
[libbacktrace_cv_sys_native=no])])
|
||||
AM_CONDITIONAL(NATIVE, test "$libbacktrace_cv_sys_native" = "yes")
|
||||
|
||||
if test "${multilib}" = "yes"; then
|
||||
multilib_arg="--enable-multilib"
|
||||
else
|
||||
multilib_arg=
|
||||
fi
|
||||
|
||||
AC_CONFIG_FILES(Makefile backtrace-supported.h)
|
||||
|
||||
# We need multilib support, but only if configuring for the target.
|
||||
AC_CONFIG_COMMANDS([default],
|
||||
[if test -n "$CONFIG_FILES"; then
|
||||
if test -n "${with_target_subdir}"; then
|
||||
# Multilibs need MULTISUBDIR defined correctly in certain makefiles so
|
||||
# that multilib installs will end up installed in the correct place.
|
||||
# The testsuite needs it for multilib-aware ABI baseline files.
|
||||
# To work around this not being passed down from config-ml.in ->
|
||||
# srcdir/Makefile.am -> srcdir/{src,libsupc++,...}/Makefile.am, manually
|
||||
# append it here. Only modify Makefiles that have just been created.
|
||||
#
|
||||
# Also, get rid of this simulated-VPATH thing that automake does.
|
||||
cat > vpsed << \_EOF
|
||||
s!`test -f '$<' || echo '$(srcdir)/'`!!
|
||||
_EOF
|
||||
for i in $SUBDIRS; do
|
||||
case $CONFIG_FILES in
|
||||
*${i}/Makefile*)
|
||||
#echo "Adding MULTISUBDIR to $i/Makefile"
|
||||
sed -f vpsed $i/Makefile > tmp
|
||||
grep '^MULTISUBDIR =' Makefile >> tmp
|
||||
mv tmp $i/Makefile
|
||||
;;
|
||||
esac
|
||||
done
|
||||
rm vpsed
|
||||
fi
|
||||
fi
|
||||
],
|
||||
[
|
||||
# Variables needed in config.status (file generation) which aren't already
|
||||
# passed by autoconf.
|
||||
SUBDIRS="$SUBDIRS"
|
||||
])
|
||||
|
||||
AC_OUTPUT
|
3126
third_party/rust/backtrace-sys/src/libbacktrace/dwarf.c
vendored
Normal file
3126
third_party/rust/backtrace-sys/src/libbacktrace/dwarf.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
121
third_party/rust/backtrace-sys/src/libbacktrace/edtest.c
vendored
Normal file
121
third_party/rust/backtrace-sys/src/libbacktrace/edtest.c
vendored
Normal file
@ -0,0 +1,121 @@
|
||||
/* edtest.c -- Test for libbacktrace storage allocation stress handling
|
||||
Copyright (C) 2017-2018 Free Software Foundation, Inc.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "backtrace.h"
|
||||
#include "backtrace-supported.h"
|
||||
#include "internal.h"
|
||||
|
||||
#include "testlib.h"
|
||||
|
||||
static int test1 (void) __attribute__ ((noinline, unused));
|
||||
static int test1 (void) __attribute__ ((noinline, unused));
|
||||
extern int f2 (int);
|
||||
extern int f3 (int, int);
|
||||
|
||||
static int
|
||||
test1 (void)
|
||||
{
|
||||
/* Returning a value here and elsewhere avoids a tailcall which
|
||||
would mess up the backtrace. */
|
||||
return f2 (__LINE__) + 1;
|
||||
}
|
||||
|
||||
int
|
||||
f3 (int f1line, int f2line)
|
||||
{
|
||||
struct info all[20];
|
||||
struct bdata data;
|
||||
int f3line;
|
||||
int i;
|
||||
|
||||
data.all = &all[0];
|
||||
data.index = 0;
|
||||
data.max = 20;
|
||||
data.failed = 0;
|
||||
|
||||
f3line = __LINE__ + 1;
|
||||
i = backtrace_full (state, 0, callback_one, error_callback_one, &data);
|
||||
|
||||
if (i != 0)
|
||||
{
|
||||
fprintf (stderr, "test1: unexpected return value %d\n", i);
|
||||
data.failed = 1;
|
||||
}
|
||||
|
||||
if (data.index < 3)
|
||||
{
|
||||
fprintf (stderr,
|
||||
"test1: not enough frames; got %zu, expected at least 3\n",
|
||||
data.index);
|
||||
data.failed = 1;
|
||||
}
|
||||
|
||||
check ("test1", 0, all, f3line, "f3", "edtest.c", &data.failed);
|
||||
check ("test1", 1, all, f2line, "f2", "edtest2_build.c", &data.failed);
|
||||
check ("test1", 2, all, f1line, "test1", "edtest.c", &data.failed);
|
||||
|
||||
printf ("%s: backtrace_full alloc stress\n", data.failed ? "FAIL" : "PASS");
|
||||
|
||||
if (data.failed)
|
||||
++failures;
|
||||
|
||||
return failures;
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED)
|
||||
{
|
||||
state = backtrace_create_state (argv[0], BACKTRACE_SUPPORTS_THREADS,
|
||||
error_callback_create, NULL);
|
||||
|
||||
// Grab the storage allocation lock prior to doing anything interesting.
|
||||
// The intent here is to insure that the backtrace_alloc code is forced
|
||||
// to always call mmap() for new memory as opposed to reusing previously
|
||||
// allocated memory from the free list. Doing things this way helps
|
||||
// simulate what you might see in a multithreaded program in which there
|
||||
// are racing calls to the allocator.
|
||||
struct backtrace_state *state_internal =
|
||||
(struct backtrace_state *) state;
|
||||
state_internal->lock_alloc = 1;
|
||||
|
||||
// Kick off the test
|
||||
test1();
|
||||
|
||||
exit (failures > 0 ? EXIT_FAILURE : EXIT_SUCCESS);
|
||||
}
|
43
third_party/rust/backtrace-sys/src/libbacktrace/edtest2.c
vendored
Normal file
43
third_party/rust/backtrace-sys/src/libbacktrace/edtest2.c
vendored
Normal file
@ -0,0 +1,43 @@
|
||||
/* edtest2.c -- Test for libbacktrace storage allocation stress handling (p2)
|
||||
Copyright (C) 2017-2018 Free Software Foundation, Inc.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
/* This file intentionally written without any #include's
|
||||
*/
|
||||
|
||||
extern int f3(int, int);
|
||||
extern int f2(int);
|
||||
|
||||
int f2(int x)
|
||||
{
|
||||
/* Returning a value here and elsewhere avoids a tailcall which
|
||||
would mess up the backtrace. */
|
||||
return f3(x, __LINE__) + 3;
|
||||
}
|
3340
third_party/rust/backtrace-sys/src/libbacktrace/elf.c
vendored
Normal file
3340
third_party/rust/backtrace-sys/src/libbacktrace/elf.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
201
third_party/rust/backtrace-sys/src/libbacktrace/fileline.c
vendored
Normal file
201
third_party/rust/backtrace-sys/src/libbacktrace/fileline.c
vendored
Normal file
@ -0,0 +1,201 @@
|
||||
/* fileline.c -- Get file and line number information in a backtrace.
|
||||
Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
||||
Written by Ian Lance Taylor, Google.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "backtrace.h"
|
||||
#include "internal.h"
|
||||
|
||||
#ifndef HAVE_GETEXECNAME
|
||||
#define getexecname() NULL
|
||||
#endif
|
||||
|
||||
/* Initialize the fileline information from the executable. Returns 1
|
||||
on success, 0 on failure. */
|
||||
|
||||
static int
|
||||
fileline_initialize (struct backtrace_state *state,
|
||||
backtrace_error_callback error_callback, void *data)
|
||||
{
|
||||
int failed;
|
||||
fileline fileline_fn;
|
||||
int pass;
|
||||
int called_error_callback;
|
||||
int descriptor;
|
||||
const char *filename;
|
||||
char buf[64];
|
||||
|
||||
if (!state->threaded)
|
||||
failed = state->fileline_initialization_failed;
|
||||
else
|
||||
failed = backtrace_atomic_load_int (&state->fileline_initialization_failed);
|
||||
|
||||
if (failed)
|
||||
{
|
||||
error_callback (data, "failed to read executable information", -1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!state->threaded)
|
||||
fileline_fn = state->fileline_fn;
|
||||
else
|
||||
fileline_fn = backtrace_atomic_load_pointer (&state->fileline_fn);
|
||||
if (fileline_fn != NULL)
|
||||
return 1;
|
||||
|
||||
/* We have not initialized the information. Do it now. */
|
||||
|
||||
descriptor = -1;
|
||||
called_error_callback = 0;
|
||||
for (pass = 0; pass < 5; ++pass)
|
||||
{
|
||||
int does_not_exist;
|
||||
|
||||
switch (pass)
|
||||
{
|
||||
case 0:
|
||||
filename = state->filename;
|
||||
break;
|
||||
case 1:
|
||||
filename = getexecname ();
|
||||
break;
|
||||
case 2:
|
||||
filename = "/proc/self/exe";
|
||||
break;
|
||||
case 3:
|
||||
filename = "/proc/curproc/file";
|
||||
break;
|
||||
case 4:
|
||||
snprintf (buf, sizeof (buf), "/proc/%ld/object/a.out",
|
||||
(long) getpid ());
|
||||
filename = buf;
|
||||
break;
|
||||
default:
|
||||
abort ();
|
||||
}
|
||||
|
||||
if (filename == NULL)
|
||||
continue;
|
||||
|
||||
descriptor = backtrace_open (filename, error_callback, data,
|
||||
&does_not_exist);
|
||||
if (descriptor < 0 && !does_not_exist)
|
||||
{
|
||||
called_error_callback = 1;
|
||||
break;
|
||||
}
|
||||
if (descriptor >= 0)
|
||||
break;
|
||||
}
|
||||
|
||||
if (descriptor < 0)
|
||||
{
|
||||
if (!called_error_callback)
|
||||
{
|
||||
if (state->filename != NULL)
|
||||
error_callback (data, state->filename, ENOENT);
|
||||
else
|
||||
error_callback (data,
|
||||
"libbacktrace could not find executable to open",
|
||||
0);
|
||||
}
|
||||
failed = 1;
|
||||
}
|
||||
|
||||
if (!failed)
|
||||
{
|
||||
if (!backtrace_initialize (state, filename, descriptor, error_callback,
|
||||
data, &fileline_fn))
|
||||
failed = 1;
|
||||
}
|
||||
|
||||
if (failed)
|
||||
{
|
||||
if (!state->threaded)
|
||||
state->fileline_initialization_failed = 1;
|
||||
else
|
||||
backtrace_atomic_store_int (&state->fileline_initialization_failed, 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!state->threaded)
|
||||
state->fileline_fn = fileline_fn;
|
||||
else
|
||||
{
|
||||
backtrace_atomic_store_pointer (&state->fileline_fn, fileline_fn);
|
||||
|
||||
/* Note that if two threads initialize at once, one of the data
|
||||
sets may be leaked. */
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Given a PC, find the file name, line number, and function name. */
|
||||
|
||||
int
|
||||
backtrace_pcinfo (struct backtrace_state *state, uintptr_t pc,
|
||||
backtrace_full_callback callback,
|
||||
backtrace_error_callback error_callback, void *data)
|
||||
{
|
||||
if (!fileline_initialize (state, error_callback, data))
|
||||
return 0;
|
||||
|
||||
if (state->fileline_initialization_failed)
|
||||
return 0;
|
||||
|
||||
return state->fileline_fn (state, pc, callback, error_callback, data);
|
||||
}
|
||||
|
||||
/* Given a PC, find the symbol for it, and its value. */
|
||||
|
||||
int
|
||||
backtrace_syminfo (struct backtrace_state *state, uintptr_t pc,
|
||||
backtrace_syminfo_callback callback,
|
||||
backtrace_error_callback error_callback, void *data)
|
||||
{
|
||||
if (!fileline_initialize (state, error_callback, data))
|
||||
return 0;
|
||||
|
||||
if (state->fileline_initialization_failed)
|
||||
return 0;
|
||||
|
||||
state->syminfo_fn (state, pc, callback, error_callback, data);
|
||||
return 1;
|
||||
}
|
49
third_party/rust/backtrace-sys/src/libbacktrace/filenames.h
vendored
Normal file
49
third_party/rust/backtrace-sys/src/libbacktrace/filenames.h
vendored
Normal file
@ -0,0 +1,49 @@
|
||||
/* btest.c -- Filename header for libbacktrace library
|
||||
Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
||||
Written by Ian Lance Taylor, Google.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#ifndef GCC_VERSION
|
||||
# define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
|
||||
#endif
|
||||
|
||||
#if (GCC_VERSION < 2007)
|
||||
# define __attribute__(x)
|
||||
#endif
|
||||
|
||||
#ifndef ATTRIBUTE_UNUSED
|
||||
# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
|
||||
#endif
|
||||
|
||||
#if defined(__MSDOS__) || defined(_WIN32) || defined(__OS2__) || defined (__CYGWIN__)
|
||||
# define IS_DIR_SEPARATOR(c) ((c) == '/' || (c) == '\\')
|
||||
#else
|
||||
# define IS_DIR_SEPARATOR(c) ((c) == '/')
|
||||
#endif
|
11
third_party/rust/backtrace-sys/src/libbacktrace/filetype.awk
vendored
Normal file
11
third_party/rust/backtrace-sys/src/libbacktrace/filetype.awk
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
# An awk script to determine the type of a file.
|
||||
/\177ELF\001/ { if (NR == 1) { print "elf32"; exit } }
|
||||
/\177ELF\002/ { if (NR == 1) { print "elf64"; exit } }
|
||||
/\114\001/ { if (NR == 1) { print "pecoff"; exit } }
|
||||
/\144\206/ { if (NR == 1) { print "pecoff"; exit } }
|
||||
/\xFE\xED\xFA\xCE/ { if (NR == 1) { print "macho32"; exit } }
|
||||
/\xCE\xFA\xED\xFE/ { if (NR == 1) { print "macho32"; exit } }
|
||||
/\xFE\xED\xFA\xCF/ { if (NR == 1) { print "macho64"; exit } }
|
||||
/\xCF\xFA\xED\xFE/ { if (NR == 1) { print "macho64"; exit } }
|
||||
/\xCA\xFE\xBA\xBE/ { if (NR == 1) { print "macho-fat"; exit } }
|
||||
/\xBE\xBA\xFE\xCA/ { if (NR == 1) { print "macho-fat"; exit } }
|
527
third_party/rust/backtrace-sys/src/libbacktrace/install-sh
vendored
Executable file
527
third_party/rust/backtrace-sys/src/libbacktrace/install-sh
vendored
Executable file
@ -0,0 +1,527 @@
|
||||
#!/bin/sh
|
||||
# install - install a program, script, or datafile
|
||||
|
||||
scriptversion=2011-01-19.21; # UTC
|
||||
|
||||
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
||||
# later released in X11R6 (xc/config/util/install.sh) with the
|
||||
# following copyright and license.
|
||||
#
|
||||
# Copyright (C) 1994 X Consortium
|
||||
#
|
||||
# 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
|
||||
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
||||
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
# Except as contained in this notice, the name of the X Consortium shall not
|
||||
# be used in advertising or otherwise to promote the sale, use or other deal-
|
||||
# ings in this Software without prior written authorization from the X Consor-
|
||||
# tium.
|
||||
#
|
||||
#
|
||||
# FSF changes to this file are in the public domain.
|
||||
#
|
||||
# Calling this script install-sh is preferred over install.sh, to prevent
|
||||
# `make' implicit rules from creating a file called install from it
|
||||
# when there is no Makefile.
|
||||
#
|
||||
# This script is compatible with the BSD install script, but was written
|
||||
# from scratch.
|
||||
|
||||
nl='
|
||||
'
|
||||
IFS=" "" $nl"
|
||||
|
||||
# set DOITPROG to echo to test this script
|
||||
|
||||
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
||||
doit=${DOITPROG-}
|
||||
if test -z "$doit"; then
|
||||
doit_exec=exec
|
||||
else
|
||||
doit_exec=$doit
|
||||
fi
|
||||
|
||||
# Put in absolute file names if you don't have them in your path;
|
||||
# or use environment vars.
|
||||
|
||||
chgrpprog=${CHGRPPROG-chgrp}
|
||||
chmodprog=${CHMODPROG-chmod}
|
||||
chownprog=${CHOWNPROG-chown}
|
||||
cmpprog=${CMPPROG-cmp}
|
||||
cpprog=${CPPROG-cp}
|
||||
mkdirprog=${MKDIRPROG-mkdir}
|
||||
mvprog=${MVPROG-mv}
|
||||
rmprog=${RMPROG-rm}
|
||||
stripprog=${STRIPPROG-strip}
|
||||
|
||||
posix_glob='?'
|
||||
initialize_posix_glob='
|
||||
test "$posix_glob" != "?" || {
|
||||
if (set -f) 2>/dev/null; then
|
||||
posix_glob=
|
||||
else
|
||||
posix_glob=:
|
||||
fi
|
||||
}
|
||||
'
|
||||
|
||||
posix_mkdir=
|
||||
|
||||
# Desired mode of installed file.
|
||||
mode=0755
|
||||
|
||||
chgrpcmd=
|
||||
chmodcmd=$chmodprog
|
||||
chowncmd=
|
||||
mvcmd=$mvprog
|
||||
rmcmd="$rmprog -f"
|
||||
stripcmd=
|
||||
|
||||
src=
|
||||
dst=
|
||||
dir_arg=
|
||||
dst_arg=
|
||||
|
||||
copy_on_change=false
|
||||
no_target_directory=
|
||||
|
||||
usage="\
|
||||
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
||||
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
||||
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
||||
or: $0 [OPTION]... -d DIRECTORIES...
|
||||
|
||||
In the 1st form, copy SRCFILE to DSTFILE.
|
||||
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
||||
In the 4th, create DIRECTORIES.
|
||||
|
||||
Options:
|
||||
--help display this help and exit.
|
||||
--version display version info and exit.
|
||||
|
||||
-c (ignored)
|
||||
-C install only if different (preserve the last data modification time)
|
||||
-d create directories instead of installing files.
|
||||
-g GROUP $chgrpprog installed files to GROUP.
|
||||
-m MODE $chmodprog installed files to MODE.
|
||||
-o USER $chownprog installed files to USER.
|
||||
-s $stripprog installed files.
|
||||
-t DIRECTORY install into DIRECTORY.
|
||||
-T report an error if DSTFILE is a directory.
|
||||
|
||||
Environment variables override the default commands:
|
||||
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
||||
RMPROG STRIPPROG
|
||||
"
|
||||
|
||||
while test $# -ne 0; do
|
||||
case $1 in
|
||||
-c) ;;
|
||||
|
||||
-C) copy_on_change=true;;
|
||||
|
||||
-d) dir_arg=true;;
|
||||
|
||||
-g) chgrpcmd="$chgrpprog $2"
|
||||
shift;;
|
||||
|
||||
--help) echo "$usage"; exit $?;;
|
||||
|
||||
-m) mode=$2
|
||||
case $mode in
|
||||
*' '* | *' '* | *'
|
||||
'* | *'*'* | *'?'* | *'['*)
|
||||
echo "$0: invalid mode: $mode" >&2
|
||||
exit 1;;
|
||||
esac
|
||||
shift;;
|
||||
|
||||
-o) chowncmd="$chownprog $2"
|
||||
shift;;
|
||||
|
||||
-s) stripcmd=$stripprog;;
|
||||
|
||||
-t) dst_arg=$2
|
||||
# Protect names problematic for `test' and other utilities.
|
||||
case $dst_arg in
|
||||
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||
esac
|
||||
shift;;
|
||||
|
||||
-T) no_target_directory=true;;
|
||||
|
||||
--version) echo "$0 $scriptversion"; exit $?;;
|
||||
|
||||
--) shift
|
||||
break;;
|
||||
|
||||
-*) echo "$0: invalid option: $1" >&2
|
||||
exit 1;;
|
||||
|
||||
*) break;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
||||
# When -d is used, all remaining arguments are directories to create.
|
||||
# When -t is used, the destination is already specified.
|
||||
# Otherwise, the last argument is the destination. Remove it from $@.
|
||||
for arg
|
||||
do
|
||||
if test -n "$dst_arg"; then
|
||||
# $@ is not empty: it contains at least $arg.
|
||||
set fnord "$@" "$dst_arg"
|
||||
shift # fnord
|
||||
fi
|
||||
shift # arg
|
||||
dst_arg=$arg
|
||||
# Protect names problematic for `test' and other utilities.
|
||||
case $dst_arg in
|
||||
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
|
||||
if test $# -eq 0; then
|
||||
if test -z "$dir_arg"; then
|
||||
echo "$0: no input file specified." >&2
|
||||
exit 1
|
||||
fi
|
||||
# It's OK to call `install-sh -d' without argument.
|
||||
# This can happen when creating conditional directories.
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if test -z "$dir_arg"; then
|
||||
do_exit='(exit $ret); exit $ret'
|
||||
trap "ret=129; $do_exit" 1
|
||||
trap "ret=130; $do_exit" 2
|
||||
trap "ret=141; $do_exit" 13
|
||||
trap "ret=143; $do_exit" 15
|
||||
|
||||
# Set umask so as not to create temps with too-generous modes.
|
||||
# However, 'strip' requires both read and write access to temps.
|
||||
case $mode in
|
||||
# Optimize common cases.
|
||||
*644) cp_umask=133;;
|
||||
*755) cp_umask=22;;
|
||||
|
||||
*[0-7])
|
||||
if test -z "$stripcmd"; then
|
||||
u_plus_rw=
|
||||
else
|
||||
u_plus_rw='% 200'
|
||||
fi
|
||||
cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
|
||||
*)
|
||||
if test -z "$stripcmd"; then
|
||||
u_plus_rw=
|
||||
else
|
||||
u_plus_rw=,u+rw
|
||||
fi
|
||||
cp_umask=$mode$u_plus_rw;;
|
||||
esac
|
||||
fi
|
||||
|
||||
for src
|
||||
do
|
||||
# Protect names problematic for `test' and other utilities.
|
||||
case $src in
|
||||
-* | [=\(\)!]) src=./$src;;
|
||||
esac
|
||||
|
||||
if test -n "$dir_arg"; then
|
||||
dst=$src
|
||||
dstdir=$dst
|
||||
test -d "$dstdir"
|
||||
dstdir_status=$?
|
||||
else
|
||||
|
||||
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
||||
# might cause directories to be created, which would be especially bad
|
||||
# if $src (and thus $dsttmp) contains '*'.
|
||||
if test ! -f "$src" && test ! -d "$src"; then
|
||||
echo "$0: $src does not exist." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test -z "$dst_arg"; then
|
||||
echo "$0: no destination specified." >&2
|
||||
exit 1
|
||||
fi
|
||||
dst=$dst_arg
|
||||
|
||||
# If destination is a directory, append the input filename; won't work
|
||||
# if double slashes aren't ignored.
|
||||
if test -d "$dst"; then
|
||||
if test -n "$no_target_directory"; then
|
||||
echo "$0: $dst_arg: Is a directory" >&2
|
||||
exit 1
|
||||
fi
|
||||
dstdir=$dst
|
||||
dst=$dstdir/`basename "$src"`
|
||||
dstdir_status=0
|
||||
else
|
||||
# Prefer dirname, but fall back on a substitute if dirname fails.
|
||||
dstdir=`
|
||||
(dirname "$dst") 2>/dev/null ||
|
||||
expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
|
||||
X"$dst" : 'X\(//\)[^/]' \| \
|
||||
X"$dst" : 'X\(//\)$' \| \
|
||||
X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
|
||||
echo X"$dst" |
|
||||
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
/^X\(\/\/\)[^/].*/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
/^X\(\/\/\)$/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
/^X\(\/\).*/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
s/.*/./; q'
|
||||
`
|
||||
|
||||
test -d "$dstdir"
|
||||
dstdir_status=$?
|
||||
fi
|
||||
fi
|
||||
|
||||
obsolete_mkdir_used=false
|
||||
|
||||
if test $dstdir_status != 0; then
|
||||
case $posix_mkdir in
|
||||
'')
|
||||
# Create intermediate dirs using mode 755 as modified by the umask.
|
||||
# This is like FreeBSD 'install' as of 1997-10-28.
|
||||
umask=`umask`
|
||||
case $stripcmd.$umask in
|
||||
# Optimize common cases.
|
||||
*[2367][2367]) mkdir_umask=$umask;;
|
||||
.*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
|
||||
|
||||
*[0-7])
|
||||
mkdir_umask=`expr $umask + 22 \
|
||||
- $umask % 100 % 40 + $umask % 20 \
|
||||
- $umask % 10 % 4 + $umask % 2
|
||||
`;;
|
||||
*) mkdir_umask=$umask,go-w;;
|
||||
esac
|
||||
|
||||
# With -d, create the new directory with the user-specified mode.
|
||||
# Otherwise, rely on $mkdir_umask.
|
||||
if test -n "$dir_arg"; then
|
||||
mkdir_mode=-m$mode
|
||||
else
|
||||
mkdir_mode=
|
||||
fi
|
||||
|
||||
posix_mkdir=false
|
||||
case $umask in
|
||||
*[123567][0-7][0-7])
|
||||
# POSIX mkdir -p sets u+wx bits regardless of umask, which
|
||||
# is incompatible with FreeBSD 'install' when (umask & 300) != 0.
|
||||
;;
|
||||
*)
|
||||
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
|
||||
trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
|
||||
|
||||
if (umask $mkdir_umask &&
|
||||
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
|
||||
then
|
||||
if test -z "$dir_arg" || {
|
||||
# Check for POSIX incompatibilities with -m.
|
||||
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
|
||||
# other-writeable bit of parent directory when it shouldn't.
|
||||
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
|
||||
ls_ld_tmpdir=`ls -ld "$tmpdir"`
|
||||
case $ls_ld_tmpdir in
|
||||
d????-?r-*) different_mode=700;;
|
||||
d????-?--*) different_mode=755;;
|
||||
*) false;;
|
||||
esac &&
|
||||
$mkdirprog -m$different_mode -p -- "$tmpdir" && {
|
||||
ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
|
||||
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
|
||||
}
|
||||
}
|
||||
then posix_mkdir=:
|
||||
fi
|
||||
rmdir "$tmpdir/d" "$tmpdir"
|
||||
else
|
||||
# Remove any dirs left behind by ancient mkdir implementations.
|
||||
rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
|
||||
fi
|
||||
trap '' 0;;
|
||||
esac;;
|
||||
esac
|
||||
|
||||
if
|
||||
$posix_mkdir && (
|
||||
umask $mkdir_umask &&
|
||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
|
||||
)
|
||||
then :
|
||||
else
|
||||
|
||||
# The umask is ridiculous, or mkdir does not conform to POSIX,
|
||||
# or it failed possibly due to a race condition. Create the
|
||||
# directory the slow way, step by step, checking for races as we go.
|
||||
|
||||
case $dstdir in
|
||||
/*) prefix='/';;
|
||||
[-=\(\)!]*) prefix='./';;
|
||||
*) prefix='';;
|
||||
esac
|
||||
|
||||
eval "$initialize_posix_glob"
|
||||
|
||||
oIFS=$IFS
|
||||
IFS=/
|
||||
$posix_glob set -f
|
||||
set fnord $dstdir
|
||||
shift
|
||||
$posix_glob set +f
|
||||
IFS=$oIFS
|
||||
|
||||
prefixes=
|
||||
|
||||
for d
|
||||
do
|
||||
test X"$d" = X && continue
|
||||
|
||||
prefix=$prefix$d
|
||||
if test -d "$prefix"; then
|
||||
prefixes=
|
||||
else
|
||||
if $posix_mkdir; then
|
||||
(umask=$mkdir_umask &&
|
||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
|
||||
# Don't fail if two instances are running concurrently.
|
||||
test -d "$prefix" || exit 1
|
||||
else
|
||||
case $prefix in
|
||||
*\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
|
||||
*) qprefix=$prefix;;
|
||||
esac
|
||||
prefixes="$prefixes '$qprefix'"
|
||||
fi
|
||||
fi
|
||||
prefix=$prefix/
|
||||
done
|
||||
|
||||
if test -n "$prefixes"; then
|
||||
# Don't fail if two instances are running concurrently.
|
||||
(umask $mkdir_umask &&
|
||||
eval "\$doit_exec \$mkdirprog $prefixes") ||
|
||||
test -d "$dstdir" || exit 1
|
||||
obsolete_mkdir_used=true
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if test -n "$dir_arg"; then
|
||||
{ test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
|
||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
|
||||
{ test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
|
||||
test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
|
||||
else
|
||||
|
||||
# Make a couple of temp file names in the proper directory.
|
||||
dsttmp=$dstdir/_inst.$$_
|
||||
rmtmp=$dstdir/_rm.$$_
|
||||
|
||||
# Trap to clean up those temp files at exit.
|
||||
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
||||
|
||||
# Copy the file name to the temp name.
|
||||
(umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
|
||||
|
||||
# and set any options; do chmod last to preserve setuid bits.
|
||||
#
|
||||
# If any of these fail, we abort the whole thing. If we want to
|
||||
# ignore errors from any of these, just make sure not to ignore
|
||||
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
||||
#
|
||||
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
|
||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
|
||||
{ test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
|
||||
{ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
|
||||
|
||||
# If -C, don't bother to copy if it wouldn't change the file.
|
||||
if $copy_on_change &&
|
||||
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
||||
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
||||
|
||||
eval "$initialize_posix_glob" &&
|
||||
$posix_glob set -f &&
|
||||
set X $old && old=:$2:$4:$5:$6 &&
|
||||
set X $new && new=:$2:$4:$5:$6 &&
|
||||
$posix_glob set +f &&
|
||||
|
||||
test "$old" = "$new" &&
|
||||
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
||||
then
|
||||
rm -f "$dsttmp"
|
||||
else
|
||||
# Rename the file to the real destination.
|
||||
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
|
||||
|
||||
# The rename failed, perhaps because mv can't rename something else
|
||||
# to itself, or perhaps because mv is so ancient that it does not
|
||||
# support -f.
|
||||
{
|
||||
# Now remove or move aside any old file at destination location.
|
||||
# We try this two ways since rm can't unlink itself on some
|
||||
# systems and the destination file might be busy for other
|
||||
# reasons. In this case, the final cleanup might fail but the new
|
||||
# file should still install successfully.
|
||||
{
|
||||
test ! -f "$dst" ||
|
||||
$doit $rmcmd -f "$dst" 2>/dev/null ||
|
||||
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
||||
{ $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
|
||||
} ||
|
||||
{ echo "$0: cannot unlink or rename $dst" >&2
|
||||
(exit 1); exit 1
|
||||
}
|
||||
} &&
|
||||
|
||||
# Now rename the file to the real destination.
|
||||
$doit $mvcmd "$dsttmp" "$dst"
|
||||
}
|
||||
fi || exit 1
|
||||
|
||||
trap '' 0
|
||||
fi
|
||||
done
|
||||
|
||||
# Local variables:
|
||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
304
third_party/rust/backtrace-sys/src/libbacktrace/internal.h
vendored
Normal file
304
third_party/rust/backtrace-sys/src/libbacktrace/internal.h
vendored
Normal file
@ -0,0 +1,304 @@
|
||||
/* internal.h -- Internal header file for stack backtrace library.
|
||||
Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
||||
Written by Ian Lance Taylor, Google.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#ifndef BACKTRACE_INTERNAL_H
|
||||
#define BACKTRACE_INTERNAL_H
|
||||
|
||||
/* We assume that <sys/types.h> and "backtrace.h" have already been
|
||||
included. */
|
||||
|
||||
#ifndef GCC_VERSION
|
||||
# define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
|
||||
#endif
|
||||
|
||||
#if (GCC_VERSION < 2007)
|
||||
# define __attribute__(x)
|
||||
#endif
|
||||
|
||||
#ifndef ATTRIBUTE_UNUSED
|
||||
# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
|
||||
#endif
|
||||
|
||||
#ifndef ATTRIBUTE_MALLOC
|
||||
# if (GCC_VERSION >= 2096)
|
||||
# define ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
|
||||
# else
|
||||
# define ATTRIBUTE_MALLOC
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_SYNC_FUNCTIONS
|
||||
|
||||
/* Define out the sync functions. These should never be called if
|
||||
they are not available. */
|
||||
|
||||
#define __sync_bool_compare_and_swap(A, B, C) (abort(), 1)
|
||||
#define __sync_lock_test_and_set(A, B) (abort(), 0)
|
||||
#define __sync_lock_release(A) abort()
|
||||
|
||||
#endif /* !defined (HAVE_SYNC_FUNCTIONS) */
|
||||
|
||||
#ifdef HAVE_ATOMIC_FUNCTIONS
|
||||
|
||||
/* We have the atomic builtin functions. */
|
||||
|
||||
#define backtrace_atomic_load_pointer(p) \
|
||||
__atomic_load_n ((p), __ATOMIC_ACQUIRE)
|
||||
#define backtrace_atomic_load_int(p) \
|
||||
__atomic_load_n ((p), __ATOMIC_ACQUIRE)
|
||||
#define backtrace_atomic_store_pointer(p, v) \
|
||||
__atomic_store_n ((p), (v), __ATOMIC_RELEASE)
|
||||
#define backtrace_atomic_store_size_t(p, v) \
|
||||
__atomic_store_n ((p), (v), __ATOMIC_RELEASE)
|
||||
#define backtrace_atomic_store_int(p, v) \
|
||||
__atomic_store_n ((p), (v), __ATOMIC_RELEASE)
|
||||
|
||||
#else /* !defined (HAVE_ATOMIC_FUNCTIONS) */
|
||||
#ifdef HAVE_SYNC_FUNCTIONS
|
||||
|
||||
/* We have the sync functions but not the atomic functions. Define
|
||||
the atomic ones in terms of the sync ones. */
|
||||
|
||||
extern void *backtrace_atomic_load_pointer (void *);
|
||||
extern int backtrace_atomic_load_int (int *);
|
||||
extern void backtrace_atomic_store_pointer (void *, void *);
|
||||
extern void backtrace_atomic_store_size_t (size_t *, size_t);
|
||||
extern void backtrace_atomic_store_int (int *, int);
|
||||
|
||||
#else /* !defined (HAVE_SYNC_FUNCTIONS) */
|
||||
|
||||
/* We have neither the sync nor the atomic functions. These will
|
||||
never be called. */
|
||||
|
||||
#define backtrace_atomic_load_pointer(p) (abort(), (void *) NULL)
|
||||
#define backtrace_atomic_load_int(p) (abort(), 0)
|
||||
#define backtrace_atomic_store_pointer(p, v) abort()
|
||||
#define backtrace_atomic_store_size_t(p, v) abort()
|
||||
#define backtrace_atomic_store_int(p, v) abort()
|
||||
|
||||
#endif /* !defined (HAVE_SYNC_FUNCTIONS) */
|
||||
#endif /* !defined (HAVE_ATOMIC_FUNCTIONS) */
|
||||
|
||||
/* The type of the function that collects file/line information. This
|
||||
is like backtrace_pcinfo. */
|
||||
|
||||
typedef int (*fileline) (struct backtrace_state *state, uintptr_t pc,
|
||||
backtrace_full_callback callback,
|
||||
backtrace_error_callback error_callback, void *data);
|
||||
|
||||
/* The type of the function that collects symbol information. This is
|
||||
like backtrace_syminfo. */
|
||||
|
||||
typedef void (*syminfo) (struct backtrace_state *state, uintptr_t pc,
|
||||
backtrace_syminfo_callback callback,
|
||||
backtrace_error_callback error_callback, void *data);
|
||||
|
||||
/* What the backtrace state pointer points to. */
|
||||
|
||||
struct backtrace_state
|
||||
{
|
||||
/* The name of the executable. */
|
||||
const char *filename;
|
||||
/* Non-zero if threaded. */
|
||||
int threaded;
|
||||
/* The master lock for fileline_fn, fileline_data, syminfo_fn,
|
||||
syminfo_data, fileline_initialization_failed and everything the
|
||||
data pointers point to. */
|
||||
void *lock;
|
||||
/* The function that returns file/line information. */
|
||||
fileline fileline_fn;
|
||||
/* The data to pass to FILELINE_FN. */
|
||||
void *fileline_data;
|
||||
/* The function that returns symbol information. */
|
||||
syminfo syminfo_fn;
|
||||
/* The data to pass to SYMINFO_FN. */
|
||||
void *syminfo_data;
|
||||
/* Whether initializing the file/line information failed. */
|
||||
int fileline_initialization_failed;
|
||||
/* The lock for the freelist. */
|
||||
int lock_alloc;
|
||||
/* The freelist when using mmap. */
|
||||
struct backtrace_freelist_struct *freelist;
|
||||
};
|
||||
|
||||
/* Open a file for reading. Returns -1 on error. If DOES_NOT_EXIST
|
||||
is not NULL, *DOES_NOT_EXIST will be set to 0 normally and set to 1
|
||||
if the file does not exist. If the file does not exist and
|
||||
DOES_NOT_EXIST is not NULL, the function will return -1 and will
|
||||
not call ERROR_CALLBACK. On other errors, or if DOES_NOT_EXIST is
|
||||
NULL, the function will call ERROR_CALLBACK before returning. */
|
||||
extern int backtrace_open (const char *filename,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data,
|
||||
int *does_not_exist);
|
||||
|
||||
/* A view of the contents of a file. This supports mmap when
|
||||
available. A view will remain in memory even after backtrace_close
|
||||
is called on the file descriptor from which the view was
|
||||
obtained. */
|
||||
|
||||
struct backtrace_view
|
||||
{
|
||||
/* The data that the caller requested. */
|
||||
const void *data;
|
||||
/* The base of the view. */
|
||||
void *base;
|
||||
/* The total length of the view. */
|
||||
size_t len;
|
||||
};
|
||||
|
||||
/* Create a view of SIZE bytes from DESCRIPTOR at OFFSET. Store the
|
||||
result in *VIEW. Returns 1 on success, 0 on error. */
|
||||
extern int backtrace_get_view (struct backtrace_state *state, int descriptor,
|
||||
off_t offset, size_t size,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data, struct backtrace_view *view);
|
||||
|
||||
/* Release a view created by backtrace_get_view. */
|
||||
extern void backtrace_release_view (struct backtrace_state *state,
|
||||
struct backtrace_view *view,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data);
|
||||
|
||||
/* Close a file opened by backtrace_open. Returns 1 on success, 0 on
|
||||
error. */
|
||||
|
||||
extern int backtrace_close (int descriptor,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data);
|
||||
|
||||
/* Sort without using memory. */
|
||||
|
||||
extern void backtrace_qsort (void *base, size_t count, size_t size,
|
||||
int (*compar) (const void *, const void *));
|
||||
|
||||
/* Allocate memory. This is like malloc. If ERROR_CALLBACK is NULL,
|
||||
this does not report an error, it just returns NULL. */
|
||||
|
||||
extern void *backtrace_alloc (struct backtrace_state *state, size_t size,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data) ATTRIBUTE_MALLOC;
|
||||
|
||||
/* Free memory allocated by backtrace_alloc. If ERROR_CALLBACK is
|
||||
NULL, this does not report an error. */
|
||||
|
||||
extern void backtrace_free (struct backtrace_state *state, void *mem,
|
||||
size_t size,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data);
|
||||
|
||||
/* A growable vector of some struct. This is used for more efficient
|
||||
allocation when we don't know the final size of some group of data
|
||||
that we want to represent as an array. */
|
||||
|
||||
struct backtrace_vector
|
||||
{
|
||||
/* The base of the vector. */
|
||||
void *base;
|
||||
/* The number of bytes in the vector. */
|
||||
size_t size;
|
||||
/* The number of bytes available at the current allocation. */
|
||||
size_t alc;
|
||||
};
|
||||
|
||||
/* Grow VEC by SIZE bytes. Return a pointer to the newly allocated
|
||||
bytes. Note that this may move the entire vector to a new memory
|
||||
location. Returns NULL on failure. */
|
||||
|
||||
extern void *backtrace_vector_grow (struct backtrace_state *state, size_t size,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data,
|
||||
struct backtrace_vector *vec);
|
||||
|
||||
/* Finish the current allocation on VEC. Prepare to start a new
|
||||
allocation. The finished allocation will never be freed. Returns
|
||||
a pointer to the base of the finished entries, or NULL on
|
||||
failure. */
|
||||
|
||||
extern void* backtrace_vector_finish (struct backtrace_state *state,
|
||||
struct backtrace_vector *vec,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data);
|
||||
|
||||
/* Release any extra space allocated for VEC. This may change
|
||||
VEC->base. Returns 1 on success, 0 on failure. */
|
||||
|
||||
extern int backtrace_vector_release (struct backtrace_state *state,
|
||||
struct backtrace_vector *vec,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data);
|
||||
|
||||
/* Read initial debug data from a descriptor, and set the
|
||||
fileline_data, syminfo_fn, and syminfo_data fields of STATE.
|
||||
Return the fileln_fn field in *FILELN_FN--this is done this way so
|
||||
that the synchronization code is only implemented once. This is
|
||||
called after the descriptor has first been opened. It will close
|
||||
the descriptor if it is no longer needed. Returns 1 on success, 0
|
||||
on error. There will be multiple implementations of this function,
|
||||
for different file formats. Each system will compile the
|
||||
appropriate one. */
|
||||
|
||||
extern int backtrace_initialize (struct backtrace_state *state,
|
||||
const char *filename,
|
||||
int descriptor,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data,
|
||||
fileline *fileline_fn);
|
||||
|
||||
/* Add file/line information for a DWARF module. */
|
||||
|
||||
extern int backtrace_dwarf_add (struct backtrace_state *state,
|
||||
uintptr_t base_address,
|
||||
const unsigned char* dwarf_info,
|
||||
size_t dwarf_info_size,
|
||||
const unsigned char *dwarf_line,
|
||||
size_t dwarf_line_size,
|
||||
const unsigned char *dwarf_abbrev,
|
||||
size_t dwarf_abbrev_size,
|
||||
const unsigned char *dwarf_ranges,
|
||||
size_t dwarf_range_size,
|
||||
const unsigned char *dwarf_str,
|
||||
size_t dwarf_str_size,
|
||||
int is_bigendian,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data, fileline *fileline_fn);
|
||||
|
||||
/* A test-only hook for elf_uncompress_zdebug. */
|
||||
|
||||
extern int backtrace_uncompress_zdebug (struct backtrace_state *,
|
||||
const unsigned char *compressed,
|
||||
size_t compressed_size,
|
||||
backtrace_error_callback, void *data,
|
||||
unsigned char **uncompressed,
|
||||
size_t *uncompressed_size);
|
||||
|
||||
#endif
|
7874
third_party/rust/backtrace-sys/src/libbacktrace/ltmain.sh
vendored
Executable file
7874
third_party/rust/backtrace-sys/src/libbacktrace/ltmain.sh
vendored
Executable file
File diff suppressed because it is too large
Load Diff
1418
third_party/rust/backtrace-sys/src/libbacktrace/macho.c
vendored
Normal file
1418
third_party/rust/backtrace-sys/src/libbacktrace/macho.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
331
third_party/rust/backtrace-sys/src/libbacktrace/missing
vendored
Executable file
331
third_party/rust/backtrace-sys/src/libbacktrace/missing
vendored
Executable file
@ -0,0 +1,331 @@
|
||||
#! /bin/sh
|
||||
# Common stub for a few missing GNU programs while installing.
|
||||
|
||||
scriptversion=2012-01-06.13; # UTC
|
||||
|
||||
# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
|
||||
# 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
|
||||
# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2, or (at your option)
|
||||
# any later version.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
|
||||
if test $# -eq 0; then
|
||||
echo 1>&2 "Try \`$0 --help' for more information"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
run=:
|
||||
sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
|
||||
sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
|
||||
|
||||
# In the cases where this matters, `missing' is being run in the
|
||||
# srcdir already.
|
||||
if test -f configure.ac; then
|
||||
configure_ac=configure.ac
|
||||
else
|
||||
configure_ac=configure.in
|
||||
fi
|
||||
|
||||
msg="missing on your system"
|
||||
|
||||
case $1 in
|
||||
--run)
|
||||
# Try to run requested program, and just exit if it succeeds.
|
||||
run=
|
||||
shift
|
||||
"$@" && exit 0
|
||||
# Exit code 63 means version mismatch. This often happens
|
||||
# when the user try to use an ancient version of a tool on
|
||||
# a file that requires a minimum version. In this case we
|
||||
# we should proceed has if the program had been absent, or
|
||||
# if --run hadn't been passed.
|
||||
if test $? = 63; then
|
||||
run=:
|
||||
msg="probably too old"
|
||||
fi
|
||||
;;
|
||||
|
||||
-h|--h|--he|--hel|--help)
|
||||
echo "\
|
||||
$0 [OPTION]... PROGRAM [ARGUMENT]...
|
||||
|
||||
Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
|
||||
error status if there is no known handling for PROGRAM.
|
||||
|
||||
Options:
|
||||
-h, --help display this help and exit
|
||||
-v, --version output version information and exit
|
||||
--run try to run the given command, and emulate it if it fails
|
||||
|
||||
Supported PROGRAM values:
|
||||
aclocal touch file \`aclocal.m4'
|
||||
autoconf touch file \`configure'
|
||||
autoheader touch file \`config.h.in'
|
||||
autom4te touch the output file, or create a stub one
|
||||
automake touch all \`Makefile.in' files
|
||||
bison create \`y.tab.[ch]', if possible, from existing .[ch]
|
||||
flex create \`lex.yy.c', if possible, from existing .c
|
||||
help2man touch the output file
|
||||
lex create \`lex.yy.c', if possible, from existing .c
|
||||
makeinfo touch the output file
|
||||
yacc create \`y.tab.[ch]', if possible, from existing .[ch]
|
||||
|
||||
Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
|
||||
\`g' are ignored when checking the name.
|
||||
|
||||
Send bug reports to <bug-automake@gnu.org>."
|
||||
exit $?
|
||||
;;
|
||||
|
||||
-v|--v|--ve|--ver|--vers|--versi|--versio|--version)
|
||||
echo "missing $scriptversion (GNU Automake)"
|
||||
exit $?
|
||||
;;
|
||||
|
||||
-*)
|
||||
echo 1>&2 "$0: Unknown \`$1' option"
|
||||
echo 1>&2 "Try \`$0 --help' for more information"
|
||||
exit 1
|
||||
;;
|
||||
|
||||
esac
|
||||
|
||||
# normalize program name to check for.
|
||||
program=`echo "$1" | sed '
|
||||
s/^gnu-//; t
|
||||
s/^gnu//; t
|
||||
s/^g//; t'`
|
||||
|
||||
# Now exit if we have it, but it failed. Also exit now if we
|
||||
# don't have it and --version was passed (most likely to detect
|
||||
# the program). This is about non-GNU programs, so use $1 not
|
||||
# $program.
|
||||
case $1 in
|
||||
lex*|yacc*)
|
||||
# Not GNU programs, they don't have --version.
|
||||
;;
|
||||
|
||||
*)
|
||||
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
|
||||
# We have it, but it failed.
|
||||
exit 1
|
||||
elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
|
||||
# Could not run --version or --help. This is probably someone
|
||||
# running `$TOOL --version' or `$TOOL --help' to check whether
|
||||
# $TOOL exists and not knowing $TOOL uses missing.
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
# If it does not exist, or fails to run (possibly an outdated version),
|
||||
# try to emulate it.
|
||||
case $program in
|
||||
aclocal*)
|
||||
echo 1>&2 "\
|
||||
WARNING: \`$1' is $msg. You should only need it if
|
||||
you modified \`acinclude.m4' or \`${configure_ac}'. You might want
|
||||
to install the \`Automake' and \`Perl' packages. Grab them from
|
||||
any GNU archive site."
|
||||
touch aclocal.m4
|
||||
;;
|
||||
|
||||
autoconf*)
|
||||
echo 1>&2 "\
|
||||
WARNING: \`$1' is $msg. You should only need it if
|
||||
you modified \`${configure_ac}'. You might want to install the
|
||||
\`Autoconf' and \`GNU m4' packages. Grab them from any GNU
|
||||
archive site."
|
||||
touch configure
|
||||
;;
|
||||
|
||||
autoheader*)
|
||||
echo 1>&2 "\
|
||||
WARNING: \`$1' is $msg. You should only need it if
|
||||
you modified \`acconfig.h' or \`${configure_ac}'. You might want
|
||||
to install the \`Autoconf' and \`GNU m4' packages. Grab them
|
||||
from any GNU archive site."
|
||||
files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
|
||||
test -z "$files" && files="config.h"
|
||||
touch_files=
|
||||
for f in $files; do
|
||||
case $f in
|
||||
*:*) touch_files="$touch_files "`echo "$f" |
|
||||
sed -e 's/^[^:]*://' -e 's/:.*//'`;;
|
||||
*) touch_files="$touch_files $f.in";;
|
||||
esac
|
||||
done
|
||||
touch $touch_files
|
||||
;;
|
||||
|
||||
automake*)
|
||||
echo 1>&2 "\
|
||||
WARNING: \`$1' is $msg. You should only need it if
|
||||
you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
|
||||
You might want to install the \`Automake' and \`Perl' packages.
|
||||
Grab them from any GNU archive site."
|
||||
find . -type f -name Makefile.am -print |
|
||||
sed 's/\.am$/.in/' |
|
||||
while read f; do touch "$f"; done
|
||||
;;
|
||||
|
||||
autom4te*)
|
||||
echo 1>&2 "\
|
||||
WARNING: \`$1' is needed, but is $msg.
|
||||
You might have modified some files without having the
|
||||
proper tools for further handling them.
|
||||
You can get \`$1' as part of \`Autoconf' from any GNU
|
||||
archive site."
|
||||
|
||||
file=`echo "$*" | sed -n "$sed_output"`
|
||||
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
||||
if test -f "$file"; then
|
||||
touch $file
|
||||
else
|
||||
test -z "$file" || exec >$file
|
||||
echo "#! /bin/sh"
|
||||
echo "# Created by GNU Automake missing as a replacement of"
|
||||
echo "# $ $@"
|
||||
echo "exit 0"
|
||||
chmod +x $file
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
|
||||
bison*|yacc*)
|
||||
echo 1>&2 "\
|
||||
WARNING: \`$1' $msg. You should only need it if
|
||||
you modified a \`.y' file. You may need the \`Bison' package
|
||||
in order for those modifications to take effect. You can get
|
||||
\`Bison' from any GNU archive site."
|
||||
rm -f y.tab.c y.tab.h
|
||||
if test $# -ne 1; then
|
||||
eval LASTARG=\${$#}
|
||||
case $LASTARG in
|
||||
*.y)
|
||||
SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
|
||||
if test -f "$SRCFILE"; then
|
||||
cp "$SRCFILE" y.tab.c
|
||||
fi
|
||||
SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
|
||||
if test -f "$SRCFILE"; then
|
||||
cp "$SRCFILE" y.tab.h
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
if test ! -f y.tab.h; then
|
||||
echo >y.tab.h
|
||||
fi
|
||||
if test ! -f y.tab.c; then
|
||||
echo 'main() { return 0; }' >y.tab.c
|
||||
fi
|
||||
;;
|
||||
|
||||
lex*|flex*)
|
||||
echo 1>&2 "\
|
||||
WARNING: \`$1' is $msg. You should only need it if
|
||||
you modified a \`.l' file. You may need the \`Flex' package
|
||||
in order for those modifications to take effect. You can get
|
||||
\`Flex' from any GNU archive site."
|
||||
rm -f lex.yy.c
|
||||
if test $# -ne 1; then
|
||||
eval LASTARG=\${$#}
|
||||
case $LASTARG in
|
||||
*.l)
|
||||
SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
|
||||
if test -f "$SRCFILE"; then
|
||||
cp "$SRCFILE" lex.yy.c
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
if test ! -f lex.yy.c; then
|
||||
echo 'main() { return 0; }' >lex.yy.c
|
||||
fi
|
||||
;;
|
||||
|
||||
help2man*)
|
||||
echo 1>&2 "\
|
||||
WARNING: \`$1' is $msg. You should only need it if
|
||||
you modified a dependency of a manual page. You may need the
|
||||
\`Help2man' package in order for those modifications to take
|
||||
effect. You can get \`Help2man' from any GNU archive site."
|
||||
|
||||
file=`echo "$*" | sed -n "$sed_output"`
|
||||
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
||||
if test -f "$file"; then
|
||||
touch $file
|
||||
else
|
||||
test -z "$file" || exec >$file
|
||||
echo ".ab help2man is required to generate this page"
|
||||
exit $?
|
||||
fi
|
||||
;;
|
||||
|
||||
makeinfo*)
|
||||
echo 1>&2 "\
|
||||
WARNING: \`$1' is $msg. You should only need it if
|
||||
you modified a \`.texi' or \`.texinfo' file, or any other file
|
||||
indirectly affecting the aspect of the manual. The spurious
|
||||
call might also be the consequence of using a buggy \`make' (AIX,
|
||||
DU, IRIX). You might want to install the \`Texinfo' package or
|
||||
the \`GNU make' package. Grab either from any GNU archive site."
|
||||
# The file to touch is that specified with -o ...
|
||||
file=`echo "$*" | sed -n "$sed_output"`
|
||||
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
||||
if test -z "$file"; then
|
||||
# ... or it is the one specified with @setfilename ...
|
||||
infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
|
||||
file=`sed -n '
|
||||
/^@setfilename/{
|
||||
s/.* \([^ ]*\) *$/\1/
|
||||
p
|
||||
q
|
||||
}' $infile`
|
||||
# ... or it is derived from the source name (dir/f.texi becomes f.info)
|
||||
test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
|
||||
fi
|
||||
# If the file does not exist, the user really needs makeinfo;
|
||||
# let's fail without touching anything.
|
||||
test -f $file || exit 1
|
||||
touch $file
|
||||
;;
|
||||
|
||||
*)
|
||||
echo 1>&2 "\
|
||||
WARNING: \`$1' is needed, and is $msg.
|
||||
You might have modified some files without having the
|
||||
proper tools for further handling them. Check the \`README' file,
|
||||
it often tells you about the needed prerequisites for installing
|
||||
this package. You may also peek at any GNU archive site, in case
|
||||
some other package would contain this missing \`$1' program."
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
exit 0
|
||||
|
||||
# Local variables:
|
||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
325
third_party/rust/backtrace-sys/src/libbacktrace/mmap.c
vendored
Normal file
325
third_party/rust/backtrace-sys/src/libbacktrace/mmap.c
vendored
Normal file
@ -0,0 +1,325 @@
|
||||
/* mmap.c -- Memory allocation with mmap.
|
||||
Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
||||
Written by Ian Lance Taylor, Google.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
#include "backtrace.h"
|
||||
#include "internal.h"
|
||||
|
||||
/* Memory allocation on systems that provide anonymous mmap. This
|
||||
permits the backtrace functions to be invoked from a signal
|
||||
handler, assuming that mmap is async-signal safe. */
|
||||
|
||||
#ifndef MAP_ANONYMOUS
|
||||
#define MAP_ANONYMOUS MAP_ANON
|
||||
#endif
|
||||
|
||||
#ifndef MAP_FAILED
|
||||
#define MAP_FAILED ((void *)-1)
|
||||
#endif
|
||||
|
||||
/* A list of free memory blocks. */
|
||||
|
||||
struct backtrace_freelist_struct
|
||||
{
|
||||
/* Next on list. */
|
||||
struct backtrace_freelist_struct *next;
|
||||
/* Size of this block, including this structure. */
|
||||
size_t size;
|
||||
};
|
||||
|
||||
/* Free memory allocated by backtrace_alloc. */
|
||||
|
||||
static void
|
||||
backtrace_free_locked (struct backtrace_state *state, void *addr, size_t size)
|
||||
{
|
||||
/* Just leak small blocks. We don't have to be perfect. Don't put
|
||||
more than 16 entries on the free list, to avoid wasting time
|
||||
searching when allocating a block. If we have more than 16
|
||||
entries, leak the smallest entry. */
|
||||
|
||||
if (size >= sizeof (struct backtrace_freelist_struct))
|
||||
{
|
||||
size_t c;
|
||||
struct backtrace_freelist_struct **ppsmall;
|
||||
struct backtrace_freelist_struct **pp;
|
||||
struct backtrace_freelist_struct *p;
|
||||
|
||||
c = 0;
|
||||
ppsmall = NULL;
|
||||
for (pp = &state->freelist; *pp != NULL; pp = &(*pp)->next)
|
||||
{
|
||||
if (ppsmall == NULL || (*pp)->size < (*ppsmall)->size)
|
||||
ppsmall = pp;
|
||||
++c;
|
||||
}
|
||||
if (c >= 16)
|
||||
{
|
||||
if (size <= (*ppsmall)->size)
|
||||
return;
|
||||
*ppsmall = (*ppsmall)->next;
|
||||
}
|
||||
|
||||
p = (struct backtrace_freelist_struct *) addr;
|
||||
p->next = state->freelist;
|
||||
p->size = size;
|
||||
state->freelist = p;
|
||||
}
|
||||
}
|
||||
|
||||
/* Allocate memory like malloc. If ERROR_CALLBACK is NULL, don't
|
||||
report an error. */
|
||||
|
||||
void *
|
||||
backtrace_alloc (struct backtrace_state *state,
|
||||
size_t size, backtrace_error_callback error_callback,
|
||||
void *data)
|
||||
{
|
||||
void *ret;
|
||||
int locked;
|
||||
struct backtrace_freelist_struct **pp;
|
||||
size_t pagesize;
|
||||
size_t asksize;
|
||||
void *page;
|
||||
|
||||
ret = NULL;
|
||||
|
||||
/* If we can acquire the lock, then see if there is space on the
|
||||
free list. If we can't acquire the lock, drop straight into
|
||||
using mmap. __sync_lock_test_and_set returns the old state of
|
||||
the lock, so we have acquired it if it returns 0. */
|
||||
|
||||
if (!state->threaded)
|
||||
locked = 1;
|
||||
else
|
||||
locked = __sync_lock_test_and_set (&state->lock_alloc, 1) == 0;
|
||||
|
||||
if (locked)
|
||||
{
|
||||
for (pp = &state->freelist; *pp != NULL; pp = &(*pp)->next)
|
||||
{
|
||||
if ((*pp)->size >= size)
|
||||
{
|
||||
struct backtrace_freelist_struct *p;
|
||||
|
||||
p = *pp;
|
||||
*pp = p->next;
|
||||
|
||||
/* Round for alignment; we assume that no type we care about
|
||||
is more than 8 bytes. */
|
||||
size = (size + 7) & ~ (size_t) 7;
|
||||
if (size < p->size)
|
||||
backtrace_free_locked (state, (char *) p + size,
|
||||
p->size - size);
|
||||
|
||||
ret = (void *) p;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (state->threaded)
|
||||
__sync_lock_release (&state->lock_alloc);
|
||||
}
|
||||
|
||||
if (ret == NULL)
|
||||
{
|
||||
/* Allocate a new page. */
|
||||
|
||||
pagesize = getpagesize ();
|
||||
asksize = (size + pagesize - 1) & ~ (pagesize - 1);
|
||||
page = mmap (NULL, asksize, PROT_READ | PROT_WRITE,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||
if (page == MAP_FAILED)
|
||||
{
|
||||
if (error_callback)
|
||||
error_callback (data, "mmap", errno);
|
||||
}
|
||||
else
|
||||
{
|
||||
size = (size + 7) & ~ (size_t) 7;
|
||||
if (size < asksize)
|
||||
backtrace_free (state, (char *) page + size, asksize - size,
|
||||
error_callback, data);
|
||||
|
||||
ret = page;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Free memory allocated by backtrace_alloc. */
|
||||
|
||||
void
|
||||
backtrace_free (struct backtrace_state *state, void *addr, size_t size,
|
||||
backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
|
||||
void *data ATTRIBUTE_UNUSED)
|
||||
{
|
||||
int locked;
|
||||
|
||||
/* If we are freeing a large aligned block, just release it back to
|
||||
the system. This case arises when growing a vector for a large
|
||||
binary with lots of debug info. Calling munmap here may cause us
|
||||
to call mmap again if there is also a large shared library; we
|
||||
just live with that. */
|
||||
if (size >= 16 * 4096)
|
||||
{
|
||||
size_t pagesize;
|
||||
|
||||
pagesize = getpagesize ();
|
||||
if (((uintptr_t) addr & (pagesize - 1)) == 0
|
||||
&& (size & (pagesize - 1)) == 0)
|
||||
{
|
||||
/* If munmap fails for some reason, just add the block to
|
||||
the freelist. */
|
||||
if (munmap (addr, size) == 0)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* If we can acquire the lock, add the new space to the free list.
|
||||
If we can't acquire the lock, just leak the memory.
|
||||
__sync_lock_test_and_set returns the old state of the lock, so we
|
||||
have acquired it if it returns 0. */
|
||||
|
||||
if (!state->threaded)
|
||||
locked = 1;
|
||||
else
|
||||
locked = __sync_lock_test_and_set (&state->lock_alloc, 1) == 0;
|
||||
|
||||
if (locked)
|
||||
{
|
||||
backtrace_free_locked (state, addr, size);
|
||||
|
||||
if (state->threaded)
|
||||
__sync_lock_release (&state->lock_alloc);
|
||||
}
|
||||
}
|
||||
|
||||
/* Grow VEC by SIZE bytes. */
|
||||
|
||||
void *
|
||||
backtrace_vector_grow (struct backtrace_state *state,size_t size,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data, struct backtrace_vector *vec)
|
||||
{
|
||||
void *ret;
|
||||
|
||||
if (size > vec->alc)
|
||||
{
|
||||
size_t pagesize;
|
||||
size_t alc;
|
||||
void *base;
|
||||
|
||||
pagesize = getpagesize ();
|
||||
alc = vec->size + size;
|
||||
if (vec->size == 0)
|
||||
alc = 16 * size;
|
||||
else if (alc < pagesize)
|
||||
{
|
||||
alc *= 2;
|
||||
if (alc > pagesize)
|
||||
alc = pagesize;
|
||||
}
|
||||
else
|
||||
{
|
||||
alc *= 2;
|
||||
alc = (alc + pagesize - 1) & ~ (pagesize - 1);
|
||||
}
|
||||
base = backtrace_alloc (state, alc, error_callback, data);
|
||||
if (base == NULL)
|
||||
return NULL;
|
||||
if (vec->base != NULL)
|
||||
{
|
||||
memcpy (base, vec->base, vec->size);
|
||||
backtrace_free (state, vec->base, vec->size + vec->alc,
|
||||
error_callback, data);
|
||||
}
|
||||
vec->base = base;
|
||||
vec->alc = alc - vec->size;
|
||||
}
|
||||
|
||||
ret = (char *) vec->base + vec->size;
|
||||
vec->size += size;
|
||||
vec->alc -= size;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Finish the current allocation on VEC. */
|
||||
|
||||
void *
|
||||
backtrace_vector_finish (
|
||||
struct backtrace_state *state ATTRIBUTE_UNUSED,
|
||||
struct backtrace_vector *vec,
|
||||
backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
|
||||
void *data ATTRIBUTE_UNUSED)
|
||||
{
|
||||
void *ret;
|
||||
|
||||
ret = vec->base;
|
||||
vec->base = (char *) vec->base + vec->size;
|
||||
vec->size = 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Release any extra space allocated for VEC. */
|
||||
|
||||
int
|
||||
backtrace_vector_release (struct backtrace_state *state,
|
||||
struct backtrace_vector *vec,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data)
|
||||
{
|
||||
size_t size;
|
||||
size_t alc;
|
||||
size_t aligned;
|
||||
|
||||
/* Make sure that the block that we free is aligned on an 8-byte
|
||||
boundary. */
|
||||
size = vec->size;
|
||||
alc = vec->alc;
|
||||
aligned = (size + 7) & ~ (size_t) 7;
|
||||
alc -= aligned - size;
|
||||
|
||||
backtrace_free (state, (char *) vec->base + aligned, alc,
|
||||
error_callback, data);
|
||||
vec->alc = 0;
|
||||
return 1;
|
||||
}
|
100
third_party/rust/backtrace-sys/src/libbacktrace/mmapio.c
vendored
Normal file
100
third_party/rust/backtrace-sys/src/libbacktrace/mmapio.c
vendored
Normal file
@ -0,0 +1,100 @@
|
||||
/* mmapio.c -- File views using mmap.
|
||||
Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
||||
Written by Ian Lance Taylor, Google.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/mman.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "backtrace.h"
|
||||
#include "internal.h"
|
||||
|
||||
#ifndef MAP_FAILED
|
||||
#define MAP_FAILED ((void *)-1)
|
||||
#endif
|
||||
|
||||
/* This file implements file views and memory allocation when mmap is
|
||||
available. */
|
||||
|
||||
/* Create a view of SIZE bytes from DESCRIPTOR at OFFSET. */
|
||||
|
||||
int
|
||||
backtrace_get_view (struct backtrace_state *state ATTRIBUTE_UNUSED,
|
||||
int descriptor, off_t offset, size_t size,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data, struct backtrace_view *view)
|
||||
{
|
||||
size_t pagesize;
|
||||
unsigned int inpage;
|
||||
off_t pageoff;
|
||||
void *map;
|
||||
|
||||
pagesize = getpagesize ();
|
||||
inpage = offset % pagesize;
|
||||
pageoff = offset - inpage;
|
||||
|
||||
size += inpage;
|
||||
size = (size + (pagesize - 1)) & ~ (pagesize - 1);
|
||||
|
||||
map = mmap (NULL, size, PROT_READ, MAP_PRIVATE, descriptor, pageoff);
|
||||
if (map == MAP_FAILED)
|
||||
{
|
||||
error_callback (data, "mmap", errno);
|
||||
return 0;
|
||||
}
|
||||
|
||||
view->data = (char *) map + inpage;
|
||||
view->base = map;
|
||||
view->len = size;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Release a view read by backtrace_get_view. */
|
||||
|
||||
void
|
||||
backtrace_release_view (struct backtrace_state *state ATTRIBUTE_UNUSED,
|
||||
struct backtrace_view *view,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data)
|
||||
{
|
||||
union {
|
||||
const void *cv;
|
||||
void *v;
|
||||
} const_cast;
|
||||
|
||||
const_cast.cv = view->base;
|
||||
if (munmap (const_cast.v, view->len) < 0)
|
||||
error_callback (data, "munmap", errno);
|
||||
}
|
83
third_party/rust/backtrace-sys/src/libbacktrace/move-if-change
vendored
Normal file
83
third_party/rust/backtrace-sys/src/libbacktrace/move-if-change
vendored
Normal file
@ -0,0 +1,83 @@
|
||||
#!/bin/sh
|
||||
# Like mv $1 $2, but if the files are the same, just delete $1.
|
||||
# Status is zero if successful, nonzero otherwise.
|
||||
|
||||
VERSION='2012-01-06 07:23'; # UTC
|
||||
# The definition above must lie within the first 8 lines in order
|
||||
# for the Emacs time-stamp write hook (at end) to update it.
|
||||
# If you change this file with Emacs, please let the write hook
|
||||
# do its job. Otherwise, update this string manually.
|
||||
|
||||
# Copyright (C) 2002-2014 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
usage="usage: $0 SOURCE DEST"
|
||||
|
||||
help="$usage
|
||||
or: $0 OPTION
|
||||
If SOURCE is different than DEST, then move it to DEST; else remove SOURCE.
|
||||
|
||||
--help display this help and exit
|
||||
--version output version information and exit
|
||||
|
||||
The variable CMPPROG can be used to specify an alternative to 'cmp'.
|
||||
|
||||
Report bugs to <bug-gnulib@gnu.org>."
|
||||
|
||||
version=`expr "$VERSION" : '\([^ ]*\)'`
|
||||
version="move-if-change (gnulib) $version
|
||||
Copyright (C) 2011 Free Software Foundation, Inc.
|
||||
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
|
||||
This is free software: you are free to change and redistribute it.
|
||||
There is NO WARRANTY, to the extent permitted by law."
|
||||
|
||||
cmpprog=${CMPPROG-cmp}
|
||||
|
||||
for arg
|
||||
do
|
||||
case $arg in
|
||||
--help | --hel | --he | --h)
|
||||
exec echo "$help" ;;
|
||||
--version | --versio | --versi | --vers | --ver | --ve | --v)
|
||||
exec echo "$version" ;;
|
||||
--)
|
||||
shift
|
||||
break ;;
|
||||
-*)
|
||||
echo "$0: invalid option: $arg" >&2
|
||||
exit 1 ;;
|
||||
*)
|
||||
break ;;
|
||||
esac
|
||||
done
|
||||
|
||||
test $# -eq 2 || { echo "$0: $usage" >&2; exit 1; }
|
||||
|
||||
if test -r "$2" && $cmpprog -- "$1" "$2" >/dev/null; then
|
||||
rm -f -- "$1"
|
||||
else
|
||||
if mv -f -- "$1" "$2"; then :; else
|
||||
# Ignore failure due to a concurrent move-if-change.
|
||||
test -r "$2" && $cmpprog -- "$1" "$2" >/dev/null && rm -f -- "$1"
|
||||
fi
|
||||
fi
|
||||
|
||||
## Local Variables:
|
||||
## eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
## time-stamp-start: "VERSION='"
|
||||
## time-stamp-format: "%:y-%02m-%02d %02H:%02M"
|
||||
## time-stamp-time-zone: "UTC"
|
||||
## time-stamp-end: "'; # UTC"
|
||||
## End:
|
66
third_party/rust/backtrace-sys/src/libbacktrace/nounwind.c
vendored
Normal file
66
third_party/rust/backtrace-sys/src/libbacktrace/nounwind.c
vendored
Normal file
@ -0,0 +1,66 @@
|
||||
/* backtrace.c -- Entry point for stack backtrace library.
|
||||
Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
||||
Written by Ian Lance Taylor, Google.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "backtrace.h"
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
/* This source file is compiled if the unwind library is not
|
||||
available. */
|
||||
|
||||
int
|
||||
backtrace_full (struct backtrace_state *state ATTRIBUTE_UNUSED,
|
||||
int skip ATTRIBUTE_UNUSED,
|
||||
backtrace_full_callback callback ATTRIBUTE_UNUSED,
|
||||
backtrace_error_callback error_callback, void *data)
|
||||
{
|
||||
error_callback (data,
|
||||
"no stack trace because unwind library not available",
|
||||
0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
backtrace_simple (struct backtrace_state *state ATTRIBUTE_UNUSED,
|
||||
int skip ATTRIBUTE_UNUSED,
|
||||
backtrace_simple_callback callback ATTRIBUTE_UNUSED,
|
||||
backtrace_error_callback error_callback, void *data)
|
||||
{
|
||||
error_callback (data,
|
||||
"no stack trace because unwind library not available",
|
||||
0);
|
||||
return 0;
|
||||
}
|
943
third_party/rust/backtrace-sys/src/libbacktrace/pecoff.c
vendored
Normal file
943
third_party/rust/backtrace-sys/src/libbacktrace/pecoff.c
vendored
Normal file
@ -0,0 +1,943 @@
|
||||
/* pecoff.c -- Get debug data from a PE/COFFF file for backtraces.
|
||||
Copyright (C) 2015-2018 Free Software Foundation, Inc.
|
||||
Adapted from elf.c by Tristan Gingold, AdaCore.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "backtrace.h"
|
||||
#include "internal.h"
|
||||
|
||||
/* Coff file header. */
|
||||
|
||||
typedef struct {
|
||||
uint16_t machine;
|
||||
uint16_t number_of_sections;
|
||||
uint32_t time_date_stamp;
|
||||
uint32_t pointer_to_symbol_table;
|
||||
uint32_t number_of_symbols;
|
||||
uint16_t size_of_optional_header;
|
||||
uint16_t characteristics;
|
||||
} b_coff_file_header;
|
||||
|
||||
/* Coff optional header. */
|
||||
|
||||
typedef struct {
|
||||
uint16_t magic;
|
||||
uint8_t major_linker_version;
|
||||
uint8_t minor_linker_version;
|
||||
uint32_t size_of_code;
|
||||
uint32_t size_of_initialized_data;
|
||||
uint32_t size_of_uninitialized_data;
|
||||
uint32_t address_of_entry_point;
|
||||
uint32_t base_of_code;
|
||||
union {
|
||||
struct {
|
||||
uint32_t base_of_data;
|
||||
uint32_t image_base;
|
||||
} pe;
|
||||
struct {
|
||||
uint64_t image_base;
|
||||
} pep;
|
||||
} u;
|
||||
} b_coff_optional_header;
|
||||
|
||||
/* Values of magic in optional header. */
|
||||
|
||||
#define PE_MAGIC 0x10b /* PE32 executable. */
|
||||
#define PEP_MAGIC 0x20b /* PE32+ executable (for 64bit targets). */
|
||||
|
||||
/* Coff section header. */
|
||||
|
||||
typedef struct {
|
||||
char name[8];
|
||||
uint32_t virtual_size;
|
||||
uint32_t virtual_address;
|
||||
uint32_t size_of_raw_data;
|
||||
uint32_t pointer_to_raw_data;
|
||||
uint32_t pointer_to_relocations;
|
||||
uint32_t pointer_to_line_numbers;
|
||||
uint16_t number_of_relocations;
|
||||
uint16_t number_of_line_numbers;
|
||||
uint32_t characteristics;
|
||||
} b_coff_section_header;
|
||||
|
||||
/* Coff symbol name. */
|
||||
|
||||
typedef union {
|
||||
char short_name[8];
|
||||
struct {
|
||||
unsigned char zeroes[4];
|
||||
unsigned char off[4];
|
||||
} long_name;
|
||||
} b_coff_name;
|
||||
|
||||
/* Coff symbol (external representation which is unaligned). */
|
||||
|
||||
typedef struct {
|
||||
b_coff_name name;
|
||||
unsigned char value[4];
|
||||
unsigned char section_number[2];
|
||||
unsigned char type[2];
|
||||
unsigned char storage_class;
|
||||
unsigned char number_of_aux_symbols;
|
||||
} b_coff_external_symbol;
|
||||
|
||||
/* Symbol types. */
|
||||
|
||||
#define N_TBSHFT 4 /* Shift for the derived type. */
|
||||
#define IMAGE_SYM_DTYPE_FUNCTION 2 /* Function derived type. */
|
||||
|
||||
/* Size of a coff symbol. */
|
||||
|
||||
#define SYM_SZ 18
|
||||
|
||||
/* Coff symbol, internal representation (aligned). */
|
||||
|
||||
typedef struct {
|
||||
const char *name;
|
||||
uint32_t value;
|
||||
int16_t sec;
|
||||
uint16_t type;
|
||||
uint16_t sc;
|
||||
} b_coff_internal_symbol;
|
||||
|
||||
/* An index of sections we care about. */
|
||||
|
||||
enum debug_section
|
||||
{
|
||||
DEBUG_INFO,
|
||||
DEBUG_LINE,
|
||||
DEBUG_ABBREV,
|
||||
DEBUG_RANGES,
|
||||
DEBUG_STR,
|
||||
DEBUG_MAX
|
||||
};
|
||||
|
||||
/* Names of sections, indexed by enum debug_section. */
|
||||
|
||||
static const char * const debug_section_names[DEBUG_MAX] =
|
||||
{
|
||||
".debug_info",
|
||||
".debug_line",
|
||||
".debug_abbrev",
|
||||
".debug_ranges",
|
||||
".debug_str"
|
||||
};
|
||||
|
||||
/* Information we gather for the sections we care about. */
|
||||
|
||||
struct debug_section_info
|
||||
{
|
||||
/* Section file offset. */
|
||||
off_t offset;
|
||||
/* Section size. */
|
||||
size_t size;
|
||||
/* Section contents, after read from file. */
|
||||
const unsigned char *data;
|
||||
};
|
||||
|
||||
/* Information we keep for an coff symbol. */
|
||||
|
||||
struct coff_symbol
|
||||
{
|
||||
/* The name of the symbol. */
|
||||
const char *name;
|
||||
/* The address of the symbol. */
|
||||
uintptr_t address;
|
||||
};
|
||||
|
||||
/* Information to pass to coff_syminfo. */
|
||||
|
||||
struct coff_syminfo_data
|
||||
{
|
||||
/* Symbols for the next module. */
|
||||
struct coff_syminfo_data *next;
|
||||
/* The COFF symbols, sorted by address. */
|
||||
struct coff_symbol *symbols;
|
||||
/* The number of symbols. */
|
||||
size_t count;
|
||||
};
|
||||
|
||||
/* A dummy callback function used when we can't find any debug info. */
|
||||
|
||||
static int
|
||||
coff_nodebug (struct backtrace_state *state ATTRIBUTE_UNUSED,
|
||||
uintptr_t pc ATTRIBUTE_UNUSED,
|
||||
backtrace_full_callback callback ATTRIBUTE_UNUSED,
|
||||
backtrace_error_callback error_callback, void *data)
|
||||
{
|
||||
error_callback (data, "no debug info in PE/COFF executable", -1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* A dummy callback function used when we can't find a symbol
|
||||
table. */
|
||||
|
||||
static void
|
||||
coff_nosyms (struct backtrace_state *state ATTRIBUTE_UNUSED,
|
||||
uintptr_t addr ATTRIBUTE_UNUSED,
|
||||
backtrace_syminfo_callback callback ATTRIBUTE_UNUSED,
|
||||
backtrace_error_callback error_callback, void *data)
|
||||
{
|
||||
error_callback (data, "no symbol table in PE/COFF executable", -1);
|
||||
}
|
||||
|
||||
/* Read a potentially unaligned 4 byte word at P, using native endianness. */
|
||||
|
||||
static uint32_t
|
||||
coff_read4 (const unsigned char *p)
|
||||
{
|
||||
uint32_t res;
|
||||
|
||||
memcpy (&res, p, 4);
|
||||
return res;
|
||||
}
|
||||
|
||||
/* Read a potentially unaligned 2 byte word at P, using native endianness.
|
||||
All 2 byte word in symbols are always aligned, but for coherency all
|
||||
fields are declared as char arrays. */
|
||||
|
||||
static uint16_t
|
||||
coff_read2 (const unsigned char *p)
|
||||
{
|
||||
uint16_t res;
|
||||
|
||||
memcpy (&res, p, sizeof (res));
|
||||
return res;
|
||||
}
|
||||
|
||||
/* Return the length (without the trailing 0) of a COFF short name. */
|
||||
|
||||
static size_t
|
||||
coff_short_name_len (const char *name)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
if (name[i] == 0)
|
||||
return i;
|
||||
return 8;
|
||||
}
|
||||
|
||||
/* Return true iff COFF short name CNAME is the same as NAME (a NUL-terminated
|
||||
string). */
|
||||
|
||||
static int
|
||||
coff_short_name_eq (const char *name, const char *cname)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
if (name[i] != cname[i])
|
||||
return 0;
|
||||
if (name[i] == 0)
|
||||
return 1;
|
||||
}
|
||||
return name[8] == 0;
|
||||
}
|
||||
|
||||
/* Return true iff NAME is the same as string at offset OFF. */
|
||||
|
||||
static int
|
||||
coff_long_name_eq (const char *name, unsigned int off,
|
||||
struct backtrace_view *str_view)
|
||||
{
|
||||
if (off >= str_view->len)
|
||||
return 0;
|
||||
return strcmp (name, (const char *)str_view->data + off) == 0;
|
||||
}
|
||||
|
||||
/* Compare struct coff_symbol for qsort. */
|
||||
|
||||
static int
|
||||
coff_symbol_compare (const void *v1, const void *v2)
|
||||
{
|
||||
const struct coff_symbol *e1 = (const struct coff_symbol *) v1;
|
||||
const struct coff_symbol *e2 = (const struct coff_symbol *) v2;
|
||||
|
||||
if (e1->address < e2->address)
|
||||
return -1;
|
||||
else if (e1->address > e2->address)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Convert SYM to internal (and aligned) format ISYM, using string table
|
||||
from STRTAB and STRTAB_SIZE, and number of sections SECTS_NUM.
|
||||
Return -1 in case of error (invalid section number or string index). */
|
||||
|
||||
static int
|
||||
coff_expand_symbol (b_coff_internal_symbol *isym,
|
||||
const b_coff_external_symbol *sym,
|
||||
uint16_t sects_num,
|
||||
const unsigned char *strtab, size_t strtab_size)
|
||||
{
|
||||
isym->type = coff_read2 (sym->type);
|
||||
isym->sec = coff_read2 (sym->section_number);
|
||||
isym->sc = sym->storage_class;
|
||||
|
||||
if (isym->sec > 0 && (uint16_t) isym->sec > sects_num)
|
||||
return -1;
|
||||
if (sym->name.short_name[0] != 0)
|
||||
isym->name = sym->name.short_name;
|
||||
else
|
||||
{
|
||||
uint32_t off = coff_read4 (sym->name.long_name.off);
|
||||
|
||||
if (off >= strtab_size)
|
||||
return -1;
|
||||
isym->name = (const char *) strtab + off;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Return true iff SYM is a defined symbol for a function. Data symbols
|
||||
aren't considered because they aren't easily identified (same type as
|
||||
section names, presence of symbols defined by the linker script). */
|
||||
|
||||
static int
|
||||
coff_is_function_symbol (const b_coff_internal_symbol *isym)
|
||||
{
|
||||
return (isym->type >> N_TBSHFT) == IMAGE_SYM_DTYPE_FUNCTION
|
||||
&& isym->sec > 0;
|
||||
}
|
||||
|
||||
/* Initialize the symbol table info for coff_syminfo. */
|
||||
|
||||
static int
|
||||
coff_initialize_syminfo (struct backtrace_state *state,
|
||||
uintptr_t base_address,
|
||||
const b_coff_section_header *sects, size_t sects_num,
|
||||
const b_coff_external_symbol *syms, size_t syms_size,
|
||||
const unsigned char *strtab, size_t strtab_size,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data, struct coff_syminfo_data *sdata)
|
||||
{
|
||||
size_t syms_count;
|
||||
char *coff_symstr;
|
||||
size_t coff_symstr_len;
|
||||
size_t coff_symbol_count;
|
||||
size_t coff_symbol_size;
|
||||
struct coff_symbol *coff_symbols;
|
||||
struct coff_symbol *coff_sym;
|
||||
char *coff_str;
|
||||
size_t i;
|
||||
|
||||
syms_count = syms_size / SYM_SZ;
|
||||
|
||||
/* We only care about function symbols. Count them. Also count size of
|
||||
strings for in-symbol names. */
|
||||
coff_symbol_count = 0;
|
||||
coff_symstr_len = 0;
|
||||
for (i = 0; i < syms_count; ++i)
|
||||
{
|
||||
const b_coff_external_symbol *asym = &syms[i];
|
||||
b_coff_internal_symbol isym;
|
||||
|
||||
if (coff_expand_symbol (&isym, asym, sects_num, strtab, strtab_size) < 0)
|
||||
{
|
||||
error_callback (data, "invalid section or offset in coff symbol", 0);
|
||||
return 0;
|
||||
}
|
||||
if (coff_is_function_symbol (&isym))
|
||||
{
|
||||
++coff_symbol_count;
|
||||
if (asym->name.short_name[0] != 0)
|
||||
coff_symstr_len += coff_short_name_len (asym->name.short_name) + 1;
|
||||
}
|
||||
|
||||
i += asym->number_of_aux_symbols;
|
||||
}
|
||||
|
||||
coff_symbol_size = (coff_symbol_count + 1) * sizeof (struct coff_symbol);
|
||||
coff_symbols = ((struct coff_symbol *)
|
||||
backtrace_alloc (state, coff_symbol_size, error_callback,
|
||||
data));
|
||||
if (coff_symbols == NULL)
|
||||
return 0;
|
||||
|
||||
/* Allocate memory for symbols strings. */
|
||||
if (coff_symstr_len > 0)
|
||||
{
|
||||
coff_symstr = ((char *)
|
||||
backtrace_alloc (state, coff_symstr_len, error_callback,
|
||||
data));
|
||||
if (coff_symstr == NULL)
|
||||
{
|
||||
backtrace_free (state, coff_symbols, coff_symbol_size,
|
||||
error_callback, data);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
coff_symstr = NULL;
|
||||
|
||||
/* Copy symbols. */
|
||||
coff_sym = coff_symbols;
|
||||
coff_str = coff_symstr;
|
||||
for (i = 0; i < syms_count; ++i)
|
||||
{
|
||||
const b_coff_external_symbol *asym = &syms[i];
|
||||
b_coff_internal_symbol isym;
|
||||
|
||||
if (coff_expand_symbol (&isym, asym, sects_num, strtab, strtab_size))
|
||||
{
|
||||
/* Should not fail, as it was already tested in the previous
|
||||
loop. */
|
||||
abort ();
|
||||
}
|
||||
if (coff_is_function_symbol (&isym))
|
||||
{
|
||||
const char *name;
|
||||
int16_t secnum;
|
||||
|
||||
if (asym->name.short_name[0] != 0)
|
||||
{
|
||||
size_t len = coff_short_name_len (isym.name);
|
||||
name = coff_str;
|
||||
memcpy (coff_str, isym.name, len);
|
||||
coff_str[len] = 0;
|
||||
coff_str += len + 1;
|
||||
}
|
||||
else
|
||||
name = isym.name;
|
||||
|
||||
/* Strip leading '_'. */
|
||||
if (name[0] == '_')
|
||||
name++;
|
||||
|
||||
/* Symbol value is section relative, so we need to read the address
|
||||
of its section. */
|
||||
secnum = coff_read2 (asym->section_number);
|
||||
|
||||
coff_sym->name = name;
|
||||
coff_sym->address = (coff_read4 (asym->value)
|
||||
+ sects[secnum - 1].virtual_address
|
||||
+ base_address);
|
||||
coff_sym++;
|
||||
}
|
||||
|
||||
i += asym->number_of_aux_symbols;
|
||||
}
|
||||
|
||||
/* End of symbols marker. */
|
||||
coff_sym->name = NULL;
|
||||
coff_sym->address = -1;
|
||||
|
||||
backtrace_qsort (coff_symbols, coff_symbol_count,
|
||||
sizeof (struct coff_symbol), coff_symbol_compare);
|
||||
|
||||
sdata->next = NULL;
|
||||
sdata->symbols = coff_symbols;
|
||||
sdata->count = coff_symbol_count;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Add EDATA to the list in STATE. */
|
||||
|
||||
static void
|
||||
coff_add_syminfo_data (struct backtrace_state *state,
|
||||
struct coff_syminfo_data *sdata)
|
||||
{
|
||||
if (!state->threaded)
|
||||
{
|
||||
struct coff_syminfo_data **pp;
|
||||
|
||||
for (pp = (struct coff_syminfo_data **) (void *) &state->syminfo_data;
|
||||
*pp != NULL;
|
||||
pp = &(*pp)->next)
|
||||
;
|
||||
*pp = sdata;
|
||||
}
|
||||
else
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
struct coff_syminfo_data **pp;
|
||||
|
||||
pp = (struct coff_syminfo_data **) (void *) &state->syminfo_data;
|
||||
|
||||
while (1)
|
||||
{
|
||||
struct coff_syminfo_data *p;
|
||||
|
||||
p = backtrace_atomic_load_pointer (pp);
|
||||
|
||||
if (p == NULL)
|
||||
break;
|
||||
|
||||
pp = &p->next;
|
||||
}
|
||||
|
||||
if (__sync_bool_compare_and_swap (pp, NULL, sdata))
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Compare an ADDR against an elf_symbol for bsearch. We allocate one
|
||||
extra entry in the array so that this can look safely at the next
|
||||
entry. */
|
||||
|
||||
static int
|
||||
coff_symbol_search (const void *vkey, const void *ventry)
|
||||
{
|
||||
const uintptr_t *key = (const uintptr_t *) vkey;
|
||||
const struct coff_symbol *entry = (const struct coff_symbol *) ventry;
|
||||
uintptr_t addr;
|
||||
|
||||
addr = *key;
|
||||
if (addr < entry->address)
|
||||
return -1;
|
||||
else if (addr >= entry[1].address)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Return the symbol name and value for an ADDR. */
|
||||
|
||||
static void
|
||||
coff_syminfo (struct backtrace_state *state, uintptr_t addr,
|
||||
backtrace_syminfo_callback callback,
|
||||
backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
|
||||
void *data)
|
||||
{
|
||||
struct coff_syminfo_data *sdata;
|
||||
struct coff_symbol *sym = NULL;
|
||||
|
||||
if (!state->threaded)
|
||||
{
|
||||
for (sdata = (struct coff_syminfo_data *) state->syminfo_data;
|
||||
sdata != NULL;
|
||||
sdata = sdata->next)
|
||||
{
|
||||
sym = ((struct coff_symbol *)
|
||||
bsearch (&addr, sdata->symbols, sdata->count,
|
||||
sizeof (struct coff_symbol), coff_symbol_search));
|
||||
if (sym != NULL)
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
struct coff_syminfo_data **pp;
|
||||
|
||||
pp = (struct coff_syminfo_data **) (void *) &state->syminfo_data;
|
||||
while (1)
|
||||
{
|
||||
sdata = backtrace_atomic_load_pointer (pp);
|
||||
if (sdata == NULL)
|
||||
break;
|
||||
|
||||
sym = ((struct coff_symbol *)
|
||||
bsearch (&addr, sdata->symbols, sdata->count,
|
||||
sizeof (struct coff_symbol), coff_symbol_search));
|
||||
if (sym != NULL)
|
||||
break;
|
||||
|
||||
pp = &sdata->next;
|
||||
}
|
||||
}
|
||||
|
||||
if (sym == NULL)
|
||||
callback (data, addr, NULL, 0, 0);
|
||||
else
|
||||
callback (data, addr, sym->name, sym->address, 0);
|
||||
}
|
||||
|
||||
/* Add the backtrace data for one PE/COFF file. Returns 1 on success,
|
||||
0 on failure (in both cases descriptor is closed). */
|
||||
|
||||
static int
|
||||
coff_add (struct backtrace_state *state, int descriptor,
|
||||
backtrace_error_callback error_callback, void *data,
|
||||
fileline *fileline_fn, int *found_sym, int *found_dwarf)
|
||||
{
|
||||
struct backtrace_view fhdr_view;
|
||||
off_t fhdr_off;
|
||||
int magic_ok;
|
||||
b_coff_file_header fhdr;
|
||||
off_t opt_sects_off;
|
||||
size_t opt_sects_size;
|
||||
unsigned int sects_num;
|
||||
struct backtrace_view sects_view;
|
||||
int sects_view_valid;
|
||||
const b_coff_optional_header *opt_hdr;
|
||||
const b_coff_section_header *sects;
|
||||
struct backtrace_view str_view;
|
||||
int str_view_valid;
|
||||
uint32_t str_size;
|
||||
off_t str_off;
|
||||
// NOTE: upstream doesn't have `{0}`, this is a fix for Rust issue #39468.
|
||||
// If syms_view is not initialized, then `free(syms_view.base)` may segfault later.
|
||||
struct backtrace_view syms_view = {0};
|
||||
off_t syms_off;
|
||||
size_t syms_size;
|
||||
int syms_view_valid;
|
||||
unsigned int syms_num;
|
||||
unsigned int i;
|
||||
struct debug_section_info sections[DEBUG_MAX];
|
||||
off_t min_offset;
|
||||
off_t max_offset;
|
||||
struct backtrace_view debug_view;
|
||||
int debug_view_valid;
|
||||
uintptr_t image_base;
|
||||
|
||||
*found_sym = 0;
|
||||
*found_dwarf = 0;
|
||||
|
||||
sects_view_valid = 0;
|
||||
syms_view_valid = 0;
|
||||
str_view_valid = 0;
|
||||
debug_view_valid = 0;
|
||||
|
||||
/* Map the MS-DOS stub (if any) and extract file header offset. */
|
||||
if (!backtrace_get_view (state, descriptor, 0, 0x40, error_callback,
|
||||
data, &fhdr_view))
|
||||
goto fail;
|
||||
|
||||
{
|
||||
const unsigned char *vptr = fhdr_view.data;
|
||||
|
||||
if (vptr[0] == 'M' && vptr[1] == 'Z')
|
||||
fhdr_off = coff_read4 (vptr + 0x3c);
|
||||
else
|
||||
fhdr_off = 0;
|
||||
}
|
||||
|
||||
backtrace_release_view (state, &fhdr_view, error_callback, data);
|
||||
|
||||
/* Map the coff file header. */
|
||||
if (!backtrace_get_view (state, descriptor, fhdr_off,
|
||||
sizeof (b_coff_file_header) + 4,
|
||||
error_callback, data, &fhdr_view))
|
||||
goto fail;
|
||||
|
||||
if (fhdr_off != 0)
|
||||
{
|
||||
const char *magic = (const char *) fhdr_view.data;
|
||||
magic_ok = memcmp (magic, "PE\0", 4) == 0;
|
||||
fhdr_off += 4;
|
||||
|
||||
memcpy (&fhdr, fhdr_view.data + 4, sizeof fhdr);
|
||||
}
|
||||
else
|
||||
{
|
||||
memcpy (&fhdr, fhdr_view.data, sizeof fhdr);
|
||||
/* TODO: test fhdr.machine for coff but non-PE platforms. */
|
||||
magic_ok = 0;
|
||||
}
|
||||
backtrace_release_view (state, &fhdr_view, error_callback, data);
|
||||
|
||||
if (!magic_ok)
|
||||
{
|
||||
error_callback (data, "executable file is not COFF", 0);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
sects_num = fhdr.number_of_sections;
|
||||
syms_num = fhdr.number_of_symbols;
|
||||
|
||||
opt_sects_off = fhdr_off + sizeof (fhdr);
|
||||
opt_sects_size = (fhdr.size_of_optional_header
|
||||
+ sects_num * sizeof (b_coff_section_header));
|
||||
|
||||
/* To translate PC to file/line when using DWARF, we need to find
|
||||
the .debug_info and .debug_line sections. */
|
||||
|
||||
/* Read the optional header and the section headers. */
|
||||
|
||||
if (!backtrace_get_view (state, descriptor, opt_sects_off, opt_sects_size,
|
||||
error_callback, data, §s_view))
|
||||
goto fail;
|
||||
sects_view_valid = 1;
|
||||
opt_hdr = (const b_coff_optional_header *) sects_view.data;
|
||||
sects = (const b_coff_section_header *)
|
||||
(sects_view.data + fhdr.size_of_optional_header);
|
||||
|
||||
if (fhdr.size_of_optional_header > sizeof (*opt_hdr))
|
||||
{
|
||||
if (opt_hdr->magic == PE_MAGIC)
|
||||
image_base = opt_hdr->u.pe.image_base;
|
||||
else if (opt_hdr->magic == PEP_MAGIC)
|
||||
image_base = opt_hdr->u.pep.image_base;
|
||||
else
|
||||
{
|
||||
error_callback (data, "bad magic in PE optional header", 0);
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
else
|
||||
image_base = 0;
|
||||
|
||||
/* Read the symbol table and the string table. */
|
||||
|
||||
if (fhdr.pointer_to_symbol_table == 0)
|
||||
{
|
||||
/* No symbol table, no string table. */
|
||||
str_off = 0;
|
||||
str_size = 0;
|
||||
syms_num = 0;
|
||||
syms_size = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Symbol table is followed by the string table. The string table
|
||||
starts with its length (on 4 bytes).
|
||||
Map the symbol table and the length of the string table. */
|
||||
syms_off = fhdr.pointer_to_symbol_table;
|
||||
syms_size = syms_num * SYM_SZ;
|
||||
|
||||
if (!backtrace_get_view (state, descriptor, syms_off, syms_size + 4,
|
||||
error_callback, data, &syms_view))
|
||||
goto fail;
|
||||
syms_view_valid = 1;
|
||||
|
||||
str_size = coff_read4 (syms_view.data + syms_size);
|
||||
|
||||
str_off = syms_off + syms_size;
|
||||
|
||||
if (str_size > 4)
|
||||
{
|
||||
/* Map string table (including the length word). */
|
||||
|
||||
if (!backtrace_get_view (state, descriptor, str_off, str_size,
|
||||
error_callback, data, &str_view))
|
||||
goto fail;
|
||||
str_view_valid = 1;
|
||||
}
|
||||
}
|
||||
|
||||
memset (sections, 0, sizeof sections);
|
||||
|
||||
/* Look for the symbol table. */
|
||||
for (i = 0; i < sects_num; ++i)
|
||||
{
|
||||
const b_coff_section_header *s = sects + i;
|
||||
unsigned int str_off;
|
||||
int j;
|
||||
|
||||
if (s->name[0] == '/')
|
||||
{
|
||||
/* Extended section name. */
|
||||
str_off = atoi (s->name + 1);
|
||||
}
|
||||
else
|
||||
str_off = 0;
|
||||
|
||||
for (j = 0; j < (int) DEBUG_MAX; ++j)
|
||||
{
|
||||
const char *dbg_name = debug_section_names[j];
|
||||
int match;
|
||||
|
||||
if (str_off != 0)
|
||||
match = coff_long_name_eq (dbg_name, str_off, &str_view);
|
||||
else
|
||||
match = coff_short_name_eq (dbg_name, s->name);
|
||||
if (match)
|
||||
{
|
||||
sections[j].offset = s->pointer_to_raw_data;
|
||||
sections[j].size = s->virtual_size <= s->size_of_raw_data ?
|
||||
s->virtual_size : s->size_of_raw_data;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (syms_num != 0)
|
||||
{
|
||||
struct coff_syminfo_data *sdata;
|
||||
|
||||
sdata = ((struct coff_syminfo_data *)
|
||||
backtrace_alloc (state, sizeof *sdata, error_callback, data));
|
||||
if (sdata == NULL)
|
||||
goto fail;
|
||||
|
||||
if (!coff_initialize_syminfo (state, image_base,
|
||||
sects, sects_num,
|
||||
syms_view.data, syms_size,
|
||||
str_view.data, str_size,
|
||||
error_callback, data, sdata))
|
||||
{
|
||||
backtrace_free (state, sdata, sizeof *sdata, error_callback, data);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
*found_sym = 1;
|
||||
|
||||
coff_add_syminfo_data (state, sdata);
|
||||
}
|
||||
|
||||
backtrace_release_view (state, §s_view, error_callback, data);
|
||||
sects_view_valid = 0;
|
||||
if (syms_view_valid)
|
||||
{
|
||||
backtrace_release_view (state, &syms_view, error_callback, data);
|
||||
syms_view_valid = 0;
|
||||
}
|
||||
|
||||
/* Read all the debug sections in a single view, since they are
|
||||
probably adjacent in the file. We never release this view. */
|
||||
|
||||
min_offset = 0;
|
||||
max_offset = 0;
|
||||
for (i = 0; i < (int) DEBUG_MAX; ++i)
|
||||
{
|
||||
off_t end;
|
||||
|
||||
if (sections[i].size == 0)
|
||||
continue;
|
||||
if (min_offset == 0 || sections[i].offset < min_offset)
|
||||
min_offset = sections[i].offset;
|
||||
end = sections[i].offset + sections[i].size;
|
||||
if (end > max_offset)
|
||||
max_offset = end;
|
||||
}
|
||||
if (min_offset == 0 || max_offset == 0)
|
||||
{
|
||||
if (!backtrace_close (descriptor, error_callback, data))
|
||||
goto fail;
|
||||
*fileline_fn = coff_nodebug;
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (!backtrace_get_view (state, descriptor, min_offset,
|
||||
max_offset - min_offset,
|
||||
error_callback, data, &debug_view))
|
||||
goto fail;
|
||||
debug_view_valid = 1;
|
||||
|
||||
/* We've read all we need from the executable. */
|
||||
if (!backtrace_close (descriptor, error_callback, data))
|
||||
goto fail;
|
||||
descriptor = -1;
|
||||
|
||||
for (i = 0; i < (int) DEBUG_MAX; ++i)
|
||||
{
|
||||
if (sections[i].size == 0)
|
||||
sections[i].data = NULL;
|
||||
else
|
||||
sections[i].data = ((const unsigned char *) debug_view.data
|
||||
+ (sections[i].offset - min_offset));
|
||||
}
|
||||
|
||||
if (!backtrace_dwarf_add (state, /* base_address */ 0,
|
||||
sections[DEBUG_INFO].data,
|
||||
sections[DEBUG_INFO].size,
|
||||
sections[DEBUG_LINE].data,
|
||||
sections[DEBUG_LINE].size,
|
||||
sections[DEBUG_ABBREV].data,
|
||||
sections[DEBUG_ABBREV].size,
|
||||
sections[DEBUG_RANGES].data,
|
||||
sections[DEBUG_RANGES].size,
|
||||
sections[DEBUG_STR].data,
|
||||
sections[DEBUG_STR].size,
|
||||
0, /* FIXME */
|
||||
error_callback, data, fileline_fn))
|
||||
goto fail;
|
||||
|
||||
*found_dwarf = 1;
|
||||
|
||||
return 1;
|
||||
|
||||
fail:
|
||||
if (sects_view_valid)
|
||||
backtrace_release_view (state, §s_view, error_callback, data);
|
||||
if (str_view_valid)
|
||||
backtrace_release_view (state, &str_view, error_callback, data);
|
||||
if (syms_view_valid)
|
||||
backtrace_release_view (state, &syms_view, error_callback, data);
|
||||
if (debug_view_valid)
|
||||
backtrace_release_view (state, &debug_view, error_callback, data);
|
||||
if (descriptor != -1)
|
||||
backtrace_close (descriptor, error_callback, data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Initialize the backtrace data we need from an ELF executable. At
|
||||
the ELF level, all we need to do is find the debug info
|
||||
sections. */
|
||||
|
||||
int
|
||||
backtrace_initialize (struct backtrace_state *state,
|
||||
const char *filename ATTRIBUTE_UNUSED, int descriptor,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data, fileline *fileline_fn)
|
||||
{
|
||||
int ret;
|
||||
int found_sym;
|
||||
int found_dwarf;
|
||||
fileline coff_fileline_fn;
|
||||
|
||||
ret = coff_add (state, descriptor, error_callback, data,
|
||||
&coff_fileline_fn, &found_sym, &found_dwarf);
|
||||
if (!ret)
|
||||
return 0;
|
||||
|
||||
if (!state->threaded)
|
||||
{
|
||||
if (found_sym)
|
||||
state->syminfo_fn = coff_syminfo;
|
||||
else if (state->syminfo_fn == NULL)
|
||||
state->syminfo_fn = coff_nosyms;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (found_sym)
|
||||
backtrace_atomic_store_pointer (&state->syminfo_fn, coff_syminfo);
|
||||
else
|
||||
__sync_bool_compare_and_swap (&state->syminfo_fn, NULL, coff_nosyms);
|
||||
}
|
||||
|
||||
if (!state->threaded)
|
||||
{
|
||||
if (state->fileline_fn == NULL || state->fileline_fn == coff_nodebug)
|
||||
*fileline_fn = coff_fileline_fn;
|
||||
}
|
||||
else
|
||||
{
|
||||
fileline current_fn;
|
||||
|
||||
current_fn = backtrace_atomic_load_pointer (&state->fileline_fn);
|
||||
if (current_fn == NULL || current_fn == coff_nodebug)
|
||||
*fileline_fn = coff_fileline_fn;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
100
third_party/rust/backtrace-sys/src/libbacktrace/posix.c
vendored
Normal file
100
third_party/rust/backtrace-sys/src/libbacktrace/posix.c
vendored
Normal file
@ -0,0 +1,100 @@
|
||||
/* posix.c -- POSIX file I/O routines for the backtrace library.
|
||||
Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
||||
Written by Ian Lance Taylor, Google.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "backtrace.h"
|
||||
#include "internal.h"
|
||||
|
||||
#ifndef O_BINARY
|
||||
#define O_BINARY 0
|
||||
#endif
|
||||
|
||||
#ifndef O_CLOEXEC
|
||||
#define O_CLOEXEC 0
|
||||
#endif
|
||||
|
||||
#ifndef FD_CLOEXEC
|
||||
#define FD_CLOEXEC 1
|
||||
#endif
|
||||
|
||||
/* Open a file for reading. */
|
||||
|
||||
int
|
||||
backtrace_open (const char *filename, backtrace_error_callback error_callback,
|
||||
void *data, int *does_not_exist)
|
||||
{
|
||||
int descriptor;
|
||||
|
||||
if (does_not_exist != NULL)
|
||||
*does_not_exist = 0;
|
||||
|
||||
descriptor = open (filename, (int) (O_RDONLY | O_BINARY | O_CLOEXEC));
|
||||
if (descriptor < 0)
|
||||
{
|
||||
if (does_not_exist != NULL && errno == ENOENT)
|
||||
*does_not_exist = 1;
|
||||
else
|
||||
error_callback (data, filename, errno);
|
||||
return -1;
|
||||
}
|
||||
|
||||
#ifdef HAVE_FCNTL
|
||||
/* Set FD_CLOEXEC just in case the kernel does not support
|
||||
O_CLOEXEC. It doesn't matter if this fails for some reason.
|
||||
FIXME: At some point it should be safe to only do this if
|
||||
O_CLOEXEC == 0. */
|
||||
fcntl (descriptor, F_SETFD, FD_CLOEXEC);
|
||||
#endif
|
||||
|
||||
return descriptor;
|
||||
}
|
||||
|
||||
/* Close DESCRIPTOR. */
|
||||
|
||||
int
|
||||
backtrace_close (int descriptor, backtrace_error_callback error_callback,
|
||||
void *data)
|
||||
{
|
||||
if (close (descriptor) < 0)
|
||||
{
|
||||
error_callback (data, "close", errno);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
92
third_party/rust/backtrace-sys/src/libbacktrace/print.c
vendored
Normal file
92
third_party/rust/backtrace-sys/src/libbacktrace/print.c
vendored
Normal file
@ -0,0 +1,92 @@
|
||||
/* print.c -- Print the current backtrace.
|
||||
Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
||||
Written by Ian Lance Taylor, Google.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "backtrace.h"
|
||||
#include "internal.h"
|
||||
|
||||
/* Passed to callbacks. */
|
||||
|
||||
struct print_data
|
||||
{
|
||||
struct backtrace_state *state;
|
||||
FILE *f;
|
||||
};
|
||||
|
||||
/* Print one level of a backtrace. */
|
||||
|
||||
static int
|
||||
print_callback (void *data, uintptr_t pc, const char *filename, int lineno,
|
||||
const char *function)
|
||||
{
|
||||
struct print_data *pdata = (struct print_data *) data;
|
||||
|
||||
fprintf (pdata->f, "0x%lx %s\n\t%s:%d\n",
|
||||
(unsigned long) pc,
|
||||
function == NULL ? "???" : function,
|
||||
filename == NULL ? "???" : filename,
|
||||
lineno);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Print errors to stderr. */
|
||||
|
||||
static void
|
||||
error_callback (void *data, const char *msg, int errnum)
|
||||
{
|
||||
struct print_data *pdata = (struct print_data *) data;
|
||||
|
||||
if (pdata->state->filename != NULL)
|
||||
fprintf (stderr, "%s: ", pdata->state->filename);
|
||||
fprintf (stderr, "libbacktrace: %s", msg);
|
||||
if (errnum > 0)
|
||||
fprintf (stderr, ": %s", strerror (errnum));
|
||||
fputc ('\n', stderr);
|
||||
}
|
||||
|
||||
/* Print a backtrace. */
|
||||
|
||||
void
|
||||
backtrace_print (struct backtrace_state *state, int skip, FILE *f)
|
||||
{
|
||||
struct print_data data;
|
||||
|
||||
data.state = state;
|
||||
data.f = f;
|
||||
backtrace_full (state, skip + 1, print_callback, error_callback,
|
||||
(void *) &data);
|
||||
}
|
96
third_party/rust/backtrace-sys/src/libbacktrace/read.c
vendored
Normal file
96
third_party/rust/backtrace-sys/src/libbacktrace/read.c
vendored
Normal file
@ -0,0 +1,96 @@
|
||||
/* read.c -- File views without mmap.
|
||||
Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
||||
Written by Ian Lance Taylor, Google.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "backtrace.h"
|
||||
#include "internal.h"
|
||||
|
||||
/* This file implements file views when mmap is not available. */
|
||||
|
||||
/* Create a view of SIZE bytes from DESCRIPTOR at OFFSET. */
|
||||
|
||||
int
|
||||
backtrace_get_view (struct backtrace_state *state, int descriptor,
|
||||
off_t offset, size_t size,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data, struct backtrace_view *view)
|
||||
{
|
||||
ssize_t got;
|
||||
|
||||
if (lseek (descriptor, offset, SEEK_SET) < 0)
|
||||
{
|
||||
error_callback (data, "lseek", errno);
|
||||
return 0;
|
||||
}
|
||||
|
||||
view->base = backtrace_alloc (state, size, error_callback, data);
|
||||
if (view->base == NULL)
|
||||
return 0;
|
||||
view->data = view->base;
|
||||
view->len = size;
|
||||
|
||||
got = read (descriptor, view->base, size);
|
||||
if (got < 0)
|
||||
{
|
||||
error_callback (data, "read", errno);
|
||||
free (view->base);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((size_t) got < size)
|
||||
{
|
||||
error_callback (data, "file too short", 0);
|
||||
free (view->base);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Release a view read by backtrace_get_view. */
|
||||
|
||||
void
|
||||
backtrace_release_view (struct backtrace_state *state,
|
||||
struct backtrace_view *view,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data)
|
||||
{
|
||||
backtrace_free (state, view->base, view->len, error_callback, data);
|
||||
view->data = NULL;
|
||||
view->base = NULL;
|
||||
}
|
108
third_party/rust/backtrace-sys/src/libbacktrace/simple.c
vendored
Normal file
108
third_party/rust/backtrace-sys/src/libbacktrace/simple.c
vendored
Normal file
@ -0,0 +1,108 @@
|
||||
/* simple.c -- The backtrace_simple function.
|
||||
Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
||||
Written by Ian Lance Taylor, Google.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "unwind.h"
|
||||
#include "backtrace.h"
|
||||
|
||||
/* The simple_backtrace routine. */
|
||||
|
||||
/* Data passed through _Unwind_Backtrace. */
|
||||
|
||||
struct backtrace_simple_data
|
||||
{
|
||||
/* Number of frames to skip. */
|
||||
int skip;
|
||||
/* Library state. */
|
||||
struct backtrace_state *state;
|
||||
/* Callback routine. */
|
||||
backtrace_simple_callback callback;
|
||||
/* Error callback routine. */
|
||||
backtrace_error_callback error_callback;
|
||||
/* Data to pass to callback routine. */
|
||||
void *data;
|
||||
/* Value to return from backtrace. */
|
||||
int ret;
|
||||
};
|
||||
|
||||
/* Unwind library callback routine. This is passd to
|
||||
_Unwind_Backtrace. */
|
||||
|
||||
static _Unwind_Reason_Code
|
||||
simple_unwind (struct _Unwind_Context *context, void *vdata)
|
||||
{
|
||||
struct backtrace_simple_data *bdata = (struct backtrace_simple_data *) vdata;
|
||||
uintptr_t pc;
|
||||
int ip_before_insn = 0;
|
||||
|
||||
#ifdef HAVE_GETIPINFO
|
||||
pc = _Unwind_GetIPInfo (context, &ip_before_insn);
|
||||
#else
|
||||
pc = _Unwind_GetIP (context);
|
||||
#endif
|
||||
|
||||
if (bdata->skip > 0)
|
||||
{
|
||||
--bdata->skip;
|
||||
return _URC_NO_REASON;
|
||||
}
|
||||
|
||||
if (!ip_before_insn)
|
||||
--pc;
|
||||
|
||||
bdata->ret = bdata->callback (bdata->data, pc);
|
||||
|
||||
if (bdata->ret != 0)
|
||||
return _URC_END_OF_STACK;
|
||||
|
||||
return _URC_NO_REASON;
|
||||
}
|
||||
|
||||
/* Get a simple stack backtrace. */
|
||||
|
||||
int
|
||||
backtrace_simple (struct backtrace_state *state, int skip,
|
||||
backtrace_simple_callback callback,
|
||||
backtrace_error_callback error_callback, void *data)
|
||||
{
|
||||
struct backtrace_simple_data bdata;
|
||||
|
||||
bdata.skip = skip + 1;
|
||||
bdata.state = state;
|
||||
bdata.callback = callback;
|
||||
bdata.error_callback = error_callback;
|
||||
bdata.data = data;
|
||||
bdata.ret = 0;
|
||||
_Unwind_Backtrace (simple_unwind, &bdata);
|
||||
return bdata.ret;
|
||||
}
|
108
third_party/rust/backtrace-sys/src/libbacktrace/sort.c
vendored
Normal file
108
third_party/rust/backtrace-sys/src/libbacktrace/sort.c
vendored
Normal file
@ -0,0 +1,108 @@
|
||||
/* sort.c -- Sort without allocating memory
|
||||
Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
||||
Written by Ian Lance Taylor, Google.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <stddef.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "backtrace.h"
|
||||
#include "internal.h"
|
||||
|
||||
/* The GNU glibc version of qsort allocates memory, which we must not
|
||||
do if we are invoked by a signal handler. So provide our own
|
||||
sort. */
|
||||
|
||||
static void
|
||||
swap (char *a, char *b, size_t size)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < size; i++, a++, b++)
|
||||
{
|
||||
char t;
|
||||
|
||||
t = *a;
|
||||
*a = *b;
|
||||
*b = t;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
backtrace_qsort (void *basearg, size_t count, size_t size,
|
||||
int (*compar) (const void *, const void *))
|
||||
{
|
||||
char *base = (char *) basearg;
|
||||
size_t i;
|
||||
size_t mid;
|
||||
|
||||
tail_recurse:
|
||||
if (count < 2)
|
||||
return;
|
||||
|
||||
/* The symbol table and DWARF tables, which is all we use this
|
||||
routine for, tend to be roughly sorted. Pick the middle element
|
||||
in the array as our pivot point, so that we are more likely to
|
||||
cut the array in half for each recursion step. */
|
||||
swap (base, base + (count / 2) * size, size);
|
||||
|
||||
mid = 0;
|
||||
for (i = 1; i < count; i++)
|
||||
{
|
||||
if ((*compar) (base, base + i * size) > 0)
|
||||
{
|
||||
++mid;
|
||||
if (i != mid)
|
||||
swap (base + mid * size, base + i * size, size);
|
||||
}
|
||||
}
|
||||
|
||||
if (mid > 0)
|
||||
swap (base, base + mid * size, size);
|
||||
|
||||
/* Recurse with the smaller array, loop with the larger one. That
|
||||
ensures that our maximum stack depth is log count. */
|
||||
if (2 * mid < count)
|
||||
{
|
||||
backtrace_qsort (base, mid, size, compar);
|
||||
base += (mid + 1) * size;
|
||||
count -= mid + 1;
|
||||
goto tail_recurse;
|
||||
}
|
||||
else
|
||||
{
|
||||
backtrace_qsort (base + (mid + 1) * size, count - (mid + 1),
|
||||
size, compar);
|
||||
count = mid;
|
||||
goto tail_recurse;
|
||||
}
|
||||
}
|
72
third_party/rust/backtrace-sys/src/libbacktrace/state.c
vendored
Normal file
72
third_party/rust/backtrace-sys/src/libbacktrace/state.c
vendored
Normal file
@ -0,0 +1,72 @@
|
||||
/* state.c -- Create the backtrace state.
|
||||
Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
||||
Written by Ian Lance Taylor, Google.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "backtrace.h"
|
||||
#include "backtrace-supported.h"
|
||||
#include "internal.h"
|
||||
|
||||
/* Create the backtrace state. This will then be passed to all the
|
||||
other routines. */
|
||||
|
||||
struct backtrace_state *
|
||||
backtrace_create_state (const char *filename, int threaded,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data)
|
||||
{
|
||||
struct backtrace_state init_state;
|
||||
struct backtrace_state *state;
|
||||
|
||||
#ifndef HAVE_SYNC_FUNCTIONS
|
||||
if (threaded)
|
||||
{
|
||||
error_callback (data, "backtrace library does not support threads", 0);
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
memset (&init_state, 0, sizeof init_state);
|
||||
init_state.filename = filename;
|
||||
init_state.threaded = threaded;
|
||||
|
||||
state = ((struct backtrace_state *)
|
||||
backtrace_alloc (&init_state, sizeof *state, error_callback, data));
|
||||
if (state == NULL)
|
||||
return NULL;
|
||||
*state = init_state;
|
||||
|
||||
return state;
|
||||
}
|
137
third_party/rust/backtrace-sys/src/libbacktrace/stest.c
vendored
Normal file
137
third_party/rust/backtrace-sys/src/libbacktrace/stest.c
vendored
Normal file
@ -0,0 +1,137 @@
|
||||
/* stest.c -- Test for libbacktrace internal sort function
|
||||
Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
||||
Written by Ian Lance Taylor, Google.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "backtrace.h"
|
||||
#include "internal.h"
|
||||
|
||||
/* Test the local qsort implementation. */
|
||||
|
||||
#define MAX 10
|
||||
|
||||
struct test
|
||||
{
|
||||
size_t count;
|
||||
int input[MAX];
|
||||
int output[MAX];
|
||||
};
|
||||
|
||||
static struct test tests[] =
|
||||
{
|
||||
{
|
||||
10,
|
||||
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 },
|
||||
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
|
||||
},
|
||||
{
|
||||
9,
|
||||
{ 1, 2, 3, 4, 5, 6, 7, 8, 9 },
|
||||
{ 1, 2, 3, 4, 5, 6, 7, 8, 9 }
|
||||
},
|
||||
{
|
||||
10,
|
||||
{ 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 },
|
||||
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 },
|
||||
},
|
||||
{
|
||||
9,
|
||||
{ 9, 8, 7, 6, 5, 4, 3, 2, 1 },
|
||||
{ 1, 2, 3, 4, 5, 6, 7, 8, 9 },
|
||||
},
|
||||
{
|
||||
10,
|
||||
{ 2, 4, 6, 8, 10, 1, 3, 5, 7, 9 },
|
||||
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 },
|
||||
},
|
||||
{
|
||||
5,
|
||||
{ 4, 5, 3, 1, 2 },
|
||||
{ 1, 2, 3, 4, 5 },
|
||||
},
|
||||
{
|
||||
5,
|
||||
{ 1, 1, 1, 1, 1 },
|
||||
{ 1, 1, 1, 1, 1 },
|
||||
},
|
||||
{
|
||||
5,
|
||||
{ 1, 1, 2, 1, 1 },
|
||||
{ 1, 1, 1, 1, 2 },
|
||||
},
|
||||
{
|
||||
5,
|
||||
{ 2, 1, 1, 1, 1 },
|
||||
{ 1, 1, 1, 1, 2 },
|
||||
},
|
||||
};
|
||||
|
||||
static int
|
||||
compare (const void *a, const void *b)
|
||||
{
|
||||
const int *ai = (const int *) a;
|
||||
const int *bi = (const int *) b;
|
||||
|
||||
return *ai - *bi;
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED)
|
||||
{
|
||||
int failures;
|
||||
size_t i;
|
||||
int a[MAX];
|
||||
|
||||
failures = 0;
|
||||
for (i = 0; i < sizeof tests / sizeof tests[0]; i++)
|
||||
{
|
||||
memcpy (a, tests[i].input, tests[i].count * sizeof (int));
|
||||
backtrace_qsort (a, tests[i].count, sizeof (int), compare);
|
||||
if (memcmp (a, tests[i].output, tests[i].count * sizeof (int)) != 0)
|
||||
{
|
||||
size_t j;
|
||||
|
||||
fprintf (stderr, "test %d failed:", (int) i);
|
||||
for (j = 0; j < tests[i].count; j++)
|
||||
fprintf (stderr, " %d", a[j]);
|
||||
fprintf (stderr, "\n");
|
||||
++failures;
|
||||
}
|
||||
}
|
||||
|
||||
exit (failures > 0 ? EXIT_FAILURE : EXIT_SUCCESS);
|
||||
}
|
234
third_party/rust/backtrace-sys/src/libbacktrace/testlib.c
vendored
Normal file
234
third_party/rust/backtrace-sys/src/libbacktrace/testlib.c
vendored
Normal file
@ -0,0 +1,234 @@
|
||||
/* testlib.c -- test functions for libbacktrace library
|
||||
Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
||||
Written by Ian Lance Taylor, Google.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "filenames.h"
|
||||
|
||||
#include "backtrace.h"
|
||||
|
||||
#include "testlib.h"
|
||||
|
||||
/* The backtrace state. */
|
||||
|
||||
void *state;
|
||||
|
||||
/* The number of failures. */
|
||||
|
||||
int failures;
|
||||
|
||||
/* Return the base name in a path. */
|
||||
|
||||
const char *
|
||||
base (const char *p)
|
||||
{
|
||||
const char *last;
|
||||
const char *s;
|
||||
|
||||
last = NULL;
|
||||
for (s = p; *s != '\0'; ++s)
|
||||
{
|
||||
if (IS_DIR_SEPARATOR (*s))
|
||||
last = s + 1;
|
||||
}
|
||||
return last != NULL ? last : p;
|
||||
}
|
||||
|
||||
/* Check an entry in a struct info array. */
|
||||
|
||||
void
|
||||
check (const char *name, int index, const struct info *all, int want_lineno,
|
||||
const char *want_function, const char *want_file, int *failed)
|
||||
{
|
||||
if (*failed)
|
||||
return;
|
||||
if (all[index].filename == NULL || all[index].function == NULL)
|
||||
{
|
||||
fprintf (stderr, "%s: [%d]: missing file name or function name\n",
|
||||
name, index);
|
||||
*failed = 1;
|
||||
return;
|
||||
}
|
||||
if (strcmp (base (all[index].filename), want_file) != 0)
|
||||
{
|
||||
fprintf (stderr, "%s: [%d]: got %s expected %s\n", name, index,
|
||||
all[index].filename, want_file);
|
||||
*failed = 1;
|
||||
}
|
||||
if (all[index].lineno != want_lineno)
|
||||
{
|
||||
fprintf (stderr, "%s: [%d]: got %d expected %d\n", name, index,
|
||||
all[index].lineno, want_lineno);
|
||||
*failed = 1;
|
||||
}
|
||||
if (strcmp (all[index].function, want_function) != 0)
|
||||
{
|
||||
fprintf (stderr, "%s: [%d]: got %s expected %s\n", name, index,
|
||||
all[index].function, want_function);
|
||||
*failed = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* The backtrace callback function. */
|
||||
|
||||
int
|
||||
callback_one (void *vdata, uintptr_t pc ATTRIBUTE_UNUSED,
|
||||
const char *filename, int lineno, const char *function)
|
||||
{
|
||||
struct bdata *data = (struct bdata *) vdata;
|
||||
struct info *p;
|
||||
|
||||
if (data->index >= data->max)
|
||||
{
|
||||
fprintf (stderr, "callback_one: callback called too many times\n");
|
||||
data->failed = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
p = &data->all[data->index];
|
||||
if (filename == NULL)
|
||||
p->filename = NULL;
|
||||
else
|
||||
{
|
||||
p->filename = strdup (filename);
|
||||
assert (p->filename != NULL);
|
||||
}
|
||||
p->lineno = lineno;
|
||||
if (function == NULL)
|
||||
p->function = NULL;
|
||||
else
|
||||
{
|
||||
p->function = strdup (function);
|
||||
assert (p->function != NULL);
|
||||
}
|
||||
++data->index;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* An error callback passed to backtrace. */
|
||||
|
||||
void
|
||||
error_callback_one (void *vdata, const char *msg, int errnum)
|
||||
{
|
||||
struct bdata *data = (struct bdata *) vdata;
|
||||
|
||||
fprintf (stderr, "%s", msg);
|
||||
if (errnum > 0)
|
||||
fprintf (stderr, ": %s", strerror (errnum));
|
||||
fprintf (stderr, "\n");
|
||||
data->failed = 1;
|
||||
}
|
||||
|
||||
/* The backtrace_simple callback function. */
|
||||
|
||||
int
|
||||
callback_two (void *vdata, uintptr_t pc)
|
||||
{
|
||||
struct sdata *data = (struct sdata *) vdata;
|
||||
|
||||
if (data->index >= data->max)
|
||||
{
|
||||
fprintf (stderr, "callback_two: callback called too many times\n");
|
||||
data->failed = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
data->addrs[data->index] = pc;
|
||||
++data->index;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* An error callback passed to backtrace_simple. */
|
||||
|
||||
void
|
||||
error_callback_two (void *vdata, const char *msg, int errnum)
|
||||
{
|
||||
struct sdata *data = (struct sdata *) vdata;
|
||||
|
||||
fprintf (stderr, "%s", msg);
|
||||
if (errnum > 0)
|
||||
fprintf (stderr, ": %s", strerror (errnum));
|
||||
fprintf (stderr, "\n");
|
||||
data->failed = 1;
|
||||
}
|
||||
|
||||
/* The backtrace_syminfo callback function. */
|
||||
|
||||
void
|
||||
callback_three (void *vdata, uintptr_t pc ATTRIBUTE_UNUSED,
|
||||
const char *symname, uintptr_t symval,
|
||||
uintptr_t symsize)
|
||||
{
|
||||
struct symdata *data = (struct symdata *) vdata;
|
||||
|
||||
if (symname == NULL)
|
||||
data->name = NULL;
|
||||
else
|
||||
{
|
||||
data->name = strdup (symname);
|
||||
assert (data->name != NULL);
|
||||
}
|
||||
data->val = symval;
|
||||
data->size = symsize;
|
||||
}
|
||||
|
||||
/* The backtrace_syminfo error callback function. */
|
||||
|
||||
void
|
||||
error_callback_three (void *vdata, const char *msg, int errnum)
|
||||
{
|
||||
struct symdata *data = (struct symdata *) vdata;
|
||||
|
||||
fprintf (stderr, "%s", msg);
|
||||
if (errnum > 0)
|
||||
fprintf (stderr, ": %s", strerror (errnum));
|
||||
fprintf (stderr, "\n");
|
||||
data->failed = 1;
|
||||
}
|
||||
|
||||
/* The backtrace_create_state error callback function. */
|
||||
|
||||
void
|
||||
error_callback_create (void *data ATTRIBUTE_UNUSED, const char *msg,
|
||||
int errnum)
|
||||
{
|
||||
fprintf (stderr, "%s", msg);
|
||||
if (errnum > 0)
|
||||
fprintf (stderr, ": %s", strerror (errnum));
|
||||
fprintf (stderr, "\n");
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
110
third_party/rust/backtrace-sys/src/libbacktrace/testlib.h
vendored
Normal file
110
third_party/rust/backtrace-sys/src/libbacktrace/testlib.h
vendored
Normal file
@ -0,0 +1,110 @@
|
||||
/* testlib.h -- Header for test functions for libbacktrace library
|
||||
Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
||||
Written by Ian Lance Taylor, Google.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#ifndef LIBBACKTRACE_TESTLIB_H
|
||||
#define LIBBACKTRACE_TESTLIB_H
|
||||
|
||||
/* Portable attribute syntax. Actually some of these tests probably
|
||||
won't work if the attributes are not recognized. */
|
||||
|
||||
#ifndef GCC_VERSION
|
||||
# define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
|
||||
#endif
|
||||
|
||||
#if (GCC_VERSION < 2007)
|
||||
# define __attribute__(x)
|
||||
#endif
|
||||
|
||||
#ifndef ATTRIBUTE_UNUSED
|
||||
# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
|
||||
#endif
|
||||
|
||||
/* Used to collect backtrace info. */
|
||||
|
||||
struct info
|
||||
{
|
||||
char *filename;
|
||||
int lineno;
|
||||
char *function;
|
||||
};
|
||||
|
||||
/* Passed to backtrace callback function. */
|
||||
|
||||
struct bdata
|
||||
{
|
||||
struct info *all;
|
||||
size_t index;
|
||||
size_t max;
|
||||
int failed;
|
||||
};
|
||||
|
||||
/* Passed to backtrace_simple callback function. */
|
||||
|
||||
struct sdata
|
||||
{
|
||||
uintptr_t *addrs;
|
||||
size_t index;
|
||||
size_t max;
|
||||
int failed;
|
||||
};
|
||||
|
||||
/* Passed to backtrace_syminfo callback function. */
|
||||
|
||||
struct symdata
|
||||
{
|
||||
const char *name;
|
||||
uintptr_t val, size;
|
||||
int failed;
|
||||
};
|
||||
|
||||
/* The backtrace state. */
|
||||
|
||||
extern void *state;
|
||||
|
||||
/* The number of failures. */
|
||||
|
||||
extern int failures;
|
||||
|
||||
extern const char *base (const char *p);
|
||||
extern void check (const char *name, int index, const struct info *all,
|
||||
int want_lineno, const char *want_function,
|
||||
const char *want_file, int *failed);
|
||||
extern int callback_one (void *, uintptr_t, const char *, int, const char *);
|
||||
extern void error_callback_one (void *, const char *, int);
|
||||
extern int callback_two (void *, uintptr_t);
|
||||
extern void error_callback_two (void *, const char *, int);
|
||||
extern void callback_three (void *, uintptr_t, const char *, uintptr_t,
|
||||
uintptr_t);
|
||||
extern void error_callback_three (void *, const char *, int);
|
||||
extern void error_callback_create (void *, const char *, int);
|
||||
|
||||
#endif /* !defined(LIBBACKTRACE_TESTLIB_H) */
|
161
third_party/rust/backtrace-sys/src/libbacktrace/ttest.c
vendored
Normal file
161
third_party/rust/backtrace-sys/src/libbacktrace/ttest.c
vendored
Normal file
@ -0,0 +1,161 @@
|
||||
/* ttest.c -- Test for libbacktrace library
|
||||
Copyright (C) 2017-2018 Free Software Foundation, Inc.
|
||||
Written by Ian Lance Taylor, Google.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
/* Test using the libbacktrace library from multiple threads. */
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
#include "filenames.h"
|
||||
|
||||
#include "backtrace.h"
|
||||
#include "backtrace-supported.h"
|
||||
|
||||
#include "testlib.h"
|
||||
|
||||
static int f2 (int) __attribute__ ((noinline));
|
||||
static int f3 (int, int) __attribute__ ((noinline));
|
||||
|
||||
/* Test that a simple backtrace works. This is called via
|
||||
pthread_create. It returns the number of failures, as void *. */
|
||||
|
||||
static void *
|
||||
test1_thread (void *arg ATTRIBUTE_UNUSED)
|
||||
{
|
||||
/* Returning a value here and elsewhere avoids a tailcall which
|
||||
would mess up the backtrace. */
|
||||
return (void *) (uintptr_t) (f2 (__LINE__) - 2);
|
||||
}
|
||||
|
||||
static int
|
||||
f2 (int f1line)
|
||||
{
|
||||
return f3 (f1line, __LINE__) + 2;
|
||||
}
|
||||
|
||||
static int
|
||||
f3 (int f1line, int f2line)
|
||||
{
|
||||
struct info all[20];
|
||||
struct bdata data;
|
||||
int f3line;
|
||||
int i;
|
||||
|
||||
data.all = &all[0];
|
||||
data.index = 0;
|
||||
data.max = 20;
|
||||
data.failed = 0;
|
||||
|
||||
f3line = __LINE__ + 1;
|
||||
i = backtrace_full (state, 0, callback_one, error_callback_one, &data);
|
||||
|
||||
if (i != 0)
|
||||
{
|
||||
fprintf (stderr, "test1: unexpected return value %d\n", i);
|
||||
data.failed = 1;
|
||||
}
|
||||
|
||||
if (data.index < 3)
|
||||
{
|
||||
fprintf (stderr,
|
||||
"test1: not enough frames; got %zu, expected at least 3\n",
|
||||
data.index);
|
||||
data.failed = 1;
|
||||
}
|
||||
|
||||
check ("test1", 0, all, f3line, "f3", "ttest.c", &data.failed);
|
||||
check ("test1", 1, all, f2line, "f2", "ttest.c", &data.failed);
|
||||
check ("test1", 2, all, f1line, "test1_thread", "ttest.c", &data.failed);
|
||||
|
||||
return data.failed;
|
||||
}
|
||||
|
||||
/* Run the test with 10 threads simultaneously. */
|
||||
|
||||
#define THREAD_COUNT 10
|
||||
|
||||
static void test1 (void) __attribute__ ((unused));
|
||||
|
||||
static void
|
||||
test1 (void)
|
||||
{
|
||||
pthread_t atid[THREAD_COUNT];
|
||||
int i;
|
||||
int errnum;
|
||||
int this_fail;
|
||||
void *ret;
|
||||
|
||||
for (i = 0; i < THREAD_COUNT; i++)
|
||||
{
|
||||
errnum = pthread_create (&atid[i], NULL, test1_thread, NULL);
|
||||
if (errnum != 0)
|
||||
{
|
||||
fprintf (stderr, "pthread_create %d: %s\n", i, strerror (errnum));
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
this_fail = 0;
|
||||
for (i = 0; i < THREAD_COUNT; i++)
|
||||
{
|
||||
errnum = pthread_join (atid[i], &ret);
|
||||
if (errnum != 0)
|
||||
{
|
||||
fprintf (stderr, "pthread_join %d: %s\n", i, strerror (errnum));
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
this_fail += (int) (uintptr_t) ret;
|
||||
}
|
||||
|
||||
printf ("%s: threaded backtrace_full noinline\n", this_fail > 0 ? "FAIL" : "PASS");
|
||||
|
||||
failures += this_fail;
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc ATTRIBUTE_UNUSED, char **argv)
|
||||
{
|
||||
state = backtrace_create_state (argv[0], BACKTRACE_SUPPORTS_THREADS,
|
||||
error_callback_create, NULL);
|
||||
|
||||
#if BACKTRACE_SUPPORTED
|
||||
#if BACKTRACE_SUPPORTS_THREADS
|
||||
test1 ();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
exit (failures ? EXIT_FAILURE : EXIT_SUCCESS);
|
||||
}
|
65
third_party/rust/backtrace-sys/src/libbacktrace/unknown.c
vendored
Normal file
65
third_party/rust/backtrace-sys/src/libbacktrace/unknown.c
vendored
Normal file
@ -0,0 +1,65 @@
|
||||
/* unknown.c -- used when backtrace configury does not know file format.
|
||||
Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
||||
Written by Ian Lance Taylor, Google.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "backtrace.h"
|
||||
#include "internal.h"
|
||||
|
||||
/* A trivial routine that always fails to find fileline data. */
|
||||
|
||||
static int
|
||||
unknown_fileline (struct backtrace_state *state ATTRIBUTE_UNUSED,
|
||||
uintptr_t pc, backtrace_full_callback callback,
|
||||
backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
|
||||
void *data)
|
||||
|
||||
{
|
||||
return callback (data, pc, NULL, 0, NULL);
|
||||
}
|
||||
|
||||
/* Initialize the backtrace data when we don't know how to read the
|
||||
debug info. */
|
||||
|
||||
int
|
||||
backtrace_initialize (struct backtrace_state *state ATTRIBUTE_UNUSED,
|
||||
const char *filename ATTRIBUTE_UNUSED,
|
||||
int descriptor ATTRIBUTE_UNUSED,
|
||||
backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
|
||||
void *data ATTRIBUTE_UNUSED, fileline *fileline_fn)
|
||||
{
|
||||
state->fileline_data = NULL;
|
||||
*fileline_fn = unknown_fileline;
|
||||
return 1;
|
||||
}
|
1642
third_party/rust/backtrace-sys/src/libbacktrace/xcoff.c
vendored
Normal file
1642
third_party/rust/backtrace-sys/src/libbacktrace/xcoff.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
537
third_party/rust/backtrace-sys/src/libbacktrace/ztest.c
vendored
Normal file
537
third_party/rust/backtrace-sys/src/libbacktrace/ztest.c
vendored
Normal file
@ -0,0 +1,537 @@
|
||||
/* ztest.c -- Test for libbacktrace inflate code.
|
||||
Copyright (C) 2017-2018 Free Software Foundation, Inc.
|
||||
Written by Ian Lance Taylor, Google.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3) The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#ifdef HAVE_ZLIB
|
||||
#include <zlib.h>
|
||||
#endif
|
||||
|
||||
#include "backtrace.h"
|
||||
#include "backtrace-supported.h"
|
||||
|
||||
#include "internal.h"
|
||||
#include "testlib.h"
|
||||
|
||||
#ifndef HAVE_CLOCK_GETTIME
|
||||
|
||||
typedef int xclockid_t;
|
||||
|
||||
static int
|
||||
xclock_gettime (xclockid_t id ATTRIBUTE_UNUSED,
|
||||
struct timespec *ts ATTRIBUTE_UNUSED)
|
||||
{
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
#define clockid_t xclockid_t
|
||||
#define clock_gettime xclock_gettime
|
||||
#undef CLOCK_REALTIME
|
||||
#define CLOCK_REALTIME 0
|
||||
|
||||
#endif /* !defined(HAVE_CLOCK_GETTIME) */
|
||||
|
||||
#ifdef CLOCK_PROCESS_CPUTIME_ID
|
||||
#define ZLIB_CLOCK_GETTIME_ARG CLOCK_PROCESS_CPUTIME_ID
|
||||
#else
|
||||
#define ZLIB_CLOCK_GETTIME_ARG CLOCK_REALTIME
|
||||
#endif
|
||||
|
||||
/* Some tests for the local zlib inflation code. */
|
||||
|
||||
struct zlib_test
|
||||
{
|
||||
const char *name;
|
||||
const char *uncompressed;
|
||||
size_t uncompressed_len;
|
||||
const char *compressed;
|
||||
size_t compressed_len;
|
||||
};
|
||||
|
||||
/* Error callback. */
|
||||
|
||||
static void
|
||||
error_callback_compress (void *vdata, const char *msg, int errnum)
|
||||
{
|
||||
fprintf (stderr, "%s", msg);
|
||||
if (errnum > 0)
|
||||
fprintf (stderr, ": %s", strerror (errnum));
|
||||
fprintf (stderr, "\n");
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
static const struct zlib_test tests[] =
|
||||
{
|
||||
{
|
||||
"empty",
|
||||
"",
|
||||
0,
|
||||
"\x78\x9c\x03\x00\x00\x00\x00\x01",
|
||||
8,
|
||||
},
|
||||
{
|
||||
"hello",
|
||||
"hello, world\n",
|
||||
0,
|
||||
("\x78\x9c\xca\x48\xcd\xc9\xc9\xd7\x51\x28\xcf"
|
||||
"\x2f\xca\x49\xe1\x02\x04\x00\x00\xff\xff\x21\xe7\x04\x93"),
|
||||
25,
|
||||
},
|
||||
{
|
||||
"goodbye",
|
||||
"goodbye, world",
|
||||
0,
|
||||
("\x78\x9c\x4b\xcf\xcf\x4f\x49\xaa"
|
||||
"\x4c\xd5\x51\x28\xcf\x2f\xca\x49"
|
||||
"\x01\x00\x28\xa5\x05\x5e"),
|
||||
22,
|
||||
},
|
||||
{
|
||||
"ranges",
|
||||
("\xcc\x11\x00\x00\x00\x00\x00\x00\xd5\x13\x00\x00\x00\x00\x00\x00"
|
||||
"\x1c\x14\x00\x00\x00\x00\x00\x00\x72\x14\x00\x00\x00\x00\x00\x00"
|
||||
"\x9d\x14\x00\x00\x00\x00\x00\x00\xd5\x14\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\xfb\x12\x00\x00\x00\x00\x00\x00\x09\x13\x00\x00\x00\x00\x00\x00"
|
||||
"\x0c\x13\x00\x00\x00\x00\x00\x00\xcb\x13\x00\x00\x00\x00\x00\x00"
|
||||
"\x29\x14\x00\x00\x00\x00\x00\x00\x4e\x14\x00\x00\x00\x00\x00\x00"
|
||||
"\x9d\x14\x00\x00\x00\x00\x00\x00\xd5\x14\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\xfb\x12\x00\x00\x00\x00\x00\x00\x09\x13\x00\x00\x00\x00\x00\x00"
|
||||
"\x67\x13\x00\x00\x00\x00\x00\x00\xcb\x13\x00\x00\x00\x00\x00\x00"
|
||||
"\x9d\x14\x00\x00\x00\x00\x00\x00\xd5\x14\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x5f\x0b\x00\x00\x00\x00\x00\x00\x6c\x0b\x00\x00\x00\x00\x00\x00"
|
||||
"\x7d\x0b\x00\x00\x00\x00\x00\x00\x7e\x0c\x00\x00\x00\x00\x00\x00"
|
||||
"\x38\x0f\x00\x00\x00\x00\x00\x00\x5c\x0f\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x83\x0c\x00\x00\x00\x00\x00\x00\xfa\x0c\x00\x00\x00\x00\x00\x00"
|
||||
"\xfd\x0d\x00\x00\x00\x00\x00\x00\xef\x0e\x00\x00\x00\x00\x00\x00"
|
||||
"\x14\x0f\x00\x00\x00\x00\x00\x00\x38\x0f\x00\x00\x00\x00\x00\x00"
|
||||
"\x9f\x0f\x00\x00\x00\x00\x00\x00\xac\x0f\x00\x00\x00\x00\x00\x00"
|
||||
"\xdb\x0f\x00\x00\x00\x00\x00\x00\xff\x0f\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\xfd\x0d\x00\x00\x00\x00\x00\x00\xd8\x0e\x00\x00\x00\x00\x00\x00"
|
||||
"\x9f\x0f\x00\x00\x00\x00\x00\x00\xac\x0f\x00\x00\x00\x00\x00\x00"
|
||||
"\xdb\x0f\x00\x00\x00\x00\x00\x00\xff\x0f\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\xfa\x0c\x00\x00\x00\x00\x00\x00\xea\x0d\x00\x00\x00\x00\x00\x00"
|
||||
"\xef\x0e\x00\x00\x00\x00\x00\x00\x14\x0f\x00\x00\x00\x00\x00\x00"
|
||||
"\x5c\x0f\x00\x00\x00\x00\x00\x00\x9f\x0f\x00\x00\x00\x00\x00\x00"
|
||||
"\xac\x0f\x00\x00\x00\x00\x00\x00\xdb\x0f\x00\x00\x00\x00\x00\x00"
|
||||
"\xff\x0f\x00\x00\x00\x00\x00\x00\x2c\x10\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x60\x11\x00\x00\x00\x00\x00\x00\xd1\x16\x00\x00\x00\x00\x00\x00"
|
||||
"\x40\x0b\x00\x00\x00\x00\x00\x00\x2c\x10\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x7a\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x9f\x01\x00\x00\x00\x00\x00\x00\xa7\x01\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x7a\x00\x00\x00\x00\x00\x00\x00\xa9\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x9f\x01\x00\x00\x00\x00\x00\x00\xa7\x01\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"),
|
||||
672,
|
||||
("\x78\x9c\x3b\x23\xc8\x00\x06\x57\x85\x21\xb4\x8c\x08\x84\x2e\x82"
|
||||
"\xd2\x73\xa1\xf4\x55\x28\x8d\x0e\x7e\x0b\x41\x68\x4e\xa8\x7e\x1e"
|
||||
"\x28\x7d\x1a\x4a\x6b\x42\xf5\xf9\x91\x69\x5e\x3a\x9a\x79\x84\xf4"
|
||||
"\xc7\x73\x43\xe8\x1c\x28\x5d\x0b\xa5\xeb\x78\x20\xb4\x05\x3f\x84"
|
||||
"\x8e\xe1\xc7\xae\xbf\x19\xaa\xee\x17\x94\xfe\xcb\x0b\xa1\xdf\xf3"
|
||||
"\x41\x68\x11\x7e\x54\x73\xe6\x43\xe9\x35\x50\xfa\x36\x94\xfe\x8f"
|
||||
"\xc3\x7c\x98\x79\x37\xf8\xc8\xd3\x0f\x73\xd7\x2b\x1c\xee\x8a\x21"
|
||||
"\xd2\x5d\x3a\x02\xd8\xcd\x4f\x80\xa6\x87\x8b\x62\x10\xda\x81\x1b"
|
||||
"\xbf\xfa\x2a\x28\xbd\x0d\x4a\xcf\x67\x84\xd0\xcb\x19\xf1\xab\x5f"
|
||||
"\x49\xa4\x7a\x00\x48\x97\x29\xd4"),
|
||||
152,
|
||||
}
|
||||
};
|
||||
|
||||
/* Test the hand coded samples. */
|
||||
|
||||
static void
|
||||
test_samples (struct backtrace_state *state)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < sizeof tests / sizeof tests[0]; ++i)
|
||||
{
|
||||
char *p;
|
||||
size_t v;
|
||||
size_t j;
|
||||
unsigned char *uncompressed;
|
||||
size_t uncompressed_len;
|
||||
|
||||
p = malloc (12 + tests[i].compressed_len);
|
||||
memcpy (p, "ZLIB", 4);
|
||||
v = tests[i].uncompressed_len;
|
||||
if (v == 0)
|
||||
v = strlen (tests[i].uncompressed);
|
||||
for (j = 0; j < 8; ++j)
|
||||
p[j + 4] = (v >> ((7 - j) * 8)) & 0xff;
|
||||
memcpy (p + 12, tests[i].compressed, tests[i].compressed_len);
|
||||
uncompressed = NULL;
|
||||
uncompressed_len = 0;
|
||||
if (!backtrace_uncompress_zdebug (state, (unsigned char *) p,
|
||||
tests[i].compressed_len + 12,
|
||||
error_callback_compress, NULL,
|
||||
&uncompressed, &uncompressed_len))
|
||||
{
|
||||
fprintf (stderr, "test %s: uncompress failed\n", tests[i].name);
|
||||
++failures;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (uncompressed_len != v)
|
||||
{
|
||||
fprintf (stderr,
|
||||
"test %s: got uncompressed length %zu, want %zu\n",
|
||||
tests[i].name, uncompressed_len, v);
|
||||
++failures;
|
||||
}
|
||||
else if (memcmp (tests[i].uncompressed, uncompressed, v) != 0)
|
||||
{
|
||||
size_t j;
|
||||
|
||||
fprintf (stderr, "test %s: uncompressed data mismatch\n",
|
||||
tests[i].name);
|
||||
for (j = 0; j < v; ++j)
|
||||
if (tests[i].uncompressed[j] != uncompressed[j])
|
||||
fprintf (stderr, " %zu: got %#x want %#x\n", j,
|
||||
uncompressed[j], tests[i].uncompressed[j]);
|
||||
++failures;
|
||||
}
|
||||
else
|
||||
printf ("PASS: inflate %s\n", tests[i].name);
|
||||
|
||||
backtrace_free (state, uncompressed, uncompressed_len,
|
||||
error_callback_compress, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef HAVE_ZLIB
|
||||
|
||||
/* Given a set of TRIALS timings, discard the lowest and highest
|
||||
values and return the mean average of the rest. */
|
||||
|
||||
static size_t
|
||||
average_time (const size_t *times, size_t trials)
|
||||
{
|
||||
size_t imax;
|
||||
size_t max;
|
||||
size_t imin;
|
||||
size_t min;
|
||||
size_t i;
|
||||
size_t sum;
|
||||
|
||||
imin = 0;
|
||||
imax = 0;
|
||||
min = times[0];
|
||||
max = times[0];
|
||||
for (i = 1; i < trials; ++i)
|
||||
{
|
||||
if (times[i] < min)
|
||||
{
|
||||
imin = i;
|
||||
min = times[i];
|
||||
}
|
||||
if (times[i] > max)
|
||||
{
|
||||
imax = i;
|
||||
max = times[i];
|
||||
}
|
||||
}
|
||||
|
||||
sum = 0;
|
||||
for (i = 0; i < trials; ++i)
|
||||
{
|
||||
if (i != imax && i != imin)
|
||||
sum += times[i];
|
||||
}
|
||||
return sum / (trials - 2);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* Test a larger text, if available. */
|
||||
|
||||
static void
|
||||
test_large (struct backtrace_state *state)
|
||||
{
|
||||
#ifdef HAVE_ZLIB
|
||||
unsigned char *orig_buf;
|
||||
size_t orig_bufsize;
|
||||
size_t i;
|
||||
char *compressed_buf;
|
||||
size_t compressed_bufsize;
|
||||
unsigned long compress_sizearg;
|
||||
unsigned char *uncompressed_buf;
|
||||
size_t uncompressed_bufsize;
|
||||
int r;
|
||||
clockid_t cid;
|
||||
struct timespec ts1;
|
||||
struct timespec ts2;
|
||||
size_t ctime;
|
||||
size_t ztime;
|
||||
const size_t trials = 16;
|
||||
size_t ctimes[16];
|
||||
size_t ztimes[16];
|
||||
static const char * const names[] = {
|
||||
"Mark.Twain-Tom.Sawyer.txt",
|
||||
"../libgo/go/compress/testdata/Mark.Twain-Tom.Sawyer.txt"
|
||||
};
|
||||
|
||||
orig_buf = NULL;
|
||||
orig_bufsize = 0;
|
||||
uncompressed_buf = NULL;
|
||||
compressed_buf = NULL;
|
||||
|
||||
for (i = 0; i < sizeof names / sizeof names[0]; ++i)
|
||||
{
|
||||
size_t len;
|
||||
char *namebuf;
|
||||
FILE *e;
|
||||
struct stat st;
|
||||
char *rbuf;
|
||||
size_t got;
|
||||
|
||||
len = strlen (SRCDIR) + strlen (names[i]) + 2;
|
||||
namebuf = malloc (len);
|
||||
if (namebuf == NULL)
|
||||
{
|
||||
perror ("malloc");
|
||||
goto fail;
|
||||
}
|
||||
snprintf (namebuf, len, "%s/%s", SRCDIR, names[i]);
|
||||
e = fopen (namebuf, "r");
|
||||
free (namebuf);
|
||||
if (e == NULL)
|
||||
continue;
|
||||
if (fstat (fileno (e), &st) < 0)
|
||||
{
|
||||
perror ("fstat");
|
||||
fclose (e);
|
||||
continue;
|
||||
}
|
||||
rbuf = malloc (st.st_size);
|
||||
if (rbuf == NULL)
|
||||
{
|
||||
perror ("malloc");
|
||||
goto fail;
|
||||
}
|
||||
got = fread (rbuf, 1, st.st_size, e);
|
||||
fclose (e);
|
||||
if (got > 0)
|
||||
{
|
||||
orig_buf = rbuf;
|
||||
orig_bufsize = got;
|
||||
break;
|
||||
}
|
||||
free (rbuf);
|
||||
}
|
||||
|
||||
if (orig_buf == NULL)
|
||||
{
|
||||
/* We couldn't find an input file. */
|
||||
printf ("UNSUPPORTED: inflate large\n");
|
||||
return;
|
||||
}
|
||||
|
||||
compressed_bufsize = compressBound (orig_bufsize) + 12;
|
||||
compressed_buf = malloc (compressed_bufsize);
|
||||
if (compressed_buf == NULL)
|
||||
{
|
||||
perror ("malloc");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
compress_sizearg = compressed_bufsize - 12;
|
||||
r = compress (compressed_buf + 12, &compress_sizearg,
|
||||
orig_buf, orig_bufsize);
|
||||
if (r != Z_OK)
|
||||
{
|
||||
fprintf (stderr, "zlib compress failed: %d\n", r);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
compressed_bufsize = compress_sizearg + 12;
|
||||
|
||||
/* Prepare the header that our library expects. */
|
||||
memcpy (compressed_buf, "ZLIB", 4);
|
||||
for (i = 0; i < 8; ++i)
|
||||
compressed_buf[i + 4] = (orig_bufsize >> ((7 - i) * 8)) & 0xff;
|
||||
|
||||
uncompressed_buf = malloc (orig_bufsize);
|
||||
if (uncompressed_buf == NULL)
|
||||
{
|
||||
perror ("malloc");
|
||||
goto fail;
|
||||
}
|
||||
uncompressed_bufsize = orig_bufsize;
|
||||
|
||||
if (!backtrace_uncompress_zdebug (state, compressed_buf, compressed_bufsize,
|
||||
error_callback_compress, NULL,
|
||||
&uncompressed_buf, &uncompressed_bufsize))
|
||||
{
|
||||
fprintf (stderr, "inflate large: backtrace_uncompress_zdebug failed\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (uncompressed_bufsize != orig_bufsize)
|
||||
{
|
||||
fprintf (stderr,
|
||||
"inflate large: got uncompressed length %zu, want %zu\n",
|
||||
uncompressed_bufsize, orig_bufsize);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (memcmp (uncompressed_buf, orig_buf, uncompressed_bufsize) != 0)
|
||||
{
|
||||
fprintf (stderr, "inflate large: uncompressed data mismatch\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
printf ("PASS: inflate large\n");
|
||||
|
||||
for (i = 0; i < trials; ++i)
|
||||
{
|
||||
unsigned long uncompress_sizearg;
|
||||
|
||||
cid = ZLIB_CLOCK_GETTIME_ARG;
|
||||
if (clock_gettime (cid, &ts1) < 0)
|
||||
{
|
||||
if (errno == EINVAL)
|
||||
return;
|
||||
perror ("clock_gettime");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!backtrace_uncompress_zdebug (state, compressed_buf,
|
||||
compressed_bufsize,
|
||||
error_callback_compress, NULL,
|
||||
&uncompressed_buf,
|
||||
&uncompressed_bufsize))
|
||||
{
|
||||
fprintf (stderr,
|
||||
("inflate large: "
|
||||
"benchmark backtrace_uncompress_zdebug failed\n"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (clock_gettime (cid, &ts2) < 0)
|
||||
{
|
||||
perror ("clock_gettime");
|
||||
return;
|
||||
}
|
||||
|
||||
ctime = (ts2.tv_sec - ts1.tv_sec) * 1000000000;
|
||||
ctime += ts2.tv_nsec - ts1.tv_nsec;
|
||||
ctimes[i] = ctime;
|
||||
|
||||
if (clock_gettime (cid, &ts1) < 0)
|
||||
{
|
||||
perror("clock_gettime");
|
||||
return;
|
||||
}
|
||||
|
||||
uncompress_sizearg = uncompressed_bufsize;
|
||||
r = uncompress (uncompressed_buf, &uncompress_sizearg,
|
||||
compressed_buf + 12, compressed_bufsize - 12);
|
||||
|
||||
if (clock_gettime (cid, &ts2) < 0)
|
||||
{
|
||||
perror ("clock_gettime");
|
||||
return;
|
||||
}
|
||||
|
||||
if (r != Z_OK)
|
||||
{
|
||||
fprintf (stderr,
|
||||
"inflate large: benchmark zlib uncompress failed: %d\n",
|
||||
r);
|
||||
return;
|
||||
}
|
||||
|
||||
ztime = (ts2.tv_sec - ts1.tv_sec) * 1000000000;
|
||||
ztime += ts2.tv_nsec - ts1.tv_nsec;
|
||||
ztimes[i] = ztime;
|
||||
}
|
||||
|
||||
/* Toss the highest and lowest times and average the rest. */
|
||||
ctime = average_time (ctimes, trials);
|
||||
ztime = average_time (ztimes, trials);
|
||||
|
||||
printf ("backtrace: %zu ns\n", ctime);
|
||||
printf ("zlib : %zu ns\n", ztime);
|
||||
printf ("ratio : %g\n", (double) ztime / (double) ctime);
|
||||
|
||||
return;
|
||||
|
||||
fail:
|
||||
printf ("FAIL: inflate large\n");
|
||||
++failures;
|
||||
|
||||
if (orig_buf != NULL)
|
||||
free (orig_buf);
|
||||
if (compressed_buf != NULL)
|
||||
free (compressed_buf);
|
||||
if (uncompressed_buf != NULL)
|
||||
free (uncompressed_buf);
|
||||
|
||||
#else /* !HAVE_ZLIB */
|
||||
|
||||
printf ("UNSUPPORTED: inflate large\n");
|
||||
|
||||
#endif /* !HAVE_ZLIB */
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc ATTRIBUTE_UNUSED, char **argv)
|
||||
{
|
||||
struct backtrace_state *state;
|
||||
|
||||
state = backtrace_create_state (argv[0], BACKTRACE_SUPPORTS_THREADS,
|
||||
error_callback_create, NULL);
|
||||
|
||||
test_samples (state);
|
||||
test_large (state);
|
||||
|
||||
exit (failures != 0 ? EXIT_FAILURE : EXIT_SUCCESS);
|
||||
}
|
19
third_party/rust/backtrace-sys/symbol-map
vendored
Normal file
19
third_party/rust/backtrace-sys/symbol-map
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
backtrace_full __rbt_backtrace_full
|
||||
backtrace_dwarf_add __rbt_backtrace_dwarf_add
|
||||
backtrace_initialize __rbt_backtrace_initialize
|
||||
backtrace_pcinfo __rbt_backtrace_pcinfo
|
||||
backtrace_syminfo __rbt_backtrace_syminfo
|
||||
backtrace_get_view __rbt_backtrace_get_view
|
||||
backtrace_release_view __rbt_backtrace_release_view
|
||||
backtrace_alloc __rbt_backtrace_alloc
|
||||
backtrace_free __rbt_backtrace_free
|
||||
backtrace_vector_finish __rbt_backtrace_vector_finish
|
||||
backtrace_vector_grow __rbt_backtrace_vector_grow
|
||||
backtrace_vector_release __rbt_backtrace_vector_release
|
||||
backtrace_close __rbt_backtrace_close
|
||||
backtrace_open __rbt_backtrace_open
|
||||
backtrace_print __rbt_backtrace_print
|
||||
backtrace_simple __rbt_backtrace_simple
|
||||
backtrace_qsort __rbt_backtrace_qsort
|
||||
backtrace_create_state __rbt_backtrace_create_state
|
||||
backtrace_uncompress_zdebug __rbt_backtrace_uncompress_zdebug
|
1
third_party/rust/backtrace/.cargo-checksum.json
vendored
Normal file
1
third_party/rust/backtrace/.cargo-checksum.json
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"files":{".gitmodules":"4d659086ee4fa6cff644c23a4c86410dcf672bbd3b0f55127b0be7b80f32aa87",".travis.yml":"78ec96336927928ba6b4214ff75ae6e2743485aabb48127add1c7f2bb98573ab","Cargo.toml":"8f2c15cc33e55c532bef00c06823eb9d06676b0e674f330cf78c6bbdf957ab21","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"914767b814ee5c5d794468902d1863649a8cfec36072df81884d396580e9748a","appveyor.yml":"568f76b9e68b862e3a21c64ce34894ff5e753c6019f45de27df0335809420030","ci/android-ndk.sh":"89fafa41d08ff477f949bfc163d04d1eb34fdee370f7a695cfba4ef34c164a55","ci/docker/aarch64-linux-android/Dockerfile":"c97f23fe2892f406d3deb7479c89e1c1dbbdbd0db456ac699f9399852300348d","ci/docker/aarch64-unknown-linux-gnu/Dockerfile":"97fa8f20c6899ee36b47371d485b64a2e96b626a2746b5f434c01eae9168b2a1","ci/docker/arm-linux-androideabi/Dockerfile":"11f6963365de062cf0ac81debec00aee29932df2714d8505f9f6383722d211a8","ci/docker/arm-unknown-linux-gnueabihf/Dockerfile":"41133d712ef13f05e67796857db86476b3ed9c6355d5eb56115575b06d739e04","ci/docker/armv7-linux-androideabi/Dockerfile":"39038d17a423683e0af27a050b34dea610729fb0085814ec6c81726a7f52556f","ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile":"2a216244baad705491f249278083994bf68744a2759f51e768b2f92e0da7c360","ci/docker/i586-unknown-linux-gnu/Dockerfile":"ef898c914590d721488ca11e62f3d7c26852346e1612deb0f3e12ab011187109","ci/docker/i686-linux-android/Dockerfile":"9181e5fe5503077652659bc3353c3c21fcf4fc6b03730430fb40d6adc3096079","ci/docker/i686-unknown-linux-gnu/Dockerfile":"ef898c914590d721488ca11e62f3d7c26852346e1612deb0f3e12ab011187109","ci/docker/powerpc-unknown-linux-gnu/Dockerfile":"83e0e3adbb2d6f2398e70d2c8f71ee301fe99e24554f902602c2f2bb067c2f2c","ci/docker/powerpc64-unknown-linux-gnu/Dockerfile":"828b657e1748bcd8d331794624d5fc1cd07087a051e507eb9206757985194bf1","ci/docker/x86_64-linux-android/Dockerfile":"074bb2906ba587466490ab9d802eb817b9f23eb54aa095ee53e1a33be5569328","ci/docker/x86_64-pc-windows-gnu/Dockerfile":"0822e270108ec39a6b93721598156031a0469ed680e62ce4acd13bbb1a952b9d","ci/docker/x86_64-unknown-linux-gnu/Dockerfile":"e1c202a6831b17e017b4737e80d5b992905895b086bbc06285fc9c337cadbc23","ci/docker/x86_64-unknown-linux-musl/Dockerfile":"2efbba08cc8fff8d2431dde92517df7d122dc754c778820c668f1ac29a885290","ci/run-docker.sh":"517db62fa790712734a1410b27995134ec88c613a0cae548382fb0d3f0b55080","ci/run.sh":"30a3807c195cd86d8b8884e1228cd061aa112b26c54277beebf5108777a36fe9","examples/backtrace.rs":"fd6e1cc6c3378ec7d41cd03b2bef187051298dceb01147e71f207dbb8a0c4867","examples/raw.rs":"f07be26d1f97cd7ac79290ac99d19c4eec5d27031fe270ab5364c25d9c2ad9e0","src/backtrace/dbghelp.rs":"d052fa4bcb4f3c012e0066d01c18d89a9c0003a6e022ebdca5a03bf09ab7a973","src/backtrace/libunwind.rs":"cc9cdc1d389571cdedf43dfc2d39b8c3af85531a3965ed700c724f436afb213e","src/backtrace/mod.rs":"91a544bd9e89da6b580e2580ab15ead354f13243bca50516ff5cefe68a8cd199","src/backtrace/noop.rs":"dc4a6602e9852b945c382194402314d3d68c8ca90199af9a8159419fb91a3c99","src/backtrace/unix_backtrace.rs":"31204989a8852428792a1c99d36717559aad14d93526e8a37744214adf188268","src/capture.rs":"a6f379300f6a578c52fce5927461fb0d084b2eb080113561a2e0cc11aa1f5c73","src/dylib.rs":"09f3d7f32849cf0daa4de9df48f8e4a4d5ba62e20723c79578201bd271dc4777","src/lib.rs":"e0176033b10579b02228f8860a4beb684fa4c246dc6225425ebe8897c662b589","src/symbolize/coresymbolication.rs":"95c7dab3e65dd7217de5dd22cd550192c1505dfada56040197675ea3b9b380f1","src/symbolize/dbghelp.rs":"6bf7c3cc9542e4084aca417b67af25da0d0caa7df83787e92046f5918d32e9d8","src/symbolize/dladdr.rs":"8287cbca440a9e92e74d88c5a7b920f6b4cf6d8f50bc8b0f61aca5ba42d5b5ec","src/symbolize/gimli.rs":"c385d4ac9a2c87c1eddf5a999bb17d46ff400026766e8c8b1fef7afc747a19e5","src/symbolize/libbacktrace.rs":"0cdad7de2501baef9da193ee6aab21c453d26348a2071c805a133efe1209eaa1","src/symbolize/mod.rs":"2fcf4a6c8319d886e03f7a45fbb25d7e35c4c6021ae3d49d243ce901f213e5c9","src/symbolize/noop.rs":"b622fcecb4e22b42c3d3e2ef5dc5a6ab14601fec83c7797ee1fbbacc12fe6ca1","tests/long_fn_name.rs":"a59eebef3e9403a566b2cdcb7c76e3237675883fa018baca6fe55801f5d11b80","tests/smoke.rs":"f3c03fc5d31281f6a08232814a7b1ca74f514014f0f8098cb014d6e7d7eb6541"},"package":"89a47830402e9981c5c41223151efcced65a0510c13097c769cede7efb34782a"}
|
3
third_party/rust/backtrace/.gitmodules
vendored
Normal file
3
third_party/rust/backtrace/.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
[submodule "backtrace-sys/src/libbacktrace"]
|
||||
path = backtrace-sys/src/libbacktrace
|
||||
url = https://github.com/rust-lang-nursery/libbacktrace
|
109
third_party/rust/backtrace/.travis.yml
vendored
Normal file
109
third_party/rust/backtrace/.travis.yml
vendored
Normal file
@ -0,0 +1,109 @@
|
||||
language: rust
|
||||
sudo: false
|
||||
dist: trusty
|
||||
|
||||
matrix:
|
||||
fast_finish: true
|
||||
include:
|
||||
# Test everything on stable linux
|
||||
- rust: stable
|
||||
addons:
|
||||
sources:
|
||||
# Provides clang-3.9
|
||||
- llvm-toolchain-trusty-3.9
|
||||
apt:
|
||||
packages:
|
||||
# Required for `bindgen`, which is required by `findshlibs`, which is
|
||||
# required by the `gimli` feature.
|
||||
- clang-3.9
|
||||
script: &test_all
|
||||
- cargo build --manifest-path backtrace-sys/Cargo.toml
|
||||
- cargo build
|
||||
- cargo test
|
||||
- cargo test --no-default-features
|
||||
- cargo test --no-default-features --features 'libunwind'
|
||||
- cargo test --no-default-features --features 'libunwind dladdr'
|
||||
- cargo test --no-default-features --features 'libunwind libbacktrace'
|
||||
- cargo test --no-default-features --features 'unix-backtrace'
|
||||
- cargo test --no-default-features --features 'unix-backtrace dladdr'
|
||||
- cargo test --no-default-features --features 'unix-backtrace libbacktrace'
|
||||
- cargo test --no-default-features --features 'serialize-serde'
|
||||
- cargo test --no-default-features --features 'serialize-rustc'
|
||||
- cargo test --no-default-features --features 'serialize-rustc serialize-serde'
|
||||
- cargo test --no-default-features --features 'cpp_demangle'
|
||||
- cargo test --no-default-features --features 'gimli-symbolize'
|
||||
- cd ./cpp_smoke_test && cargo test && cd ..
|
||||
- cargo clean && cargo build
|
||||
|
||||
# Test everything on OSX as well as beta/nightly
|
||||
- os: osx
|
||||
script: *test_all
|
||||
- rust: beta
|
||||
script: *test_all
|
||||
- rust: nightly
|
||||
script: *test_all
|
||||
|
||||
# Upload docs on nightly
|
||||
- rust: nightly
|
||||
script:
|
||||
- pip install 'travis-cargo<0.2' --user && export PATH=$HOME/.local/bin:$PATH
|
||||
- cargo doc --no-deps --all-features
|
||||
after_success:
|
||||
- travis-cargo doc-upload
|
||||
|
||||
# Cross-compile tests, not as comprehensive as above but gets us breadth of
|
||||
# targets
|
||||
- env: TARGET=aarch64-unknown-linux-gnu
|
||||
- env: TARGET=arm-unknown-linux-gnueabihf
|
||||
- env: TARGET=armv7-unknown-linux-gnueabihf
|
||||
- env: TARGET=i586-unknown-linux-gnu
|
||||
- env: TARGET=i686-unknown-linux-gnu
|
||||
- env: TARGET=powerpc64-unknown-linux-gnu
|
||||
- env: TARGET=powerpc-unknown-linux-gnu
|
||||
- env: TARGET=x86_64-pc-windows-gnu
|
||||
- env: TARGET=x86_64-unknown-linux-gnu NO_ADD=1
|
||||
- env: TARGET=x86_64-unknown-linux-musl
|
||||
|
||||
# Cross compile Android targets from linux
|
||||
- env: TARGET=arm-linux-androideabi
|
||||
- env: TARGET=armv7-linux-androideabi
|
||||
- env: TARGET=aarch64-linux-android
|
||||
- env: TARGET=i686-linux-android
|
||||
- env: TARGET=x86_64-linux-android
|
||||
|
||||
# Build iOS targets from OSX
|
||||
- env: TARGET=aarch64-apple-ios SDK=iphoneos
|
||||
os: osx
|
||||
script: &ios-build
|
||||
- rustup target add $TARGET
|
||||
- export SDK_PATH=`xcrun --show-sdk-path --sdk $SDK`
|
||||
- export RUSTFLAGS="-C link-arg=-isysroot -C link-arg=$SDK_PATH"
|
||||
- cargo test --no-run --target $TARGET
|
||||
- env: TARGET=armv7-apple-ios SDK=iphoneos
|
||||
os: osx
|
||||
script: *ios-build
|
||||
- env: TARGET=armv7s-apple-ios SDK=iphoneos
|
||||
os: osx
|
||||
script: *ios-build
|
||||
- env: TARGET=i386-apple-ios SDK=iphonesimulator
|
||||
os: osx
|
||||
script: *ios-build
|
||||
- env: TARGET=x86_64-apple-ios SDK=iphonesimulator
|
||||
os: osx
|
||||
script: *ios-build
|
||||
|
||||
# docker cross-compilation targets
|
||||
script:
|
||||
- if [ "$NO_ADD" == "" ]; then rustup target add $TARGET; fi
|
||||
- cargo generate-lockfile
|
||||
- ci/run-docker.sh $TARGET
|
||||
|
||||
notifications:
|
||||
email:
|
||||
on_success: never
|
||||
|
||||
env:
|
||||
global:
|
||||
# serde-codegen has historically needed a large stack to expand
|
||||
- RUST_MIN_STACK=16777216
|
||||
- secure: "Kuf3j6gC3MhR+F7g8/5J4+3tu+FXJP/SqKjsUVVjs/qjniIVX3MwZPhtP/pVtdRvYjW0NzLw5Nufb4o1cyY4uKwR8BHHNuEUE/h3mPShjWHqzLyn5QiBumPozsFCa32H4gconRmp3+s0YrBT7nLoGvUZZS0dkldMkpvvrPL/yUKXLS8HEP4L1GO5iMQQYG6i3sbWTbHikE6ZQogW/iZommyqUkVB/s/SQvdH9SXu89ttNXlm/F+EIsgsgyzpbULp5sD34GRDPJe+H1m+sgA1kTRrzmuBGNmz9mx6GyIKaqACTm1gRcb06nFjTPVTQioJBNnoV7TEqZCvjuSsUjcGmP4Aeissafo93ADzV+bd0uoWIScE9ltSVS+RgCDV+sd0GHz5U6FjhgZp0amaVl3d6hPp8lbTfK/gfj1i9ktQfKZbG7rB4tfIU1KeQRkyE9vb/TaKp8nwBbc4SVQ4EKFOlRbE1S1FooaKZweW8w57d2u+sMMMVJbO28/Ap8tk9xDSOl4shPaT0iM0U9/heF8FmCZB1OKXLKn6TAaNFnaMTvdTHl+Tjrf6Vzd/oPXJ7GuaB6eLxXYjXvZHuKiLkSZriOzhL7PbijNILbSgZt7+Fa0vcnXP8zgD4dmupx/CoIHLN9NP4o9cGXuBcaJ/iFryJ4i5LKGFNEUHtXkavDrcgcA="
|
86
third_party/rust/backtrace/Cargo.toml
vendored
Normal file
86
third_party/rust/backtrace/Cargo.toml
vendored
Normal file
@ -0,0 +1,86 @@
|
||||
# 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 = "backtrace"
|
||||
version = "0.3.9"
|
||||
authors = ["Alex Crichton <alex@alexcrichton.com>", "The Rust Project Developers"]
|
||||
description = "A library to acquire a stack trace (backtrace) at runtime in a Rust program.\n"
|
||||
homepage = "https://github.com/alexcrichton/backtrace-rs"
|
||||
documentation = "https://docs.rs/backtrace"
|
||||
readme = "README.md"
|
||||
license = "MIT/Apache-2.0"
|
||||
repository = "https://github.com/alexcrichton/backtrace-rs"
|
||||
[dependencies.addr2line]
|
||||
version = "0.6.0"
|
||||
optional = true
|
||||
|
||||
[dependencies.cfg-if]
|
||||
version = "0.1"
|
||||
|
||||
[dependencies.cpp_demangle]
|
||||
version = "0.2.3"
|
||||
optional = true
|
||||
default-features = false
|
||||
|
||||
[dependencies.findshlibs]
|
||||
version = "0.3.3"
|
||||
optional = true
|
||||
|
||||
[dependencies.gimli]
|
||||
version = "0.15.0"
|
||||
optional = true
|
||||
|
||||
[dependencies.memmap]
|
||||
version = "0.6.2"
|
||||
optional = true
|
||||
|
||||
[dependencies.object]
|
||||
version = "0.7.0"
|
||||
optional = true
|
||||
|
||||
[dependencies.rustc-demangle]
|
||||
version = "0.1.4"
|
||||
|
||||
[dependencies.rustc-serialize]
|
||||
version = "0.3"
|
||||
optional = true
|
||||
|
||||
[dependencies.serde]
|
||||
version = "1.0"
|
||||
optional = true
|
||||
|
||||
[dependencies.serde_derive]
|
||||
version = "1.0"
|
||||
optional = true
|
||||
|
||||
[features]
|
||||
coresymbolication = []
|
||||
dbghelp = ["winapi"]
|
||||
default = ["libunwind", "libbacktrace", "coresymbolication", "dladdr", "dbghelp"]
|
||||
dladdr = []
|
||||
gimli-symbolize = ["addr2line", "findshlibs", "gimli", "memmap", "object"]
|
||||
kernel32 = []
|
||||
libbacktrace = ["backtrace-sys"]
|
||||
libunwind = []
|
||||
serialize-rustc = ["rustc-serialize"]
|
||||
serialize-serde = ["serde", "serde_derive"]
|
||||
unix-backtrace = []
|
||||
[target."cfg(all(unix, not(target_os = \"fuchsia\"), not(target_os = \"emscripten\"), not(target_os = \"macos\"), not(target_os = \"ios\")))".dependencies.backtrace-sys]
|
||||
version = "0.1.17"
|
||||
optional = true
|
||||
[target."cfg(unix)".dependencies.libc]
|
||||
version = "0.2"
|
||||
[target."cfg(windows)".dependencies.winapi]
|
||||
version = "0.3.3"
|
||||
features = ["std", "dbghelp", "processthreadsapi", "winnt", "minwindef"]
|
||||
optional = true
|
201
third_party/rust/backtrace/LICENSE-APACHE
vendored
Normal file
201
third_party/rust/backtrace/LICENSE-APACHE
vendored
Normal file
@ -0,0 +1,201 @@
|
||||
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.
|
25
third_party/rust/backtrace/LICENSE-MIT
vendored
Normal file
25
third_party/rust/backtrace/LICENSE-MIT
vendored
Normal file
@ -0,0 +1,25 @@
|
||||
Copyright (c) 2014 Alex Crichton
|
||||
|
||||
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.
|
91
third_party/rust/backtrace/README.md
vendored
Normal file
91
third_party/rust/backtrace/README.md
vendored
Normal file
@ -0,0 +1,91 @@
|
||||
# backtrace-rs
|
||||
|
||||
[![Build Status](https://travis-ci.org/alexcrichton/backtrace-rs.svg?branch=master)](https://travis-ci.org/alexcrichton/backtrace-rs)
|
||||
[![Build status](https://ci.appveyor.com/api/projects/status/v4l9oj4aqbbgyx44?svg=true)](https://ci.appveyor.com/project/alexcrichton/backtrace-rs)
|
||||
|
||||
[Documentation](https://docs.rs/backtrace)
|
||||
|
||||
A library for acquiring backtraces at runtime for Rust. This library aims to
|
||||
enhance the support given by the standard library at `std::rt` by providing a
|
||||
more stable and programmatic interface.
|
||||
|
||||
## Install
|
||||
|
||||
```toml
|
||||
[dependencies]
|
||||
backtrace = "0.3"
|
||||
```
|
||||
|
||||
```rust
|
||||
extern crate backtrace;
|
||||
```
|
||||
|
||||
Note that this crate requires `make`, `objcopy`, and `ar` to be present on Linux
|
||||
systems.
|
||||
|
||||
## Usage
|
||||
|
||||
To simply capture a backtrace and defer dealing with it until a later time,
|
||||
you can use the top-level `Backtrace` type.
|
||||
|
||||
```rust
|
||||
extern crate backtrace;
|
||||
|
||||
use backtrace::Backtrace;
|
||||
|
||||
fn main() {
|
||||
let bt = Backtrace::new();
|
||||
|
||||
// do_some_work();
|
||||
|
||||
println!("{:?}", bt);
|
||||
}
|
||||
```
|
||||
|
||||
If, however, you'd like more raw access to the actual tracing functionality, you
|
||||
can use the `trace` and `resolve` functions directly.
|
||||
|
||||
```rust
|
||||
extern crate backtrace;
|
||||
|
||||
fn main() {
|
||||
backtrace::trace(|frame| {
|
||||
let ip = frame.ip();
|
||||
let symbol_address = frame.symbol_address();
|
||||
|
||||
// Resolve this instruction pointer to a symbol name
|
||||
backtrace::resolve(ip, |symbol| {
|
||||
if let Some(name) = symbol.name() {
|
||||
// ...
|
||||
}
|
||||
if let Some(filename) = symbol.filename() {
|
||||
// ...
|
||||
}
|
||||
});
|
||||
|
||||
true // keep going to the next frame
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
## Platform Support
|
||||
|
||||
This library currently supports OSX, Linux, and Windows. Support for other
|
||||
platforms is always welcome!
|
||||
|
||||
# License
|
||||
|
||||
This project is licensed under either of
|
||||
|
||||
* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
|
||||
http://www.apache.org/licenses/LICENSE-2.0)
|
||||
* MIT license ([LICENSE-MIT](LICENSE-MIT) or
|
||||
http://opensource.org/licenses/MIT)
|
||||
|
||||
at your option.
|
||||
|
||||
### Contribution
|
||||
|
||||
Unless you explicitly state otherwise, any contribution intentionally submitted
|
||||
for inclusion in backtrace-rs by you, as defined in the Apache-2.0 license, shall be
|
||||
dual licensed as above, without any additional terms or conditions.
|
20
third_party/rust/backtrace/appveyor.yml
vendored
Normal file
20
third_party/rust/backtrace/appveyor.yml
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
environment:
|
||||
matrix:
|
||||
- TARGET: x86_64-pc-windows-gnu
|
||||
MSYS_BITS: 64
|
||||
- TARGET: i686-pc-windows-gnu
|
||||
MSYS_BITS: 32
|
||||
- TARGET: x86_64-pc-windows-msvc
|
||||
- TARGET: i686-pc-windows-msvc
|
||||
install:
|
||||
- ps: Start-FileDownload "https://static.rust-lang.org/dist/rust-nightly-${env:TARGET}.exe"
|
||||
- rust-nightly-%TARGET%.exe /VERYSILENT /NORESTART /DIR="C:\Program Files (x86)\Rust"
|
||||
- set PATH=%PATH%;C:\Program Files (x86)\Rust\bin
|
||||
- if defined MSYS_BITS set PATH=%PATH%;C:\msys64\mingw%MSYS_BITS%\bin
|
||||
- rustc -V
|
||||
- cargo -V
|
||||
|
||||
build: false
|
||||
|
||||
test_script:
|
||||
- cargo test --target %TARGET%
|
23
third_party/rust/backtrace/ci/android-ndk.sh
vendored
Executable file
23
third_party/rust/backtrace/ci/android-ndk.sh
vendored
Executable file
@ -0,0 +1,23 @@
|
||||
set -ex
|
||||
|
||||
ANDROID_ARCH=$1
|
||||
ANDROID_SDK_VERSION=4333796
|
||||
|
||||
mkdir /tmp/android
|
||||
cd /tmp/android
|
||||
|
||||
curl -o android-sdk.zip \
|
||||
"https://dl.google.com/android/repository/sdk-tools-linux-${ANDROID_SDK_VERSION}.zip"
|
||||
unzip -q android-sdk.zip
|
||||
|
||||
yes | ./tools/bin/sdkmanager --licenses > /dev/null
|
||||
./tools/bin/sdkmanager ndk-bundle > /dev/null
|
||||
|
||||
./ndk-bundle/build/tools/make_standalone_toolchain.py \
|
||||
--arch $ANDROID_ARCH \
|
||||
--stl=libc++ \
|
||||
--api 21 \
|
||||
--install-dir /android-toolchain
|
||||
|
||||
cd /tmp
|
||||
rm -rf android
|
18
third_party/rust/backtrace/ci/docker/aarch64-linux-android/Dockerfile
vendored
Normal file
18
third_party/rust/backtrace/ci/docker/aarch64-linux-android/Dockerfile
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
FROM ubuntu:18.04
|
||||
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
curl \
|
||||
ca-certificates \
|
||||
unzip \
|
||||
openjdk-8-jre \
|
||||
python \
|
||||
gcc \
|
||||
libc6-dev
|
||||
|
||||
COPY android-ndk.sh /
|
||||
RUN /android-ndk.sh arm64
|
||||
ENV PATH=$PATH:/android-toolchain/bin
|
||||
|
||||
# TODO: run tests in an emulator eventually
|
||||
ENV CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER=aarch64-linux-android-gcc \
|
||||
CARGO_TARGET_AARCH64_LINUX_ANDROID_RUNNER="true"
|
11
third_party/rust/backtrace/ci/docker/aarch64-unknown-linux-gnu/Dockerfile
vendored
Normal file
11
third_party/rust/backtrace/ci/docker/aarch64-unknown-linux-gnu/Dockerfile
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
FROM ubuntu:18.04
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
gcc \
|
||||
ca-certificates \
|
||||
libc6-dev \
|
||||
gcc-aarch64-linux-gnu \
|
||||
libc6-dev-arm64-cross \
|
||||
qemu-user
|
||||
|
||||
ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc \
|
||||
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUNNER="qemu-aarch64 -L /usr/aarch64-linux-gnu"
|
18
third_party/rust/backtrace/ci/docker/arm-linux-androideabi/Dockerfile
vendored
Normal file
18
third_party/rust/backtrace/ci/docker/arm-linux-androideabi/Dockerfile
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
FROM ubuntu:18.04
|
||||
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
curl \
|
||||
ca-certificates \
|
||||
unzip \
|
||||
openjdk-8-jre \
|
||||
python \
|
||||
gcc \
|
||||
libc6-dev
|
||||
|
||||
COPY android-ndk.sh /
|
||||
RUN /android-ndk.sh arm
|
||||
ENV PATH=$PATH:/android-toolchain/bin
|
||||
|
||||
# TODO: run tests in an emulator eventually
|
||||
ENV CARGO_TARGET_ARM_LINUX_ANDROIDEABI_LINKER=arm-linux-androideabi-gcc \
|
||||
CARGO_TARGET_ARM_LINUX_ANDROIDEABI_RUNNER="true"
|
10
third_party/rust/backtrace/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile
vendored
Normal file
10
third_party/rust/backtrace/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
FROM ubuntu:18.04
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
gcc \
|
||||
ca-certificates \
|
||||
libc6-dev \
|
||||
gcc-arm-linux-gnueabihf \
|
||||
libc6-dev-armhf-cross \
|
||||
qemu-user
|
||||
ENV CARGO_TARGET_ARM_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc \
|
||||
CARGO_TARGET_ARM_UNKNOWN_LINUX_GNUEABIHF_RUNNER="qemu-arm -L /usr/arm-linux-gnueabihf"
|
18
third_party/rust/backtrace/ci/docker/armv7-linux-androideabi/Dockerfile
vendored
Normal file
18
third_party/rust/backtrace/ci/docker/armv7-linux-androideabi/Dockerfile
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
FROM ubuntu:18.04
|
||||
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
curl \
|
||||
ca-certificates \
|
||||
unzip \
|
||||
openjdk-8-jre \
|
||||
python \
|
||||
gcc \
|
||||
libc6-dev
|
||||
|
||||
COPY android-ndk.sh /
|
||||
RUN /android-ndk.sh arm
|
||||
ENV PATH=$PATH:/android-toolchain/bin
|
||||
|
||||
# TODO: run tests in an emulator eventually
|
||||
ENV CARGO_TARGET_ARMV7_LINUX_ANDROIDEABI_LINKER=arm-linux-androideabi-gcc \
|
||||
CARGO_TARGET_ARMV7_LINUX_ANDROIDEABI_RUNNER="true"
|
10
third_party/rust/backtrace/ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile
vendored
Normal file
10
third_party/rust/backtrace/ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
FROM ubuntu:18.04
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
gcc \
|
||||
ca-certificates \
|
||||
libc6-dev \
|
||||
gcc-arm-linux-gnueabihf \
|
||||
libc6-dev-armhf-cross \
|
||||
qemu-user
|
||||
ENV CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc \
|
||||
CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_RUNNER="qemu-arm -L /usr/arm-linux-gnueabihf"
|
5
third_party/rust/backtrace/ci/docker/i586-unknown-linux-gnu/Dockerfile
vendored
Normal file
5
third_party/rust/backtrace/ci/docker/i586-unknown-linux-gnu/Dockerfile
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
FROM ubuntu:18.04
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
gcc-multilib \
|
||||
libc6-dev \
|
||||
ca-certificates
|
18
third_party/rust/backtrace/ci/docker/i686-linux-android/Dockerfile
vendored
Normal file
18
third_party/rust/backtrace/ci/docker/i686-linux-android/Dockerfile
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
FROM ubuntu:18.04
|
||||
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
curl \
|
||||
ca-certificates \
|
||||
unzip \
|
||||
openjdk-8-jre \
|
||||
python \
|
||||
gcc \
|
||||
libc6-dev
|
||||
|
||||
COPY android-ndk.sh /
|
||||
RUN /android-ndk.sh x86
|
||||
ENV PATH=$PATH:/android-toolchain/bin
|
||||
|
||||
# TODO: run tests in an emulator eventually
|
||||
ENV CARGO_TARGET_I686_LINUX_ANDROID_LINKER=i686-linux-android-gcc \
|
||||
CARGO_TARGET_I686_LINUX_ANDROID_RUNNER="true"
|
5
third_party/rust/backtrace/ci/docker/i686-unknown-linux-gnu/Dockerfile
vendored
Normal file
5
third_party/rust/backtrace/ci/docker/i686-unknown-linux-gnu/Dockerfile
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
FROM ubuntu:18.04
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
gcc-multilib \
|
||||
libc6-dev \
|
||||
ca-certificates
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user