From 6c7e95171a7c50b00e46ec8a8e502c4824cd549a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rk=20Tolm=C3=A1cs?= Date: Sat, 2 Dec 2023 10:33:48 +0100 Subject: [PATCH 01/36] New tests based on golden wasm and sourcemap MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently the address resolution fails, most likely a bug in the mapping code. Signed-off-by: Márk Tolmács --- Cargo.lock | 618 +++++++++++++-------------- wasm2map/Cargo.toml | 2 + wasm2map/src/test.rs | 123 +++++- wasm2map/test/assets/golden.wasm | Bin 0 -> 1871691 bytes wasm2map/test/assets/golden.wasm.map | 82 ++++ 5 files changed, 497 insertions(+), 328 deletions(-) create mode 100644 wasm2map/test/assets/golden.wasm create mode 100644 wasm2map/test/assets/golden.wasm.map diff --git a/Cargo.lock b/Cargo.lock index 2893935..76491e0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,36 +4,35 @@ version = 3 [[package]] name = "adler" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbe262130bf8e280f95bb7f04f74a82dca9950bbdc12c68b4d3dab0112494d37" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "anstream" -version = "0.3.0" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e579a7752471abc2a8268df8b20005e3eadd975f585398f17efcfd8d4927371" +checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", - "is-terminal", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" [[package]] name = "anstyle-parse" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" +checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" dependencies = [ "utf8parse", ] @@ -44,36 +43,24 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" dependencies = [ - "windows-sys 0.48.0", + "windows-sys", ] [[package]] name = "anstyle-wincon" -version = "1.0.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcd8291a340dd8ac70e18878bc4501dd7b4ff970cfa21c207d36ece51ea88fd" +checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" dependencies = [ "anstyle", - "windows-sys 0.48.0", + "windows-sys", ] -[[package]] -name = "autocfg" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" - -[[package]] -name = "bitflags" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" - [[package]] name = "byteorder" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffea412272c01cbee45e0d34f71c54af698d48f7d404a61fb46b71f48e3f30db" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "cargo-wasm2map" @@ -84,12 +71,6 @@ dependencies = [ "wasm2map", ] -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - [[package]] name = "cfg-if" version = "1.0.0" @@ -98,20 +79,19 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.3.10" +version = "4.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "384e169cc618c613d5e3ca6404dda77a8685a63e08660dcc64abaf7da7cb0c7a" +checksum = "41fffed7514f420abec6d183b1d3acfd9099c79c3a10a06ade4f8203f1411272" dependencies = [ "clap_builder", "clap_derive", - "once_cell", ] [[package]] name = "clap_builder" -version = "4.3.10" +version = "4.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef137bbe35aab78bdb468ccfba75a5f4d8321ae011d34063770780545176af2d" +checksum = "63361bae7eef3771745f02d8d892bec2fee5f6e34af316ba556e7f97a7069ff1" dependencies = [ "anstream", "anstyle", @@ -121,21 +101,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.3.2" +version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8cd2b2a819ad6eec39e8f1d6b53001af1e5469f8c177579cdaeb313115b825f" +checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.8", + "syn", ] [[package]] name = "clap_lex" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" [[package]] name = "colorchoice" @@ -145,156 +125,132 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "crc32fast" -version = "1.2.0" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ - "cfg-if 0.1.10", + "cfg-if", ] [[package]] -name = "errno" -version = "0.2.8" +name = "data-encoding" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" -dependencies = [ - "errno-dragonfly", - "libc", - "winapi", -] +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" [[package]] -name = "errno-dragonfly" -version = "0.1.1" +name = "debugid" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14ca354e36190500e1e1fb267c647932382b54053c50b14970856c0b00a35067" +checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" dependencies = [ - "gcc", - "libc", + "serde", + "uuid", ] +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "flate2" -version = "1.0.26" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" dependencies = [ "crc32fast", "miniz_oxide", ] [[package]] -name = "fuchsia-zircon" -version = "0.3.1" +name = "form_urlencoded" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b5365afd01fdf916e775a224e844f80b3b9710d0f4f00903e219e859474d7ae" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ - "bitflags", - "fuchsia-zircon-sys", + "percent-encoding", ] [[package]] -name = "fuchsia-zircon-sys" -version = "0.3.1" +name = "gcc" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "069def9a0e5feb7e9120635f6ebad24d853a6affbb077fec84d0888316cf9ae6" +checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" [[package]] -name = "gcc" -version = "0.3.4" +name = "getrandom" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfd5de9bef6f37b6e743c425657ce3642dbc48152fce88199a6d6344e2a527e1" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] [[package]] name = "gimli" -version = "0.27.2" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" [[package]] name = "hashbrown" -version = "0.12.0" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c21d40587b92fa6a6c6e3c1bdbf87d75511db5672f9c93175574b3a00df1758" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "heck" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" - -[[package]] -name = "hermit-abi" -version = "0.3.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "856b5cb0902c2b6d65d5fd97dfa30f9b70c7538e770b98eab5ed52d8db923e01" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "idna" -version = "0.2.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ - "matches", "unicode-bidi", "unicode-normalization", ] [[package]] -name = "indexmap" -version = "1.9.1" +name = "if_chain" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" -dependencies = [ - "autocfg", - "hashbrown", -] +checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" [[package]] -name = "io-lifetimes" -version = "1.0.1" +name = "indexmap" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7d367024b3f3414d8e01f437f704f41a9f64ab36f9067fa73e526ad4c763c87" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ - "libc", - "windows-sys 0.42.0", + "equivalent", + "hashbrown", ] [[package]] -name = "is-terminal" -version = "0.4.4" +name = "itoa" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b6b32576413a8e69b90e952e4a026476040d81017b80445deda5f2d3921857" -dependencies = [ - "hermit-abi", - "io-lifetimes", - "rustix", - "windows-sys 0.45.0", -] +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "libc" -version = "0.2.133" +version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0f80d65747a3e43d1596c7c5492d95d5edddaabd45a7fcdb02b95f644164966" - -[[package]] -name = "linux-raw-sys" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb68f22743a3fb35785f1e7f844ca5a3de2dde5bd0c0ef5b372065814699b121" - -[[package]] -name = "matches" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15305656809ce5a4805b1ff2946892810992197ce1270ff79baded852187942e" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" [[package]] name = "memchr" -version = "2.4.1" +version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" [[package]] name = "memmap2" @@ -316,9 +272,9 @@ dependencies = [ [[package]] name = "object" -version = "0.31.1" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" dependencies = [ "flate2", "memchr", @@ -327,367 +283,391 @@ dependencies = [ ] [[package]] -name = "once_cell" -version = "1.12.0" +name = "percent-encoding" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] -name = "percent-encoding" -version = "2.0.0" +name = "ppv-lite86" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba4f28a6faf4ffea762ba8f4baef48c61a6db348647c73095034041fc79dd954" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro2" -version = "1.0.60" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] [[package]] name = "rand" -version = "0.4.1" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5f78082e6a6d042862611e9640cf20776185fee506cf6cf67e93c6225cee31" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ - "fuchsia-zircon", "libc", + "rand_chacha", + "rand_core", ] [[package]] -name = "rustix" -version = "0.36.4" +name = "rand_chacha" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb93e85278e08bb5788653183213d3a60fc242b10cb9be96586f5a73dcb67c23" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ - "bitflags", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys", - "windows-sys 0.42.0", + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +dependencies = [ + "semver 0.9.0", ] [[package]] name = "ruzstd" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a15e661f0f9dac21f3494fe5d23a6338c0ac116a2d22c2b63010acd89467ffe" +checksum = "ac3ffab8f9715a0d455df4bbb9d21e91135aab3cd3ca187af0cd0c3c3f868fdc" dependencies = [ "byteorder", - "thiserror", + "thiserror-core", "twox-hash", ] [[package]] -name = "static_assertions" -version = "1.0.0" +name = "ryu" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa13613355688665b68639b1c378a62dbedea78aff0fc59a4fa656cbbdec657" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] -name = "strsim" -version = "0.10.0" +name = "semver" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] [[package]] -name = "syn" -version = "1.0.11" +name = "semver" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff0acdb207ae2fe6d5976617f887eb1e35a2ba52c13c7234c790960cdad9238" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" [[package]] -name = "syn" -version = "2.0.8" +name = "semver-parser" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc02725fd69ab9f26eab07fad303e2497fad6fb9eba4f96c4d1687bdf704ad9" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] -name = "thiserror" -version = "1.0.7" +name = "serde" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6e37992ba0f05f3aa079be7f453c91b55d15a01a7aad202baa9c6fa48c3e6b5" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" dependencies = [ - "thiserror-impl", + "serde_derive", ] [[package]] -name = "thiserror-impl" -version = "1.0.7" +name = "serde_derive" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3308bffe57639095bdb057e73850afecf2730c3b5539af96e6ae096644f4db" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn 1.0.11", + "syn", ] [[package]] -name = "twox-hash" -version = "1.6.0" +name = "serde_json" +version = "1.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04f8ab788026715fa63b31960869617cba39117e520eb415b0139543e325ab59" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" dependencies = [ - "cfg-if 0.1.10", - "static_assertions", + "itoa", + "ryu", + "serde", ] [[package]] -name = "unicode-bidi" -version = "0.3.0" +name = "sourcemap" +version = "7.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2560b941fdb9ea38301b9b708504d612fcdf9c91a8c31d82219bd74cb07d304d" +checksum = "10da010a590ed2fa9ca8467b00ce7e9c5a8017742c0c09c45450efc172208c4b" dependencies = [ - "matches", + "data-encoding", + "debugid", + "if_chain", + "rustc_version", + "serde", + "serde_json", + "unicode-id", + "url", ] [[package]] -name = "unicode-ident" -version = "1.0.0" +name = "static_assertions" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] -name = "unicode-normalization" -version = "0.1.5" +name = "strsim" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51ccda9ef9efa3f7ef5d91e8f9b83bbe6955f9bf86aec89d5cce2c874625920f" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] -name = "unicode-xid" -version = "0.2.0" +name = "syn" +version = "2.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] [[package]] -name = "url" -version = "2.0.0" +name = "thiserror" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ddaf52e65c6b81c56b7e957c0b1970f7937f21c5c6774c4e56fcb4e20b48c6" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" dependencies = [ - "idna", - "matches", - "percent-encoding", + "thiserror-impl", ] [[package]] -name = "utf8parse" -version = "0.2.1" +name = "thiserror-core" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" - -[[package]] -name = "wasm2map" -version = "0.1.0" +checksum = "c001ee18b7e5e3f62cbf58c7fe220119e68d902bb7443179c0c8aef30090e999" dependencies = [ - "cfg-if 1.0.0", - "flate2", - "gcc", - "gimli", - "memmap2", - "object", - "rand", - "thiserror", + "thiserror-core-impl", ] [[package]] -name = "wasmparser" -version = "0.102.0" +name = "thiserror-core-impl" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48134de3d7598219ab9eaf6b91b15d8e50d31da76b8519fe4ecfcec2cf35104b" +checksum = "e4c60d69f36615a077cc7663b9cb8e42275722d23e58a7fa3d2c7f2915d09d04" dependencies = [ - "indexmap", - "url", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "winapi" -version = "0.3.0" +name = "thiserror-impl" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3ad91d846a4a5342c1fb7008d26124ee6cf94a3953751618577295373b32117" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.3.0" +name = "tinyvec" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a16a8e2ebfc883e2b1771c6482b1fb3c6831eab289ba391619a2d93a7356220f" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.3.0" +name = "tinyvec_macros" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca29cb03c8ceaf20f8224a18a530938305e9872b1478ea24ff44b4f503a1d1d" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] -name = "windows-sys" -version = "0.42.0" +name = "twox-hash" +version = "1.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ - "windows_aarch64_gnullvm 0.42.1", - "windows_aarch64_msvc 0.42.1", - "windows_i686_gnu 0.42.1", - "windows_i686_msvc 0.42.1", - "windows_x86_64_gnu 0.42.1", - "windows_x86_64_gnullvm 0.42.1", - "windows_x86_64_msvc 0.42.1", + "cfg-if", + "static_assertions", ] [[package]] -name = "windows-sys" -version = "0.45.0" +name = "unicode-bidi" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.1", -] +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] -name = "windows-sys" -version = "0.48.0" +name = "unicode-id" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.0", -] +checksum = "b1b6def86329695390197b82c1e244a54a131ceb66c996f2088a3876e2ae083f" [[package]] -name = "windows-targets" -version = "0.42.1" +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" dependencies = [ - "windows_aarch64_gnullvm 0.42.1", - "windows_aarch64_msvc 0.42.1", - "windows_i686_gnu 0.42.1", - "windows_i686_msvc 0.42.1", - "windows_x86_64_gnu 0.42.1", - "windows_x86_64_gnullvm 0.42.1", - "windows_x86_64_msvc 0.42.1", + "tinyvec", ] [[package]] -name = "windows-targets" -version = "0.48.0" +name = "url" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "form_urlencoded", + "idna", + "percent-encoding", ] [[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.1" +name = "utf8parse" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.0" +name = "uuid" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" [[package]] -name = "windows_aarch64_msvc" -version = "0.42.1" +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] -name = "windows_aarch64_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +name = "wasm2map" +version = "0.1.0" +dependencies = [ + "cfg-if", + "flate2", + "gcc", + "gimli", + "memmap2", + "object", + "rand", + "serde_json", + "sourcemap", + "thiserror", +] [[package]] -name = "windows_i686_gnu" -version = "0.42.1" +name = "wasmparser" +version = "0.110.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" +checksum = "1dfcdb72d96f01e6c85b6bf20102e7423bdbaad5c337301bab2bbf253d26413c" +dependencies = [ + "indexmap", + "semver 1.0.20", +] [[package]] -name = "windows_i686_gnu" +name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] [[package]] -name = "windows_i686_msvc" -version = "0.42.1" +name = "windows-targets" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] [[package]] -name = "windows_i686_msvc" -version = "0.48.0" +name = "windows_aarch64_gnullvm" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] -name = "windows_x86_64_gnu" -version = "0.42.1" +name = "windows_aarch64_msvc" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] -name = "windows_x86_64_gnu" -version = "0.48.0" +name = "windows_i686_gnu" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.1" +name = "windows_i686_msvc" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.0" +name = "windows_x86_64_gnu" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] -name = "windows_x86_64_msvc" -version = "0.42.1" +name = "windows_x86_64_gnullvm" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" diff --git a/wasm2map/Cargo.toml b/wasm2map/Cargo.toml index 1dc9a48..b069a35 100644 --- a/wasm2map/Cargo.toml +++ b/wasm2map/Cargo.toml @@ -35,6 +35,8 @@ features = [ ] [dependencies] +serde_json = "^1" +sourcemap = "^7.0" # For -Zminimal-versions cfg-if = ">= 0.1.5" rand = ">= 0.3.23" diff --git a/wasm2map/src/test.rs b/wasm2map/src/test.rs index d328f16..d1f6165 100644 --- a/wasm2map/src/test.rs +++ b/wasm2map/src/test.rs @@ -1,4 +1,9 @@ -use std::{fs, ops::Deref, path::PathBuf}; +use sourcemap::SourceMap; +use std::{ + fs, + ops::Deref, + path::{Path, PathBuf}, +}; use crate::{error::Error, json::encode, vlq, CodePoint, WASM}; @@ -10,27 +15,69 @@ const WASM_SOURCEMAPPINGURL_SECTION_NAME: &[u8] = b"sourceMappingURL"; // TODO: Test sourcemap size load // TODO: Test sourcemap generation +/// Tests the format of the sourcemap, makes sure the JSON is valid and +/// the required keys are present, with the right type of values. #[test] -fn can_create_sourcemap() { +fn can_create_valid_sourcemap_format() { testutils::run_test(|out| { if let Ok(mapper) = WASM::load(out) { let sourcemap = mapper.map_v3(false); - assert!(sourcemap.starts_with(r#"{"version":3,"names":[],"sources":["#)); - assert!(sourcemap.ends_with(r#""}"#)); + let parsed = serde_json::from_str::(sourcemap.as_str()) + .expect("Sourcemap is not a valid JSON file"); + let json = parsed.as_object().expect("Sourcemap is not a JSON object"); + + let version = json + .get("version") + .expect("Sourcemap JSON object has no requied version key") + .as_i64() + .expect("Sourcemap JSON version value is not an integer"); + assert!(version == 3); + + let names = json + .get("names") + .expect("Sourcemap JSON has no names key") + .as_array() + .expect("Sourcemap JSON key names is not an array"); + assert!(names.is_empty()); + + let sources = json + .get("sources") + .expect("Sourcemap JSON object has no sources key") + .as_array() + .expect("Sourcemap JSON sources value is not an array"); + assert!(!sources.is_empty()); + sources.iter().for_each(|value| { + let path = Path::new( + value + .as_str() + .expect("Sourcemap JSON sources item is not a string"), + ); + assert!(path.extension().is_some()); + }); + + let mappings = json + .get("mappings") + .expect("Sourcemap JSON object has no mappings key") + .as_str() + .expect("Sourcemap JSON key mappings is not a string"); + assert!(!mappings.is_empty()); } else { unreachable!() } }); } +/// The Rust library core files are included in DWARF as relative file paths. +/// This test checks if some of the Rust core files are included in the sources +/// list with some leading parent directories, meaning the relative paths in +/// DWARF are resolved. #[test] fn relative_paths_are_considered() { testutils::run_test(|out| { if let Ok(mapper) = WASM::load(out) { let sourcemap = mapper.map_v3(false); - // Any fixed relative path should have at least a `/` beforehand. assert!(sourcemap.contains("/library/core/src/any.rs")); assert!(sourcemap.contains("/library/core/src/panicking.rs")); } else { @@ -39,18 +86,24 @@ fn relative_paths_are_considered() { }); } +/// When the caller requests the bundling of source file contents, we check +/// that the generated sourcemap has the user source code for the test code. #[test] fn can_bundle_source() { testutils::run_test(|out| { if let Ok(mapper) = WASM::load(out) { let sourcemap = mapper.map_v3(true); + fs::write("sourcemap.json", &sourcemap).expect("FAILED to write file"); assert!(sourcemap.contains("fn main() {}")); + fs::remove_file("sourcemap.json").expect("Failed to delete temp file"); } else { unreachable!() } }); } +/// Check the ability of the library to modify the WASM file to add / change +/// a sourcemap. Makes sure the library does not break the WASM binary. #[test] fn can_add_and_update_sourcemap() { testutils::run_test(|out| { @@ -147,6 +200,9 @@ fn can_add_and_update_sourcemap() { }) } +/// Just check if an error is raised when the target WASM binary does not exists. +/// This monitors a regression in the code previously present, where patching +/// failed silently and the user did not recognize why there is no sourcemap loaded. #[test] fn test_path_handles_nonexistent_wasm() { testutils::run_test(|out| { @@ -165,6 +221,7 @@ fn test_path_handles_nonexistent_wasm() { }); } +/// Make sure the error type of this crate handles all needed cases. #[test] fn test_error_types() { fn errors() -> Result<(), Box> { @@ -199,11 +256,14 @@ fn test_error_types() { assert_eq!(format!("{}", error), "This is a test"); } +/// Test the VLQ encoding of numbers to VLQ byte sequences, which +/// can be turned into "mappings" in the sourcemap. #[test] fn test_numeric_encode_to_byte_sequence() { assert_eq!(vlq::encode_uint_var(432), vec![176, 3]) } +/// Check if the Debug, Display is present on types in this library #[test] fn test_derived_macros_present() { testutils::run_test(|out| { @@ -222,6 +282,8 @@ fn test_derived_macros_present() { }) } +/// Test our specialized JSON encoding is working, all special characters are +/// encoded properly. #[test] fn test_json_encode() { let buf = [0; 32] @@ -240,6 +302,49 @@ fn test_json_encode() { ); } +/// Uses the Mozilla source-map package (which is directly used by the Firefox +/// browser to resolve sourcemaps) to retrieve a known good position for the +/// test source. +#[test] +fn position_retrieval_works() { + let workspace = testutils::get_workspace_dir(); + + let sourcemap = { + let path = workspace.clone().join("wasm2map/test/assets/golden.wasm"); + let wasm = WASM::load(path.as_path()).expect("Could not load golden.wasm"); + + SourceMap::from_slice(wasm.map_v3(false).as_bytes()) + .expect("Generated sourcemap is not valid") + }; + + let golden = { + let path = workspace + .clone() + .join("wasm2map/test/assets/golden.wasm.map"); + + SourceMap::from_reader(fs::File::open(path.as_path()).expect("Cannot load golden.wasm.map")) + .expect("Cannot parse sourcemap golden.wasm.map") + }; + + golden.tokens().for_each(|golden_token| { + let col = golden_token.get_dst_col(); + let line = golden_token.get_dst_line(); + let token = sourcemap + .lookup_token(line, col) + .expect("Position from golden.json is not present in the sourcemap"); + let left = golden_token.to_string(); + let right = token.to_string(); + + assert!( + left.as_str().eq(right.as_str()), + "[{}] {} <=> {}", + col, + left, + right + ); + }); +} + mod testutils { use std::{ fs, panic, @@ -249,7 +354,7 @@ mod testutils { // Get the target dir for the project or workspace directly from cargo // so we can create the temporary WASM file somewhere reliable - pub fn get_target_dir() -> PathBuf { + pub fn get_workspace_dir() -> PathBuf { let mut out = PathBuf::new(); let raw = Command::new("cargo") .args(["locate-project", "--workspace"]) @@ -271,7 +376,7 @@ mod testutils { // // NOTE: We also force the WASM32 target obviously, so the tests need that toolchain pub fn build_with_rustc(source: &'_ str, output: &'_ str) { - let mut file = get_target_dir(); + let mut file = get_workspace_dir(); file.push("target"); file.push(format!("test{}.rs", get_thread_id())); std::fs::write(&file, source).unwrap(); @@ -290,7 +395,7 @@ mod testutils { // Builds a test WASM file via rustc in the target directory for the tests // to manipulate pub fn setup() -> String { - let mut out = get_target_dir(); + let mut out = get_workspace_dir(); out.push("target"); out.push(format!("test{}.wasm", get_thread_id())); @@ -301,7 +406,7 @@ mod testutils { // Remove the test WASM at the end of each test case pub fn teardown() { - let mut target = get_target_dir(); + let mut target = get_workspace_dir(); target.push("target"); let mut wasm = target.clone(); diff --git a/wasm2map/test/assets/golden.wasm b/wasm2map/test/assets/golden.wasm new file mode 100644 index 0000000000000000000000000000000000000000..c501b02af7d639316096379698a96f0d1ee05fcc GIT binary patch literal 1871691 zcmeFa34mNh)%RU@>1}!@=`52>_MRa?2!!mDMZh!|NLU0F6a^&#f@Bi16N3U77J)}m zQBe_5qM}4Z#Ya?B)TpRI;V~#`lpqliBcetg9teu^{{E-#z1=;@ATICsz27oW-E~e? zojP^u)H$c>*6p~(YtIXubHP~y7df{m*cfbF6mHz;7DXF3CV4Och!})0j-Pa(R*mT5i*mVqPzZvYi{oNGmBL(D$OU1XYY{4>LQXZx zA-FgQ)Go*cfo~NX2quVwVoN@XgIp}B+j3=?}!&463DCsnK+X7(lL?UkzhXwJ_I}Yh{>= zs>PnpQndtcEtSuEo)By+1+6`B(Ux>y9$21G7p>$LR9!V#HnQeALuf}D)M|A*uzW&L z_=otsBH^$Chfy`(1BZpA+uXqNDM9J)Qe#%0 zs@}HE>Q%nrYjpx0dEG~E`Towg|M~u(xLFa3e&i=_`Hv4g_0-RIjGPs@GF07>kNo1h zZ@y;Rn}2bUukekhpV@WKyZ`gPnksau!Y#M`;Zq;K_u*S^+30J0<e2Jo;dF5V$CfSU#MeOPz%;|#c)kJZd6xTD^^LC+qkwiZhdF$ z+fhHNq4gcDL753;QH%z`R|k-^k>x=_t=J<{`QeH8A;aIJzyU2J@+a^lOzKNLC&c0avd4!heIW_W0>74~GBRU0QL>%VR1phxUJ! ziJ&t-IFS=`^bu6vYPHG}_o@KX)ai1*bIe#;^`%txwn}nziDo&*cBGpHRjSHHxY~|O zV8qN;?K<%!li?s+dqf45M?L?4#Du5xD$BY;PfzmoGOqR7yo8c-D=ha`7PbY9MFu)P zk)begwHL3Z+M2m;fI+S6YdZzC8kAq36}Q!*&Y(3aH?jCZnjn3?gYF*0!Hz5Z0H$adlmv2GeM`~45-$|PEb+u-RDyBtg{jj0FX=&vx zzM7Q51Yn{;LJ}q>1BH;}v9$=z%PuWZe^%H~TXxFh^etOc{;ymRdqcj}x(fZ!(obTJ zuM5wBWHayuuJTPoV3Ddpj~OwTs@yGP7sMxo+uqK2wHlb!xE8IhMaQ%SHRErqio_}s z_^w(Ew2{?%Lo>dW4+;mD4A-H}CQ));wz;FBNlYR`Kw!cIQL|=UZV}zu#Y{uA{tc_U zLxYiES`gL8w>Na|j zDy&JQUd47v&$OhmV(^Z1u^jrsEl6wig=~uhnLVLxUcBh;G0}P1`#e=^A}%$q4~M)I z-=@cBZ34^X2STDX>1u~mQ~#l{KhTh>rjt0Tn*7jET)yNRjY`%n0_qHH(NwnCT+yL# z*cDd(OBgZEOr(G&LZd?is?n&5}2naO9SaLWgX^P%jN{>4w6;DEs1p*S8{?#qB6B{+OE`|d+xcy zamFW`gIaO@>$}2b>ubSkh8?V1RyzU}g1jOG1|WXrBC>&+Suq*=&?*~67vXy~T-TNN zYDO53CfImTIVJ?@$XECP3}GSvu<{j6mRDK$%=!893$Plbs*sbxJ_c3XypZ23x|3z^yLXC-H&VE5+jt6Eiy-aciP z-`m<;YHJlCNTfM4w3_AEqA((xPFo^nvpKcr#xW_+jXQ2sceu-&obpG?K_1IdxkrPc zGXEu3JE-i_H`=KFH~Yud(*LU*WZqk-|A#rq#MT9|E*#6Yk`Zs915pE@$XO#XR0VqcndMEuifEzNazVUiRXRNb;3NT0x7 zHb)*`LDmAr(>`#- ziE#_k5Uttz!3Jis8nJy$`UoQEGowE;>xCB+%|JAh7*BnxQCCnU)LT~hsaXcH^BD^J zBuFMiF+WYQUzFM-jm(50tDO##saDIx0EemgIP)XaFjFIqN}?jV#{V)+y}hx8qU6DU&EU z$lAt)GXjuD4+tw8gNu{%2hIzE@vz?OWQzTNtfT+YiNRiC;q)aHG$N|&EKyje%u

H8GM-kkS|_tZ{N` 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�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

RLgtz9Npy1qcpje1+yY~zQBryx15)YAF3x;> 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

y-@_*iD9%T6I3ay`>ikCb3>*e?>$ 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

$i^!9OAJ(Bnm*p>zUj4=5Lg#yZh4qmwNl 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%0AYkk%8U6+u27(_{}#+8Jd-W(DeVxhxI=3(i1Gfj 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⁡mnbD=uyp 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 literal 0 HcmV?d00001 diff --git a/wasm2map/test/assets/golden.wasm.map b/wasm2map/test/assets/golden.wasm.map new file mode 100644 index 0000000..3770f35 --- /dev/null +++ b/wasm2map/test/assets/golden.wasm.map @@ -0,0 +1,82 @@ +{ + "version": 3, + "names": [], + "sources": [ + "/rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/std/src/sys_common/backtrace.rs", + "/rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/core/src/hint.rs", + "/rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/core/src/ops/function.rs", + "/rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/std/src/rt.rs", + "/rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/std/src/process.rs", + "/rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/core/src/ptr/mod.rs", + "target/test5.rs", + "library/core/src/any.rs", + "library/alloc/src/raw_vec.rs", + "library/core/src/num/mod.rs", + "library/core/src/alloc/layout.rs", + "library/core/src/result.rs", + "library/core/src/fmt/mod.rs", + "library/core/src/ptr/mod.rs", + "library/alloc/src/alloc.rs", + "library/std/src/thread/mod.rs", + "library/alloc/src/string.rs", + "library/core/src/char/methods.rs", + "library/alloc/src/vec/mod.rs", + "library/core/src/ptr/mut_ptr.rs", + "library/core/src/intrinsics.rs", + "/cargo/registry/src/index.crates.io-6f17d22bba15001f/dlmalloc-0.2.4/src/dlmalloc.rs", + "library/core/src/cmp.rs", + "library/std/src/sys/unsupported/once.rs", + "library/core/src/cell.rs", + "library/core/src/option.rs", + "library/std/src/io/stdio.rs", + "library/std/src/sync/once_lock.rs", + "library/core/src/sync/atomic.rs", + "library/std/src/sync/remutex.rs", + "library/std/src/rt.rs", + "library/alloc/src/ffi/c_str.rs", + "library/alloc/src/sync.rs", + "library/std/src/sys_common/thread_info.rs", + "library/core/src/cell/once.rs", + "library/std/src/panicking.rs", + "library/core/src/ops/function.rs", + "library/std/src/sync/once.rs", + "library/core/src/mem/maybe_uninit.rs", + "library/std/src/sys_common/backtrace.rs", + "library/core/src/hint.rs", + "library/core/src/panic/panic_info.rs", + "library/std/src/alloc.rs", + "/cargo/registry/src/index.crates.io-6f17d22bba15001f/dlmalloc-0.2.4/src/lib.rs", + "library/alloc/src/boxed.rs", + "library/std/src/sys/unsupported/locks/rwlock.rs", + "library/std/src/sys/unsupported/common.rs", + "library/std/src/sys/unsupported/process.rs", + "library/panic_abort/src/lib.rs", + "src/dlmalloc.rs", + "/rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/core/src/num/mod.rs", + "/rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/core/src/ptr/mut_ptr.rs", + "src/wasm.rs", + "/rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/stdarch/crates/core_arch/src/wasm32/memory.rs", + "library/core/src/slice/memchr.rs", + "library/core/src/fmt/rt.rs", + "library/core/src/panicking.rs", + "library/core/src/ptr/const_ptr.rs", + "library/core/src/iter/traits/iterator.rs", + "library/core/src/iter/range.rs", + "library/core/src/ptr/non_null.rs", + "library/core/src/slice/iter/macros.rs", + "library/core/src/str/validations.rs", + "library/core/src/str/iter.rs", + "library/core/src/str/mod.rs", + "library/core/src/slice/index.rs", + "library/core/src/str/traits.rs", + "library/core/src/str/count.rs", + "library/core/src/iter/traits/accum.rs", + "library/core/src/fmt/num.rs", + "library/core/src/slice/mod.rs", + "src/macros.rs", + "src/mem/impls.rs", + "/rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/core/src/ptr/const_ptr.rs" + ], + "sourcesContent": null, + "mappings": "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+EO,WAAA,GiB7EZ,kCtBw6BI,CgBpTI,Sfte4B,CFhRX,EK81CjB,cC36CA,MNyFc,KYo8Ed,oBkCplFD,GAIH,kCASM,iBACC,4BADD,GACC,wBADD,GACC,gBADD,GACC,gBADD,GACC,gBADD,GACC,oBADD,OACC,kB7B82BS,sBjBtvBM,UAYA,mBuBuGd,QAEqD,qBAA7B,oBAAZ,UADG,6BAcd,WAAA,GAsCb,oBvBlH2C,eUosBZ,OV9jBvB,GAvBG,MCm4BP,CDtzBc,SE4BkB,MF/MZ,YACZ,MAWI,cA2K0B,OA3K1B,IA2KE,oBGs/CV,OAAM,KHt/CI,EAlDV,OADA,QUq+CG,kBVj2CP,kBAEsC,QADT,QUi2CrB,Ua9/CU,ObigDsB,cAEhC,MVhoDJ,KWkzBS,ONqVT,GKpVG,oBV3lBA,gBMlUE,eAmBA,QHmrBL,MoB9dH,6BvB6JqC,SAAA,GwBjJ1C,0BvBg3BI,GC/7BmE,GAA1C,OD+7BzB,CAAA,CC31BiB,ED21BjB,UC11BmB,uBAAA,GsBhBtB,OvB02BG,SAAA,GC/7BmE,GAA1C,CsBqF5B,gBrBssBqB,gCAAA,GEwdd,M0C1zCJ,Q1C8RJ,E2C7bA,wBfHQ,uCeuBK,YAAA,M/B+gBI,cAAT,Gb2vBG,GAKY,O6C3aN,W7C2aW,M8C//BpB,uBpCuqCJ,CqCtyBO,KCyDH,KChnBe,EC5HX,aACL,qBAUc,OA/BL,OANZ,SAuCG,2BAjCH,CAsCqB,OAtCT,CAAZ,SAyCO,2BAzCP,CA8CyB,OA9Cb,CAAZ,KA+Ca,OAAL,QC2EE,CAAN,UAK6B,KAArB,YtCscC,CiC9PF,ICgYJ,ECyDH,KChnBe,EC5HX,WACL,OAYA,OAQI,GAHc,OAtCT,GAAZ,QAAY,GAAZ,EA8CyB,OA9Cb,CAAZ,SA+Ca,OAAL,MC2EE,CAAN,GCwEG,SCQA,ODJH,MAUY,KEsGZ,SD5GG,KDQO,KvD41BV,CyDxvBA,QzConBA,mBb4aA,MAGY,2BAkBf,EAjBY,euDj1CV,GAOC,eN6LW,iBAcI,6BAAA,WJ+rBN,SIpsBS,QC/MtB,CM4BuB,KPmLD,OC/MtB,CM4BuB,KPmLD,OC/MtB,CM4BuB,KPmLD,OC/MtB,CM4BuB,S3DoqCv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,iBACC,kCADD,aAgET,cAAA,Ge+FD,sCAmBsB,cjDq5Ed,uBiDn5EY,SAES,uBZ8rBZ,CrCmtDT,UAAA,ciDh5EqB,UZ6rBZ,CrCmtDT,UiD/4EY,UANE,aAgBM,UAGT,GlDoxBF,SkDjxBG,ClDixBH,GkDnxBY,eACT,YADS,IZ8qBZ,OrCmtDT,eiD13EW,GlD4wBF,SkDvwBG,ClDuwBH,OkDxwBY,CZmqBZ,OrCmtDT,SD9mDS,SkD3wBG,ClD2wBH,OkD1wBG,KAcR,YlD4vBK,UkD9vB4C,GAEjD,QACH,aAAA,GzD+vCD,+BF3jC4B,G6D1EpC,WC5SO,ctBqnCH,KsBlnC4B,CrB06Bf,KqBj/BH,eACM,SAAR,OC24BK,OtBqGA,CqBj/BH,SA2EN,WAEc,MC+zBL,aD9zBc,CACpB,OAvCG,mBATgB,KAShB,aAJc,OAQA,SAFD,KAEsB,KAArB,CAKhB,OATE,OrBy8BG,CqBz8BH,SAuCH,MAlEG,OACY,SAAd,OrBm+BK,OAAA,CqBp+BH,aAyEN,GCszBS,sBD34BG,SAAR,OC24BK,OtBqGA,CqBj/BH,SDkXL,EAAA,GAQO,YACH" +} \ No newline at end of file From 3922934cdb68ece5c1c89ed13c0157d117c5e228 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rk=20Tolm=C3=A1cs?= Date: Sun, 3 Dec 2023 20:43:31 +0100 Subject: [PATCH 02/36] Intermediate state of rewrite MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Márk Tolmács --- cargo-wasm2map/src/main.rs | 9 ++- wasm2map/src/lib.rs | 122 +++++++++++++++++++++++++++++++- wasm2map/src/reader/file.rs | 50 +++++++++++++ wasm2map/src/reader/mmap.rs | 56 +++++++++++++++ wasm2map/src/reader/mod.rs | 9 +++ wasm2map/src/relocate.rs | 135 ++++++++++++++++++++++++++++++++++++ 6 files changed, 376 insertions(+), 5 deletions(-) create mode 100644 wasm2map/src/reader/file.rs create mode 100644 wasm2map/src/reader/mmap.rs create mode 100644 wasm2map/src/reader/mod.rs create mode 100644 wasm2map/src/relocate.rs diff --git a/cargo-wasm2map/src/main.rs b/cargo-wasm2map/src/main.rs index f814aaf..81b53d7 100644 --- a/cargo-wasm2map/src/main.rs +++ b/cargo-wasm2map/src/main.rs @@ -14,7 +14,7 @@ use clap::{Args, Parser}; use std::{fs, path::PathBuf}; -use wasm2map::WASM; +use wasm2map::{Wasm, WasmReader, WASM}; // Cargo commands receive the name of the subcommand as the main command // so we need to consume the name of our executable in order to get to the @@ -101,8 +101,11 @@ fn main() -> Result<(), String> { // TODO(mtolamcs): Test the base url parameter to make sure its a valid // url and it also does not reference the map file - // Load the WASM file to memory and parse the DWARF code section - let mut wasm = WASM::load(&args.path).map_err(|err| err.to_string())?; + // Open the WASM file + let reader = WasmReader::from_path(&args.path).map_err(|err| err.to_string())?; + + // Parse the DWARF code section + let mut wasm = Wasm::new(&reader, None).map_err(|err| err.to_string())?; // Generate the source map JSON for the loaded WASM let sourcemap = wasm.map_v3(args.bundle_sources); diff --git a/wasm2map/src/lib.rs b/wasm2map/src/lib.rs index 9016c9f..6ac4d38 100644 --- a/wasm2map/src/lib.rs +++ b/wasm2map/src/lib.rs @@ -16,22 +16,140 @@ mod error; mod json; +mod reader; +mod relocate; #[cfg(test)] mod test; mod vlq; use error::Error; -use object::{Object, ObjectSection}; +use gimli::{Dwarf, EndianSlice, LittleEndian}; +pub use object::ReadRef; +use object::{File, Object, ObjectSection, ObjectSymbol, Relocation}; +pub use reader::WasmReader; +use relocate::Relocate; +use sourcemap::SourceMapBuilder; use std::{ borrow::Cow, - collections::BTreeMap, + collections::{BTreeMap, HashMap}, fs, io::{self, Seek, Write}, ops::Deref, path::{Path, PathBuf}, + rc::Rc, str, }; +type RelocationMap = HashMap; + +/// +pub struct Wasm<'raw, R: ReadRef<'raw>> { + object: File<'raw, R>, + mapper: SourceMapBuilder, +} + +impl<'a, R> Wasm<'a, R> +where + R: ReadRef<'a>, +{ + /// + /// + /// + pub fn new(binary: R, name: Option<&str>) -> Result { + match File::parse(binary)? { + file @ File::Wasm(_) => Ok(Self { + object: file, + mapper: SourceMapBuilder::new(name), + }), + _ => Err(Error::from("Data does not represent a WASM file")), + } + } + + fn generate() -> Result<(), Error> { + //let mut load_section = |id: gimli::SectionId| -> Result<_, Error> { Err(Error::from("")) }; + //let dwarf = Dwarf::load(&mut load_section)?; + Ok(()) + } + + fn load_file_section( + &mut self, + id: gimli::SectionId, + is_dwo: bool, + ) -> Result>, Error> { + let mut relocations = RelocationMap::default(); + let name = if is_dwo { + id.dwo_name() + } else { + Some(id.name()) + }; + + let data = match name.and_then(|name| self.object.section_by_name(&name)) { + Some(ref section) => { + // DWO sections never have relocations, so don't bother. + if !is_dwo { + for (offset64, mut relocation) in section.relocations() { + let offset = offset64 as usize; + if offset as u64 != offset64 { + continue; + } + let offset = offset as usize; + match relocation.kind() { + object::RelocationKind::Absolute => { + match relocation.target() { + object::RelocationTarget::Symbol(symbol_idx) => { + match self.object.symbol_by_index(symbol_idx) { + Ok(symbol) => { + let addend = symbol + .address() + .wrapping_add(relocation.addend() as u64); + relocation.set_addend(addend as i64); + } + Err(_) => { + eprintln!( + "Relocation with invalid symbol for section {} at offset 0x{:08x}", + section.name().unwrap(), + offset + ); + } + } + } + _ => {} + } + if relocations.insert(offset, relocation).is_some() { + eprintln!( + "Multiple relocations for section {} at offset 0x{:08x}", + section.name().unwrap(), + offset + ); + } + } + _ => { + eprintln!( + "Unsupported relocation for section {} at offset 0x{:08x}", + section.name().unwrap(), + offset + ); + } + } + } + } + section.uncompressed_data()? + } + // Use a non-zero capacity so that `ReaderOffsetId`s are unique. + None => Cow::Owned(Vec::with_capacity(1)), + }; + let reader = gimli::EndianSlice::new(&data, LittleEndian); + let section = reader; + Ok(Relocate { + relocations: Rc::new(relocations), + section, + reader, + }) + } +} + +//////////////////// + const DWARF_CODE_SECTION_ID: usize = 10; /// Represents a code unit which can be translated to a sourcemap code point diff --git a/wasm2map/src/reader/file.rs b/wasm2map/src/reader/file.rs new file mode 100644 index 0000000..21daceb --- /dev/null +++ b/wasm2map/src/reader/file.rs @@ -0,0 +1,50 @@ +use std::{ + fs::File, + io::{Read, Seek}, + path::Path, +}; + +use object::{ReadCache, ReadRef}; + +use crate::error::Error; + +/// +#[derive(Debug)] +pub struct WasmReader { + data: ReadCache, +} + +impl WasmReader { + /// + pub fn from_path(path: impl AsRef) -> Result { + let file = File::open(path)?; + Ok(Self { + data: ReadCache::new(file), + }) + } + + /// + pub fn from_file(file: File) -> Result { + Self { + data: ReadCache::new(file), + } + } +} + +impl<'a, R: Read + Seek> ReadRef<'a> for &'a WasmReader { + fn len(self) -> Result { + self.data.len() + } + + fn read_bytes_at(self, offset: u64, size: u64) -> Result<&'a [u8], ()> { + self.data.read_bytes_at(offset, size) + } + + fn read_bytes_at_until( + self, + range: std::ops::Range, + delimiter: u8, + ) -> Result<&'a [u8], ()> { + self.data.read_bytes_at_until(range, delimiter) + } +} diff --git a/wasm2map/src/reader/mmap.rs b/wasm2map/src/reader/mmap.rs new file mode 100644 index 0000000..8526ef5 --- /dev/null +++ b/wasm2map/src/reader/mmap.rs @@ -0,0 +1,56 @@ +use std::{ + fs::File, + io::{Read, Seek}, + marker::PhantomData, + path::Path, +}; + +use memmap2::Mmap; +use object::ReadRef; + +use crate::error::Error; + +/// +#[derive(Debug)] +pub struct WasmReader { + data: Mmap, + _marker: PhantomData, +} + +impl WasmReader { + /// + pub fn from_path(path: impl AsRef) -> Result { + let file = File::open(path)?; + + Ok(Self { + data: unsafe { memmap2::Mmap::map(&file) }?, + _marker: PhantomData, + }) + } + + /// + pub fn from_file(file: File) -> Result { + Ok(Self { + data: unsafe { memmap2::Mmap::map(&file) }?, + _marker: PhantomData, + }) + } +} + +impl<'a, R: Read + Seek> ReadRef<'a> for &'a WasmReader { + fn len(self) -> Result { + self.data.len().try_into().map_err(|_| ()) + } + + fn read_bytes_at(self, offset: u64, size: u64) -> Result<&'a [u8], ()> { + self.data.read_bytes_at(offset, size) + } + + fn read_bytes_at_until( + self, + range: std::ops::Range, + delimiter: u8, + ) -> Result<&'a [u8], ()> { + self.data.read_bytes_at_until(range, delimiter) + } +} diff --git a/wasm2map/src/reader/mod.rs b/wasm2map/src/reader/mod.rs new file mode 100644 index 0000000..671689d --- /dev/null +++ b/wasm2map/src/reader/mod.rs @@ -0,0 +1,9 @@ +#[cfg(not(feature = "memmap2"))] +pub mod file; +#[cfg(not(feature = "memmap2"))] +pub use file::WasnReader; + +#[cfg(feature = "memmap2")] +pub mod mmap; +#[cfg(feature = "memmap2")] +pub use mmap::WasmReader; diff --git a/wasm2map/src/relocate.rs b/wasm2map/src/relocate.rs new file mode 100644 index 0000000..8bf1efb --- /dev/null +++ b/wasm2map/src/relocate.rs @@ -0,0 +1,135 @@ +use gimli::Reader; +use object::Relocation; +use std::{borrow::Cow, collections::HashMap, rc::Rc}; + +pub type RelocationMap = HashMap; + +#[derive(Debug, Clone)] +pub struct Relocate> { + pub relocations: Rc, + pub section: R, + pub reader: R, +} + +impl<'a, R: gimli::Reader> Relocate { + pub fn relocate(&self, offset: usize, value: u64) -> u64 { + if let Some(relocation) = self.relocations.get(&offset) { + match relocation.kind() { + object::RelocationKind::Absolute => { + if relocation.has_implicit_addend() { + // Use the explicit addend too, because it may have the symbol value. + return value.wrapping_add(relocation.addend() as u64); + } else { + return relocation.addend() as u64; + } + } + _ => {} + } + }; + value + } +} + +impl> Reader for Relocate { + type Endian = R::Endian; + type Offset = R::Offset; + + fn read_address(&mut self, address_size: u8) -> gimli::Result { + let offset = self.reader.offset_from(&self.section); + let value = self.reader.read_address(address_size)?; + Ok(self.relocate(offset, value)) + } + + fn read_length(&mut self, format: gimli::Format) -> gimli::Result { + let offset = self.reader.offset_from(&self.section); + let value = self.reader.read_length(format)?; + ::from_u64(self.relocate(offset, value as u64)) + } + + fn read_offset(&mut self, format: gimli::Format) -> gimli::Result { + let offset = self.reader.offset_from(&self.section); + let value = self.reader.read_offset(format)?; + ::from_u64(self.relocate(offset, value as u64)) + } + + fn read_sized_offset(&mut self, size: u8) -> gimli::Result { + let offset = self.reader.offset_from(&self.section); + let value = self.reader.read_sized_offset(size)?; + ::from_u64(self.relocate(offset, value as u64)) + } + + #[inline] + fn split(&mut self, len: Self::Offset) -> gimli::Result { + let mut other = self.clone(); + other.reader.truncate(len)?; + self.reader.skip(len)?; + Ok(other) + } + + // All remaining methods simply delegate to `self.reader`. + + #[inline] + fn endian(&self) -> Self::Endian { + self.reader.endian() + } + + #[inline] + fn len(&self) -> Self::Offset { + self.reader.len() + } + + #[inline] + fn empty(&mut self) { + self.reader.empty() + } + + #[inline] + fn truncate(&mut self, len: Self::Offset) -> gimli::Result<()> { + self.reader.truncate(len) + } + + #[inline] + fn offset_from(&self, base: &Self) -> Self::Offset { + self.reader.offset_from(&base.reader) + } + + #[inline] + fn offset_id(&self) -> gimli::ReaderOffsetId { + self.reader.offset_id() + } + + #[inline] + fn lookup_offset_id(&self, id: gimli::ReaderOffsetId) -> Option { + self.reader.lookup_offset_id(id) + } + + #[inline] + fn find(&self, byte: u8) -> gimli::Result { + self.reader.find(byte) + } + + #[inline] + fn skip(&mut self, len: Self::Offset) -> gimli::Result<()> { + self.reader.skip(len) + } + + #[inline] + fn to_slice(&self) -> gimli::Result> { + self.reader.to_slice() + } + + #[inline] + fn to_string(&self) -> gimli::Result> { + self.reader.to_string() + } + + #[inline] + fn to_string_lossy(&self) -> gimli::Result> { + self.reader.to_string_lossy() + } + + #[inline] + fn read_slice(&mut self, buf: &mut [u8]) -> gimli::Result<()> { + self.reader.read_slice(buf) + } +} From dbec4c28bd8ccf7d0a703f5d21e60650d3416dc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rk=20Tolm=C3=A1cs?= Date: Mon, 4 Dec 2023 21:06:07 +0100 Subject: [PATCH 03/36] Refactored but still not compiling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Márk Tolmács --- Cargo.lock | 13 +- cargo-wasm2map/src/main.rs | 2 +- wasm2map/Cargo.toml | 4 +- wasm2map/src/lib.rs | 292 ++++++++++++++++++------ wasm2map/src/{reader => loader}/file.rs | 12 +- wasm2map/src/{reader => loader}/mmap.rs | 14 +- wasm2map/src/{reader => loader}/mod.rs | 4 +- wasm2map/src/reader.rs | 17 ++ wasm2map/src/relocate.rs | 31 +-- wasm2map/src/test.rs | 4 + 10 files changed, 280 insertions(+), 113 deletions(-) rename wasm2map/src/{reader => loader}/file.rs (87%) rename wasm2map/src/{reader => loader}/mmap.rs (89%) rename wasm2map/src/{reader => loader}/mod.rs (74%) create mode 100644 wasm2map/src/reader.rs diff --git a/Cargo.lock b/Cargo.lock index 76491e0..e816bbb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -192,9 +192,12 @@ dependencies = [ [[package]] name = "gimli" -version = "0.27.3" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +dependencies = [ + "stable_deref_trait", +] [[package]] name = "hashbrown" @@ -436,6 +439,12 @@ dependencies = [ "url", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "static_assertions" version = "1.1.0" diff --git a/cargo-wasm2map/src/main.rs b/cargo-wasm2map/src/main.rs index 81b53d7..4036dc2 100644 --- a/cargo-wasm2map/src/main.rs +++ b/cargo-wasm2map/src/main.rs @@ -105,7 +105,7 @@ fn main() -> Result<(), String> { let reader = WasmReader::from_path(&args.path).map_err(|err| err.to_string())?; // Parse the DWARF code section - let mut wasm = Wasm::new(&reader, None).map_err(|err| err.to_string())?; + let mut wasm = Wasm::new(&reader, None, None, None).map_err(|err| err.to_string())?; // Generate the source map JSON for the loaded WASM let sourcemap = wasm.map_v3(args.bundle_sources); diff --git a/wasm2map/Cargo.toml b/wasm2map/Cargo.toml index b069a35..3ea577d 100644 --- a/wasm2map/Cargo.toml +++ b/wasm2map/Cargo.toml @@ -19,9 +19,9 @@ license = "MIT OR Apache-2.0" default = ["memmap2"] [dependencies.gimli] -version = "0.27.2" +version = "0.28.1" default-features = false -features = ["read"] +features = ["read", "endian-reader"] [dependencies.memmap2] version = "~0.5.10" diff --git a/wasm2map/src/lib.rs b/wasm2map/src/lib.rs index 6ac4d38..2788483 100644 --- a/wasm2map/src/lib.rs +++ b/wasm2map/src/lib.rs @@ -16,6 +16,7 @@ mod error; mod json; +mod loader; mod reader; mod relocate; #[cfg(test)] @@ -23,15 +24,16 @@ mod test; mod vlq; use error::Error; -use gimli::{Dwarf, EndianSlice, LittleEndian}; +use gimli::{self, Dwarf, LittleEndian, Reader}; +pub use loader::WasmLoader; pub use object::ReadRef; -use object::{File, Object, ObjectSection, ObjectSymbol, Relocation}; -pub use reader::WasmReader; -use relocate::Relocate; +use object::{self, Object, ObjectSection, ObjectSymbol}; +use reader::WasmReader; +use relocate::{Relocate, RelocationMap}; use sourcemap::SourceMapBuilder; use std::{ borrow::Cow, - collections::{BTreeMap, HashMap}, + collections::BTreeMap, fs, io::{self, Seek, Write}, ops::Deref, @@ -40,42 +42,110 @@ use std::{ str, }; -type RelocationMap = HashMap; +struct Raw<'object, R: ReadRef<'object>> { + object: object::File<'object, R>, + parent: Option>, + sup: Option>, +} + +impl<'object, R: ReadRef<'object>> Raw<'object, R> { + /// + /// + /// + pub fn new( + binary: R, + dwo_parent: Option, + sup_file: Option, + ) -> Result, Error> { + Ok(Raw { + object: Self::parse_file(binary)?, + parent: dwo_parent.and_then(|dwo_parent| Self::parse_file(dwo_parent).ok()), + sup: sup_file.and_then(|sup_file| Self::parse_file(sup_file).ok()), + }) + } + + fn parse_file(binary: R) -> Result, Error> { + match object::File::parse(binary)? { + file @ object::File::Wasm(_) => Ok(file), + _ => Err(Error::from("Data does not represent a WASM file")), + } + } +} /// -pub struct Wasm<'raw, R: ReadRef<'raw>> { - object: File<'raw, R>, +pub struct Wasm<'wasm, R: ReadRef<'wasm>> { + raw: Raw<'wasm, R>, mapper: SourceMapBuilder, } -impl<'a, R> Wasm<'a, R> +impl<'wasm, R> Wasm<'wasm, R> where - R: ReadRef<'a>, + R: ReadRef<'wasm>, { /// /// /// - pub fn new(binary: R, name: Option<&str>) -> Result { - match File::parse(binary)? { - file @ File::Wasm(_) => Ok(Self { - object: file, - mapper: SourceMapBuilder::new(name), - }), - _ => Err(Error::from("Data does not represent a WASM file")), - } + pub fn new( + binary: R, + name: Option<&str>, + dwo_parent: Option, + sup_file: Option, + ) -> Result { + Ok(Self { + raw: Raw::new(binary, dwo_parent, sup_file)?, + mapper: SourceMapBuilder::new(name), + }) } - fn generate() -> Result<(), Error> { - //let mut load_section = |id: gimli::SectionId| -> Result<_, Error> { Err(Error::from("")) }; - //let dwarf = Dwarf::load(&mut load_section)?; + /// + /// + /// + pub fn map_v3(&'wasm mut self) -> Result<(), Error> { + let parent = if let Some(parent) = &self.raw.parent { + let mut load_parent_section = + |id: gimli::SectionId| Self::load_file_section(id, parent, false); + Some(gimli::Dwarf::load(&mut load_parent_section)?) + } else { + None + }; + let parent = parent.as_ref(); + + let mut load_section = + |id: gimli::SectionId| Self::load_file_section(id, &self.raw.object, parent.is_some()); + + let mut dwarf = gimli::Dwarf::load(&mut load_section)?; + if parent.is_some() { + if let Some(parent) = parent { + dwarf.make_dwo(parent); + } else { + dwarf.file_type = gimli::DwarfFileType::Dwo; + } + } + + if let Some(sup) = self.raw.sup.as_ref() { + let mut load_sup_section = |id: gimli::SectionId| { + // Note: we really only need the `.debug_str` section, + // but for now we load them all. + Self::load_file_section(id, sup, false) + }; + dwarf.load_sup(&mut load_sup_section)?; + } + + dwarf.populate_abbreviations_cache(gimli::AbbreviationsCacheStrategy::All); + + self.generate(&dwarf); + Ok(()) } + /// + /// + /// fn load_file_section( - &mut self, id: gimli::SectionId, + object: &'wasm object::File<'wasm, R>, is_dwo: bool, - ) -> Result>, Error> { + ) -> Result>>, Error> { let mut relocations = RelocationMap::default(); let name = if is_dwo { id.dwo_name() @@ -83,69 +153,147 @@ where Some(id.name()) }; - let data = match name.and_then(|name| self.object.section_by_name(&name)) { + let data = match name.and_then(|name| object.section_by_name(name)) { Some(ref section) => { // DWO sections never have relocations, so don't bother. if !is_dwo { - for (offset64, mut relocation) in section.relocations() { - let offset = offset64 as usize; - if offset as u64 != offset64 { - continue; - } - let offset = offset as usize; - match relocation.kind() { - object::RelocationKind::Absolute => { - match relocation.target() { - object::RelocationTarget::Symbol(symbol_idx) => { - match self.object.symbol_by_index(symbol_idx) { - Ok(symbol) => { - let addend = symbol - .address() - .wrapping_add(relocation.addend() as u64); - relocation.set_addend(addend as i64); - } - Err(_) => { - eprintln!( - "Relocation with invalid symbol for section {} at offset 0x{:08x}", - section.name().unwrap(), - offset - ); - } - } - } - _ => {} - } - if relocations.insert(offset, relocation).is_some() { - eprintln!( - "Multiple relocations for section {} at offset 0x{:08x}", - section.name().unwrap(), - offset - ); - } - } - _ => { - eprintln!( - "Unsupported relocation for section {} at offset 0x{:08x}", - section.name().unwrap(), - offset - ); - } - } - } + // Collect the relocations in this section and add to the relocation map + relocations.extend(Self::get_relocations(object, section)?); } section.uncompressed_data()? } // Use a non-zero capacity so that `ReaderOffsetId`s are unique. None => Cow::Owned(Vec::with_capacity(1)), }; - let reader = gimli::EndianSlice::new(&data, LittleEndian); - let section = reader; + + let reader = gimli::EndianReader::new(WasmReader { data }, LittleEndian); + let offset = reader.offset_from(&reader); Ok(Relocate { relocations: Rc::new(relocations), - section, + offset, reader, }) } + + /// + /// + /// + fn get_relocations( + object: &object::File<'wasm, R>, + section: &object::Section<'wasm, 'wasm, R>, + ) -> Result { + let mut relocations: RelocationMap = RelocationMap::new(); + + for (offset64, mut relocation) in section.relocations() { + let offset = offset64 as usize; + if offset as u64 != offset64 { + continue; + } + + match relocation.kind() { + object::RelocationKind::Absolute => { + if let object::RelocationTarget::Symbol(symbol_idx) = relocation.target() { + match object.symbol_by_index(symbol_idx) { + Ok(symbol) => { + let addend = + symbol.address().wrapping_add(relocation.addend() as u64); + relocation.set_addend(addend as i64); + } + Err(_) => { + let msg = format!( + "Relocation with invalid symbol for section {} at offset 0x{:08x}", + section.name().unwrap(), + offset + ); + return Err(msg.into()); + } + } + } + + if relocations.insert(offset, relocation).is_some() { + let msg = format!( + "Multiple relocations for section {} at offset 0x{:08x}", + section.name().unwrap(), + offset + ); + return Err(msg.into()); + } + } + _ => { + let msg = format!( + "Unsupported relocation for section {} at offset 0x{:08x}", + section.name().unwrap(), + offset + ); + return Err(msg.into()); + } + } + } + + Ok(relocations) + } + + fn generate(&'wasm mut self, dwarf: &gimli::Dwarf) -> Result<(), Error> { + let mut iter = dwarf.units(); + while let Some(header) = iter.next()? { + let unit = match dwarf.unit(header) { + Ok(unit) => unit, + Err(_) => continue, + }; + match self.generate_line(&unit, dwarf) { + Ok(_) => (), + Err(err) => return Err(err), + } + } + Ok(()) + } + + fn generate_line( + &'wasm mut self, + unit: &gimli::Unit, + dwarf: &gimli::Dwarf, + ) -> Result<(), Error> { + if let Some(program) = unit.line_program.clone() { + let header = program.header(); + let base = if header.version() >= 5 { 0 } else { 1 }; + //header.directory(directory) + let mut rows = program.rows(); + while let Some((line_header, row)) = rows.next_row()? { + let line = match row.line() { + Some(line) => line.get(), + None => 0, + }; + let column = match row.column() { + gimli::ColumnType::Column(column) => column.get(), + gimli::ColumnType::LeftEdge => 0, + }; + let file = match row.file(line_header) { + Some(file) => { + let reader = dwarf.attr_string(unit, file.path_name())?; + let file_name = reader.to_string_lossy()?; + let sid = self.mapper.add_source(file_name.as_ref()); + Some(sid) + } + None => None, + }; + + self.mapper.add_raw( + 1, + row.address().try_into()?, + line.try_into()?, + column.try_into()?, + file, + None, // TODO: Look up name + ); + + if row.end_sequence() {} + + //self.mapper.into_sourcemap() + } + } + + Ok(()) + } } //////////////////// diff --git a/wasm2map/src/reader/file.rs b/wasm2map/src/loader/file.rs similarity index 87% rename from wasm2map/src/reader/file.rs rename to wasm2map/src/loader/file.rs index 21daceb..f302452 100644 --- a/wasm2map/src/reader/file.rs +++ b/wasm2map/src/loader/file.rs @@ -1,20 +1,18 @@ +use crate::error::Error; +use object::{ReadCache, ReadRef}; use std::{ fs::File, io::{Read, Seek}, path::Path, }; -use object::{ReadCache, ReadRef}; - -use crate::error::Error; - /// #[derive(Debug)] -pub struct WasmReader { +pub struct WasmLoader { data: ReadCache, } -impl WasmReader { +impl WasmLoader { /// pub fn from_path(path: impl AsRef) -> Result { let file = File::open(path)?; @@ -31,7 +29,7 @@ impl WasmReader { } } -impl<'a, R: Read + Seek> ReadRef<'a> for &'a WasmReader { +impl<'a, R: Read + Seek> ReadRef<'a> for &'a WasmLoader { fn len(self) -> Result { self.data.len() } diff --git a/wasm2map/src/reader/mmap.rs b/wasm2map/src/loader/mmap.rs similarity index 89% rename from wasm2map/src/reader/mmap.rs rename to wasm2map/src/loader/mmap.rs index 8526ef5..f224c76 100644 --- a/wasm2map/src/reader/mmap.rs +++ b/wasm2map/src/loader/mmap.rs @@ -1,3 +1,6 @@ +use crate::error::Error; +use memmap2::Mmap; +use object::ReadRef; use std::{ fs::File, io::{Read, Seek}, @@ -5,19 +8,14 @@ use std::{ path::Path, }; -use memmap2::Mmap; -use object::ReadRef; - -use crate::error::Error; - /// #[derive(Debug)] -pub struct WasmReader { +pub struct WasmLoader { data: Mmap, _marker: PhantomData, } -impl WasmReader { +impl WasmLoader { /// pub fn from_path(path: impl AsRef) -> Result { let file = File::open(path)?; @@ -37,7 +35,7 @@ impl WasmReader { } } -impl<'a, R: Read + Seek> ReadRef<'a> for &'a WasmReader { +impl<'a, R: Read + Seek> ReadRef<'a> for &'a WasmLoader { fn len(self) -> Result { self.data.len().try_into().map_err(|_| ()) } diff --git a/wasm2map/src/reader/mod.rs b/wasm2map/src/loader/mod.rs similarity index 74% rename from wasm2map/src/reader/mod.rs rename to wasm2map/src/loader/mod.rs index 671689d..017f4ad 100644 --- a/wasm2map/src/reader/mod.rs +++ b/wasm2map/src/loader/mod.rs @@ -1,9 +1,9 @@ #[cfg(not(feature = "memmap2"))] pub mod file; #[cfg(not(feature = "memmap2"))] -pub use file::WasnReader; +pub use file::WasmLoader; #[cfg(feature = "memmap2")] pub mod mmap; #[cfg(feature = "memmap2")] -pub use mmap::WasmReader; +pub use mmap::WasmLoader; diff --git a/wasm2map/src/reader.rs b/wasm2map/src/reader.rs new file mode 100644 index 0000000..4ff4a68 --- /dev/null +++ b/wasm2map/src/reader.rs @@ -0,0 +1,17 @@ +use std::{borrow::Cow, ops::Deref}; + +#[derive(Clone, Debug)] +pub struct WasmReader<'a> { + pub data: Cow<'a, [u8]>, +} + +impl<'a> Deref for WasmReader<'a> { + type Target = [u8]; + + fn deref(&self) -> &Self::Target { + self.data.deref() + } +} + +unsafe impl<'a> gimli::StableDeref for WasmReader<'a> {} +unsafe impl<'a> gimli::CloneStableDeref for WasmReader<'a> {} diff --git a/wasm2map/src/relocate.rs b/wasm2map/src/relocate.rs index 8bf1efb..bbfa0d9 100644 --- a/wasm2map/src/relocate.rs +++ b/wasm2map/src/relocate.rs @@ -7,23 +7,20 @@ pub type RelocationMap = HashMap; #[derive(Debug, Clone)] pub struct Relocate> { pub relocations: Rc, - pub section: R, + pub offset: usize, pub reader: R, } -impl<'a, R: gimli::Reader> Relocate { +impl> Relocate { pub fn relocate(&self, offset: usize, value: u64) -> u64 { if let Some(relocation) = self.relocations.get(&offset) { - match relocation.kind() { - object::RelocationKind::Absolute => { - if relocation.has_implicit_addend() { - // Use the explicit addend too, because it may have the symbol value. - return value.wrapping_add(relocation.addend() as u64); - } else { - return relocation.addend() as u64; - } + if let object::RelocationKind::Absolute = relocation.kind() { + if relocation.has_implicit_addend() { + // Use the explicit addend too, because it may have the symbol value. + return value.wrapping_add(relocation.addend() as u64); + } else { + return relocation.addend() as u64; } - _ => {} } }; value @@ -35,27 +32,23 @@ impl> Reader for Relocate { type Offset = R::Offset; fn read_address(&mut self, address_size: u8) -> gimli::Result { - let offset = self.reader.offset_from(&self.section); let value = self.reader.read_address(address_size)?; - Ok(self.relocate(offset, value)) + Ok(self.relocate(self.offset, value)) } fn read_length(&mut self, format: gimli::Format) -> gimli::Result { - let offset = self.reader.offset_from(&self.section); let value = self.reader.read_length(format)?; - ::from_u64(self.relocate(offset, value as u64)) + ::from_u64(self.relocate(self.offset, value as u64)) } fn read_offset(&mut self, format: gimli::Format) -> gimli::Result { - let offset = self.reader.offset_from(&self.section); let value = self.reader.read_offset(format)?; - ::from_u64(self.relocate(offset, value as u64)) + ::from_u64(self.relocate(self.offset, value as u64)) } fn read_sized_offset(&mut self, size: u8) -> gimli::Result { - let offset = self.reader.offset_from(&self.section); let value = self.reader.read_sized_offset(size)?; - ::from_u64(self.relocate(offset, value as u64)) + ::from_u64(self.relocate(self.offset, value as u64)) } #[inline] diff --git a/wasm2map/src/test.rs b/wasm2map/src/test.rs index d1f6165..9099829 100644 --- a/wasm2map/src/test.rs +++ b/wasm2map/src/test.rs @@ -345,6 +345,10 @@ fn position_retrieval_works() { }); } +// TODO: Test relocation + +// TODO: Test DWO? + mod testutils { use std::{ fs, panic, From ddc96a187b9e0b6f38ec2ae256dc49889595d765 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rk=20Tolm=C3=A1cs?= Date: Tue, 5 Dec 2023 09:55:25 +0100 Subject: [PATCH 04/36] Compiling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Márk Tolmács --- wasm2map/src/lib.rs | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/wasm2map/src/lib.rs b/wasm2map/src/lib.rs index 2788483..fc68dea 100644 --- a/wasm2map/src/lib.rs +++ b/wasm2map/src/lib.rs @@ -30,7 +30,7 @@ pub use object::ReadRef; use object::{self, Object, ObjectSection, ObjectSymbol}; use reader::WasmReader; use relocate::{Relocate, RelocationMap}; -use sourcemap::SourceMapBuilder; +use sourcemap::{SourceMap, SourceMapBuilder}; use std::{ borrow::Cow, collections::BTreeMap, @@ -101,7 +101,13 @@ where /// /// pub fn map_v3(&'wasm mut self) -> Result<(), Error> { - let parent = if let Some(parent) = &self.raw.parent { + let Wasm { raw, mapper } = self; + + // If the WASM debug info is in a split DWARF object (DWO), then load + // the parent object first, so we can link them. The parent archive + // contains references to the DWO object we resolve later in generating + // the source map + let parent = if let Some(parent) = &raw.parent { let mut load_parent_section = |id: gimli::SectionId| Self::load_file_section(id, parent, false); Some(gimli::Dwarf::load(&mut load_parent_section)?) @@ -110,10 +116,12 @@ where }; let parent = parent.as_ref(); + // This is the target object binary we are generating the sourcemap for let mut load_section = - |id: gimli::SectionId| Self::load_file_section(id, &self.raw.object, parent.is_some()); + |id: gimli::SectionId| Self::load_file_section(id, &raw.object, parent.is_some()); let mut dwarf = gimli::Dwarf::load(&mut load_section)?; + if parent.is_some() { if let Some(parent) = parent { dwarf.make_dwo(parent); @@ -122,7 +130,8 @@ where } } - if let Some(sup) = self.raw.sup.as_ref() { + // Load optional supplemental file + if let Some(sup) = &raw.sup { let mut load_sup_section = |id: gimli::SectionId| { // Note: we really only need the `.debug_str` section, // but for now we load them all. @@ -133,9 +142,8 @@ where dwarf.populate_abbreviations_cache(gimli::AbbreviationsCacheStrategy::All); - self.generate(&dwarf); - - Ok(()) + // Finally use the loaded DWARF data to generate the sourcemap + Self::generate(&dwarf, mapper) } /// @@ -233,14 +241,17 @@ where Ok(relocations) } - fn generate(&'wasm mut self, dwarf: &gimli::Dwarf) -> Result<(), Error> { + fn generate( + dwarf: &gimli::Dwarf, + mapper: &'wasm mut SourceMapBuilder, + ) -> Result<(), Error> { let mut iter = dwarf.units(); while let Some(header) = iter.next()? { let unit = match dwarf.unit(header) { Ok(unit) => unit, Err(_) => continue, }; - match self.generate_line(&unit, dwarf) { + match Self::generate_line(&unit, dwarf, mapper) { Ok(_) => (), Err(err) => return Err(err), } @@ -249,9 +260,9 @@ where } fn generate_line( - &'wasm mut self, unit: &gimli::Unit, dwarf: &gimli::Dwarf, + mapper: &mut SourceMapBuilder, ) -> Result<(), Error> { if let Some(program) = unit.line_program.clone() { let header = program.header(); @@ -271,13 +282,13 @@ where Some(file) => { let reader = dwarf.attr_string(unit, file.path_name())?; let file_name = reader.to_string_lossy()?; - let sid = self.mapper.add_source(file_name.as_ref()); + let sid = mapper.add_source(file_name.as_ref()); Some(sid) } None => None, }; - self.mapper.add_raw( + mapper.add_raw( 1, row.address().try_into()?, line.try_into()?, From d22afc31a2ded93b6a6a5a02b7e6ec94a325790c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rk=20Tolm=C3=A1cs?= Date: Tue, 5 Dec 2023 20:34:28 +0100 Subject: [PATCH 05/36] Half compiles MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Márk Tolmács --- cargo-wasm2map/src/main.rs | 12 +- wasm2map/src/dwarf.rs | 211 +++++++++++++++++++++++++++ wasm2map/src/lib.rs | 286 +++++++------------------------------ 3 files changed, 271 insertions(+), 238 deletions(-) create mode 100644 wasm2map/src/dwarf.rs diff --git a/cargo-wasm2map/src/main.rs b/cargo-wasm2map/src/main.rs index 4036dc2..8aa9ab6 100644 --- a/cargo-wasm2map/src/main.rs +++ b/cargo-wasm2map/src/main.rs @@ -14,7 +14,7 @@ use clap::{Args, Parser}; use std::{fs, path::PathBuf}; -use wasm2map::{Wasm, WasmReader, WASM}; +use wasm2map::{Wasm, WasmLoader}; // Cargo commands receive the name of the subcommand as the main command // so we need to consume the name of our executable in order to get to the @@ -102,13 +102,14 @@ fn main() -> Result<(), String> { // url and it also does not reference the map file // Open the WASM file - let reader = WasmReader::from_path(&args.path).map_err(|err| err.to_string())?; + let reader = WasmLoader::from_path(&args.path).map_err(|err| err.to_string())?; // Parse the DWARF code section let mut wasm = Wasm::new(&reader, None, None, None).map_err(|err| err.to_string())?; // Generate the source map JSON for the loaded WASM - let sourcemap = wasm.map_v3(args.bundle_sources); + wasm.build(args.bundle_sources); + let sourcemap = wasm.into_string(); // Dump JSON to the map file fs::write(&map, sourcemap).map_err(|err| err.to_string())?; @@ -121,7 +122,10 @@ fn main() -> Result<(), String> { args.base_url.unwrap().as_str(), map.file_name().unwrap().to_str().unwrap() ); - wasm.patch(&url).map_err(|err| err.to_string())?; + + // TODO: Patching + + //wasm.patch(&url).map_err(|err| err.to_string())?; } Ok(()) diff --git a/wasm2map/src/dwarf.rs b/wasm2map/src/dwarf.rs new file mode 100644 index 0000000..a3cc80f --- /dev/null +++ b/wasm2map/src/dwarf.rs @@ -0,0 +1,211 @@ +use crate::{ + error::Error, + reader::WasmReader, + relocate::{Relocate, RelocationMap}, +}; +use gimli::{Dwarf, EndianReader, LittleEndian, Reader}; +use object::{ + File, Object, ObjectSection, ObjectSymbol, ReadRef, RelocationKind, RelocationTarget, Section, +}; +use std::{borrow::Cow, cell::OnceCell, rc::Rc}; + +pub type ReifiedDwarf<'a> = Dwarf>>>; + +pub struct Raw<'reader, R: ReadRef<'reader>> { + binary: File<'reader, R>, + dwo_parent: Option>, + sup_file: Option>, +} + +impl<'reader, R> Raw<'reader, R> +where + R: ReadRef<'reader> + 'reader, +{ + /// + pub fn new(binary: R, dwo_parent: Option, sup_file: Option) -> Result { + Ok(Self { + binary: Self::parse_file(binary)?, + dwo_parent: dwo_parent.and_then(|dwo_parent| Self::parse_file(dwo_parent).ok()), + sup_file: sup_file.and_then(|sup_file| Self::parse_file(sup_file).ok()), + }) + } + + /// + fn parse_file(binary: R) -> Result, Error> { + match File::parse(binary)? { + file @ File::Wasm(_) => Ok(file), + _ => Err(Error::from("Data does not represent a WASM file")), + } + } +} + +/// +/// +/// +pub struct DwarfReader<'reader, R: ReadRef<'reader> + 'reader> { + raw: Raw<'reader, R>, + pub dwarf: OnceCell>, +} + +impl<'reader, R> DwarfReader<'reader, R> +where + R: ReadRef<'reader> + 'reader, +{ + /// + /// + /// + pub fn new(raw: Raw<'reader, R>) -> DwarfReader<'reader, R> { + DwarfReader { + raw, + dwarf: OnceCell::new(), + } + } + + /// + /// + /// + pub fn get( + &'reader self, + ) -> Result<&Dwarf>>>, Error> { + if self.dwarf.get().is_none() { + // If the WASM debug info is in a split DWARF object (DWO), then load + // the parent object first, so we can link them. The parent archive + // contains references to the DWO object we resolve later in generating + // the source map + let parent = if let Some(parent) = &self.raw.dwo_parent { + let mut load_parent_section = + |id: gimli::SectionId| Self::load_file_section(id, parent, false); + Some(gimli::Dwarf::load(&mut load_parent_section)?) + } else { + None + }; + let parent = parent.as_ref(); + + // This is the target object binary we are generating the sourcemap for + let mut load_section = |id: gimli::SectionId| { + Self::load_file_section(id, &self.raw.binary, parent.is_some()) + }; + + let mut dwarf = gimli::Dwarf::load(&mut load_section)?; + + if parent.is_some() { + if let Some(parent) = parent { + dwarf.make_dwo(parent); + } else { + dwarf.file_type = gimli::DwarfFileType::Dwo; + } + } + + // Load optional supplemental file + if let Some(sup) = &self.raw.sup_file { + let mut load_sup_section = |id: gimli::SectionId| { + // Note: we really only need the `.debug_str` section, + // but for now we load them all. + Self::load_file_section(id, sup, false) + }; + dwarf.load_sup(&mut load_sup_section)?; + } + + dwarf.populate_abbreviations_cache(gimli::AbbreviationsCacheStrategy::All); + + self.dwarf.set(dwarf).ok(); + } + + Ok(self.dwarf.get().unwrap()) + } + + /// + /// + /// + fn load_file_section( + id: gimli::SectionId, + object: &'reader File<'reader, R>, + is_dwo: bool, + ) -> Result>>, Error> { + let mut relocations = RelocationMap::default(); + let name = if is_dwo { + id.dwo_name() + } else { + Some(id.name()) + }; + + let data = match name.and_then(|name| object.section_by_name(name)) { + Some(ref section) => { + // DWO sections never have relocations, so don't bother. + if !is_dwo { + // Collect the relocations in this section and add to the relocation map + relocations.extend(Self::get_relocations(object, section)?); + } + section.uncompressed_data()? + } + // Use a non-zero capacity so that `ReaderOffsetId`s are unique. + None => Cow::Owned(Vec::with_capacity(1)), + }; + + let reader = gimli::EndianReader::new(WasmReader { data }, LittleEndian); + let offset = reader.offset_from(&reader); + Ok(Relocate { + relocations: Rc::new(relocations), + offset, + reader, + }) + } + + /// + /// + /// + fn get_relocations( + object: &File<'reader, R>, + section: &Section<'reader, 'reader, R>, + ) -> Result { + let mut relocations: RelocationMap = RelocationMap::new(); + + for (offset64, mut relocation) in section.relocations() { + let offset = offset64 as usize; + if offset as u64 != offset64 { + continue; + } + + match relocation.kind() { + RelocationKind::Absolute => { + if let RelocationTarget::Symbol(symbol_idx) = relocation.target() { + match object.symbol_by_index(symbol_idx) { + Ok(symbol) => { + let addend = + symbol.address().wrapping_add(relocation.addend() as u64); + relocation.set_addend(addend as i64); + } + Err(_) => { + let msg = format!( + "Relocation with invalid symbol for section {} at offset 0x{:08x}", + section.name().unwrap(), + offset + ); + return Err(msg.into()); + } + } + } + + if relocations.insert(offset, relocation).is_some() { + let msg = format!( + "Multiple relocations for section {} at offset 0x{:08x}", + section.name().unwrap(), + offset + ); + return Err(msg.into()); + } + } + _ => { + let msg = format!( + "Unsupported relocation for section {} at offset 0x{:08x}", + section.name().unwrap(), + offset + ); + return Err(msg.into()); + } + } + } + + Ok(relocations) + } +} diff --git a/wasm2map/src/lib.rs b/wasm2map/src/lib.rs index fc68dea..38239d6 100644 --- a/wasm2map/src/lib.rs +++ b/wasm2map/src/lib.rs @@ -14,6 +14,7 @@ //! * [wasm_sourcemap.py](https://github.com/emscripten-core/emscripten/blob/main/tools/wasm-sourcemap.py) by the Emscripten Team //! * [WebAssembly Debugging](https://medium.com/oasislabs/webassembly-debugging-bec0aa93f8c6) by Will Scott and Oasis Labs +mod dwarf; mod error; mod json; mod loader; @@ -23,14 +24,13 @@ mod relocate; mod test; mod vlq; +use dwarf::{DwarfReader, Raw}; use error::Error; -use gimli::{self, Dwarf, LittleEndian, Reader}; +use gimli::{self, Reader}; pub use loader::WasmLoader; pub use object::ReadRef; -use object::{self, Object, ObjectSection, ObjectSymbol}; -use reader::WasmReader; -use relocate::{Relocate, RelocationMap}; -use sourcemap::{SourceMap, SourceMapBuilder}; +use object::{self, Object, ObjectSection}; +use sourcemap::SourceMapBuilder; use std::{ borrow::Cow, collections::BTreeMap, @@ -38,50 +38,16 @@ use std::{ io::{self, Seek, Write}, ops::Deref, path::{Path, PathBuf}, - rc::Rc, str, }; -struct Raw<'object, R: ReadRef<'object>> { - object: object::File<'object, R>, - parent: Option>, - sup: Option>, -} - -impl<'object, R: ReadRef<'object>> Raw<'object, R> { - /// - /// - /// - pub fn new( - binary: R, - dwo_parent: Option, - sup_file: Option, - ) -> Result, Error> { - Ok(Raw { - object: Self::parse_file(binary)?, - parent: dwo_parent.and_then(|dwo_parent| Self::parse_file(dwo_parent).ok()), - sup: sup_file.and_then(|sup_file| Self::parse_file(sup_file).ok()), - }) - } - - fn parse_file(binary: R) -> Result, Error> { - match object::File::parse(binary)? { - file @ object::File::Wasm(_) => Ok(file), - _ => Err(Error::from("Data does not represent a WASM file")), - } - } -} - /// pub struct Wasm<'wasm, R: ReadRef<'wasm>> { - raw: Raw<'wasm, R>, + dwarf: DwarfReader<'wasm, R>, mapper: SourceMapBuilder, } -impl<'wasm, R> Wasm<'wasm, R> -where - R: ReadRef<'wasm>, -{ +impl<'wasm, R: ReadRef<'wasm> + 'wasm> Wasm<'wasm, R> { /// /// /// @@ -92,7 +58,7 @@ where sup_file: Option, ) -> Result { Ok(Self { - raw: Raw::new(binary, dwo_parent, sup_file)?, + dwarf: DwarfReader::<'wasm, R>::new(Raw::new(binary, dwo_parent, sup_file)?), mapper: SourceMapBuilder::new(name), }) } @@ -100,210 +66,62 @@ where /// /// /// - pub fn map_v3(&'wasm mut self) -> Result<(), Error> { - let Wasm { raw, mapper } = self; - - // If the WASM debug info is in a split DWARF object (DWO), then load - // the parent object first, so we can link them. The parent archive - // contains references to the DWO object we resolve later in generating - // the source map - let parent = if let Some(parent) = &raw.parent { - let mut load_parent_section = - |id: gimli::SectionId| Self::load_file_section(id, parent, false); - Some(gimli::Dwarf::load(&mut load_parent_section)?) - } else { - None - }; - let parent = parent.as_ref(); - - // This is the target object binary we are generating the sourcemap for - let mut load_section = - |id: gimli::SectionId| Self::load_file_section(id, &raw.object, parent.is_some()); - - let mut dwarf = gimli::Dwarf::load(&mut load_section)?; - - if parent.is_some() { - if let Some(parent) = parent { - dwarf.make_dwo(parent); - } else { - dwarf.file_type = gimli::DwarfFileType::Dwo; - } - } - - // Load optional supplemental file - if let Some(sup) = &raw.sup { - let mut load_sup_section = |id: gimli::SectionId| { - // Note: we really only need the `.debug_str` section, - // but for now we load them all. - Self::load_file_section(id, sup, false) + pub fn build(&'wasm mut self, bundle_sources: bool) -> Result<(), Error> { + let mut iter = self.dwarf.get()?.units(); + while let Some(header) = iter.next()? { + let unit = match self.dwarf.get()?.unit(header) { + Ok(unit) => unit, + Err(_) => continue, }; - dwarf.load_sup(&mut load_sup_section)?; - } - - dwarf.populate_abbreviations_cache(gimli::AbbreviationsCacheStrategy::All); - - // Finally use the loaded DWARF data to generate the sourcemap - Self::generate(&dwarf, mapper) - } - - /// - /// - /// - fn load_file_section( - id: gimli::SectionId, - object: &'wasm object::File<'wasm, R>, - is_dwo: bool, - ) -> Result>>, Error> { - let mut relocations = RelocationMap::default(); - let name = if is_dwo { - id.dwo_name() - } else { - Some(id.name()) - }; - - let data = match name.and_then(|name| object.section_by_name(name)) { - Some(ref section) => { - // DWO sections never have relocations, so don't bother. - if !is_dwo { - // Collect the relocations in this section and add to the relocation map - relocations.extend(Self::get_relocations(object, section)?); - } - section.uncompressed_data()? - } - // Use a non-zero capacity so that `ReaderOffsetId`s are unique. - None => Cow::Owned(Vec::with_capacity(1)), - }; - - let reader = gimli::EndianReader::new(WasmReader { data }, LittleEndian); - let offset = reader.offset_from(&reader); - Ok(Relocate { - relocations: Rc::new(relocations), - offset, - reader, - }) - } - - /// - /// - /// - fn get_relocations( - object: &object::File<'wasm, R>, - section: &object::Section<'wasm, 'wasm, R>, - ) -> Result { - let mut relocations: RelocationMap = RelocationMap::new(); - - for (offset64, mut relocation) in section.relocations() { - let offset = offset64 as usize; - if offset as u64 != offset64 { - continue; - } - - match relocation.kind() { - object::RelocationKind::Absolute => { - if let object::RelocationTarget::Symbol(symbol_idx) = relocation.target() { - match object.symbol_by_index(symbol_idx) { - Ok(symbol) => { - let addend = - symbol.address().wrapping_add(relocation.addend() as u64); - relocation.set_addend(addend as i64); - } - Err(_) => { - let msg = format!( - "Relocation with invalid symbol for section {} at offset 0x{:08x}", - section.name().unwrap(), - offset - ); - return Err(msg.into()); - } + if let Some(program) = unit.line_program.clone() { + //let header = program.header(); + //let base = if header.version() >= 5 { 0 } else { 1 }; + //header.directory(directory) + let mut rows = program.rows(); + while let Some((line_header, row)) = rows.next_row()? { + let line = match row.line() { + Some(line) => line.get(), + None => 0, + }; + let column = match row.column() { + gimli::ColumnType::Column(column) => column.get(), + gimli::ColumnType::LeftEdge => 0, + }; + let file = match row.file(line_header) { + Some(file) => { + let reader = self.dwarf.get()?.attr_string(&unit, file.path_name())?; + let file_name = reader.to_string_lossy()?; + let sid = self.mapper.add_source(file_name.as_ref()); + Some(sid) } - } + None => None, + }; - if relocations.insert(offset, relocation).is_some() { - let msg = format!( - "Multiple relocations for section {} at offset 0x{:08x}", - section.name().unwrap(), - offset - ); - return Err(msg.into()); - } - } - _ => { - let msg = format!( - "Unsupported relocation for section {} at offset 0x{:08x}", - section.name().unwrap(), - offset + // TODO: Bundle sources? + + self.mapper.add_raw( + 1, + row.address().try_into()?, + line.try_into()?, + column.try_into()?, + file, + None, // TODO: Look up name ); - return Err(msg.into()); + + //if row.end_sequence() {} } } } - Ok(relocations) - } - - fn generate( - dwarf: &gimli::Dwarf, - mapper: &'wasm mut SourceMapBuilder, - ) -> Result<(), Error> { - let mut iter = dwarf.units(); - while let Some(header) = iter.next()? { - let unit = match dwarf.unit(header) { - Ok(unit) => unit, - Err(_) => continue, - }; - match Self::generate_line(&unit, dwarf, mapper) { - Ok(_) => (), - Err(err) => return Err(err), - } - } Ok(()) } - fn generate_line( - unit: &gimli::Unit, - dwarf: &gimli::Dwarf, - mapper: &mut SourceMapBuilder, - ) -> Result<(), Error> { - if let Some(program) = unit.line_program.clone() { - let header = program.header(); - let base = if header.version() >= 5 { 0 } else { 1 }; - //header.directory(directory) - let mut rows = program.rows(); - while let Some((line_header, row)) = rows.next_row()? { - let line = match row.line() { - Some(line) => line.get(), - None => 0, - }; - let column = match row.column() { - gimli::ColumnType::Column(column) => column.get(), - gimli::ColumnType::LeftEdge => 0, - }; - let file = match row.file(line_header) { - Some(file) => { - let reader = dwarf.attr_string(unit, file.path_name())?; - let file_name = reader.to_string_lossy()?; - let sid = mapper.add_source(file_name.as_ref()); - Some(sid) - } - None => None, - }; - - mapper.add_raw( - 1, - row.address().try_into()?, - line.try_into()?, - column.try_into()?, - file, - None, // TODO: Look up name - ); - - if row.end_sequence() {} - - //self.mapper.into_sourcemap() - } - } + /// + pub fn into_string(self) -> String { + let mut buf: Vec = Vec::new(); + self.mapper.into_sourcemap().to_writer(&mut buf).unwrap(); - Ok(()) + String::from_utf8(buf).unwrap() } } From 962b1bddbde49c05dec148bf8170565477192428 Mon Sep 17 00:00:00 2001 From: Mark Tolmacs Date: Tue, 5 Dec 2023 21:20:34 +0100 Subject: [PATCH 06/36] Relocator type Signed-off-by: Mark Tolmacs --- wasm2map/src/dwarf.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/wasm2map/src/dwarf.rs b/wasm2map/src/dwarf.rs index a3cc80f..36d2971 100644 --- a/wasm2map/src/dwarf.rs +++ b/wasm2map/src/dwarf.rs @@ -9,7 +9,7 @@ use object::{ }; use std::{borrow::Cow, cell::OnceCell, rc::Rc}; -pub type ReifiedDwarf<'a> = Dwarf>>>; +pub type Relocator<'a> = Relocate>>; pub struct Raw<'reader, R: ReadRef<'reader>> { binary: File<'reader, R>, @@ -44,7 +44,7 @@ where /// pub struct DwarfReader<'reader, R: ReadRef<'reader> + 'reader> { raw: Raw<'reader, R>, - pub dwarf: OnceCell>, + pub dwarf: OnceCell>>, } impl<'reader, R> DwarfReader<'reader, R> @@ -64,9 +64,7 @@ where /// /// /// - pub fn get( - &'reader self, - ) -> Result<&Dwarf>>>, Error> { + pub fn get(&'reader self) -> Result<&Dwarf>, Error> { if self.dwarf.get().is_none() { // If the WASM debug info is in a split DWARF object (DWO), then load // the parent object first, so we can link them. The parent archive @@ -121,7 +119,7 @@ where id: gimli::SectionId, object: &'reader File<'reader, R>, is_dwo: bool, - ) -> Result>>, Error> { + ) -> Result, Error> { let mut relocations = RelocationMap::default(); let name = if is_dwo { id.dwo_name() From c474ddd83e689e10c99430485cafbf26928777b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rk=20Tolm=C3=A1cs?= Date: Wed, 6 Dec 2023 15:39:56 +0100 Subject: [PATCH 07/36] No need to reference MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Márk Tolmács --- wasm2map/src/dwarf.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/wasm2map/src/dwarf.rs b/wasm2map/src/dwarf.rs index 36d2971..16bc25d 100644 --- a/wasm2map/src/dwarf.rs +++ b/wasm2map/src/dwarf.rs @@ -71,20 +71,20 @@ where // contains references to the DWO object we resolve later in generating // the source map let parent = if let Some(parent) = &self.raw.dwo_parent { - let mut load_parent_section = + let load_parent_section = |id: gimli::SectionId| Self::load_file_section(id, parent, false); - Some(gimli::Dwarf::load(&mut load_parent_section)?) + Some(gimli::Dwarf::load(load_parent_section)?) } else { None }; let parent = parent.as_ref(); // This is the target object binary we are generating the sourcemap for - let mut load_section = |id: gimli::SectionId| { + let load_section = |id: gimli::SectionId| { Self::load_file_section(id, &self.raw.binary, parent.is_some()) }; - let mut dwarf = gimli::Dwarf::load(&mut load_section)?; + let mut dwarf = gimli::Dwarf::load(load_section)?; if parent.is_some() { if let Some(parent) = parent { @@ -96,12 +96,12 @@ where // Load optional supplemental file if let Some(sup) = &self.raw.sup_file { - let mut load_sup_section = |id: gimli::SectionId| { + let load_sup_section = |id: gimli::SectionId| { // Note: we really only need the `.debug_str` section, // but for now we load them all. Self::load_file_section(id, sup, false) }; - dwarf.load_sup(&mut load_sup_section)?; + dwarf.load_sup(load_sup_section)?; } dwarf.populate_abbreviations_cache(gimli::AbbreviationsCacheStrategy::All); From 2b73d9e4c6ac026b9d282e8e4a52a2a9381e1079 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rk=20Tolm=C3=A1cs?= Date: Wed, 6 Dec 2023 16:06:04 +0100 Subject: [PATCH 08/36] Everything compiles MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Márk Tolmács --- cargo-wasm2map/src/main.rs | 3 +- wasm2map/src/dwarf.rs | 25 +- wasm2map/src/error.rs | 6 + wasm2map/src/lib.rs | 494 +------------------------------------ wasm2map/src/reader.rs | 17 -- 5 files changed, 40 insertions(+), 505 deletions(-) delete mode 100644 wasm2map/src/reader.rs diff --git a/cargo-wasm2map/src/main.rs b/cargo-wasm2map/src/main.rs index 8aa9ab6..381f0db 100644 --- a/cargo-wasm2map/src/main.rs +++ b/cargo-wasm2map/src/main.rs @@ -108,8 +108,7 @@ fn main() -> Result<(), String> { let mut wasm = Wasm::new(&reader, None, None, None).map_err(|err| err.to_string())?; // Generate the source map JSON for the loaded WASM - wasm.build(args.bundle_sources); - let sourcemap = wasm.into_string(); + let sourcemap = wasm.build(args.bundle_sources)?; // Dump JSON to the map file fs::write(&map, sourcemap).map_err(|err| err.to_string())?; diff --git a/wasm2map/src/dwarf.rs b/wasm2map/src/dwarf.rs index 16bc25d..976d084 100644 --- a/wasm2map/src/dwarf.rs +++ b/wasm2map/src/dwarf.rs @@ -1,6 +1,5 @@ use crate::{ error::Error, - reader::WasmReader, relocate::{Relocate, RelocationMap}, }; use gimli::{Dwarf, EndianReader, LittleEndian, Reader}; @@ -9,7 +8,7 @@ use object::{ }; use std::{borrow::Cow, cell::OnceCell, rc::Rc}; -pub type Relocator<'a> = Relocate>>; +pub type Relocator<'a> = Relocate>>; pub struct Raw<'reader, R: ReadRef<'reader>> { binary: File<'reader, R>, @@ -140,7 +139,7 @@ where None => Cow::Owned(Vec::with_capacity(1)), }; - let reader = gimli::EndianReader::new(WasmReader { data }, LittleEndian); + let reader = gimli::EndianReader::new(SectionReader { data }, LittleEndian); let offset = reader.offset_from(&reader); Ok(Relocate { relocations: Rc::new(relocations), @@ -207,3 +206,23 @@ where Ok(relocations) } } + +/// We need a holder struct to own the binary data coming out of the object +/// reader when the DWARF loader loads a section. Since the gimli::Reader trait +/// is not implemented for Cow returned by object::File::section_by_name we +/// need to implement it ourselves. +#[derive(Clone, Debug)] +pub struct SectionReader<'a> { + pub data: Cow<'a, [u8]>, +} + +impl<'a> std::ops::Deref for SectionReader<'a> { + type Target = [u8]; + + fn deref(&self) -> &Self::Target { + self.data.deref() + } +} + +unsafe impl<'a> gimli::StableDeref for SectionReader<'a> {} +unsafe impl<'a> gimli::CloneStableDeref for SectionReader<'a> {} diff --git a/wasm2map/src/error.rs b/wasm2map/src/error.rs index 6535ece..6263e05 100644 --- a/wasm2map/src/error.rs +++ b/wasm2map/src/error.rs @@ -54,6 +54,12 @@ impl From for Error { } } +impl From for String { + fn from(value: Error) -> Self { + value.to_string() + } +} + impl From for Error { fn from(value: std::num::TryFromIntError) -> Self { Self { diff --git a/wasm2map/src/lib.rs b/wasm2map/src/lib.rs index 38239d6..0a083a2 100644 --- a/wasm2map/src/lib.rs +++ b/wasm2map/src/lib.rs @@ -18,33 +18,23 @@ mod dwarf; mod error; mod json; mod loader; -mod reader; mod relocate; -#[cfg(test)] -mod test; +// #[cfg(test)] +// mod test; mod vlq; use dwarf::{DwarfReader, Raw}; -use error::Error; +pub use error::Error; use gimli::{self, Reader}; pub use loader::WasmLoader; pub use object::ReadRef; -use object::{self, Object, ObjectSection}; +use object::{self}; use sourcemap::SourceMapBuilder; -use std::{ - borrow::Cow, - collections::BTreeMap, - fs, - io::{self, Seek, Write}, - ops::Deref, - path::{Path, PathBuf}, - str, -}; +use std::str; /// pub struct Wasm<'wasm, R: ReadRef<'wasm>> { dwarf: DwarfReader<'wasm, R>, - mapper: SourceMapBuilder, } impl<'wasm, R: ReadRef<'wasm> + 'wasm> Wasm<'wasm, R> { @@ -59,14 +49,14 @@ impl<'wasm, R: ReadRef<'wasm> + 'wasm> Wasm<'wasm, R> { ) -> Result { Ok(Self { dwarf: DwarfReader::<'wasm, R>::new(Raw::new(binary, dwo_parent, sup_file)?), - mapper: SourceMapBuilder::new(name), }) } /// /// /// - pub fn build(&'wasm mut self, bundle_sources: bool) -> Result<(), Error> { + pub fn build(&'wasm self, bundle_sources: bool) -> Result { + let mut mapper = SourceMapBuilder::new(None); let mut iter = self.dwarf.get()?.units(); while let Some(header) = iter.next()? { let unit = match self.dwarf.get()?.unit(header) { @@ -91,7 +81,7 @@ impl<'wasm, R: ReadRef<'wasm> + 'wasm> Wasm<'wasm, R> { Some(file) => { let reader = self.dwarf.get()?.attr_string(&unit, file.path_name())?; let file_name = reader.to_string_lossy()?; - let sid = self.mapper.add_source(file_name.as_ref()); + let sid = mapper.add_source(file_name.as_ref()); Some(sid) } None => None, @@ -99,7 +89,7 @@ impl<'wasm, R: ReadRef<'wasm> + 'wasm> Wasm<'wasm, R> { // TODO: Bundle sources? - self.mapper.add_raw( + mapper.add_raw( 1, row.address().try_into()?, line.try_into()?, @@ -113,471 +103,9 @@ impl<'wasm, R: ReadRef<'wasm> + 'wasm> Wasm<'wasm, R> { } } - Ok(()) - } - - /// - pub fn into_string(self) -> String { let mut buf: Vec = Vec::new(); - self.mapper.into_sourcemap().to_writer(&mut buf).unwrap(); - - String::from_utf8(buf).unwrap() - } -} - -//////////////////// - -const DWARF_CODE_SECTION_ID: usize = 10; - -/// Represents a code unit which can be translated to a sourcemap code point -#[derive(Debug)] -pub struct CodePoint { - path: PathBuf, - address: i64, - line: i64, - column: i64, -} - -/// The actual DWARF to Sourcemap mapper -/// -/// # Usage -/// -/// ```rust -/// use wasm2map::WASM; -/// -/// let mapper = WASM::load("/path/to/the/file.wasm"); -/// if let Ok(mut mapper) = mapper { -/// let sourcemap = mapper.map_v3(false); -/// mapper.patch("http://localhost:8080").expect("Failed to patch"); -/// } -/// ``` -#[derive(Debug)] -pub struct WASM { - path: PathBuf, - points: BTreeMap, - sourcemap_size: Option, -} - -struct Generated { - mappings: Vec, - sources: Vec, - contents: Option>>, -} - -impl WASM { - /// Loads the WASM file under 'path' into memory and parses the DWARF info - /// If the WASM or the DWARF info in it is malformed (or non-existent) - /// it returns with the appropriate error result. - pub fn load(path: impl AsRef) -> Result { - let path = path.as_ref().to_owned(); - - #[cfg(feature = "memmap2")] - let raw = { - // Load the WASM file into memory via mmap to speed things up - // with large WASM files - let file = fs::File::open(&path)?; - unsafe { memmap2::Mmap::map(&file) }? - }; - #[cfg(not(feature = "memmap2"))] - let raw = { - // Load the WASM file via the standard library, which can be slower - // for larger WASM files, but some platforms might not be supported - // by memmap2 - fs::read(&path)? - }; - - // Parse the modules and sections from the WASM - let object = object::File::parse(raw.deref())?; - - // Load the sourcemap custom section (if any) and calculate the total - // size of the whole custom module (that is, the sourceMappingURL module) - let sourcemap_size = match object.section_by_name("sourceMappingURL") { - Some(section) => { - // This is the '0' section type - const CUSTOM_SEGMENT_ID_SIZE: u64 = 1; - // The size of the length b"sourceMappingURL" (which is always - // 1 byte, so the size of u8) + the length of the - // b"sourceMappingURL" byte array - const SEGMENT_NAME_SIZE: u64 = - std::mem::size_of::() as u64 + b"sourceMappingURL".len() as u64; - let section_size_length = vlq::encode_uint_var(section.size() as u32).len() as u64; - let section_size = CUSTOM_SEGMENT_ID_SIZE - + SEGMENT_NAME_SIZE - + section_size_length - + section.size(); - Some(section_size) - } - None => None, - }; - - // Load the code section to get its offset - let offset: i64 = { - let (code_section_offset, _) = object - .section_by_index(object::SectionIndex(DWARF_CODE_SECTION_ID))? - .file_range() - .ok_or("Missing code section in WASM")?; - code_section_offset.try_into()? - }; - - // Load all of the DWARF sections - let section = - gimli::Dwarf::load(|id: gimli::SectionId| -> Result, gimli::Error> { - match object.section_by_name(id.name()) { - Some(ref section) => Ok(section - .uncompressed_data() - .unwrap_or(Cow::Borrowed(&[][..]))), - None => Ok(Cow::Borrowed(&[][..])), - } - })?; - - // Borrow a `Cow<[u8]>` to create an `EndianSlice`. - let borrow_section: &dyn for<'a> Fn( - &'a Cow<[u8]>, - ) - -> gimli::EndianSlice<'a, gimli::RunTimeEndian> = - &|section| gimli::EndianSlice::new(section, gimli::RunTimeEndian::Little); - - // Create `EndianSlice`s for all of the sections. - let dwarf = section.borrow(&borrow_section); - - // Collect the debug data and enforce that they are sorted by address - // which BTreeMap guarantees - let mut points: BTreeMap = BTreeMap::new(); - - let mut iter = dwarf.units(); - while let Some(header) = iter.next()? { - let unit = dwarf.unit(header)?; - - // Get the line program for the compilation unit. - if let Some(program) = unit.line_program.clone() { - // Iterate over the line program rows for the unit. - let mut rows = program.rows(); - while let Some((header, row)) = rows.next_row()? { - // We will collect the embdedded path from the DWARF loc metadata - let mut path = PathBuf::new(); - - if let Some(file) = row.file(header) { - if let Some(dir) = file.directory(header) { - let dir = &dwarf.attr_string(&unit, dir)?.to_string_lossy(); - let dir = Path::new(dir.as_ref()); - - // Relative directories are relative to the compilation unit directory. - if dir.is_relative() { - if let Some(dir) = unit.comp_dir { - path.push(dir.to_string_lossy().as_ref()) - } - } - - path.push(dir); - } - - path.push( - dwarf - .attr_string(&unit, file.path_name())? - .to_string_lossy() - .as_ref(), - ); - } - - // The address of the instruction in the code section - let address: i64 = { - let mut addr: i64 = row.address().try_into()?; - if row.end_sequence() { - addr -= 1; - } - addr + offset - }; - - // Determine line/column. DWARF line/column is never 0 - let line = { - let line = match row.line() { - Some(line) => line.get(), - - // No line information means this code block does not belong to - // a source code block (generated by the compiler for whatever - // reason) - None => 0, - }; - line.try_into()? - }; - - let column: i64 = { - let col = match row.column() { - gimli::ColumnType::LeftEdge => 1, - gimli::ColumnType::Column(column) => column.get(), - }; - col.try_into()? - }; - - let point = CodePoint { - path, - address, - line, - column, - }; - - points.insert(point.address, point); - } - } - } - - Ok(Self { - path, - points, - sourcemap_size, - }) - } + mapper.into_sourcemap().to_writer(&mut buf).unwrap(); - /// Generate the sourcemap v3 JSON from the parsed WASM DWARF data. - /// - /// The `bundle` parameter, when set to true, bundles the source code - /// of your project in the source map, so you can jump to the source - /// code from the console, not just the raw WASM bytecode. - /// - /// Note: The mapper is currently not able to package the source code - /// of crate dependencies, nor the rust library sources. - /// - /// # Example output - /// - /// ```json - /// { - /// "version": 3, - /// "names": [], - /// "sources": [ - /// "file/path/name.rs", - /// "another/file/path.rs" - /// ... - /// ], - /// "sourcesContent": [ - /// null, - /// null, - /// null, - /// "fn main() {}", - /// null, - /// ... - /// ], - /// "mappings": { - /// "yjBAiIA,qCAIiB,QAMhB,...,oBAAA" - /// } - /// } - /// ``` - pub fn map_v3(&self, bundle: bool) -> String { - let mut sourcemap = String::with_capacity(self.points.len() * 4 + 100); - let Generated { - mappings, - sources, - contents, - } = self.generate(bundle); - - sourcemap.push('{'); - sourcemap.push_str(r#""version":3,"#); - sourcemap.push_str(r#""names":[],"#); - let processed_sources: Vec = sources - .into_iter() - .map(|source| { - if let Some(pos) = source.find(':') { - source[pos + 1..].to_string() - } else { - source - } - }) - .map(|source| source.replace('\\', "/")) - .collect(); - sourcemap - .push_str(format!(r#""sources":["{}"],"#, processed_sources.join(r#"",""#)).as_str()); - - if let Some(contents) = contents { - debug_assert!(bundle); - sourcemap.push_str(format!(r#""sourcesContent":[{}],"#, contents.join(",")).as_str()); - } else { - sourcemap.push_str(r#""sourcesContent":null,"#); - } - - sourcemap.push_str(format!(r#""mappings":"{}""#, mappings.join(",")).as_str()); - sourcemap.push('}'); - - sourcemap - } - - #[allow(rustdoc::invalid_html_tags)] - /// Patch the loaded WASM file to reference the sourcemap and ask the - /// browser or debugger to load it for us when referencing the code - /// - /// # Limitations - /// This can only work if the sourceMappingURL custom section is the last - /// section of the WASM. - /// - /// # How does this work? - /// - /// The WebAssembly specification contains a "custom" section definition - /// which is used to encode the sourcemap url in the WASM binary. - /// - /// The structure of the custom module is as follows (without ): - /// ( - /// 0 ( - /// - /// - /// ) - /// ) - /// - /// This structure is VLQ encoded without the parentheses and spaces into - /// a byte array and appended to the end of the WASM binary. - /// - /// More details in the [WebAssembly Module Specification](https://webassembly.github.io/spec/core/binary/modules.html) - pub fn patch(&mut self, url: &str) -> Result<(), Error> { - // Open WASM binary for writing - let mut wasm = fs::OpenOptions::new() - .write(true) - .open(&self.path) - .map_err(|err| { - format!( - "Failed to open WASM file to append sourcemap section: {}", - err - ) - })?; - - // Grab the actual size (byte count) of the WASM binary - let size = wasm.seek(io::SeekFrom::End(0))?; - - // Determine the file cusrsor position without the custom section (if any) - // by subtracting the size of the sourceMappingURL section from the - // byte size of the WASM binary - let pos = self - .sourcemap_size - .map(|length| size - length) - .unwrap_or(size); - - // Truncate the WASM binary and position the file cursor to the new end - // (if there was a sourcemap added), no-op otherwise - wasm.set_len(pos)?; - wasm.seek(io::SeekFrom::End(0))?; - - // Generate the souceMappingURL custom - // section (see above for info on structure) - const WASM_CUSTOM_SECTION_ID: u32 = 0; - let section_name = "sourceMappingURL"; - let section_content = [ - &vlq::encode_uint_var(section_name.len() as u32)[..], - section_name.as_bytes(), - &vlq::encode_uint_var(url.len() as u32)[..], - url.as_bytes(), - ] - .concat(); - let section = [ - &vlq::encode_uint_var(WASM_CUSTOM_SECTION_ID)[..], - &vlq::encode_uint_var(section_content.len() as u32)[..], - section_content.as_ref(), - ] - .concat(); - - // Write out the custom section - wasm.write_all(§ion) - .map_err(|err| format!("Failed to write sourcemap section to WASM file: {}", err))?; - - let _s = wasm.seek(io::SeekFrom::End(0)); - - // Set the sourcemap data after writing it out - self.sourcemap_size = Some(section.len() as u64); - - Ok(()) - } - - // Generate the sourcemap mappings and source ids. - // - // The sourcemap 3 format tries to save on file size by using offsets - // wherever possible. So we need to encode the source file data and - // line, column data for each WASM code segment address in the expected - // order, so offsets make sense when resolved by the browser (or debugger) - fn generate<'a>(&'a self, bundle: bool) -> Generated { - // We collect all referenced source code files in a table and use the - // source id (which is the value param of this HashMap) as the basis for - // the offset when encoding position (i.e. last source id - this source id), - // which require preserving the order of inserts! - let mut sources: Vec<&'a Path> = Vec::new(); - //let mut sources: BTreeMap<&'a Path, i64> = BTreeMap::new(); - //let mut sources: HashMap<&'a Path, i64> = HashMap::new(); - - // This is the WASM address -> file:line:col mapping table in the - // required format, which is basically offsets written after each other - // in the specified order (address, source id, line, finally col) - let mut mappings: Vec = Vec::new(); - - // These variables track the last of the four pieces of data so we can - // subtract from them to get an offset and then update them to the latest - let mut last_address: i64 = 0; - let mut last_source_id: i64 = 0; - let mut last_line: i64 = 1; - let mut last_column: i64 = 1; - - for line in self.points.values() { - // Line 0 means that this is an intermediate code block and does not - // refer to a code block in the source files. We need to skip these - // in order to generate the proper offset encoding - if line.line == 0 { - continue; - } - - // We either get the id of a source file if already in the table - // or we get the max(id) + 1 as the new id for a previously unseen - // source file, which we promptly insert into the source table - - let source_id: i64 = - if let Some(id) = sources.iter().position(|&val| val == line.path.as_path()) { - id as i64 - } else { - let id = sources.len() as i64; - sources.push(&line.path); - id - }; - - // Calculate the offsets (see above) - let address_delta = line.address - last_address; - let source_id_delta = source_id - last_source_id; - let line_delta = line.line - last_line; - let column_delta = line.column - last_column; - - // Store the mapping offsets in the specific format - // (see above) in the mapping table - let mapping = format!( - "{}{}{}{}", - vlq::encode(address_delta).as_str(), - vlq::encode(source_id_delta).as_str(), - vlq::encode(line_delta).as_str(), - vlq::encode(column_delta).as_str() - ); - mappings.push(mapping); - - // Update the tracking variables to the freshly calculated values - // to use them in the next iteration (see above) - last_address = line.address; - last_source_id = source_id; - last_line = line.line; - last_column = line.column; - } - - // We only need the file paths from the sources table in the order - // they were encoded, turned to strings - let sources = sources - .iter() - .filter_map(|p| Some(p.as_os_str().to_str()?.to_owned())) - .collect::>(); - - let contents = bundle.then(|| { - sources - .iter() - .map(Path::new) - .map(|path| { - fs::read_to_string(path) - .map(|content| Cow::Owned(format!(r#""{}""#, json::encode(&content)))) - .unwrap_or(Cow::Borrowed("null")) - }) - .collect() - }); - - Generated { - mappings, - sources, - contents, - } + Ok(String::from_utf8(buf).unwrap()) } } diff --git a/wasm2map/src/reader.rs b/wasm2map/src/reader.rs deleted file mode 100644 index 4ff4a68..0000000 --- a/wasm2map/src/reader.rs +++ /dev/null @@ -1,17 +0,0 @@ -use std::{borrow::Cow, ops::Deref}; - -#[derive(Clone, Debug)] -pub struct WasmReader<'a> { - pub data: Cow<'a, [u8]>, -} - -impl<'a> Deref for WasmReader<'a> { - type Target = [u8]; - - fn deref(&self) -> &Self::Target { - self.data.deref() - } -} - -unsafe impl<'a> gimli::StableDeref for WasmReader<'a> {} -unsafe impl<'a> gimli::CloneStableDeref for WasmReader<'a> {} From ec46b2f04a370cd13910acbd31215ba83582f3b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rk=20Tolm=C3=A1cs?= Date: Wed, 6 Dec 2023 16:08:25 +0100 Subject: [PATCH 09/36] Small refactors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Márk Tolmács --- wasm2map/src/dwarf.rs | 4 ++-- wasm2map/src/lib.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/wasm2map/src/dwarf.rs b/wasm2map/src/dwarf.rs index 976d084..7230df8 100644 --- a/wasm2map/src/dwarf.rs +++ b/wasm2map/src/dwarf.rs @@ -53,8 +53,8 @@ where /// /// /// - pub fn new(raw: Raw<'reader, R>) -> DwarfReader<'reader, R> { - DwarfReader { + pub fn new(raw: Raw<'reader, R>) -> Self { + Self { raw, dwarf: OnceCell::new(), } diff --git a/wasm2map/src/lib.rs b/wasm2map/src/lib.rs index 0a083a2..e50379a 100644 --- a/wasm2map/src/lib.rs +++ b/wasm2map/src/lib.rs @@ -48,7 +48,7 @@ impl<'wasm, R: ReadRef<'wasm> + 'wasm> Wasm<'wasm, R> { sup_file: Option, ) -> Result { Ok(Self { - dwarf: DwarfReader::<'wasm, R>::new(Raw::new(binary, dwo_parent, sup_file)?), + dwarf: DwarfReader::new(Raw::new(binary, dwo_parent, sup_file)?), }) } From c9fd49783ae1cbff5f9e6e39c857633caa10391b Mon Sep 17 00:00:00 2001 From: Mark Tolmacs Date: Wed, 6 Dec 2023 17:51:51 +0100 Subject: [PATCH 10/36] Dwarf handling refactor Signed-off-by: Mark Tolmacs --- wasm2map/src/dwarf.rs | 81 +++++++++++++++++++++++-------------------- 1 file changed, 44 insertions(+), 37 deletions(-) diff --git a/wasm2map/src/dwarf.rs b/wasm2map/src/dwarf.rs index 7230df8..ab695cc 100644 --- a/wasm2map/src/dwarf.rs +++ b/wasm2map/src/dwarf.rs @@ -64,51 +64,58 @@ where /// /// pub fn get(&'reader self) -> Result<&Dwarf>, Error> { - if self.dwarf.get().is_none() { - // If the WASM debug info is in a split DWARF object (DWO), then load - // the parent object first, so we can link them. The parent archive - // contains references to the DWO object we resolve later in generating - // the source map - let parent = if let Some(parent) = &self.raw.dwo_parent { - let load_parent_section = - |id: gimli::SectionId| Self::load_file_section(id, parent, false); - Some(gimli::Dwarf::load(load_parent_section)?) - } else { - None - }; - let parent = parent.as_ref(); + self.dwarf.get().ok_or(()).or_else(|_| self.load()) + } +} - // This is the target object binary we are generating the sourcemap for - let load_section = |id: gimli::SectionId| { - Self::load_file_section(id, &self.raw.binary, parent.is_some()) - }; +impl<'reader, R> DwarfReader<'reader, R> +where + R: ReadRef<'reader> + 'reader, +{ + /// + /// + /// + fn load(&'reader self) -> Result<&Dwarf>, Error> { + // If the WASM debug info is in a split DWARF object (DWO), then load + // the parent object first, so we can link them. The parent archive + // contains references to the DWO object we resolve later in generating + // the source map + let parent = if let Some(parent) = &self.raw.dwo_parent { + let load_parent_section = + |id: gimli::SectionId| Self::load_file_section(id, parent, false); + Some(gimli::Dwarf::load(load_parent_section)?) + } else { + None + }; + let parent = parent.as_ref(); - let mut dwarf = gimli::Dwarf::load(load_section)?; + // This is the target object binary we are generating the sourcemap for + let load_section = + |id: gimli::SectionId| Self::load_file_section(id, &self.raw.binary, parent.is_some()); - if parent.is_some() { - if let Some(parent) = parent { - dwarf.make_dwo(parent); - } else { - dwarf.file_type = gimli::DwarfFileType::Dwo; - } - } + let mut dwarf = gimli::Dwarf::load(load_section)?; - // Load optional supplemental file - if let Some(sup) = &self.raw.sup_file { - let load_sup_section = |id: gimli::SectionId| { - // Note: we really only need the `.debug_str` section, - // but for now we load them all. - Self::load_file_section(id, sup, false) - }; - dwarf.load_sup(load_sup_section)?; + if parent.is_some() { + if let Some(parent) = parent { + dwarf.make_dwo(parent); + } else { + dwarf.file_type = gimli::DwarfFileType::Dwo; } + } - dwarf.populate_abbreviations_cache(gimli::AbbreviationsCacheStrategy::All); - - self.dwarf.set(dwarf).ok(); + // Load optional supplemental file + if let Some(sup) = &self.raw.sup_file { + let load_sup_section = |id: gimli::SectionId| { + // Note: we really only need the `.debug_str` section, + // but for now we load them all. + Self::load_file_section(id, sup, false) + }; + dwarf.load_sup(load_sup_section)?; } - Ok(self.dwarf.get().unwrap()) + dwarf.populate_abbreviations_cache(gimli::AbbreviationsCacheStrategy::All); + + Ok(self.dwarf.get_or_init(|| dwarf)) } /// From 51efc4179d1e5393553ab085d4582a777c74529b Mon Sep 17 00:00:00 2001 From: Mark Tolmacs Date: Wed, 6 Dec 2023 17:58:20 +0100 Subject: [PATCH 11/36] Loader turned into a feature Signed-off-by: Mark Tolmacs --- Cargo.lock | 4 ++-- cargo-wasm2map/Cargo.toml | 5 ++++- wasm2map/Cargo.toml | 5 +++-- wasm2map/src/lib.rs | 2 ++ 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e816bbb..b729020 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -257,9 +257,9 @@ checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" [[package]] name = "memmap2" -version = "0.5.10" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +checksum = "deaba38d7abf1d4cca21cc89e932e542ba2b9258664d2a9ef0e61512039c9375" dependencies = [ "libc", ] diff --git a/cargo-wasm2map/Cargo.toml b/cargo-wasm2map/Cargo.toml index 06db51b..dd17b84 100644 --- a/cargo-wasm2map/Cargo.toml +++ b/cargo-wasm2map/Cargo.toml @@ -14,10 +14,13 @@ rust-version = "1.64.0" license = "MIT OR Apache-2.0" [dependencies] -wasm2map = { path = "../wasm2map" } # For -Zminimal-versions proc-macro2 = ">= 1.0.60" +[dependencies.wasm2map] +path = "../wasm2map" +features = ["memmap2", "loader"] + [dependencies.clap] version = "4.3.10" features = ["derive"] diff --git a/wasm2map/Cargo.toml b/wasm2map/Cargo.toml index 3ea577d..595a28d 100644 --- a/wasm2map/Cargo.toml +++ b/wasm2map/Cargo.toml @@ -16,7 +16,8 @@ license = "MIT OR Apache-2.0" [lib] [features] -default = ["memmap2"] +default = ["memmap2", "loader"] +loader = [] [dependencies.gimli] version = "0.28.1" @@ -24,7 +25,7 @@ default-features = false features = ["read", "endian-reader"] [dependencies.memmap2] -version = "~0.5.10" +version = "~0.9.0" default-features = false optional = true diff --git a/wasm2map/src/lib.rs b/wasm2map/src/lib.rs index e50379a..b60c17e 100644 --- a/wasm2map/src/lib.rs +++ b/wasm2map/src/lib.rs @@ -17,6 +17,7 @@ mod dwarf; mod error; mod json; +#[cfg(feature = "loader")] mod loader; mod relocate; // #[cfg(test)] @@ -26,6 +27,7 @@ mod vlq; use dwarf::{DwarfReader, Raw}; pub use error::Error; use gimli::{self, Reader}; +#[cfg(feature = "loader")] pub use loader::WasmLoader; pub use object::ReadRef; use object::{self}; From f1d39e9d5a5fb7c396cdf77be428536aefc39ee6 Mon Sep 17 00:00:00 2001 From: Mark Tolmacs Date: Wed, 6 Dec 2023 18:31:59 +0100 Subject: [PATCH 12/36] Refactor Signed-off-by: Mark Tolmacs --- wasm2map/src/{ => dwarf}/dwarf.rs | 6 +- wasm2map/src/dwarf/mod.rs | 5 ++ wasm2map/src/{ => dwarf}/relocate.rs | 0 wasm2map/src/json.rs | 84 ---------------------------- wasm2map/src/lib.rs | 5 +- wasm2map/src/vlq.rs | 36 ------------ 6 files changed, 8 insertions(+), 128 deletions(-) rename wasm2map/src/{ => dwarf}/dwarf.rs (99%) create mode 100644 wasm2map/src/dwarf/mod.rs rename wasm2map/src/{ => dwarf}/relocate.rs (100%) delete mode 100644 wasm2map/src/json.rs delete mode 100644 wasm2map/src/vlq.rs diff --git a/wasm2map/src/dwarf.rs b/wasm2map/src/dwarf/dwarf.rs similarity index 99% rename from wasm2map/src/dwarf.rs rename to wasm2map/src/dwarf/dwarf.rs index ab695cc..37f91e8 100644 --- a/wasm2map/src/dwarf.rs +++ b/wasm2map/src/dwarf/dwarf.rs @@ -1,7 +1,5 @@ -use crate::{ - error::Error, - relocate::{Relocate, RelocationMap}, -}; +use super::relocate::{Relocate, RelocationMap}; +use crate::error::Error; use gimli::{Dwarf, EndianReader, LittleEndian, Reader}; use object::{ File, Object, ObjectSection, ObjectSymbol, ReadRef, RelocationKind, RelocationTarget, Section, diff --git a/wasm2map/src/dwarf/mod.rs b/wasm2map/src/dwarf/mod.rs new file mode 100644 index 0000000..75cfd7b --- /dev/null +++ b/wasm2map/src/dwarf/mod.rs @@ -0,0 +1,5 @@ +mod dwarf; +mod relocate; + +pub use self::dwarf::DwarfReader; +pub use self::dwarf::Raw; diff --git a/wasm2map/src/relocate.rs b/wasm2map/src/dwarf/relocate.rs similarity index 100% rename from wasm2map/src/relocate.rs rename to wasm2map/src/dwarf/relocate.rs diff --git a/wasm2map/src/json.rs b/wasm2map/src/json.rs deleted file mode 100644 index d74fb53..0000000 --- a/wasm2map/src/json.rs +++ /dev/null @@ -1,84 +0,0 @@ -use std::borrow::Cow; -use std::str; - -// Inspired by: -// -pub(crate) fn encode(string: &str) -> Cow<'_, str> { - const BB: u8 = b'b'; // \x08 - const TT: u8 = b't'; // \x09 - const NN: u8 = b'n'; // \x0A - const FF: u8 = b'f'; // \x0C - const RR: u8 = b'r'; // \x0D - const QU: u8 = b'"'; // \x22 - const BS: u8 = b'\\'; // \x5C - const UU: u8 = b'u'; // \x00...\x1F except the ones above - const __: u8 = 0; - - // Lookup table of escape sequences. A value of b'x' at index i means that byte - // i is escaped as "\x" in JSON. A value of 0 means that byte i is not escaped. - static ESCAPE: [u8; 256] = [ - // 1 2 3 4 5 6 7 8 9 A B C D E F - UU, UU, UU, UU, UU, UU, UU, UU, BB, TT, NN, UU, FF, RR, UU, UU, // 0 - UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, // 1 - __, __, QU, __, __, __, __, __, __, __, __, __, __, __, __, __, // 2 - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 3 - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 4 - __, __, __, __, __, __, __, __, __, __, __, __, BS, __, __, __, // 5 - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 6 - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 7 - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 8 - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 9 - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // A - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // B - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // C - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // D - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // E - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // F - ]; - - let mut start = 0; - let mut new_string = String::new(); - - for (index, byte) in string.bytes().enumerate() { - let escape = ESCAPE[byte as usize]; - if escape == 0 { - continue; - } - - if start < index { - new_string += &string[start..index]; - } - - match escape { - QU => new_string += r#"\""#, - BS => new_string += r"\\", - BB => new_string += r"\b", - FF => new_string += r"\f", - NN => new_string += r"\n", - RR => new_string += r"\r", - TT => new_string += r"\t", - UU => { - static HEX_DIGITS: [u8; 16] = *b"0123456789abcdef"; - - new_string += str::from_utf8(&[ - b'\\', - b'u', - b'0', - b'0', - HEX_DIGITS[(byte >> 4) as usize], - HEX_DIGITS[(byte & 0xF) as usize], - ]) - .unwrap() - } - _ => unreachable!(), - } - - start = index + 1; - } - - if new_string.is_empty() { - string.into() - } else { - new_string.into() - } -} diff --git a/wasm2map/src/lib.rs b/wasm2map/src/lib.rs index b60c17e..1ce9036 100644 --- a/wasm2map/src/lib.rs +++ b/wasm2map/src/lib.rs @@ -16,16 +16,13 @@ mod dwarf; mod error; -mod json; #[cfg(feature = "loader")] mod loader; -mod relocate; // #[cfg(test)] // mod test; -mod vlq; use dwarf::{DwarfReader, Raw}; -pub use error::Error; +use error::Error; use gimli::{self, Reader}; #[cfg(feature = "loader")] pub use loader::WasmLoader; diff --git a/wasm2map/src/vlq.rs b/wasm2map/src/vlq.rs deleted file mode 100644 index 8b1fd50..0000000 --- a/wasm2map/src/vlq.rs +++ /dev/null @@ -1,36 +0,0 @@ -// Simple implementation of VLQ (variable-length quality) encoding to avoid -// yet another dependency to accomplish this simple task -// -// TODO(mtolmacs): Use smallvec instead of string -pub(crate) fn encode(value: i64) -> String { - const VLQ_CHARS: &[u8] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".as_bytes(); - let mut x = if value >= 0 { - value << 1 - } else { - (-value << 1) + 1 - }; - let mut result = String::new(); - - while x > 31 { - let idx: usize = (32 + (x & 31)).try_into().unwrap(); - let ch: char = VLQ_CHARS[idx].into(); - result.push(ch); - x >>= 5; - } - let idx: usize = x.try_into().unwrap(); - let ch: char = VLQ_CHARS[idx].into(); - result.push(ch); - - result -} - -pub(crate) fn encode_uint_var(mut n: u32) -> Vec { - let mut result = Vec::new(); - while n > 127 { - result.push((128 | (n & 127)) as u8); - n >>= 7; - } - result.push(n as u8); - result -} From 63a742108ec206f5c7b862c629e942a5a52c3e7b Mon Sep 17 00:00:00 2001 From: Mark Tolmacs Date: Thu, 7 Dec 2023 21:52:32 +0100 Subject: [PATCH 13/36] Refactors Signed-off-by: Mark Tolmacs --- cargo-wasm2map/src/main.rs | 7 +- wasm2map/src/dwarf/dwarf.rs | 233 ------------------------------------ wasm2map/src/dwarf/mod.rs | 216 ++++++++++++++++++++++++++++++++- wasm2map/src/lib.rs | 67 ++++++++--- 4 files changed, 269 insertions(+), 254 deletions(-) delete mode 100644 wasm2map/src/dwarf/dwarf.rs diff --git a/cargo-wasm2map/src/main.rs b/cargo-wasm2map/src/main.rs index 381f0db..848e8cc 100644 --- a/cargo-wasm2map/src/main.rs +++ b/cargo-wasm2map/src/main.rs @@ -105,10 +105,13 @@ fn main() -> Result<(), String> { let reader = WasmLoader::from_path(&args.path).map_err(|err| err.to_string())?; // Parse the DWARF code section - let mut wasm = Wasm::new(&reader, None, None, None).map_err(|err| err.to_string())?; + let mut wasm = Wasm::new(&reader, None, None).map_err(|err| err.to_string())?; // Generate the source map JSON for the loaded WASM - let sourcemap = wasm.build(args.bundle_sources)?; + let sourcemap = wasm.build( + args.bundle_sources, + Some(map.file_name().unwrap().to_str().unwrap()), + )?; // Dump JSON to the map file fs::write(&map, sourcemap).map_err(|err| err.to_string())?; diff --git a/wasm2map/src/dwarf/dwarf.rs b/wasm2map/src/dwarf/dwarf.rs deleted file mode 100644 index 37f91e8..0000000 --- a/wasm2map/src/dwarf/dwarf.rs +++ /dev/null @@ -1,233 +0,0 @@ -use super::relocate::{Relocate, RelocationMap}; -use crate::error::Error; -use gimli::{Dwarf, EndianReader, LittleEndian, Reader}; -use object::{ - File, Object, ObjectSection, ObjectSymbol, ReadRef, RelocationKind, RelocationTarget, Section, -}; -use std::{borrow::Cow, cell::OnceCell, rc::Rc}; - -pub type Relocator<'a> = Relocate>>; - -pub struct Raw<'reader, R: ReadRef<'reader>> { - binary: File<'reader, R>, - dwo_parent: Option>, - sup_file: Option>, -} - -impl<'reader, R> Raw<'reader, R> -where - R: ReadRef<'reader> + 'reader, -{ - /// - pub fn new(binary: R, dwo_parent: Option, sup_file: Option) -> Result { - Ok(Self { - binary: Self::parse_file(binary)?, - dwo_parent: dwo_parent.and_then(|dwo_parent| Self::parse_file(dwo_parent).ok()), - sup_file: sup_file.and_then(|sup_file| Self::parse_file(sup_file).ok()), - }) - } - - /// - fn parse_file(binary: R) -> Result, Error> { - match File::parse(binary)? { - file @ File::Wasm(_) => Ok(file), - _ => Err(Error::from("Data does not represent a WASM file")), - } - } -} - -/// -/// -/// -pub struct DwarfReader<'reader, R: ReadRef<'reader> + 'reader> { - raw: Raw<'reader, R>, - pub dwarf: OnceCell>>, -} - -impl<'reader, R> DwarfReader<'reader, R> -where - R: ReadRef<'reader> + 'reader, -{ - /// - /// - /// - pub fn new(raw: Raw<'reader, R>) -> Self { - Self { - raw, - dwarf: OnceCell::new(), - } - } - - /// - /// - /// - pub fn get(&'reader self) -> Result<&Dwarf>, Error> { - self.dwarf.get().ok_or(()).or_else(|_| self.load()) - } -} - -impl<'reader, R> DwarfReader<'reader, R> -where - R: ReadRef<'reader> + 'reader, -{ - /// - /// - /// - fn load(&'reader self) -> Result<&Dwarf>, Error> { - // If the WASM debug info is in a split DWARF object (DWO), then load - // the parent object first, so we can link them. The parent archive - // contains references to the DWO object we resolve later in generating - // the source map - let parent = if let Some(parent) = &self.raw.dwo_parent { - let load_parent_section = - |id: gimli::SectionId| Self::load_file_section(id, parent, false); - Some(gimli::Dwarf::load(load_parent_section)?) - } else { - None - }; - let parent = parent.as_ref(); - - // This is the target object binary we are generating the sourcemap for - let load_section = - |id: gimli::SectionId| Self::load_file_section(id, &self.raw.binary, parent.is_some()); - - let mut dwarf = gimli::Dwarf::load(load_section)?; - - if parent.is_some() { - if let Some(parent) = parent { - dwarf.make_dwo(parent); - } else { - dwarf.file_type = gimli::DwarfFileType::Dwo; - } - } - - // Load optional supplemental file - if let Some(sup) = &self.raw.sup_file { - let load_sup_section = |id: gimli::SectionId| { - // Note: we really only need the `.debug_str` section, - // but for now we load them all. - Self::load_file_section(id, sup, false) - }; - dwarf.load_sup(load_sup_section)?; - } - - dwarf.populate_abbreviations_cache(gimli::AbbreviationsCacheStrategy::All); - - Ok(self.dwarf.get_or_init(|| dwarf)) - } - - /// - /// - /// - fn load_file_section( - id: gimli::SectionId, - object: &'reader File<'reader, R>, - is_dwo: bool, - ) -> Result, Error> { - let mut relocations = RelocationMap::default(); - let name = if is_dwo { - id.dwo_name() - } else { - Some(id.name()) - }; - - let data = match name.and_then(|name| object.section_by_name(name)) { - Some(ref section) => { - // DWO sections never have relocations, so don't bother. - if !is_dwo { - // Collect the relocations in this section and add to the relocation map - relocations.extend(Self::get_relocations(object, section)?); - } - section.uncompressed_data()? - } - // Use a non-zero capacity so that `ReaderOffsetId`s are unique. - None => Cow::Owned(Vec::with_capacity(1)), - }; - - let reader = gimli::EndianReader::new(SectionReader { data }, LittleEndian); - let offset = reader.offset_from(&reader); - Ok(Relocate { - relocations: Rc::new(relocations), - offset, - reader, - }) - } - - /// - /// - /// - fn get_relocations( - object: &File<'reader, R>, - section: &Section<'reader, 'reader, R>, - ) -> Result { - let mut relocations: RelocationMap = RelocationMap::new(); - - for (offset64, mut relocation) in section.relocations() { - let offset = offset64 as usize; - if offset as u64 != offset64 { - continue; - } - - match relocation.kind() { - RelocationKind::Absolute => { - if let RelocationTarget::Symbol(symbol_idx) = relocation.target() { - match object.symbol_by_index(symbol_idx) { - Ok(symbol) => { - let addend = - symbol.address().wrapping_add(relocation.addend() as u64); - relocation.set_addend(addend as i64); - } - Err(_) => { - let msg = format!( - "Relocation with invalid symbol for section {} at offset 0x{:08x}", - section.name().unwrap(), - offset - ); - return Err(msg.into()); - } - } - } - - if relocations.insert(offset, relocation).is_some() { - let msg = format!( - "Multiple relocations for section {} at offset 0x{:08x}", - section.name().unwrap(), - offset - ); - return Err(msg.into()); - } - } - _ => { - let msg = format!( - "Unsupported relocation for section {} at offset 0x{:08x}", - section.name().unwrap(), - offset - ); - return Err(msg.into()); - } - } - } - - Ok(relocations) - } -} - -/// We need a holder struct to own the binary data coming out of the object -/// reader when the DWARF loader loads a section. Since the gimli::Reader trait -/// is not implemented for Cow returned by object::File::section_by_name we -/// need to implement it ourselves. -#[derive(Clone, Debug)] -pub struct SectionReader<'a> { - pub data: Cow<'a, [u8]>, -} - -impl<'a> std::ops::Deref for SectionReader<'a> { - type Target = [u8]; - - fn deref(&self) -> &Self::Target { - self.data.deref() - } -} - -unsafe impl<'a> gimli::StableDeref for SectionReader<'a> {} -unsafe impl<'a> gimli::CloneStableDeref for SectionReader<'a> {} diff --git a/wasm2map/src/dwarf/mod.rs b/wasm2map/src/dwarf/mod.rs index 75cfd7b..9c4e210 100644 --- a/wasm2map/src/dwarf/mod.rs +++ b/wasm2map/src/dwarf/mod.rs @@ -1,5 +1,215 @@ -mod dwarf; mod relocate; -pub use self::dwarf::DwarfReader; -pub use self::dwarf::Raw; +use self::relocate::{Relocate, RelocationMap}; +use crate::error::Error; +use gimli::{EndianReader, LittleEndian, Reader}; +use object::{ + File, Object, ObjectSection, ObjectSymbol, ReadRef, RelocationKind, RelocationTarget, Section, +}; +use std::{borrow::Cow, cell::OnceCell, rc::Rc}; + +pub type Relocator<'a> = Relocate>>; + +/// +/// +/// +pub struct DwarfReader<'reader, R: ReadRef<'reader> + 'reader> { + binary: &'reader File<'reader, R>, + dwo_parent: Option<&'reader File<'reader, R>>, + sup_file: Option<&'reader File<'reader, R>>, + dwarf: OnceCell>>, +} + +impl<'reader, R> DwarfReader<'reader, R> +where + R: ReadRef<'reader> + 'reader, +{ + /// + /// + /// + pub fn new( + binary: &'reader File<'reader, R>, + dwo_parent: Option<&'reader File<'reader, R>>, + sup_file: Option<&'reader File<'reader, R>>, + ) -> Self { + Self { + binary, + dwo_parent, + sup_file, + dwarf: OnceCell::new(), + } + } + + /// + /// + /// + pub fn get(&'reader self) -> Result<&gimli::Dwarf>, Error> { + self.dwarf.get().ok_or(()).or_else(|_| self.load()) + } +} + +impl<'reader, R> DwarfReader<'reader, R> +where + R: ReadRef<'reader> + 'reader, +{ + /// + /// + /// + fn load(&'reader self) -> Result<&gimli::Dwarf>, Error> { + // If the WASM debug info is in a split DWARF object (DWO), then load + // the parent object first, so we can link them. The parent archive + // contains references to the DWO object we resolve later in generating + // the source map + let parent = if let Some(parent) = self.dwo_parent { + let load_parent_section = + |id: gimli::SectionId| Self::load_file_section(id, parent, false); + Some(gimli::Dwarf::load(load_parent_section)?) + } else { + None + }; + let parent = parent.as_ref(); + + // This is the target object binary we are generating the sourcemap for + let load_section = + |id: gimli::SectionId| Self::load_file_section(id, self.binary, parent.is_some()); + + let mut dwarf = gimli::Dwarf::load(load_section)?; + + if parent.is_some() { + if let Some(parent) = parent { + dwarf.make_dwo(parent); + } else { + dwarf.file_type = gimli::DwarfFileType::Dwo; + } + } + + // Load optional supplemental file + if let Some(sup) = self.sup_file { + let load_sup_section = |id: gimli::SectionId| { + // Note: we really only need the `.debug_str` section, + // but for now we load them all. + Self::load_file_section(id, sup, false) + }; + dwarf.load_sup(load_sup_section)?; + } + + dwarf.populate_abbreviations_cache(gimli::AbbreviationsCacheStrategy::All); + + Ok(self.dwarf.get_or_init(|| dwarf)) + } + + /// + /// + /// + fn load_file_section( + id: gimli::SectionId, + object: &'reader File<'reader, R>, + is_dwo: bool, + ) -> Result, Error> { + let mut relocations = RelocationMap::default(); + let name = if is_dwo { + id.dwo_name() + } else { + Some(id.name()) + }; + + let data = match name.and_then(|name| object.section_by_name(name)) { + Some(ref section) => { + // DWO sections never have relocations, so don't bother. + if !is_dwo { + // Collect the relocations in this section and add to the relocation map + relocations.extend(Self::get_relocations(object, section)?); + } + section.uncompressed_data()? + } + // Use a non-zero capacity so that `ReaderOffsetId`s are unique. + None => Cow::Owned(Vec::with_capacity(1)), + }; + + let reader = gimli::EndianReader::new(SectionReader { data }, LittleEndian); + let offset = reader.offset_from(&reader); + Ok(Relocate { + relocations: Rc::new(relocations), + offset, + reader, + }) + } + + /// + /// + /// + fn get_relocations( + object: &File<'reader, R>, + section: &Section<'reader, 'reader, R>, + ) -> Result { + let mut relocations: RelocationMap = RelocationMap::new(); + + for (offset64, mut relocation) in section.relocations() { + let offset = offset64 as usize; + if offset as u64 != offset64 { + continue; + } + + match relocation.kind() { + RelocationKind::Absolute => { + if let RelocationTarget::Symbol(symbol_idx) = relocation.target() { + match object.symbol_by_index(symbol_idx) { + Ok(symbol) => { + let addend = + symbol.address().wrapping_add(relocation.addend() as u64); + relocation.set_addend(addend as i64); + } + Err(_) => { + let msg = format!( + "Relocation with invalid symbol for section {} at offset 0x{:08x}", + section.name().unwrap(), + offset + ); + return Err(msg.into()); + } + } + } + + if relocations.insert(offset, relocation).is_some() { + let msg = format!( + "Multiple relocations for section {} at offset 0x{:08x}", + section.name().unwrap(), + offset + ); + return Err(msg.into()); + } + } + _ => { + let msg = format!( + "Unsupported relocation for section {} at offset 0x{:08x}", + section.name().unwrap(), + offset + ); + return Err(msg.into()); + } + } + } + + Ok(relocations) + } +} + +/// We need a holder struct to own the binary data coming out of the object +/// reader when the DWARF loader loads a section. Since the gimli::Reader trait +/// is not implemented for Cow returned by object::File::section_by_name we +/// need to implement it ourselves. +#[derive(Clone, Debug)] +pub struct SectionReader<'a> { + pub data: Cow<'a, [u8]>, +} + +impl<'a> std::ops::Deref for SectionReader<'a> { + type Target = [u8]; + + fn deref(&self) -> &Self::Target { + self.data.deref() + } +} + +unsafe impl<'a> gimli::StableDeref for SectionReader<'a> {} +unsafe impl<'a> gimli::CloneStableDeref for SectionReader<'a> {} diff --git a/wasm2map/src/lib.rs b/wasm2map/src/lib.rs index 1ce9036..5848991 100644 --- a/wasm2map/src/lib.rs +++ b/wasm2map/src/lib.rs @@ -21,44 +21,79 @@ mod loader; // #[cfg(test)] // mod test; -use dwarf::{DwarfReader, Raw}; +use dwarf::DwarfReader; use error::Error; use gimli::{self, Reader}; #[cfg(feature = "loader")] pub use loader::WasmLoader; pub use object::ReadRef; -use object::{self}; +use object::{self, File}; use sourcemap::SourceMapBuilder; -use std::str; +use std::{cell::OnceCell, str}; /// pub struct Wasm<'wasm, R: ReadRef<'wasm>> { - dwarf: DwarfReader<'wasm, R>, + binary: File<'wasm, R>, + dwo_parent: Option>, + sup_file: Option>, + dwarf: OnceCell>, } -impl<'wasm, R: ReadRef<'wasm> + 'wasm> Wasm<'wasm, R> { +impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { /// /// /// - pub fn new( - binary: R, - name: Option<&str>, - dwo_parent: Option, - sup_file: Option, - ) -> Result { + pub fn new(binary: R, dwo_parent: Option, sup_file: Option) -> Result { Ok(Self { - dwarf: DwarfReader::new(Raw::new(binary, dwo_parent, sup_file)?), + binary: match File::parse(binary)? { + file @ File::Wasm(_) => Ok(file), + _ => Err(Error::from("Object does not represent a WASM file")), + }?, + dwo_parent: if let Some(dwo_parent) = dwo_parent { + let dwo_parent = match File::parse(dwo_parent)? { + file @ File::Wasm(_) => Ok(file), + _ => Err(Error::from( + "DWO parent object does not represent a WASM file", + )), + }?; + Some(dwo_parent) + } else { + None + }, + sup_file: if let Some(sup_file) = sup_file { + let sup_file = match File::parse(sup_file)? { + file @ File::Wasm(_) => Ok(file), + _ => Err(Error::from( + "Supplemental file does not represent a WASM file", + )), + }?; + Some(sup_file) + } else { + None + }, + dwarf: OnceCell::new(), }) } /// /// /// - pub fn build(&'wasm self, bundle_sources: bool) -> Result { + pub fn build(&'wasm self, bundle_sources: bool, name: Option<&str>) -> Result { + let dwarf = self + .dwarf + .get_or_init(|| { + DwarfReader::new( + &self.binary, + self.dwo_parent.as_ref(), + self.sup_file.as_ref(), + ) + }) + .get()?; + let mut mapper = SourceMapBuilder::new(None); - let mut iter = self.dwarf.get()?.units(); + let mut iter = dwarf.units(); while let Some(header) = iter.next()? { - let unit = match self.dwarf.get()?.unit(header) { + let unit = match dwarf.unit(header) { Ok(unit) => unit, Err(_) => continue, }; @@ -78,7 +113,7 @@ impl<'wasm, R: ReadRef<'wasm> + 'wasm> Wasm<'wasm, R> { }; let file = match row.file(line_header) { Some(file) => { - let reader = self.dwarf.get()?.attr_string(&unit, file.path_name())?; + let reader = dwarf.attr_string(&unit, file.path_name())?; let file_name = reader.to_string_lossy()?; let sid = mapper.add_source(file_name.as_ref()); Some(sid) From 4eec173ef1e7bde9491121638e6d41a1d2be4ede Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rk=20Tolm=C3=A1cs?= Date: Fri, 8 Dec 2023 14:31:56 +0100 Subject: [PATCH 14/36] Path now contains directory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Márk Tolmács --- wasm2map/src/lib.rs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/wasm2map/src/lib.rs b/wasm2map/src/lib.rs index 5848991..3224e1a 100644 --- a/wasm2map/src/lib.rs +++ b/wasm2map/src/lib.rs @@ -29,7 +29,7 @@ pub use loader::WasmLoader; pub use object::ReadRef; use object::{self, File}; use sourcemap::SourceMapBuilder; -use std::{cell::OnceCell, str}; +use std::{borrow::Cow, cell::OnceCell, str}; /// pub struct Wasm<'wasm, R: ReadRef<'wasm>> { @@ -101,7 +101,7 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { //let header = program.header(); //let base = if header.version() >= 5 { 0 } else { 1 }; //header.directory(directory) - let mut rows = program.rows(); + let mut rows = program.clone().rows(); while let Some((line_header, row)) = rows.next_row()? { let line = match row.line() { Some(line) => line.get(), @@ -113,8 +113,19 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { }; let file = match row.file(line_header) { Some(file) => { - let reader = dwarf.attr_string(&unit, file.path_name())?; - let file_name = reader.to_string_lossy()?; + let mut file_name = dwarf + .attr_string(&unit, file.path_name())? + .to_string_lossy()? + .to_string(); + if let Some(directory_attr) = file.directory(program.header()) { + if let Ok(directory) = dwarf.attr_string(&unit, directory_attr) { + if let Ok(directory) = directory.to_string_lossy() { + let mut directory = directory.to_string(); + directory.push('/'); + file_name.insert_str(0, &directory); + } + } + } let sid = mapper.add_source(file_name.as_ref()); Some(sid) } From cc350823f9198d95ddfa7d28de6a99fef760854a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rk=20Tolm=C3=A1cs?= Date: Sat, 9 Dec 2023 21:22:23 +0100 Subject: [PATCH 15/36] End sequence fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Márk Tolmács --- wasm2map/src/lib.rs | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/wasm2map/src/lib.rs b/wasm2map/src/lib.rs index 3224e1a..90516d3 100644 --- a/wasm2map/src/lib.rs +++ b/wasm2map/src/lib.rs @@ -29,7 +29,9 @@ pub use loader::WasmLoader; pub use object::ReadRef; use object::{self, File}; use sourcemap::SourceMapBuilder; -use std::{borrow::Cow, cell::OnceCell, str}; +use std::{cell::OnceCell, str}; + +type Entry = (u32, u32, u32, u32, Option, Option); /// pub struct Wasm<'wasm, R: ReadRef<'wasm>> { @@ -79,6 +81,9 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { /// /// pub fn build(&'wasm self, bundle_sources: bool, name: Option<&str>) -> Result { + let mut entries: Vec = Vec::new(); + let mut mapper = SourceMapBuilder::new(None); + let dwarf = self .dwarf .get_or_init(|| { @@ -90,7 +95,6 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { }) .get()?; - let mut mapper = SourceMapBuilder::new(None); let mut iter = dwarf.units(); while let Some(header) = iter.next()? { let unit = match dwarf.unit(header) { @@ -105,12 +109,13 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { while let Some((line_header, row)) = rows.next_row()? { let line = match row.line() { Some(line) => line.get(), - None => 0, + None => continue, }; let column = match row.column() { gimli::ColumnType::Column(column) => column.get(), - gimli::ColumnType::LeftEdge => 0, + gimli::ColumnType::LeftEdge => 1, }; + let mut address = row.address().try_into()?; let file = match row.file(line_header) { Some(file) => { let mut file_name = dwarf @@ -134,20 +139,34 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { // TODO: Bundle sources? - mapper.add_raw( - 1, - row.address().try_into()?, + if row.end_sequence() { + address -= 1; + let last = entries.last().ok_or("Empty DWARF program sequence")?; + if last.0 == address { + // TODO last entry has the same address, reusing + continue; + } + } + + entries.push(( + column.try_into()?, + address, line.try_into()?, column.try_into()?, file, None, // TODO: Look up name - ); - - //if row.end_sequence() {} + )); } } } + entries.sort_by(|left, right| left.0.cmp(&right.0)); + entries + .into_iter() + .for_each(|(dst_line, dst_col, src_line, src_col, source, name)| { + mapper.add_raw(dst_line, dst_col, src_line, src_col, source, name); + }); + let mut buf: Vec = Vec::new(); mapper.into_sourcemap().to_writer(&mut buf).unwrap(); From 5543f944be1b803a9431c62987390bec2db18539 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rk=20Tolm=C3=A1cs?= Date: Sat, 9 Dec 2023 22:02:55 +0100 Subject: [PATCH 16/36] Position test adapted, but failing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Márk Tolmács --- wasm2map/src/_test.rs | 450 ++++++++++++++++++++++++++++++++++++++++++ wasm2map/src/lib.rs | 4 +- wasm2map/src/test.rs | 312 ++++------------------------- 3 files changed, 485 insertions(+), 281 deletions(-) create mode 100644 wasm2map/src/_test.rs diff --git a/wasm2map/src/_test.rs b/wasm2map/src/_test.rs new file mode 100644 index 0000000..9099829 --- /dev/null +++ b/wasm2map/src/_test.rs @@ -0,0 +1,450 @@ +use sourcemap::SourceMap; +use std::{ + fs, + ops::Deref, + path::{Path, PathBuf}, +}; + +use crate::{error::Error, json::encode, vlq, CodePoint, WASM}; + +// Consts needed to build golden versions of the binary WASM module section. +// See wasm2map::WASM::patch() doc-comment for details. +const WASM_CUSTOM_SECTION_ID: u8 = 0; +const WASM_SOURCEMAPPINGURL_SECTION_NAME: &[u8] = b"sourceMappingURL"; + +// TODO: Test sourcemap size load +// TODO: Test sourcemap generation + +/// Tests the format of the sourcemap, makes sure the JSON is valid and +/// the required keys are present, with the right type of values. +#[test] +fn can_create_valid_sourcemap_format() { + testutils::run_test(|out| { + if let Ok(mapper) = WASM::load(out) { + let sourcemap = mapper.map_v3(false); + + let parsed = serde_json::from_str::(sourcemap.as_str()) + .expect("Sourcemap is not a valid JSON file"); + let json = parsed.as_object().expect("Sourcemap is not a JSON object"); + + let version = json + .get("version") + .expect("Sourcemap JSON object has no requied version key") + .as_i64() + .expect("Sourcemap JSON version value is not an integer"); + assert!(version == 3); + + let names = json + .get("names") + .expect("Sourcemap JSON has no names key") + .as_array() + .expect("Sourcemap JSON key names is not an array"); + assert!(names.is_empty()); + + let sources = json + .get("sources") + .expect("Sourcemap JSON object has no sources key") + .as_array() + .expect("Sourcemap JSON sources value is not an array"); + assert!(!sources.is_empty()); + sources.iter().for_each(|value| { + let path = Path::new( + value + .as_str() + .expect("Sourcemap JSON sources item is not a string"), + ); + assert!(path.extension().is_some()); + }); + + let mappings = json + .get("mappings") + .expect("Sourcemap JSON object has no mappings key") + .as_str() + .expect("Sourcemap JSON key mappings is not a string"); + assert!(!mappings.is_empty()); + } else { + unreachable!() + } + }); +} + +/// The Rust library core files are included in DWARF as relative file paths. +/// This test checks if some of the Rust core files are included in the sources +/// list with some leading parent directories, meaning the relative paths in +/// DWARF are resolved. +#[test] +fn relative_paths_are_considered() { + testutils::run_test(|out| { + if let Ok(mapper) = WASM::load(out) { + let sourcemap = mapper.map_v3(false); + + assert!(sourcemap.contains("/library/core/src/any.rs")); + assert!(sourcemap.contains("/library/core/src/panicking.rs")); + } else { + unreachable!() + } + }); +} + +/// When the caller requests the bundling of source file contents, we check +/// that the generated sourcemap has the user source code for the test code. +#[test] +fn can_bundle_source() { + testutils::run_test(|out| { + if let Ok(mapper) = WASM::load(out) { + let sourcemap = mapper.map_v3(true); + fs::write("sourcemap.json", &sourcemap).expect("FAILED to write file"); + assert!(sourcemap.contains("fn main() {}")); + fs::remove_file("sourcemap.json").expect("Failed to delete temp file"); + } else { + unreachable!() + } + }); +} + +/// Check the ability of the library to modify the WASM file to add / change +/// a sourcemap. Makes sure the library does not break the WASM binary. +#[test] +fn can_add_and_update_sourcemap() { + testutils::run_test(|out| { + // Set up the test byte data + const URL: &str = "http://localhost:8080"; + let content = [ + &[WASM_SOURCEMAPPINGURL_SECTION_NAME.len() as u8], + WASM_SOURCEMAPPINGURL_SECTION_NAME, + &[URL.len() as u8], + URL.as_bytes(), + ] + .concat(); + let section = [ + &[WASM_CUSTOM_SECTION_ID] as &[u8], + &[content.len() as u8], + content.as_ref(), + ] + .concat(); + const URL2: &str = "http://127.0.0.1:8080"; + let content2 = [ + &[WASM_SOURCEMAPPINGURL_SECTION_NAME.len() as u8], + WASM_SOURCEMAPPINGURL_SECTION_NAME, + &[URL2.len() as u8] as &[u8], + URL2.as_bytes(), + ] + .concat(); + let section2 = [ + &[WASM_CUSTOM_SECTION_ID] as &[u8], + &[content2.len() as u8], + content2.as_ref(), + ] + .concat(); + + let mapper = WASM::load(&out); + if let Ok(mut mapper) = mapper { + // Patch the WASM with sourceMappingURL and check if it is applied + // correctly + if let Err(error) = mapper.patch(URL) { + panic!("Failed to patch the WASM file the first time: {}", error); + } + { + let test = testutils::peek_wasm_file_end(out.clone(), section.len()); + assert_eq!(test, section); + } + + // Update it and check if it's still valid and not duplicated + if let Err(error) = mapper.patch(URL2) { + panic!("Failed to patch the WASM file the first time: {}", error); + } + { + let test = + testutils::peek_wasm_file_end(out.clone(), section.len() + section2.len()); + + // Test if the patch just keeps adding patches or properly + // update the old one + assert_ne!( + test, + [section.as_ref() as &[u8], section2.as_ref()].concat() + ); + + // Test if the only sourceMappingURL is the last one we set + assert_eq!(test[test.len() - section2.len()..], section2); + } + + // Attempt to patch with the last one for sanity check + if let Err(error) = mapper.patch(URL2) { + panic!("Failed to patch the WASM file the first time: {}", error); + } + { + // Test if WASM binary is at least structurally valid + let raw = fs::read(&out).expect("Cannot open the WASM file"); + let obj = object::File::parse(raw.deref()); + assert!(obj.is_ok()); + } + } else { + panic!("Error loading WASM: {}", mapper.err().unwrap()); + } + + let mapper = WASM::load(&out); + if let Ok(mut mapper) = mapper { + // Attempt to patch with the last one for sanity check + if let Err(error) = mapper.patch(URL2) { + panic!("Failed to patch the WASM file the first time: {}", error); + } + { + // Test if WASM binary is at least structurally valid + let raw = fs::read(&out).expect("Cannot open the WASM file"); + let obj = object::File::parse(raw.deref()); + assert!(obj.is_ok()); + } + } else { + panic!("Error loading WASM: {}", mapper.err().unwrap()); + } + }) +} + +/// Just check if an error is raised when the target WASM binary does not exists. +/// This monitors a regression in the code previously present, where patching +/// failed silently and the user did not recognize why there is no sourcemap loaded. +#[test] +fn test_path_handles_nonexistent_wasm() { + testutils::run_test(|out| { + let mapper = WASM::load(&out); + if let Ok(mut mapper) = mapper { + // Delete the WASM file to trigger error + fs::remove_file(&out).ok(); + + // Attempt to patch with the last one for sanity check + let result = mapper.patch("http://127.0.0.1:8080"); + + assert!(result.is_err()) + } else { + panic!("Error loading WASM: {}", mapper.err().unwrap()); + } + }); +} + +/// Make sure the error type of this crate handles all needed cases. +#[test] +fn test_error_types() { + fn errors() -> Result<(), Box> { + let _error: crate::Error = + std::io::Error::new(std::io::ErrorKind::AddrInUse, "This is a test").into(); + + let dumbarray = Vec::::new(); + let _error: crate::Error = match object::File::parse(dumbarray.as_slice()) { + Ok(_) => unreachable!(), + Err(err) => err.into(), + }; + + let _error: crate::Error = gimli::Error::Io.into(); + + let _error: crate::Error = "This is a test".into(); + + let _error: crate::Error = "This is a test".to_owned().into(); + + let num: Result = u32::MAX.try_into(); + let _error: crate::Error = match num { + Ok(_) => unreachable!(), + Err(err) => err.into(), + }; + + Err(Box::from(_error)) + } + + let errors = errors(); + assert!(errors.is_err()); + + let error: crate::Error = "This is a test".into(); + assert_eq!(format!("{}", error), "This is a test"); +} + +/// Test the VLQ encoding of numbers to VLQ byte sequences, which +/// can be turned into "mappings" in the sourcemap. +#[test] +fn test_numeric_encode_to_byte_sequence() { + assert_eq!(vlq::encode_uint_var(432), vec![176, 3]) +} + +/// Check if the Debug, Display is present on types in this library +#[test] +fn test_derived_macros_present() { + testutils::run_test(|out| { + let codepoint = CodePoint { + path: PathBuf::new(), + address: 0, + line: 0, + column: 0, + }; + assert!(!format!("{:#?}", codepoint).is_empty()); + let wasm = + WASM::load(out).expect("Loading WASM file is unsuccessful in derived macros test"); + assert!(!format!("{:#?}", wasm).is_empty()); + let error = Error::from(""); + assert!(!format!("{:#?}", error).is_empty()); + }) +} + +/// Test our specialized JSON encoding is working, all special characters are +/// encoded properly. +#[test] +fn test_json_encode() { + let buf = [0; 32] + .iter() + .enumerate() + .map(|(count, _)| u8::try_from(count).expect("Data buffer is longer than 32")) + .collect::>(); + assert_eq!( + encode(std::str::from_utf8(buf.as_slice()).expect("Wrong test buffer data")), + r#"\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f"# + ); + let buf2 = &[36, 35, 34, 92, 93, 94]; + assert_eq!( + encode(std::str::from_utf8(buf2.as_slice()).expect("Wrong second test buffer data")), + r#"$#\"\\"# + ); +} + +/// Uses the Mozilla source-map package (which is directly used by the Firefox +/// browser to resolve sourcemaps) to retrieve a known good position for the +/// test source. +#[test] +fn position_retrieval_works() { + let workspace = testutils::get_workspace_dir(); + + let sourcemap = { + let path = workspace.clone().join("wasm2map/test/assets/golden.wasm"); + let wasm = WASM::load(path.as_path()).expect("Could not load golden.wasm"); + + SourceMap::from_slice(wasm.map_v3(false).as_bytes()) + .expect("Generated sourcemap is not valid") + }; + + let golden = { + let path = workspace + .clone() + .join("wasm2map/test/assets/golden.wasm.map"); + + SourceMap::from_reader(fs::File::open(path.as_path()).expect("Cannot load golden.wasm.map")) + .expect("Cannot parse sourcemap golden.wasm.map") + }; + + golden.tokens().for_each(|golden_token| { + let col = golden_token.get_dst_col(); + let line = golden_token.get_dst_line(); + let token = sourcemap + .lookup_token(line, col) + .expect("Position from golden.json is not present in the sourcemap"); + let left = golden_token.to_string(); + let right = token.to_string(); + + assert!( + left.as_str().eq(right.as_str()), + "[{}] {} <=> {}", + col, + left, + right + ); + }); +} + +// TODO: Test relocation + +// TODO: Test DWO? + +mod testutils { + use std::{ + fs, panic, + path::PathBuf, + process::{Command, Stdio}, + }; + + // Get the target dir for the project or workspace directly from cargo + // so we can create the temporary WASM file somewhere reliable + pub fn get_workspace_dir() -> PathBuf { + let mut out = PathBuf::new(); + let raw = Command::new("cargo") + .args(["locate-project", "--workspace"]) + .output() + .expect("Failed to locate cargo project") + .stdout; + let locate_project = &String::from_utf8_lossy(&raw); + out.push(&locate_project[9..locate_project.len() - 14]); + out + } + + // Invoke the rustc command to compile a simple WASM binary with DWARF info + // so we can run our tests on it + // + // # Concept + // + // rustc gets the source code (the source param) from stdin and writes out + // the created WASM binary to the project / workspace target dir. + // + // NOTE: We also force the WASM32 target obviously, so the tests need that toolchain + pub fn build_with_rustc(source: &'_ str, output: &'_ str) { + let mut file = get_workspace_dir(); + file.push("target"); + file.push(format!("test{}.rs", get_thread_id())); + std::fs::write(&file, source).unwrap(); + + let mut rustc = Command::new("rustc") + .args(["--target", "wasm32-unknown-unknown", "-g", "-o", output]) + .arg(file) + .stdout(Stdio::piped()) + .spawn() + .expect("Test WASM compile unsuccessful"); + rustc + .wait() + .expect("Could not compile test WASM successfully"); + } + + // Builds a test WASM file via rustc in the target directory for the tests + // to manipulate + pub fn setup() -> String { + let mut out = get_workspace_dir(); + out.push("target"); + out.push(format!("test{}.wasm", get_thread_id())); + + build_with_rustc("fn main() {}", out.display().to_string().as_str()); + + out.to_string_lossy().to_string() + } + + // Remove the test WASM at the end of each test case + pub fn teardown() { + let mut target = get_workspace_dir(); + target.push("target"); + + let mut wasm = target.clone(); + wasm.push(format!("test{}.wasm", get_thread_id())); + fs::remove_file(wasm.as_path()).ok(); + + let mut input = target.clone(); + input.push(format!("test{}.rs", get_thread_id())); + fs::remove_file(input.as_path()).ok(); + } + + pub fn get_thread_id() -> u64 { + // TODO(mtolmacs): There's an easier way on nightly, https://github.com/rust-lang/rust/issues/67939 + let str = format!("{:#?}", std::thread::current().id()); + let num = &str.as_str()[14..str.len() - 3]; + + str::parse::(num).expect("ThreadId debug format changed") + } + + // Loads 'loopback' bytes from the end of the WASM binary specified by the 'path' + // parameter, which we can use to match against expected binary patters + pub fn peek_wasm_file_end(path: String, lookback: usize) -> Vec { + let binary = fs::read(path).expect("Can't open the test WASM file for reading"); + binary[binary.len() - lookback..].to_owned() + } + + // Run a test with setup and teardown for the test case + pub fn run_test(test: T) + where + T: FnOnce(String) + panic::UnwindSafe, + { + let out = setup(); + let result = panic::catch_unwind(|| test(out)); + teardown(); + assert!(result.is_ok()) + } +} diff --git a/wasm2map/src/lib.rs b/wasm2map/src/lib.rs index 90516d3..afe421d 100644 --- a/wasm2map/src/lib.rs +++ b/wasm2map/src/lib.rs @@ -18,8 +18,8 @@ mod dwarf; mod error; #[cfg(feature = "loader")] mod loader; -// #[cfg(test)] -// mod test; +#[cfg(test)] +mod test; use dwarf::DwarfReader; use error::Error; diff --git a/wasm2map/src/test.rs b/wasm2map/src/test.rs index 9099829..556a793 100644 --- a/wasm2map/src/test.rs +++ b/wasm2map/src/test.rs @@ -1,28 +1,20 @@ -use sourcemap::SourceMap; -use std::{ - fs, - ops::Deref, - path::{Path, PathBuf}, -}; - -use crate::{error::Error, json::encode, vlq, CodePoint, WASM}; +// TODO: Test relocation +// TODO: Test DWO? -// Consts needed to build golden versions of the binary WASM module section. -// See wasm2map::WASM::patch() doc-comment for details. -const WASM_CUSTOM_SECTION_ID: u8 = 0; -const WASM_SOURCEMAPPINGURL_SECTION_NAME: &[u8] = b"sourceMappingURL"; +use sourcemap::SourceMap; -// TODO: Test sourcemap size load -// TODO: Test sourcemap generation +use crate::{Wasm, WasmLoader}; +use std::{fs, panic, path::Path}; /// Tests the format of the sourcemap, makes sure the JSON is valid and /// the required keys are present, with the right type of values. #[test] fn can_create_valid_sourcemap_format() { - testutils::run_test(|out| { - if let Ok(mapper) = WASM::load(out) { - let sourcemap = mapper.map_v3(false); - + panic::catch_unwind(|| { + let path = testutils::get_workspace_dir().join("wasm2map/test/assets/golden.wasm"); + let loader = WasmLoader::from_path(path).expect("Could not load WASM file"); + let wasm = Wasm::new(&loader, None, None).expect("Could not load WASM sections"); + if let Ok(sourcemap) = wasm.build(false, None) { let parsed = serde_json::from_str::(sourcemap.as_str()) .expect("Sourcemap is not a valid JSON file"); let json = parsed.as_object().expect("Sourcemap is not a JSON object"); @@ -63,275 +55,41 @@ fn can_create_valid_sourcemap_format() { .expect("Sourcemap JSON key mappings is not a string"); assert!(!mappings.is_empty()); } else { - unreachable!() - } - }); -} - -/// The Rust library core files are included in DWARF as relative file paths. -/// This test checks if some of the Rust core files are included in the sources -/// list with some leading parent directories, meaning the relative paths in -/// DWARF are resolved. -#[test] -fn relative_paths_are_considered() { - testutils::run_test(|out| { - if let Ok(mapper) = WASM::load(out) { - let sourcemap = mapper.map_v3(false); - - assert!(sourcemap.contains("/library/core/src/any.rs")); - assert!(sourcemap.contains("/library/core/src/panicking.rs")); - } else { - unreachable!() - } - }); -} - -/// When the caller requests the bundling of source file contents, we check -/// that the generated sourcemap has the user source code for the test code. -#[test] -fn can_bundle_source() { - testutils::run_test(|out| { - if let Ok(mapper) = WASM::load(out) { - let sourcemap = mapper.map_v3(true); - fs::write("sourcemap.json", &sourcemap).expect("FAILED to write file"); - assert!(sourcemap.contains("fn main() {}")); - fs::remove_file("sourcemap.json").expect("Failed to delete temp file"); - } else { - unreachable!() - } - }); -} - -/// Check the ability of the library to modify the WASM file to add / change -/// a sourcemap. Makes sure the library does not break the WASM binary. -#[test] -fn can_add_and_update_sourcemap() { - testutils::run_test(|out| { - // Set up the test byte data - const URL: &str = "http://localhost:8080"; - let content = [ - &[WASM_SOURCEMAPPINGURL_SECTION_NAME.len() as u8], - WASM_SOURCEMAPPINGURL_SECTION_NAME, - &[URL.len() as u8], - URL.as_bytes(), - ] - .concat(); - let section = [ - &[WASM_CUSTOM_SECTION_ID] as &[u8], - &[content.len() as u8], - content.as_ref(), - ] - .concat(); - const URL2: &str = "http://127.0.0.1:8080"; - let content2 = [ - &[WASM_SOURCEMAPPINGURL_SECTION_NAME.len() as u8], - WASM_SOURCEMAPPINGURL_SECTION_NAME, - &[URL2.len() as u8] as &[u8], - URL2.as_bytes(), - ] - .concat(); - let section2 = [ - &[WASM_CUSTOM_SECTION_ID] as &[u8], - &[content2.len() as u8], - content2.as_ref(), - ] - .concat(); - - let mapper = WASM::load(&out); - if let Ok(mut mapper) = mapper { - // Patch the WASM with sourceMappingURL and check if it is applied - // correctly - if let Err(error) = mapper.patch(URL) { - panic!("Failed to patch the WASM file the first time: {}", error); - } - { - let test = testutils::peek_wasm_file_end(out.clone(), section.len()); - assert_eq!(test, section); - } - - // Update it and check if it's still valid and not duplicated - if let Err(error) = mapper.patch(URL2) { - panic!("Failed to patch the WASM file the first time: {}", error); - } - { - let test = - testutils::peek_wasm_file_end(out.clone(), section.len() + section2.len()); - - // Test if the patch just keeps adding patches or properly - // update the old one - assert_ne!( - test, - [section.as_ref() as &[u8], section2.as_ref()].concat() - ); - - // Test if the only sourceMappingURL is the last one we set - assert_eq!(test[test.len() - section2.len()..], section2); - } - - // Attempt to patch with the last one for sanity check - if let Err(error) = mapper.patch(URL2) { - panic!("Failed to patch the WASM file the first time: {}", error); - } - { - // Test if WASM binary is at least structurally valid - let raw = fs::read(&out).expect("Cannot open the WASM file"); - let obj = object::File::parse(raw.deref()); - assert!(obj.is_ok()); - } - } else { - panic!("Error loading WASM: {}", mapper.err().unwrap()); - } - - let mapper = WASM::load(&out); - if let Ok(mut mapper) = mapper { - // Attempt to patch with the last one for sanity check - if let Err(error) = mapper.patch(URL2) { - panic!("Failed to patch the WASM file the first time: {}", error); - } - { - // Test if WASM binary is at least structurally valid - let raw = fs::read(&out).expect("Cannot open the WASM file"); - let obj = object::File::parse(raw.deref()); - assert!(obj.is_ok()); - } - } else { - panic!("Error loading WASM: {}", mapper.err().unwrap()); - } - }) -} - -/// Just check if an error is raised when the target WASM binary does not exists. -/// This monitors a regression in the code previously present, where patching -/// failed silently and the user did not recognize why there is no sourcemap loaded. -#[test] -fn test_path_handles_nonexistent_wasm() { - testutils::run_test(|out| { - let mapper = WASM::load(&out); - if let Ok(mut mapper) = mapper { - // Delete the WASM file to trigger error - fs::remove_file(&out).ok(); - - // Attempt to patch with the last one for sanity check - let result = mapper.patch("http://127.0.0.1:8080"); - - assert!(result.is_err()) - } else { - panic!("Error loading WASM: {}", mapper.err().unwrap()); + unreachable!("Could not load WASM binary") } - }); -} - -/// Make sure the error type of this crate handles all needed cases. -#[test] -fn test_error_types() { - fn errors() -> Result<(), Box> { - let _error: crate::Error = - std::io::Error::new(std::io::ErrorKind::AddrInUse, "This is a test").into(); - - let dumbarray = Vec::::new(); - let _error: crate::Error = match object::File::parse(dumbarray.as_slice()) { - Ok(_) => unreachable!(), - Err(err) => err.into(), - }; - - let _error: crate::Error = gimli::Error::Io.into(); - - let _error: crate::Error = "This is a test".into(); - - let _error: crate::Error = "This is a test".to_owned().into(); - - let num: Result = u32::MAX.try_into(); - let _error: crate::Error = match num { - Ok(_) => unreachable!(), - Err(err) => err.into(), - }; - - Err(Box::from(_error)) - } - - let errors = errors(); - assert!(errors.is_err()); - - let error: crate::Error = "This is a test".into(); - assert_eq!(format!("{}", error), "This is a test"); -} - -/// Test the VLQ encoding of numbers to VLQ byte sequences, which -/// can be turned into "mappings" in the sourcemap. -#[test] -fn test_numeric_encode_to_byte_sequence() { - assert_eq!(vlq::encode_uint_var(432), vec![176, 3]) -} - -/// Check if the Debug, Display is present on types in this library -#[test] -fn test_derived_macros_present() { - testutils::run_test(|out| { - let codepoint = CodePoint { - path: PathBuf::new(), - address: 0, - line: 0, - column: 0, - }; - assert!(!format!("{:#?}", codepoint).is_empty()); - let wasm = - WASM::load(out).expect("Loading WASM file is unsuccessful in derived macros test"); - assert!(!format!("{:#?}", wasm).is_empty()); - let error = Error::from(""); - assert!(!format!("{:#?}", error).is_empty()); }) + .expect("Cannot create a valid sourcemap format"); } -/// Test our specialized JSON encoding is working, all special characters are -/// encoded properly. -#[test] -fn test_json_encode() { - let buf = [0; 32] - .iter() - .enumerate() - .map(|(count, _)| u8::try_from(count).expect("Data buffer is longer than 32")) - .collect::>(); - assert_eq!( - encode(std::str::from_utf8(buf.as_slice()).expect("Wrong test buffer data")), - r#"\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f"# - ); - let buf2 = &[36, 35, 34, 92, 93, 94]; - assert_eq!( - encode(std::str::from_utf8(buf2.as_slice()).expect("Wrong second test buffer data")), - r#"$#\"\\"# - ); -} - -/// Uses the Mozilla source-map package (which is directly used by the Firefox -/// browser to resolve sourcemaps) to retrieve a known good position for the -/// test source. +/// Check the address resolution in the generated sourcemap against a known good +/// example #[test] fn position_retrieval_works() { - let workspace = testutils::get_workspace_dir(); - - let sourcemap = { - let path = workspace.clone().join("wasm2map/test/assets/golden.wasm"); - let wasm = WASM::load(path.as_path()).expect("Could not load golden.wasm"); - - SourceMap::from_slice(wasm.map_v3(false).as_bytes()) - .expect("Generated sourcemap is not valid") - }; - let golden = { - let path = workspace - .clone() - .join("wasm2map/test/assets/golden.wasm.map"); - - SourceMap::from_reader(fs::File::open(path.as_path()).expect("Cannot load golden.wasm.map")) - .expect("Cannot parse sourcemap golden.wasm.map") + let path = testutils::get_workspace_dir().join("wasm2map/test/assets/golden.wasm.map"); + let bytes = std::fs::read(path).expect("Could not load golden sourcemap"); + SourceMap::from_slice(&bytes).expect("Malformed golden sourcemap file") }; + let path = testutils::get_workspace_dir().join("wasm2map/test/assets/golden.wasm"); + let loader = WasmLoader::from_path(path).expect("Could not load WASM file"); + let wasm = Wasm::new(&loader, None, None).expect("Could not load WASM sections"); + let sourcemap = SourceMap::from_slice( + wasm.build(false, None) + .expect("Failed to build sourcemap for golden WASM") + .as_bytes(), + ) + .expect("Generated sourcemap is not valid"); + golden.tokens().for_each(|golden_token| { let col = golden_token.get_dst_col(); let line = golden_token.get_dst_line(); - let token = sourcemap - .lookup_token(line, col) - .expect("Position from golden.json is not present in the sourcemap"); + let token = sourcemap.lookup_token(line, col).unwrap_or_else(|| { + panic!( + "Position {}:{} from golden.wasm.map is not present in the generated sourcemap", + line, col + ) + }); let left = golden_token.to_string(); let right = token.to_string(); @@ -345,10 +103,6 @@ fn position_retrieval_works() { }); } -// TODO: Test relocation - -// TODO: Test DWO? - mod testutils { use std::{ fs, panic, From 940725d164c81a074563e689eb10acd3d8277b4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rk=20Tolm=C3=A1cs?= Date: Sun, 10 Dec 2023 12:56:11 +0100 Subject: [PATCH 17/36] Column fix for entries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Márk Tolmács --- wasm2map/src/lib.rs | 2 +- wasm2map/src/test.rs | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/wasm2map/src/lib.rs b/wasm2map/src/lib.rs index afe421d..4ac2abb 100644 --- a/wasm2map/src/lib.rs +++ b/wasm2map/src/lib.rs @@ -113,7 +113,7 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { }; let column = match row.column() { gimli::ColumnType::Column(column) => column.get(), - gimli::ColumnType::LeftEdge => 1, + gimli::ColumnType::LeftEdge => 0, }; let mut address = row.address().try_into()?; let file = match row.file(line_header) { diff --git a/wasm2map/src/test.rs b/wasm2map/src/test.rs index 556a793..0af1bdf 100644 --- a/wasm2map/src/test.rs +++ b/wasm2map/src/test.rs @@ -81,13 +81,15 @@ fn position_retrieval_works() { ) .expect("Generated sourcemap is not valid"); + let mut entry: u32 = 0; golden.tokens().for_each(|golden_token| { + entry += 1; let col = golden_token.get_dst_col(); let line = golden_token.get_dst_line(); let token = sourcemap.lookup_token(line, col).unwrap_or_else(|| { panic!( - "Position {}:{} from golden.wasm.map is not present in the generated sourcemap", - line, col + "Position {}:{} from golden.wasm.map is not present in the generated sourcemap at position {}", + line, col, entry ) }); let left = golden_token.to_string(); From 6f9cd76a1b23e909b05ef5ede97a1c0acecd7f64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rk=20Tolm=C3=A1cs?= Date: Mon, 11 Dec 2023 08:18:50 +0100 Subject: [PATCH 18/36] VSCode launch configuration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Márk Tolmács --- .vscode/launch.json | 64 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..693ea5c --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,64 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "lldb", + "request": "launch", + "name": "Debug unit tests in library 'wasm2map'", + "cargo": { + "args": [ + "test", + "--no-run", + "--lib", + "--package=wasm2map" + ], + "filter": { + "name": "wasm2map", + "kind": "lib" + } + }, + "args": [], + "cwd": "${workspaceFolder}" + }, + { + "type": "lldb", + "request": "launch", + "name": "Debug executable 'cargo-wasm2map'", + "cargo": { + "args": [ + "build", + "--bin=cargo-wasm2map", + "--package=cargo-wasm2map" + ], + "filter": { + "name": "cargo-wasm2map", + "kind": "bin" + } + }, + "args": [], + "cwd": "${workspaceFolder}" + }, + { + "type": "lldb", + "request": "launch", + "name": "Debug unit tests in executable 'cargo-wasm2map'", + "cargo": { + "args": [ + "test", + "--no-run", + "--bin=cargo-wasm2map", + "--package=cargo-wasm2map" + ], + "filter": { + "name": "cargo-wasm2map", + "kind": "bin" + } + }, + "args": [], + "cwd": "${workspaceFolder}" + } + ] +} \ No newline at end of file From 1aae8a635b497beb6954f8f64102eebc26c7f56b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rk=20Tolm=C3=A1cs?= Date: Mon, 11 Dec 2023 08:19:13 +0100 Subject: [PATCH 19/36] Fixes in entry generation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Márk Tolmács --- wasm2map/src/lib.rs | 53 ++++++++++++++++++++++++++++++++------------ wasm2map/src/test.rs | 6 +++-- 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/wasm2map/src/lib.rs b/wasm2map/src/lib.rs index 4ac2abb..655b446 100644 --- a/wasm2map/src/lib.rs +++ b/wasm2map/src/lib.rs @@ -31,7 +31,7 @@ use object::{self, File}; use sourcemap::SourceMapBuilder; use std::{cell::OnceCell, str}; -type Entry = (u32, u32, u32, u32, Option, Option); +type Entry = (u32, u32, u32, u32, Option, Option, bool); /// pub struct Wasm<'wasm, R: ReadRef<'wasm>> { @@ -102,9 +102,6 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { Err(_) => continue, }; if let Some(program) = unit.line_program.clone() { - //let header = program.header(); - //let base = if header.version() >= 5 { 0 } else { 1 }; - //header.directory(directory) let mut rows = program.clone().rows(); while let Some((line_header, row)) = rows.next_row()? { let line = match row.line() { @@ -136,40 +133,68 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { } None => None, }; + let eos = row.end_sequence(); // TODO: Bundle sources? if row.end_sequence() { address -= 1; - let last = entries.last().ok_or("Empty DWARF program sequence")?; - if last.0 == address { - // TODO last entry has the same address, reusing - continue; + let last = entries.last_mut().unwrap(); + if last.1 == address { + last.6 = true; } } entries.push(( - column.try_into()?, + 0, address, line.try_into()?, column.try_into()?, file, None, // TODO: Look up name + eos, )); } } } - entries.sort_by(|left, right| left.0.cmp(&right.0)); - entries - .into_iter() - .for_each(|(dst_line, dst_col, src_line, src_col, source, name)| { + //Self::remove_dead_entries(&mut entries); + entries.into_iter().filter(|item| !item.6).for_each( + |(dst_line, dst_col, src_line, src_col, source, name, _)| { mapper.add_raw(dst_line, dst_col, src_line, src_col, source, name); - }); + }, + ); let mut buf: Vec = Vec::new(); mapper.into_sourcemap().to_writer(&mut buf).unwrap(); Ok(String::from_utf8(buf).unwrap()) } + + /// + /// + fn remove_dead_entries(entries: &mut Vec) { + let mut block_start = 0; + let mut cur_entry = 0; + while cur_entry < entries.len() { + if !entries.get(cur_entry).unwrap().6 { + cur_entry += 1; + } else { + let fn_start = entries.get(block_start).unwrap().1; + let fn_ptr = entries.get(cur_entry).unwrap().1; + let fn_size_length = (fn_ptr - fn_start + 1).ilog(128) + 1; + let min_live_offset = 1 + fn_size_length; + if fn_start < min_live_offset { + cur_entry += 1; + entries.as_mut_slice()[block_start..cur_entry] + .iter_mut() + .for_each(|e| e.6 = true); + cur_entry += 1; + continue; + } + cur_entry += 1; + block_start = cur_entry; + } + } + } } diff --git a/wasm2map/src/test.rs b/wasm2map/src/test.rs index 0af1bdf..0ff353f 100644 --- a/wasm2map/src/test.rs +++ b/wasm2map/src/test.rs @@ -97,10 +97,12 @@ fn position_retrieval_works() { assert!( left.as_str().eq(right.as_str()), - "[{}] {} <=> {}", + "[{}:{}] {} <=> {} at position {}", + line, col, left, - right + right, + entry ); }); } From 0da7ba8e7a2dd8955597875f29ca5ae962ffd3cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rk=20Tolm=C3=A1cs?= Date: Mon, 11 Dec 2023 08:21:06 +0100 Subject: [PATCH 20/36] Test asset llvm-dwarfdump output added MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Márk Tolmács --- wasm2map/test/assets/golden.dump | Bin 0 -> 660122 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 wasm2map/test/assets/golden.dump diff --git a/wasm2map/test/assets/golden.dump b/wasm2map/test/assets/golden.dump new file mode 100644 index 0000000000000000000000000000000000000000..951926ea24604cc53d1fd3cb76f6b4e7640cda8d GIT binary patch literal 660122 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

0;;mWmQuTj57{n(1Hw)23T%lCCy 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

Knqjrj}JR{E6Cnc%+p59&?86BEIvrvtnWy?UU~b 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 RJI8zHc(0A5yo`19{|D}`w1WTu literal 0 HcmV?d00001 From 53eb88415e93922daadf7914a82968ea09f3dd90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rk=20Tolm=C3=A1cs?= Date: Mon, 11 Dec 2023 11:29:48 +0100 Subject: [PATCH 21/36] Bringing entry addresses closer to the golden image MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Márk Tolmács --- wasm2map/src/dwarf/mod.rs | 7 ++----- wasm2map/src/lib.rs | 30 +++++++++++++++++++++--------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/wasm2map/src/dwarf/mod.rs b/wasm2map/src/dwarf/mod.rs index 9c4e210..63b1d15 100644 --- a/wasm2map/src/dwarf/mod.rs +++ b/wasm2map/src/dwarf/mod.rs @@ -144,11 +144,8 @@ where ) -> Result { let mut relocations: RelocationMap = RelocationMap::new(); - for (offset64, mut relocation) in section.relocations() { - let offset = offset64 as usize; - if offset as u64 != offset64 { - continue; - } + for (offset, mut relocation) in section.relocations() { + let offset = usize::try_from(offset)?; match relocation.kind() { RelocationKind::Absolute => { diff --git a/wasm2map/src/lib.rs b/wasm2map/src/lib.rs index 655b446..940792c 100644 --- a/wasm2map/src/lib.rs +++ b/wasm2map/src/lib.rs @@ -27,7 +27,7 @@ use gimli::{self, Reader}; #[cfg(feature = "loader")] pub use loader::WasmLoader; pub use object::ReadRef; -use object::{self, File}; +use object::{self, File, Object, ObjectSection, SectionIndex}; use sourcemap::SourceMapBuilder; use std::{cell::OnceCell, str}; @@ -38,6 +38,7 @@ pub struct Wasm<'wasm, R: ReadRef<'wasm>> { binary: File<'wasm, R>, dwo_parent: Option>, sup_file: Option>, + offset: u32, dwarf: OnceCell>, } @@ -46,8 +47,16 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { /// /// pub fn new(binary: R, dwo_parent: Option, sup_file: Option) -> Result { + let file = File::parse(binary)?; + let offset = file + .section_by_index(SectionIndex(10))? + .file_range() + .ok_or("No size data available for the code section")? + .0 + .try_into()?; + Ok(Self { - binary: match File::parse(binary)? { + binary: match file { file @ File::Wasm(_) => Ok(file), _ => Err(Error::from("Object does not represent a WASM file")), }?, @@ -73,6 +82,7 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { } else { None }, + offset, dwarf: OnceCell::new(), }) } @@ -101,18 +111,20 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { Ok(unit) => unit, Err(_) => continue, }; + if let Some(program) = unit.line_program.clone() { let mut rows = program.clone().rows(); while let Some((line_header, row)) = rows.next_row()? { - let line = match row.line() { - Some(line) => line.get(), + let line: u32 = match row.line() { + Some(line) => line.get().try_into()?, None => continue, }; - let column = match row.column() { - gimli::ColumnType::Column(column) => column.get(), + let column: u32 = match row.column() { + gimli::ColumnType::Column(column) => column.get().try_into()?, gimli::ColumnType::LeftEdge => 0, }; let mut address = row.address().try_into()?; + address += self.offset; let file = match row.file(line_header) { Some(file) => { let mut file_name = dwarf @@ -137,7 +149,7 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { // TODO: Bundle sources? - if row.end_sequence() { + if eos { address -= 1; let last = entries.last_mut().unwrap(); if last.1 == address { @@ -148,8 +160,8 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { entries.push(( 0, address, - line.try_into()?, - column.try_into()?, + line.saturating_sub(1), + column.saturating_sub(1), file, None, // TODO: Look up name eos, From 24142108742feea9873aca3023241ff7a33b28f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rk=20Tolm=C3=A1cs?= Date: Mon, 11 Dec 2023 12:23:36 +0100 Subject: [PATCH 22/36] Minimal path resolution issues compared to golden MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Márk Tolmács --- cargo-wasm2map/src/main.rs | 4 ++-- wasm2map/src/lib.rs | 14 ++++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/cargo-wasm2map/src/main.rs b/cargo-wasm2map/src/main.rs index 848e8cc..a80fb5c 100644 --- a/cargo-wasm2map/src/main.rs +++ b/cargo-wasm2map/src/main.rs @@ -105,7 +105,7 @@ fn main() -> Result<(), String> { let reader = WasmLoader::from_path(&args.path).map_err(|err| err.to_string())?; // Parse the DWARF code section - let mut wasm = Wasm::new(&reader, None, None).map_err(|err| err.to_string())?; + let wasm = Wasm::new(&reader, None, None).map_err(|err| err.to_string())?; // Generate the source map JSON for the loaded WASM let sourcemap = wasm.build( @@ -119,7 +119,7 @@ fn main() -> Result<(), String> { // If patching is requested, then patch the WASM file at the parameter // with the provided source bap base url + the mapfile name if args.patch { - let url = format!( + let _url = format!( "{}/{}", args.base_url.unwrap().as_str(), map.file_name().unwrap().to_str().unwrap() diff --git a/wasm2map/src/lib.rs b/wasm2map/src/lib.rs index 940792c..89e373c 100644 --- a/wasm2map/src/lib.rs +++ b/wasm2map/src/lib.rs @@ -90,7 +90,7 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { /// /// /// - pub fn build(&'wasm self, bundle_sources: bool, name: Option<&str>) -> Result { + pub fn build(&'wasm self, _bundle_sources: bool, _name: Option<&str>) -> Result { let mut entries: Vec = Vec::new(); let mut mapper = SourceMapBuilder::new(None); @@ -171,11 +171,13 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { } //Self::remove_dead_entries(&mut entries); - entries.into_iter().filter(|item| !item.6).for_each( - |(dst_line, dst_col, src_line, src_col, source, name, _)| { + entries.sort_by(|left, right| left.1.cmp(&right.1)); + entries + .into_iter() + //.filter(|item| !item.6) + .for_each(|(dst_line, dst_col, src_line, src_col, source, name, _)| { mapper.add_raw(dst_line, dst_col, src_line, src_col, source, name); - }, - ); + }); let mut buf: Vec = Vec::new(); mapper.into_sourcemap().to_writer(&mut buf).unwrap(); @@ -185,7 +187,7 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { /// /// - fn remove_dead_entries(entries: &mut Vec) { + fn _remove_dead_entries(entries: &mut Vec) { let mut block_start = 0; let mut cur_entry = 0; while cur_entry < entries.len() { From 878b1901e8ca1538bcbc895ef8218de60dce37d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rk=20Tolm=C3=A1cs?= Date: Mon, 11 Dec 2023 14:02:45 +0100 Subject: [PATCH 23/36] Finally the entry retrival tests pass MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Márk Tolmács --- Cargo.lock | 9 ++++++++- wasm2map/Cargo.toml | 3 ++- wasm2map/src/lib.rs | 28 +++++++++++++++++++--------- wasm2map/src/test.rs | 3 ++- 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b729020..34e67ef 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -273,6 +273,12 @@ dependencies = [ "adler", ] +[[package]] +name = "normalize-path" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5438dd2b2ff4c6df6e1ce22d825ed2fa93ee2922235cc45186991717f0a892d" + [[package]] name = "object" version = "0.32.1" @@ -591,13 +597,14 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm2map" -version = "0.1.0" +version = "0.2.0" dependencies = [ "cfg-if", "flate2", "gcc", "gimli", "memmap2", + "normalize-path", "object", "rand", "serde_json", diff --git a/wasm2map/Cargo.toml b/wasm2map/Cargo.toml index 595a28d..307d56d 100644 --- a/wasm2map/Cargo.toml +++ b/wasm2map/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasm2map" -version = "0.1.0" +version = "0.2.0" edition = "2021" authors = ["Mark Tolmacs "] description = "Generates source map for .wasm file with DWARF debug info embedded as source map." @@ -36,6 +36,7 @@ features = [ ] [dependencies] +normalize-path = "0.2.1" serde_json = "^1" sourcemap = "^7.0" # For -Zminimal-versions diff --git a/wasm2map/src/lib.rs b/wasm2map/src/lib.rs index 89e373c..fa1edca 100644 --- a/wasm2map/src/lib.rs +++ b/wasm2map/src/lib.rs @@ -26,10 +26,11 @@ use error::Error; use gimli::{self, Reader}; #[cfg(feature = "loader")] pub use loader::WasmLoader; +use normalize_path::NormalizePath; pub use object::ReadRef; use object::{self, File, Object, ObjectSection, SectionIndex}; use sourcemap::SourceMapBuilder; -use std::{cell::OnceCell, str}; +use std::{cell::OnceCell, path::PathBuf, str}; type Entry = (u32, u32, u32, u32, Option, Option, bool); @@ -127,20 +128,29 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { address += self.offset; let file = match row.file(line_header) { Some(file) => { - let mut file_name = dwarf - .attr_string(&unit, file.path_name())? - .to_string_lossy()? - .to_string(); + let mut file_name = PathBuf::from( + dwarf + .attr_string(&unit, file.path_name())? + .to_string_lossy()? + .as_ref(), + ); + if let Some(directory_attr) = file.directory(program.header()) { if let Ok(directory) = dwarf.attr_string(&unit, directory_attr) { if let Ok(directory) = directory.to_string_lossy() { - let mut directory = directory.to_string(); - directory.push('/'); - file_name.insert_str(0, &directory); + file_name = + PathBuf::from(directory.as_ref()).join(file_name); } } } - let sid = mapper.add_source(file_name.as_ref()); + let sid = mapper.add_source( + file_name + .normalize() + .to_str() + .ok_or("Error converting path to string")? + .replace('\\', "/") + .as_str(), + ); Some(sid) } None => None, diff --git a/wasm2map/src/test.rs b/wasm2map/src/test.rs index 0ff353f..d893361 100644 --- a/wasm2map/src/test.rs +++ b/wasm2map/src/test.rs @@ -84,8 +84,9 @@ fn position_retrieval_works() { let mut entry: u32 = 0; golden.tokens().for_each(|golden_token| { entry += 1; - let col = golden_token.get_dst_col(); + let col = golden_token.get_dst_col() + 1; let line = golden_token.get_dst_line(); + let golden_token = golden.lookup_token(line, col).expect("Even the golden sourcemap cannot lookup a position"); let token = sourcemap.lookup_token(line, col).unwrap_or_else(|| { panic!( "Position {}:{} from golden.wasm.map is not present in the generated sourcemap at position {}", From 2c0957e7b6c6500762469bcef2767437b310a1e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rk=20Tolm=C3=A1cs?= Date: Sat, 16 Dec 2023 17:51:42 +0100 Subject: [PATCH 24/36] Introducing thiserror MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Márk Tolmács --- Cargo.lock | 7 +++ wasm2map/Cargo.toml | 8 ++-- wasm2map/src/error.rs | 105 ++++++++++++++++-------------------------- wasm2map/src/lib.rs | 39 ++++++++++------ 4 files changed, 74 insertions(+), 85 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 34e67ef..b0fb2d4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -154,6 +154,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + [[package]] name = "flate2" version = "1.0.28" @@ -196,6 +202,7 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" dependencies = [ + "fallible-iterator", "stable_deref_trait", ] diff --git a/wasm2map/Cargo.toml b/wasm2map/Cargo.toml index 307d56d..982d917 100644 --- a/wasm2map/Cargo.toml +++ b/wasm2map/Cargo.toml @@ -22,7 +22,7 @@ loader = [] [dependencies.gimli] version = "0.28.1" default-features = false -features = ["read", "endian-reader"] +features = ["std", "read", "endian-reader"] [dependencies.memmap2] version = "~0.9.0" @@ -31,18 +31,16 @@ optional = true [dependencies.object] version = ">= 0.31.1" -features = [ - "wasm" -] +features = ["std", "wasm"] [dependencies] normalize-path = "0.2.1" serde_json = "^1" sourcemap = "^7.0" +thiserror = ">= 1.0.7" # For -Zminimal-versions cfg-if = ">= 0.1.5" rand = ">= 0.3.23" -thiserror = ">= 1.0.7" flate2 = ">= 1.0.26" [build-dependencies] diff --git a/wasm2map/src/error.rs b/wasm2map/src/error.rs index 6263e05..c564389 100644 --- a/wasm2map/src/error.rs +++ b/wasm2map/src/error.rs @@ -1,69 +1,42 @@ -use std::fmt::Display; - -/// Common error type for the crate -#[derive(Debug)] -pub struct Error { - msg: String, -} - -impl std::error::Error for Error {} - -impl Display for Error { +use std::{ + fmt::{Debug, Display}, + num::TryFromIntError, +}; + +/// Common public error type for the library which is exported from the crate +#[derive(thiserror::Error, Debug)] +#[error(transparent)] +pub enum Error { + /// Signals an issue with the WASM object file structure, segments or reading + Object { + #[from] + source: object::Error, + }, + /// Signals an issue with the DWARF data structures in the object file + /// or parsing of the DWARF data + Dwarf { + #[from] + source: gimli::Error, + }, + /// Internal error which shouldn't ever happen. Signals a programming error + /// with this lib or the downstream dependencies, but panicking in libraries + /// is not nice with the upstream implementor, so we wrap it up with this. + Internal { + #[from] + source: InternalError, + }, +} + +/// The opaque internal error type for programming errors. Should not be exposed +/// outside the library. +#[derive(thiserror::Error, Debug)] +pub enum InternalError { + Generic(&'static str), + TryFromInt(#[from] TryFromIntError), +} + +impl Display for InternalError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.msg) - } -} - -// Implement these From<...> traits to make -// the library codemuch more readable -impl From for Error { - fn from(value: std::io::Error) -> Self { - Self { - msg: value.to_string(), - } - } -} - -impl From for Error { - fn from(value: object::Error) -> Self { - Self { - msg: value.to_string(), - } - } -} - -impl From for Error { - fn from(value: gimli::Error) -> Self { - Self { - msg: value.to_string(), - } - } -} - -impl From<&str> for Error { - fn from(value: &str) -> Self { - Self { - msg: value.to_owned(), - } - } -} - -impl From for Error { - fn from(value: String) -> Self { - Self { msg: value } - } -} - -impl From for String { - fn from(value: Error) -> Self { - value.to_string() - } -} - -impl From for Error { - fn from(value: std::num::TryFromIntError) -> Self { - Self { - msg: value.to_string(), - } + write!(f, "{}", self.to_string()) } } diff --git a/wasm2map/src/lib.rs b/wasm2map/src/lib.rs index fa1edca..88d60f2 100644 --- a/wasm2map/src/lib.rs +++ b/wasm2map/src/lib.rs @@ -22,16 +22,18 @@ mod loader; mod test; use dwarf::DwarfReader; -use error::Error; +use error::InternalError; use gimli::{self, Reader}; #[cfg(feature = "loader")] -pub use loader::WasmLoader; use normalize_path::NormalizePath; -pub use object::ReadRef; use object::{self, File, Object, ObjectSection, SectionIndex}; use sourcemap::SourceMapBuilder; use std::{cell::OnceCell, path::PathBuf, str}; +pub use error::Error; +pub use loader::WasmLoader; +pub use object::ReadRef; + type Entry = (u32, u32, u32, u32, Option, Option, bool); /// @@ -52,20 +54,25 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { let offset = file .section_by_index(SectionIndex(10))? .file_range() - .ok_or("No size data available for the code section")? + .ok_or(InternalError::Generic( + "The code section in the WASM file does not contain a size parameter", + ))? .0 - .try_into()?; + .try_into() + .map_err(InternalError::from)?; Ok(Self { binary: match file { file @ File::Wasm(_) => Ok(file), - _ => Err(Error::from("Object does not represent a WASM file")), + _ => Err(InternalError::Generic( + "Object does not represent a WASM file", + )), }?, dwo_parent: if let Some(dwo_parent) = dwo_parent { let dwo_parent = match File::parse(dwo_parent)? { file @ File::Wasm(_) => Ok(file), - _ => Err(Error::from( - "DWO parent object does not represent a WASM file", + _ => Err(InternalError::Generic( + "DWO parent file is not connected to a WASM file", )), }?; Some(dwo_parent) @@ -75,8 +82,8 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { sup_file: if let Some(sup_file) = sup_file { let sup_file = match File::parse(sup_file)? { file @ File::Wasm(_) => Ok(file), - _ => Err(Error::from( - "Supplemental file does not represent a WASM file", + _ => Err(InternalError::Generic( + "Supplemental file is not connected to a WASM file", )), }?; Some(sup_file) @@ -117,14 +124,16 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { let mut rows = program.clone().rows(); while let Some((line_header, row)) = rows.next_row()? { let line: u32 = match row.line() { - Some(line) => line.get().try_into()?, + Some(line) => line.get().try_into().map_err(InternalError::from)?, None => continue, }; let column: u32 = match row.column() { - gimli::ColumnType::Column(column) => column.get().try_into()?, + gimli::ColumnType::Column(column) => { + column.get().try_into().map_err(InternalError::from)? + } gimli::ColumnType::LeftEdge => 0, }; - let mut address = row.address().try_into()?; + let mut address = row.address().try_into().map_err(InternalError::from)?; address += self.offset; let file = match row.file(line_header) { Some(file) => { @@ -147,7 +156,9 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { file_name .normalize() .to_str() - .ok_or("Error converting path to string")? + .ok_or(InternalError::Generic( + "Error converting source file path to string", + ))? .replace('\\', "/") .as_str(), ); From a9b9b8d9897aa07e64223449ab2e8e6bdd6b6f94 Mon Sep 17 00:00:00 2001 From: Mark Tolmacs Date: Wed, 6 Mar 2024 14:09:03 +0100 Subject: [PATCH 25/36] Fix some test- and Result-related issues Signed-off-by: Mark Tolmacs --- .gitignore | 3 +++ cargo-wasm2map/src/main.rs | 10 ++++++---- wasm2map/src/dwarf/mod.rs | 10 +++++----- wasm2map/src/error.rs | 38 ++++++++++++++++++-------------------- wasm2map/src/lib.rs | 10 +++++----- wasm2map/src/test.rs | 2 +- 6 files changed, 38 insertions(+), 35 deletions(-) diff --git a/.gitignore b/.gitignore index ca8033e..d89e0a3 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,6 @@ target/ # Coverage report files lcov.info + +# macOS +.DS_Store diff --git a/cargo-wasm2map/src/main.rs b/cargo-wasm2map/src/main.rs index a80fb5c..ab111c1 100644 --- a/cargo-wasm2map/src/main.rs +++ b/cargo-wasm2map/src/main.rs @@ -108,10 +108,12 @@ fn main() -> Result<(), String> { let wasm = Wasm::new(&reader, None, None).map_err(|err| err.to_string())?; // Generate the source map JSON for the loaded WASM - let sourcemap = wasm.build( - args.bundle_sources, - Some(map.file_name().unwrap().to_str().unwrap()), - )?; + let sourcemap = wasm + .build( + args.bundle_sources, + Some(map.file_name().unwrap().to_str().unwrap()), + ) + .map_err(|err| err.to_string())?; // Dump JSON to the map file fs::write(&map, sourcemap).map_err(|err| err.to_string())?; diff --git a/wasm2map/src/dwarf/mod.rs b/wasm2map/src/dwarf/mod.rs index 63b1d15..3f78332 100644 --- a/wasm2map/src/dwarf/mod.rs +++ b/wasm2map/src/dwarf/mod.rs @@ -1,7 +1,7 @@ mod relocate; use self::relocate::{Relocate, RelocationMap}; -use crate::error::Error; +use crate::error::{Error, InternalError}; use gimli::{EndianReader, LittleEndian, Reader}; use object::{ File, Object, ObjectSection, ObjectSymbol, ReadRef, RelocationKind, RelocationTarget, Section, @@ -145,7 +145,7 @@ where let mut relocations: RelocationMap = RelocationMap::new(); for (offset, mut relocation) in section.relocations() { - let offset = usize::try_from(offset)?; + let offset = usize::try_from(offset).map_err(InternalError::from)?; match relocation.kind() { RelocationKind::Absolute => { @@ -162,7 +162,7 @@ where section.name().unwrap(), offset ); - return Err(msg.into()); + return Err(InternalError::from(msg).into()); } } } @@ -173,7 +173,7 @@ where section.name().unwrap(), offset ); - return Err(msg.into()); + return Err(InternalError::from(msg).into()); } } _ => { @@ -182,7 +182,7 @@ where section.name().unwrap(), offset ); - return Err(msg.into()); + return Err(InternalError::from(msg).into()); } } } diff --git a/wasm2map/src/error.rs b/wasm2map/src/error.rs index c564389..50e832f 100644 --- a/wasm2map/src/error.rs +++ b/wasm2map/src/error.rs @@ -1,42 +1,40 @@ -use std::{ - fmt::{Debug, Display}, - num::TryFromIntError, -}; +use std::{fmt::Debug, io, num::TryFromIntError}; /// Common public error type for the library which is exported from the crate #[derive(thiserror::Error, Debug)] #[error(transparent)] pub enum Error { /// Signals an issue with the WASM object file structure, segments or reading - Object { - #[from] - source: object::Error, - }, + Object(#[from] object::Error), /// Signals an issue with the DWARF data structures in the object file /// or parsing of the DWARF data - Dwarf { - #[from] - source: gimli::Error, - }, + Dwarf(#[from] gimli::Error), + /// When the source file or output file cannot be read or mapped to memory + IoError(#[from] io::Error), /// Internal error which shouldn't ever happen. Signals a programming error /// with this lib or the downstream dependencies, but panicking in libraries /// is not nice with the upstream implementor, so we wrap it up with this. - Internal { - #[from] - source: InternalError, - }, + Internal(#[from] InternalError), } /// The opaque internal error type for programming errors. Should not be exposed /// outside the library. #[derive(thiserror::Error, Debug)] pub enum InternalError { - Generic(&'static str), + #[error("Internal Error: {0}")] + Generic(String), + #[error("Internal Error: {0}")] TryFromInt(#[from] TryFromIntError), } -impl Display for InternalError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.to_string()) +impl From for InternalError { + fn from(value: String) -> Self { + Self::Generic(value) + } +} + +impl From<&'static str> for InternalError { + fn from(value: &'static str) -> Self { + Self::Generic(String::from(value)) } } diff --git a/wasm2map/src/lib.rs b/wasm2map/src/lib.rs index 88d60f2..dc92a98 100644 --- a/wasm2map/src/lib.rs +++ b/wasm2map/src/lib.rs @@ -55,7 +55,7 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { .section_by_index(SectionIndex(10))? .file_range() .ok_or(InternalError::Generic( - "The code section in the WASM file does not contain a size parameter", + "The code section in the WASM file does not contain a size parameter".into(), ))? .0 .try_into() @@ -65,14 +65,14 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { binary: match file { file @ File::Wasm(_) => Ok(file), _ => Err(InternalError::Generic( - "Object does not represent a WASM file", + "Object does not represent a WASM file".into(), )), }?, dwo_parent: if let Some(dwo_parent) = dwo_parent { let dwo_parent = match File::parse(dwo_parent)? { file @ File::Wasm(_) => Ok(file), _ => Err(InternalError::Generic( - "DWO parent file is not connected to a WASM file", + "DWO parent file is not connected to a WASM file".into(), )), }?; Some(dwo_parent) @@ -83,7 +83,7 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { let sup_file = match File::parse(sup_file)? { file @ File::Wasm(_) => Ok(file), _ => Err(InternalError::Generic( - "Supplemental file is not connected to a WASM file", + "Supplemental file is not connected to a WASM file".into(), )), }?; Some(sup_file) @@ -157,7 +157,7 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { .normalize() .to_str() .ok_or(InternalError::Generic( - "Error converting source file path to string", + "Error converting source file path to string".into(), ))? .replace('\\', "/") .as_str(), diff --git a/wasm2map/src/test.rs b/wasm2map/src/test.rs index d893361..38f4549 100644 --- a/wasm2map/src/test.rs +++ b/wasm2map/src/test.rs @@ -4,7 +4,7 @@ use sourcemap::SourceMap; use crate::{Wasm, WasmLoader}; -use std::{fs, panic, path::Path}; +use std::{panic, path::Path}; /// Tests the format of the sourcemap, makes sure the JSON is valid and /// the required keys are present, with the right type of values. From c680e6a5856b90898f982e82c29feb43e05b9b64 Mon Sep 17 00:00:00 2001 From: Mark Tolmacs Date: Wed, 6 Mar 2024 14:22:37 +0100 Subject: [PATCH 26/36] Refactored dwarf module Signed-off-by: Mark Tolmacs --- wasm2map/src/dwarf/mod.rs | 213 +--------------------------------- wasm2map/src/dwarf/reader.rs | 189 ++++++++++++++++++++++++++++++ wasm2map/src/dwarf/section.rs | 21 ++++ 3 files changed, 213 insertions(+), 210 deletions(-) create mode 100644 wasm2map/src/dwarf/reader.rs create mode 100644 wasm2map/src/dwarf/section.rs diff --git a/wasm2map/src/dwarf/mod.rs b/wasm2map/src/dwarf/mod.rs index 3f78332..b853a2c 100644 --- a/wasm2map/src/dwarf/mod.rs +++ b/wasm2map/src/dwarf/mod.rs @@ -1,212 +1,5 @@ +mod reader; mod relocate; +mod section; -use self::relocate::{Relocate, RelocationMap}; -use crate::error::{Error, InternalError}; -use gimli::{EndianReader, LittleEndian, Reader}; -use object::{ - File, Object, ObjectSection, ObjectSymbol, ReadRef, RelocationKind, RelocationTarget, Section, -}; -use std::{borrow::Cow, cell::OnceCell, rc::Rc}; - -pub type Relocator<'a> = Relocate>>; - -/// -/// -/// -pub struct DwarfReader<'reader, R: ReadRef<'reader> + 'reader> { - binary: &'reader File<'reader, R>, - dwo_parent: Option<&'reader File<'reader, R>>, - sup_file: Option<&'reader File<'reader, R>>, - dwarf: OnceCell>>, -} - -impl<'reader, R> DwarfReader<'reader, R> -where - R: ReadRef<'reader> + 'reader, -{ - /// - /// - /// - pub fn new( - binary: &'reader File<'reader, R>, - dwo_parent: Option<&'reader File<'reader, R>>, - sup_file: Option<&'reader File<'reader, R>>, - ) -> Self { - Self { - binary, - dwo_parent, - sup_file, - dwarf: OnceCell::new(), - } - } - - /// - /// - /// - pub fn get(&'reader self) -> Result<&gimli::Dwarf>, Error> { - self.dwarf.get().ok_or(()).or_else(|_| self.load()) - } -} - -impl<'reader, R> DwarfReader<'reader, R> -where - R: ReadRef<'reader> + 'reader, -{ - /// - /// - /// - fn load(&'reader self) -> Result<&gimli::Dwarf>, Error> { - // If the WASM debug info is in a split DWARF object (DWO), then load - // the parent object first, so we can link them. The parent archive - // contains references to the DWO object we resolve later in generating - // the source map - let parent = if let Some(parent) = self.dwo_parent { - let load_parent_section = - |id: gimli::SectionId| Self::load_file_section(id, parent, false); - Some(gimli::Dwarf::load(load_parent_section)?) - } else { - None - }; - let parent = parent.as_ref(); - - // This is the target object binary we are generating the sourcemap for - let load_section = - |id: gimli::SectionId| Self::load_file_section(id, self.binary, parent.is_some()); - - let mut dwarf = gimli::Dwarf::load(load_section)?; - - if parent.is_some() { - if let Some(parent) = parent { - dwarf.make_dwo(parent); - } else { - dwarf.file_type = gimli::DwarfFileType::Dwo; - } - } - - // Load optional supplemental file - if let Some(sup) = self.sup_file { - let load_sup_section = |id: gimli::SectionId| { - // Note: we really only need the `.debug_str` section, - // but for now we load them all. - Self::load_file_section(id, sup, false) - }; - dwarf.load_sup(load_sup_section)?; - } - - dwarf.populate_abbreviations_cache(gimli::AbbreviationsCacheStrategy::All); - - Ok(self.dwarf.get_or_init(|| dwarf)) - } - - /// - /// - /// - fn load_file_section( - id: gimli::SectionId, - object: &'reader File<'reader, R>, - is_dwo: bool, - ) -> Result, Error> { - let mut relocations = RelocationMap::default(); - let name = if is_dwo { - id.dwo_name() - } else { - Some(id.name()) - }; - - let data = match name.and_then(|name| object.section_by_name(name)) { - Some(ref section) => { - // DWO sections never have relocations, so don't bother. - if !is_dwo { - // Collect the relocations in this section and add to the relocation map - relocations.extend(Self::get_relocations(object, section)?); - } - section.uncompressed_data()? - } - // Use a non-zero capacity so that `ReaderOffsetId`s are unique. - None => Cow::Owned(Vec::with_capacity(1)), - }; - - let reader = gimli::EndianReader::new(SectionReader { data }, LittleEndian); - let offset = reader.offset_from(&reader); - Ok(Relocate { - relocations: Rc::new(relocations), - offset, - reader, - }) - } - - /// - /// - /// - fn get_relocations( - object: &File<'reader, R>, - section: &Section<'reader, 'reader, R>, - ) -> Result { - let mut relocations: RelocationMap = RelocationMap::new(); - - for (offset, mut relocation) in section.relocations() { - let offset = usize::try_from(offset).map_err(InternalError::from)?; - - match relocation.kind() { - RelocationKind::Absolute => { - if let RelocationTarget::Symbol(symbol_idx) = relocation.target() { - match object.symbol_by_index(symbol_idx) { - Ok(symbol) => { - let addend = - symbol.address().wrapping_add(relocation.addend() as u64); - relocation.set_addend(addend as i64); - } - Err(_) => { - let msg = format!( - "Relocation with invalid symbol for section {} at offset 0x{:08x}", - section.name().unwrap(), - offset - ); - return Err(InternalError::from(msg).into()); - } - } - } - - if relocations.insert(offset, relocation).is_some() { - let msg = format!( - "Multiple relocations for section {} at offset 0x{:08x}", - section.name().unwrap(), - offset - ); - return Err(InternalError::from(msg).into()); - } - } - _ => { - let msg = format!( - "Unsupported relocation for section {} at offset 0x{:08x}", - section.name().unwrap(), - offset - ); - return Err(InternalError::from(msg).into()); - } - } - } - - Ok(relocations) - } -} - -/// We need a holder struct to own the binary data coming out of the object -/// reader when the DWARF loader loads a section. Since the gimli::Reader trait -/// is not implemented for Cow returned by object::File::section_by_name we -/// need to implement it ourselves. -#[derive(Clone, Debug)] -pub struct SectionReader<'a> { - pub data: Cow<'a, [u8]>, -} - -impl<'a> std::ops::Deref for SectionReader<'a> { - type Target = [u8]; - - fn deref(&self) -> &Self::Target { - self.data.deref() - } -} - -unsafe impl<'a> gimli::StableDeref for SectionReader<'a> {} -unsafe impl<'a> gimli::CloneStableDeref for SectionReader<'a> {} +pub use reader::DwarfReader; diff --git a/wasm2map/src/dwarf/reader.rs b/wasm2map/src/dwarf/reader.rs new file mode 100644 index 0000000..0360932 --- /dev/null +++ b/wasm2map/src/dwarf/reader.rs @@ -0,0 +1,189 @@ +use crate::error::{Error, InternalError}; +use gimli::{EndianReader, LittleEndian, Reader}; +use object::{ + File, Object, ObjectSection, ObjectSymbol, ReadRef, RelocationKind, RelocationTarget, Section, +}; +use std::{borrow::Cow, cell::OnceCell, rc::Rc}; + +use super::{ + relocate::{Relocate, RelocationMap}, + section::SectionReader, +}; + +pub type Relocator<'a> = Relocate>>; + +/// +/// +/// +pub struct DwarfReader<'reader, R: ReadRef<'reader> + 'reader> { + binary: &'reader File<'reader, R>, + dwo_parent: Option<&'reader File<'reader, R>>, + sup_file: Option<&'reader File<'reader, R>>, + dwarf: OnceCell>>, +} + +impl<'reader, R> DwarfReader<'reader, R> +where + R: ReadRef<'reader> + 'reader, +{ + /// + /// + /// + pub fn new( + binary: &'reader File<'reader, R>, + dwo_parent: Option<&'reader File<'reader, R>>, + sup_file: Option<&'reader File<'reader, R>>, + ) -> Self { + Self { + binary, + dwo_parent, + sup_file, + dwarf: OnceCell::new(), + } + } + + /// + /// + /// + pub fn get(&'reader self) -> Result<&gimli::Dwarf>, Error> { + self.dwarf.get().ok_or(()).or_else(|_| self.load()) + } + + /// + /// + /// + fn load(&'reader self) -> Result<&gimli::Dwarf>, Error> { + // If the WASM debug info is in a split DWARF object (DWO), then load + // the parent object first, so we can link them. The parent archive + // contains references to the DWO object we resolve later in generating + // the source map + let parent = if let Some(parent) = self.dwo_parent { + let load_parent_section = + |id: gimli::SectionId| Self::load_file_section(id, parent, false); + Some(gimli::Dwarf::load(load_parent_section)?) + } else { + None + }; + let parent = parent.as_ref(); + + // This is the target object binary we are generating the sourcemap for + let load_section = + |id: gimli::SectionId| Self::load_file_section(id, self.binary, parent.is_some()); + + let mut dwarf = gimli::Dwarf::load(load_section)?; + + if parent.is_some() { + if let Some(parent) = parent { + dwarf.make_dwo(parent); + } else { + dwarf.file_type = gimli::DwarfFileType::Dwo; + } + } + + // Load optional supplemental file + if let Some(sup) = self.sup_file { + let load_sup_section = |id: gimli::SectionId| { + // Note: we really only need the `.debug_str` section, + // but for now we load them all. + Self::load_file_section(id, sup, false) + }; + dwarf.load_sup(load_sup_section)?; + } + + dwarf.populate_abbreviations_cache(gimli::AbbreviationsCacheStrategy::All); + + Ok(self.dwarf.get_or_init(|| dwarf)) + } + + /// + /// + /// + fn load_file_section( + id: gimli::SectionId, + object: &'reader File<'reader, R>, + is_dwo: bool, + ) -> Result, Error> { + let mut relocations = RelocationMap::default(); + let name = if is_dwo { + id.dwo_name() + } else { + Some(id.name()) + }; + + let data = match name.and_then(|name| object.section_by_name(name)) { + Some(ref section) => { + // DWO sections never have relocations, so don't bother. + if !is_dwo { + // Collect the relocations in this section and add to the relocation map + relocations.extend(Self::get_relocations(object, section)?); + } + section.uncompressed_data()? + } + // Use a non-zero capacity so that `ReaderOffsetId`s are unique. + None => Cow::Owned(Vec::with_capacity(1)), + }; + + let reader = gimli::EndianReader::new(SectionReader { data }, LittleEndian); + let offset = reader.offset_from(&reader); + Ok(Relocate { + relocations: Rc::new(relocations), + offset, + reader, + }) + } + + /// + /// + /// + fn get_relocations( + object: &File<'reader, R>, + section: &Section<'reader, 'reader, R>, + ) -> Result { + let mut relocations: RelocationMap = RelocationMap::new(); + + for (offset, mut relocation) in section.relocations() { + let offset = usize::try_from(offset).map_err(InternalError::from)?; + + match relocation.kind() { + RelocationKind::Absolute => { + if let RelocationTarget::Symbol(symbol_idx) = relocation.target() { + match object.symbol_by_index(symbol_idx) { + Ok(symbol) => { + let addend = + symbol.address().wrapping_add(relocation.addend() as u64); + relocation.set_addend(addend as i64); + } + Err(_) => { + let msg = format!( + "Relocation with invalid symbol for section {} at offset 0x{:08x}", + section.name().unwrap(), + offset + ); + return Err(InternalError::from(msg).into()); + } + } + } + + if relocations.insert(offset, relocation).is_some() { + let msg = format!( + "Multiple relocations for section {} at offset 0x{:08x}", + section.name().unwrap(), + offset + ); + return Err(InternalError::from(msg).into()); + } + } + _ => { + let msg = format!( + "Unsupported relocation for section {} at offset 0x{:08x}", + section.name().unwrap(), + offset + ); + return Err(InternalError::from(msg).into()); + } + } + } + + Ok(relocations) + } +} diff --git a/wasm2map/src/dwarf/section.rs b/wasm2map/src/dwarf/section.rs new file mode 100644 index 0000000..13192c9 --- /dev/null +++ b/wasm2map/src/dwarf/section.rs @@ -0,0 +1,21 @@ +use std::borrow::Cow; + +/// We need a holder struct to own the binary data coming out of the object +/// reader when the DWARF loader loads a section. Since the gimli::Reader trait +/// is not implemented for Cow returned by object::File::section_by_name we +/// need to implement it ourselves. +#[derive(Clone, Debug)] +pub struct SectionReader<'a> { + pub data: Cow<'a, [u8]>, +} + +impl<'a> std::ops::Deref for SectionReader<'a> { + type Target = [u8]; + + fn deref(&self) -> &Self::Target { + self.data.deref() + } +} + +unsafe impl<'a> gimli::StableDeref for SectionReader<'a> {} +unsafe impl<'a> gimli::CloneStableDeref for SectionReader<'a> {} From b3f5c7fef25a948ba4fda317e1565543875021c6 Mon Sep 17 00:00:00 2001 From: Mark Tolmacs Date: Wed, 6 Mar 2024 16:15:12 +0100 Subject: [PATCH 27/36] Rust 1.64 dependency and other fixes Signed-off-by: Mark Tolmacs --- Cargo.lock | 227 ++++++++++++++++++++++++----------- cargo-wasm2map/Cargo.toml | 5 +- wasm2map/Cargo.toml | 5 +- wasm2map/src/dwarf/reader.rs | 3 +- wasm2map/src/lib.rs | 41 +++++-- 5 files changed, 194 insertions(+), 87 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b0fb2d4..2b6f0d8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,29 +10,30 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "anstream" -version = "0.6.4" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" +checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is-terminal", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "15c4c2c83f81532e5845a733998b6971faca23490340a418e9b72a3ec9de12ea" [[package]] name = "anstyle-parse" -version = "0.2.2" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" +checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" dependencies = [ "utf8parse", ] @@ -43,19 +44,25 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" dependencies = [ - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" +checksum = "c677ab05e09154296dd37acecd46420c17b9713e8366facafa8fc0885167cf4c" dependencies = [ "anstyle", - "windows-sys", + "windows-sys 0.48.0", ] +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + [[package]] name = "byteorder" version = "1.5.0" @@ -66,7 +73,10 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" name = "cargo-wasm2map" version = "0.1.0" dependencies = [ + "anstyle", + "anstyle-parse", "clap", + "clap_lex", "proc-macro2", "wasm2map", ] @@ -79,19 +89,20 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.4.10" +version = "4.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fffed7514f420abec6d183b1d3acfd9099c79c3a10a06ade4f8203f1411272" +checksum = "03aef18ddf7d879c15ce20f04826ef8418101c7e528014c3eeea13321047dca3" dependencies = [ "clap_builder", "clap_derive", + "once_cell", ] [[package]] name = "clap_builder" -version = "4.4.9" +version = "4.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63361bae7eef3771745f02d8d892bec2fee5f6e34af316ba556e7f97a7069ff1" +checksum = "f8ce6fffb678c9b80a70b6b6de0aad31df727623a70fd9a842c30cd573e2fa98" dependencies = [ "anstream", "anstyle", @@ -101,9 +112,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "54a9bb5758fc5dfe728d1019941681eccaf0cf8a4189b692a0ee2f2ecf90a050" dependencies = [ "heck", "proc-macro2", @@ -113,9 +124,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" [[package]] name = "colorchoice" @@ -148,12 +159,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - [[package]] name = "fallible-iterator" version = "0.3.0" @@ -208,9 +213,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "heck" @@ -218,6 +223,12 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + [[package]] name = "idna" version = "0.5.0" @@ -234,16 +245,33 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" +[[package]] +name = "ilog" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d6896d5a5d605a3b80da159ccc5a6e1fad346b4d2c1ad51046e22536b9a362" + [[package]] name = "indexmap" -version = "2.1.0" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ - "equivalent", + "autocfg", "hashbrown", ] +[[package]] +name = "is-terminal" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "itoa" version = "1.0.9" @@ -288,9 +316,9 @@ checksum = "f5438dd2b2ff4c6df6e1ce22d825ed2fa93ee2922235cc45186991717f0a892d" [[package]] name = "object" -version = "0.32.1" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" dependencies = [ "flate2", "memchr", @@ -298,6 +326,12 @@ dependencies = [ "wasmparser", ] +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + [[package]] name = "percent-encoding" version = "2.3.1" @@ -364,17 +398,23 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" dependencies = [ - "semver 0.9.0", + "semver", ] +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + [[package]] name = "ruzstd" -version = "0.4.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3ffab8f9715a0d455df4bbb9d21e91135aab3cd3ca187af0cd0c3c3f868fdc" +checksum = "9a15e661f0f9dac21f3494fe5d23a6338c0ac116a2d22c2b63010acd89467ffe" dependencies = [ "byteorder", - "thiserror-core", + "thiserror", "twox-hash", ] @@ -393,12 +433,6 @@ dependencies = [ "semver-parser", ] -[[package]] -name = "semver" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" - [[package]] name = "semver-parser" version = "0.7.0" @@ -490,26 +524,6 @@ dependencies = [ "thiserror-impl", ] -[[package]] -name = "thiserror-core" -version = "1.0.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c001ee18b7e5e3f62cbf58c7fe220119e68d902bb7443179c0c8aef30090e999" -dependencies = [ - "thiserror-core-impl", -] - -[[package]] -name = "thiserror-core-impl" -version = "1.0.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4c60d69f36615a077cc7663b9cb8e42275722d23e58a7fa3d2c7f2915d09d04" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "thiserror-impl" version = "1.0.50" @@ -610,10 +624,13 @@ dependencies = [ "flate2", "gcc", "gimli", + "ilog", "memmap2", "normalize-path", "object", + "once_cell", "rand", + "rustversion", "serde_json", "sourcemap", "thiserror", @@ -621,12 +638,12 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.110.0" +version = "0.102.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dfcdb72d96f01e6c85b6bf20102e7423bdbaad5c337301bab2bbf253d26413c" +checksum = "48134de3d7598219ab9eaf6b91b15d8e50d31da76b8519fe4ecfcec2cf35104b" dependencies = [ "indexmap", - "semver 1.0.20", + "url", ] [[package]] @@ -635,7 +652,16 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.4", ] [[package]] @@ -644,13 +670,28 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +dependencies = [ + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", ] [[package]] @@ -659,38 +700,80 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" diff --git a/cargo-wasm2map/Cargo.toml b/cargo-wasm2map/Cargo.toml index dd17b84..2a0c68c 100644 --- a/cargo-wasm2map/Cargo.toml +++ b/cargo-wasm2map/Cargo.toml @@ -16,13 +16,16 @@ license = "MIT OR Apache-2.0" [dependencies] # For -Zminimal-versions proc-macro2 = ">= 1.0.60" +anstyle = "<1.0.3" # MSRV 1.64 support end +anstyle-parse = "<0.2.2" # MSRV 1.64 support end +clap_lex = "<0.5.1" # MSRV 1.64 support end [dependencies.wasm2map] path = "../wasm2map" features = ["memmap2", "loader"] [dependencies.clap] -version = "4.3.10" +version = ">=4.3.11, <4.3.24" features = ["derive"] [badges] diff --git a/wasm2map/Cargo.toml b/wasm2map/Cargo.toml index 982d917..22bed8c 100644 --- a/wasm2map/Cargo.toml +++ b/wasm2map/Cargo.toml @@ -30,7 +30,7 @@ default-features = false optional = true [dependencies.object] -version = ">= 0.31.1" +version = ">=0.31.1" # MSRV 1.64 support ended, earlier does not qualify features = ["std", "wasm"] [dependencies] @@ -38,6 +38,9 @@ normalize-path = "0.2.1" serde_json = "^1" sourcemap = "^7.0" thiserror = ">= 1.0.7" +once_cell = "=1.19.0" +rustversion = "=1.0.14" +ilog = "=1.0.1" # For -Zminimal-versions cfg-if = ">= 0.1.5" rand = ">= 0.3.23" diff --git a/wasm2map/src/dwarf/reader.rs b/wasm2map/src/dwarf/reader.rs index 0360932..0941511 100644 --- a/wasm2map/src/dwarf/reader.rs +++ b/wasm2map/src/dwarf/reader.rs @@ -3,7 +3,8 @@ use gimli::{EndianReader, LittleEndian, Reader}; use object::{ File, Object, ObjectSection, ObjectSymbol, ReadRef, RelocationKind, RelocationTarget, Section, }; -use std::{borrow::Cow, cell::OnceCell, rc::Rc}; +use once_cell::unsync::OnceCell; +use std::{borrow::Cow, rc::Rc}; use super::{ relocate::{Relocate, RelocationMap}, diff --git a/wasm2map/src/lib.rs b/wasm2map/src/lib.rs index dc92a98..158289e 100644 --- a/wasm2map/src/lib.rs +++ b/wasm2map/src/lib.rs @@ -22,17 +22,19 @@ mod loader; mod test; use dwarf::DwarfReader; +pub use error::Error; use error::InternalError; use gimli::{self, Reader}; +#[rustversion::before(1.65)] +use ilog::IntLog; #[cfg(feature = "loader")] -use normalize_path::NormalizePath; -use object::{self, File, Object, ObjectSection, SectionIndex}; -use sourcemap::SourceMapBuilder; -use std::{cell::OnceCell, path::PathBuf, str}; - -pub use error::Error; pub use loader::WasmLoader; +use normalize_path::NormalizePath; pub use object::ReadRef; +use object::{self, File, FileKind, Object, ObjectSection, SectionIndex}; +use once_cell::unsync::OnceCell; +use sourcemap::SourceMapBuilder; +use std::{path::PathBuf, str}; type Entry = (u32, u32, u32, u32, Option, Option, bool); @@ -62,15 +64,15 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { .map_err(InternalError::from)?; Ok(Self { - binary: match file { - file @ File::Wasm(_) => Ok(file), + binary: match FileKind::parse(binary)? { + FileKind::Wasm => Ok(file), _ => Err(InternalError::Generic( "Object does not represent a WASM file".into(), )), }?, dwo_parent: if let Some(dwo_parent) = dwo_parent { - let dwo_parent = match File::parse(dwo_parent)? { - file @ File::Wasm(_) => Ok(file), + let dwo_parent = match FileKind::parse(dwo_parent)? { + FileKind::Wasm => Ok(File::parse(dwo_parent)?), _ => Err(InternalError::Generic( "DWO parent file is not connected to a WASM file".into(), )), @@ -80,8 +82,8 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { None }, sup_file: if let Some(sup_file) = sup_file { - let sup_file = match File::parse(sup_file)? { - file @ File::Wasm(_) => Ok(file), + let sup_file = match FileKind::parse(sup_file)? { + FileKind::Wasm => Ok(File::parse(sup_file)?), _ => Err(InternalError::Generic( "Supplemental file is not connected to a WASM file".into(), )), @@ -233,3 +235,18 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { } } } + +#[rustversion::before(1.65)] +//#[allow(unstable_name_collisions)] +trait PolyfillIlog { + fn ilog(self, base: u32) -> u32; +} + +#[rustversion::before(1.65)] +impl PolyfillIlog for u32 { + fn ilog(self, base: u32) -> u32 { + u32::try_from(self.log2() / base.log2()).expect( + "Invariant of logarithm with arbitrary base from u32 cannot be converted to u32", + ) + } +} From 83bcfe62899e6e862ebe5c75015addb405fbeefa Mon Sep 17 00:00:00 2001 From: Mark Tolmacs Date: Wed, 6 Mar 2024 16:21:29 +0100 Subject: [PATCH 28/36] CI build fix Signed-off-by: Mark Tolmacs --- wasm2map/src/loader/file.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wasm2map/src/loader/file.rs b/wasm2map/src/loader/file.rs index f302452..9173e36 100644 --- a/wasm2map/src/loader/file.rs +++ b/wasm2map/src/loader/file.rs @@ -23,9 +23,9 @@ impl WasmLoader { /// pub fn from_file(file: File) -> Result { - Self { + Ok(Self { data: ReadCache::new(file), - } + }) } } From 7fa61c1f1713689c8b85143fe1373abd0bbcaa1e Mon Sep 17 00:00:00 2001 From: Mark Tolmacs Date: Sat, 4 Jan 2025 16:37:59 +0100 Subject: [PATCH 29/36] Explicit lifetimes --- wasm2map/src/dwarf/reader.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wasm2map/src/dwarf/reader.rs b/wasm2map/src/dwarf/reader.rs index 0941511..2a197b9 100644 --- a/wasm2map/src/dwarf/reader.rs +++ b/wasm2map/src/dwarf/reader.rs @@ -46,14 +46,14 @@ where /// /// /// - pub fn get(&'reader self) -> Result<&gimli::Dwarf>, Error> { + pub fn get(&'reader self) -> Result<&'reader gimli::Dwarf>, Error> { self.dwarf.get().ok_or(()).or_else(|_| self.load()) } /// /// /// - fn load(&'reader self) -> Result<&gimli::Dwarf>, Error> { + fn load(&'reader self) -> Result<&'reader gimli::Dwarf>, Error> { // If the WASM debug info is in a split DWARF object (DWO), then load // the parent object first, so we can link them. The parent archive // contains references to the DWO object we resolve later in generating From 5e0444b6b4bcf3f053e4f66916e738e80dc96d39 Mon Sep 17 00:00:00 2001 From: Mark Tolmacs Date: Sat, 4 Jan 2025 18:04:03 +0100 Subject: [PATCH 30/36] Modernize dependencies --- Cargo.lock | 698 +++++++++++++++++++++++------------ cargo-wasm2map/Cargo.toml | 14 +- cargo-wasm2map/src/main.rs | 4 +- wasm2map/Cargo.toml | 15 +- wasm2map/src/dwarf/mod.rs | 2 +- wasm2map/src/dwarf/reader.rs | 41 +- wasm2map/src/lib.rs | 15 +- wasm2map/src/loader/file.rs | 6 +- wasm2map/src/loader/mmap.rs | 6 +- wasm2map/src/loader/mod.rs | 13 +- wasm2map/src/test.rs | 6 +- 11 files changed, 529 insertions(+), 291 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2b6f0d8..cf457ec 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,65 +3,86 @@ version = 3 [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "anstream" -version = "0.3.2" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", - "is-terminal", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.2" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c4c2c83f81532e5845a733998b6971faca23490340a418e9b72a3ec9de12ea" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.0" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.48.0", + "windows-sys", ] [[package]] name = "anstyle-wincon" -version = "1.0.2" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c677ab05e09154296dd37acecd46420c17b9713e8366facafa8fc0885167cf4c" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] -name = "autocfg" -version = "1.1.0" +name = "base64-simd" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "781dd20c3aff0bd194fe7d2a977dd92f21c173891f3a03b677359e5fa457e5d5" +dependencies = [ + "simd-abstraction", +] + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "bitvec" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] [[package]] name = "byteorder" @@ -71,7 +92,7 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "cargo-wasm2map" -version = "0.1.0" +version = "0.2.0" dependencies = [ "anstyle", "anstyle-parse", @@ -89,20 +110,19 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.3.23" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03aef18ddf7d879c15ce20f04826ef8418101c7e528014c3eeea13321047dca3" +checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" dependencies = [ "clap_builder", "clap_derive", - "once_cell", ] [[package]] name = "clap_builder" -version = "4.3.23" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ce6fffb678c9b80a70b6b6de0aad31df727623a70fd9a842c30cd573e2fa98" +checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" dependencies = [ "anstream", "anstyle", @@ -112,9 +132,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.3.12" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a9bb5758fc5dfe728d1019941681eccaf0cf8a4189b692a0ee2f2ecf90a050" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ "heck", "proc-macro2", @@ -124,30 +144,30 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.5.0" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] [[package]] name = "data-encoding" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" [[package]] name = "debugid" @@ -159,6 +179,17 @@ dependencies = [ "uuid", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "fallible-iterator" version = "0.3.0" @@ -167,9 +198,9 @@ checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" [[package]] name = "flate2" -version = "1.0.28" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", "miniz_oxide", @@ -184,6 +215,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "gcc" version = "0.3.55" @@ -192,9 +229,9 @@ checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" [[package]] name = "getrandom" -version = "0.2.11" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", @@ -203,40 +240,157 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" dependencies = [ "fallible-iterator", "stable_deref_trait", ] [[package]] -name = "hashbrown" -version = "0.12.3" +name = "heck" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] -name = "heck" -version = "0.4.1" +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] [[package]] -name = "hermit-abi" -version = "0.3.9" +name = "icu_locid_transform_data" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", ] [[package]] @@ -252,60 +406,51 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d6896d5a5d605a3b80da159ccc5a6e1fad346b4d2c1ad51046e22536b9a362" [[package]] -name = "indexmap" -version = "1.9.3" +name = "is_terminal_polyfill" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown", -] +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] -name = "is-terminal" -version = "0.4.12" +name = "itoa" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.52.0", -] +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] -name = "itoa" -version = "1.0.9" +name = "libc" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] -name = "libc" -version = "0.2.150" +name = "litemap" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap2" -version = "0.9.0" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deaba38d7abf1d4cca21cc89e932e542ba2b9258664d2a9ef0e61512039c9375" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" dependencies = [ "libc", ] [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" dependencies = [ - "adler", + "adler2", ] [[package]] @@ -316,9 +461,9 @@ checksum = "f5438dd2b2ff4c6df6e1ce22d825ed2fa93ee2922235cc45186991717f0a892d" [[package]] name = "object" -version = "0.31.1" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "flate2", "memchr", @@ -327,10 +472,10 @@ dependencies = [ ] [[package]] -name = "once_cell" -version = "1.19.0" +name = "outref" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" [[package]] name = "percent-encoding" @@ -340,28 +485,37 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "proc-macro2" -version = "1.0.70" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.33" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand" version = "0.8.5" @@ -392,6 +546,12 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc_version" version = "0.2.3" @@ -403,26 +563,24 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] name = "ruzstd" -version = "0.3.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a15e661f0f9dac21f3494fe5d23a6338c0ac116a2d22c2b63010acd89467ffe" +checksum = "fad02996bfc73da3e301efe90b1837be9ed8f4a462b6ed410aa35d00381de89f" dependencies = [ - "byteorder", - "thiserror", "twox-hash", ] [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "semver" @@ -441,18 +599,18 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.193" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.193" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", @@ -461,28 +619,47 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.134" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] +[[package]] +name = "simd-abstraction" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cadb29c57caadc51ff8346233b5cec1d240b68ce55cf1afc764818791876987" +dependencies = [ + "outref", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + [[package]] name = "sourcemap" -version = "7.0.1" +version = "9.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10da010a590ed2fa9ca8467b00ce7e9c5a8017742c0c09c45450efc172208c4b" +checksum = "27c4ea7042fd1a155ad95335b5d505ab00d5124ea0332a06c8390d200bb1a76a" dependencies = [ + "base64-simd", + "bitvec", "data-encoding", "debugid", "if_chain", + "rustc-hash", "rustc_version", "serde", "serde_json", - "unicode-id", + "unicode-id-start", "url", ] @@ -500,35 +677,52 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "2.0.39" +version = "2.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "987bc0be1cdea8b10216bd06e2ca407d40b9543468fafd3ddfb02f36e77f71f3" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "thiserror" -version = "1.0.50" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.50" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" dependencies = [ "proc-macro2", "quote", @@ -536,20 +730,15 @@ dependencies = [ ] [[package]] -name = "tinyvec" -version = "1.6.0" +name = "tinystr" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" dependencies = [ - "tinyvec_macros", + "displaydoc", + "zerovec", ] -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "twox-hash" version = "1.6.3" @@ -561,54 +750,51 @@ dependencies = [ ] [[package]] -name = "unicode-bidi" -version = "0.3.13" +name = "unicode-id-start" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" - -[[package]] -name = "unicode-id" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1b6def86329695390197b82c1e244a54a131ceb66c996f2088a3876e2ae083f" +checksum = "2f322b60f6b9736017344fa0635d64be2f458fbc04eef65f6be22976dd1ffd5b" [[package]] name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.22" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "url" -version = "2.5.0" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", "percent-encoding", ] +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.6.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" [[package]] name = "wasi" @@ -628,7 +814,6 @@ dependencies = [ "memmap2", "normalize-path", "object", - "once_cell", "rand", "rustversion", "serde_json", @@ -638,142 +823,191 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.102.0" +version = "0.222.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48134de3d7598219ab9eaf6b91b15d8e50d31da76b8519fe4ecfcec2cf35104b" +checksum = "4adf50fde1b1a49c1add6a80d47aea500c88db70551805853aa8b88f3ea27ab5" dependencies = [ - "indexmap", - "url", + "bitflags", ] [[package]] name = "windows-sys" -version = "0.48.0" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets 0.48.5", + "windows-targets", ] [[package]] -name = "windows-sys" -version = "0.52.0" +name = "windows-targets" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows-targets 0.52.4", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] [[package]] -name = "windows-targets" -version = "0.48.5" +name = "windows_aarch64_gnullvm" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] -name = "windows-targets" -version = "0.52.4" +name = "windows_aarch64_msvc" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" -dependencies = [ - "windows_aarch64_gnullvm 0.52.4", - "windows_aarch64_msvc 0.52.4", - "windows_i686_gnu 0.52.4", - "windows_i686_msvc 0.52.4", - "windows_x86_64_gnu 0.52.4", - "windows_x86_64_gnullvm 0.52.4", - "windows_x86_64_msvc 0.52.4", -] +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" +name = "windows_i686_gnu" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.4" +name = "windows_i686_gnullvm" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" +name = "windows_i686_msvc" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] -name = "windows_aarch64_msvc" -version = "0.52.4" +name = "windows_x86_64_gnu" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] -name = "windows_i686_gnu" -version = "0.48.5" +name = "windows_x86_64_gnullvm" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] -name = "windows_i686_gnu" -version = "0.52.4" +name = "windows_x86_64_msvc" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "windows_i686_msvc" -version = "0.48.5" +name = "write16" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" [[package]] -name = "windows_i686_msvc" -version = "0.52.4" +name = "writeable" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" +name = "wyz" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] [[package]] -name = "windows_x86_64_gnu" -version = "0.52.4" +name = "yoke" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] [[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" +name = "yoke-derive" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] [[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.4" +name = "zerocopy" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] [[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" +name = "zerocopy-derive" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] -name = "windows_x86_64_msvc" -version = "0.52.4" +name = "zerofrom" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/cargo-wasm2map/Cargo.toml b/cargo-wasm2map/Cargo.toml index 2a0c68c..216e8d2 100644 --- a/cargo-wasm2map/Cargo.toml +++ b/cargo-wasm2map/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cargo-wasm2map" -version = "0.1.0" +version = "0.2.0" edition = "2021" authors = ["Mark Tolmacs "] description = "Cargo command which generates source map for .wasm file with DWARF debug info embedded as source map." @@ -10,23 +10,23 @@ repository = "https://github.com/mtolmacs/wasm2map" homepage = "https://github.com/mtolmacs/wasm2map" keywords = ["webassembly", "wasm", "debug", "sourcemap"] categories = ["command-line-utilities"] -rust-version = "1.64.0" +rust-version = "1.76.0" license = "MIT OR Apache-2.0" [dependencies] # For -Zminimal-versions proc-macro2 = ">= 1.0.60" -anstyle = "<1.0.3" # MSRV 1.64 support end -anstyle-parse = "<0.2.2" # MSRV 1.64 support end -clap_lex = "<0.5.1" # MSRV 1.64 support end +anstyle = "^1" +anstyle-parse = "^0.2" +clap_lex = "0.7.4" [dependencies.wasm2map] path = "../wasm2map" features = ["memmap2", "loader"] [dependencies.clap] -version = ">=4.3.11, <4.3.24" +version = "4.5.3" features = ["derive"] [badges] -maintenance = { status = "actively-developed" } \ No newline at end of file +maintenance = { status = "actively-developed" } diff --git a/cargo-wasm2map/src/main.rs b/cargo-wasm2map/src/main.rs index ab111c1..94c3389 100644 --- a/cargo-wasm2map/src/main.rs +++ b/cargo-wasm2map/src/main.rs @@ -14,7 +14,7 @@ use clap::{Args, Parser}; use std::{fs, path::PathBuf}; -use wasm2map::{Wasm, WasmLoader}; +use wasm2map::{Wasm, Loader}; // Cargo commands receive the name of the subcommand as the main command // so we need to consume the name of our executable in order to get to the @@ -102,7 +102,7 @@ fn main() -> Result<(), String> { // url and it also does not reference the map file // Open the WASM file - let reader = WasmLoader::from_path(&args.path).map_err(|err| err.to_string())?; + let reader = Loader::from_path(&args.path).map_err(|err| err.to_string())?; // Parse the DWARF code section let wasm = Wasm::new(&reader, None, None).map_err(|err| err.to_string())?; diff --git a/wasm2map/Cargo.toml b/wasm2map/Cargo.toml index 22bed8c..b475fa9 100644 --- a/wasm2map/Cargo.toml +++ b/wasm2map/Cargo.toml @@ -10,7 +10,7 @@ repository = "https://github.com/mtolmacs/wasm2map" homepage = "https://github.com/mtolmacs/wasm2map" keywords = ["webassembly", "wasm", "debug", "sourcemap"] categories = ["development-tools::debugging"] -rust-version = "1.64.0" +rust-version = "1.76.0" license = "MIT OR Apache-2.0" [lib] @@ -20,26 +20,25 @@ default = ["memmap2", "loader"] loader = [] [dependencies.gimli] -version = "0.28.1" +version = "0.31.1" default-features = false features = ["std", "read", "endian-reader"] [dependencies.memmap2] -version = "~0.9.0" +version = "~0.9.5" default-features = false optional = true [dependencies.object] -version = ">=0.31.1" # MSRV 1.64 support ended, earlier does not qualify +version = ">=0.31.1" # MSRV 1.64 support ended, earlier does not qualify features = ["std", "wasm"] [dependencies] normalize-path = "0.2.1" serde_json = "^1" -sourcemap = "^7.0" +sourcemap = "^9.1" thiserror = ">= 1.0.7" -once_cell = "=1.19.0" -rustversion = "=1.0.14" +rustversion = "=1.0.19" ilog = "=1.0.1" # For -Zminimal-versions cfg-if = ">= 0.1.5" @@ -51,4 +50,4 @@ flate2 = ">= 1.0.26" gcc = ">= 0.3.4" [badges] -maintenance = { status = "actively-developed" } \ No newline at end of file +maintenance = { status = "actively-developed" } diff --git a/wasm2map/src/dwarf/mod.rs b/wasm2map/src/dwarf/mod.rs index b853a2c..2d281bf 100644 --- a/wasm2map/src/dwarf/mod.rs +++ b/wasm2map/src/dwarf/mod.rs @@ -2,4 +2,4 @@ mod reader; mod relocate; mod section; -pub use reader::DwarfReader; +pub use reader::Reader; diff --git a/wasm2map/src/dwarf/reader.rs b/wasm2map/src/dwarf/reader.rs index 2a197b9..5da4050 100644 --- a/wasm2map/src/dwarf/reader.rs +++ b/wasm2map/src/dwarf/reader.rs @@ -1,39 +1,36 @@ use crate::error::{Error, InternalError}; -use gimli::{EndianReader, LittleEndian, Reader}; -use object::{ - File, Object, ObjectSection, ObjectSymbol, ReadRef, RelocationKind, RelocationTarget, Section, -}; -use once_cell::unsync::OnceCell; -use std::{borrow::Cow, rc::Rc}; +use gimli::Reader as _; +use object::{Object, ObjectSection, ObjectSymbol}; +use std::{borrow::Cow, cell::OnceCell, rc::Rc}; use super::{ relocate::{Relocate, RelocationMap}, section::SectionReader, }; -pub type Relocator<'a> = Relocate>>; +pub type Relocator<'a> = Relocate>>; /// /// /// -pub struct DwarfReader<'reader, R: ReadRef<'reader> + 'reader> { - binary: &'reader File<'reader, R>, - dwo_parent: Option<&'reader File<'reader, R>>, - sup_file: Option<&'reader File<'reader, R>>, +pub struct Reader<'reader, R: object::ReadRef<'reader> + 'reader> { + binary: &'reader object::File<'reader, R>, + dwo_parent: Option<&'reader object::File<'reader, R>>, + sup_file: Option<&'reader object::File<'reader, R>>, dwarf: OnceCell>>, } -impl<'reader, R> DwarfReader<'reader, R> +impl<'reader, R> Reader<'reader, R> where - R: ReadRef<'reader> + 'reader, + R: object::ReadRef<'reader> + 'reader, { /// /// /// pub fn new( - binary: &'reader File<'reader, R>, - dwo_parent: Option<&'reader File<'reader, R>>, - sup_file: Option<&'reader File<'reader, R>>, + binary: &'reader object::File<'reader, R>, + dwo_parent: Option<&'reader object::File<'reader, R>>, + sup_file: Option<&'reader object::File<'reader, R>>, ) -> Self { Self { binary, @@ -101,7 +98,7 @@ where /// fn load_file_section( id: gimli::SectionId, - object: &'reader File<'reader, R>, + object: &'reader object::File<'reader, R>, is_dwo: bool, ) -> Result, Error> { let mut relocations = RelocationMap::default(); @@ -124,7 +121,7 @@ where None => Cow::Owned(Vec::with_capacity(1)), }; - let reader = gimli::EndianReader::new(SectionReader { data }, LittleEndian); + let reader = gimli::EndianReader::new(SectionReader { data }, gimli::LittleEndian); let offset = reader.offset_from(&reader); Ok(Relocate { relocations: Rc::new(relocations), @@ -137,8 +134,8 @@ where /// /// fn get_relocations( - object: &File<'reader, R>, - section: &Section<'reader, 'reader, R>, + object: &object::File<'reader, R>, + section: &object::Section<'reader, 'reader, R>, ) -> Result { let mut relocations: RelocationMap = RelocationMap::new(); @@ -146,8 +143,8 @@ where let offset = usize::try_from(offset).map_err(InternalError::from)?; match relocation.kind() { - RelocationKind::Absolute => { - if let RelocationTarget::Symbol(symbol_idx) = relocation.target() { + object::RelocationKind::Absolute => { + if let object::RelocationTarget::Symbol(symbol_idx) = relocation.target() { match object.symbol_by_index(symbol_idx) { Ok(symbol) => { let addend = diff --git a/wasm2map/src/lib.rs b/wasm2map/src/lib.rs index 158289e..063fd77 100644 --- a/wasm2map/src/lib.rs +++ b/wasm2map/src/lib.rs @@ -21,20 +21,19 @@ mod loader; #[cfg(test)] mod test; -use dwarf::DwarfReader; +use dwarf::Reader; pub use error::Error; use error::InternalError; -use gimli::{self, Reader}; +use gimli::Reader as _; #[rustversion::before(1.65)] use ilog::IntLog; #[cfg(feature = "loader")] -pub use loader::WasmLoader; +pub use loader::Loader; use normalize_path::NormalizePath; pub use object::ReadRef; use object::{self, File, FileKind, Object, ObjectSection, SectionIndex}; -use once_cell::unsync::OnceCell; use sourcemap::SourceMapBuilder; -use std::{path::PathBuf, str}; +use std::{cell::OnceCell, path::PathBuf, str}; type Entry = (u32, u32, u32, u32, Option, Option, bool); @@ -44,7 +43,7 @@ pub struct Wasm<'wasm, R: ReadRef<'wasm>> { dwo_parent: Option>, sup_file: Option>, offset: u32, - dwarf: OnceCell>, + dwarf: OnceCell>, } impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { @@ -107,7 +106,7 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { let dwarf = self .dwarf .get_or_init(|| { - DwarfReader::new( + Reader::new( &self.binary, self.dwo_parent.as_ref(), self.sup_file.as_ref(), @@ -199,7 +198,7 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { .into_iter() //.filter(|item| !item.6) .for_each(|(dst_line, dst_col, src_line, src_col, source, name, _)| { - mapper.add_raw(dst_line, dst_col, src_line, src_col, source, name); + mapper.add_raw(dst_line, dst_col, src_line, src_col, source, name, false); }); let mut buf: Vec = Vec::new(); diff --git a/wasm2map/src/loader/file.rs b/wasm2map/src/loader/file.rs index 9173e36..cf59e22 100644 --- a/wasm2map/src/loader/file.rs +++ b/wasm2map/src/loader/file.rs @@ -8,11 +8,11 @@ use std::{ /// #[derive(Debug)] -pub struct WasmLoader { +pub struct Loader { data: ReadCache, } -impl WasmLoader { +impl Loader { /// pub fn from_path(path: impl AsRef) -> Result { let file = File::open(path)?; @@ -29,7 +29,7 @@ impl WasmLoader { } } -impl<'a, R: Read + Seek> ReadRef<'a> for &'a WasmLoader { +impl<'a, R: Read + Seek> ReadRef<'a> for &'a Loader { fn len(self) -> Result { self.data.len() } diff --git a/wasm2map/src/loader/mmap.rs b/wasm2map/src/loader/mmap.rs index f224c76..754ae06 100644 --- a/wasm2map/src/loader/mmap.rs +++ b/wasm2map/src/loader/mmap.rs @@ -10,12 +10,12 @@ use std::{ /// #[derive(Debug)] -pub struct WasmLoader { +pub struct Loader { data: Mmap, _marker: PhantomData, } -impl WasmLoader { +impl Loader { /// pub fn from_path(path: impl AsRef) -> Result { let file = File::open(path)?; @@ -35,7 +35,7 @@ impl WasmLoader { } } -impl<'a, R: Read + Seek> ReadRef<'a> for &'a WasmLoader { +impl<'a, R: Read + Seek> ReadRef<'a> for &'a Loader { fn len(self) -> Result { self.data.len().try_into().map_err(|_| ()) } diff --git a/wasm2map/src/loader/mod.rs b/wasm2map/src/loader/mod.rs index 017f4ad..d79301e 100644 --- a/wasm2map/src/loader/mod.rs +++ b/wasm2map/src/loader/mod.rs @@ -1,9 +1,18 @@ +/// Helper module to load wasm a file into memory easily. Currently loading from +/// a file is supported. +/// +/// The type of 'Loader' is determined by the feature flag 'memmap2'. If the +/// memmap2 feature is enabled, then the loader uses unsafe code to use the +/// fast mmap OS feature to load the file into memory in one swoop. Otherwise, +/// if safe code is required, then the file loader uses traditional file I/O +/// to do the same. + #[cfg(not(feature = "memmap2"))] pub mod file; #[cfg(not(feature = "memmap2"))] -pub use file::WasmLoader; +pub use file::Loader; #[cfg(feature = "memmap2")] pub mod mmap; #[cfg(feature = "memmap2")] -pub use mmap::WasmLoader; +pub use mmap::Loader; diff --git a/wasm2map/src/test.rs b/wasm2map/src/test.rs index 38f4549..6e94d39 100644 --- a/wasm2map/src/test.rs +++ b/wasm2map/src/test.rs @@ -3,7 +3,7 @@ use sourcemap::SourceMap; -use crate::{Wasm, WasmLoader}; +use crate::{Loader, Wasm}; use std::{panic, path::Path}; /// Tests the format of the sourcemap, makes sure the JSON is valid and @@ -12,7 +12,7 @@ use std::{panic, path::Path}; fn can_create_valid_sourcemap_format() { panic::catch_unwind(|| { let path = testutils::get_workspace_dir().join("wasm2map/test/assets/golden.wasm"); - let loader = WasmLoader::from_path(path).expect("Could not load WASM file"); + let loader = Loader::from_path(path).expect("Could not load WASM file"); let wasm = Wasm::new(&loader, None, None).expect("Could not load WASM sections"); if let Ok(sourcemap) = wasm.build(false, None) { let parsed = serde_json::from_str::(sourcemap.as_str()) @@ -72,7 +72,7 @@ fn position_retrieval_works() { }; let path = testutils::get_workspace_dir().join("wasm2map/test/assets/golden.wasm"); - let loader = WasmLoader::from_path(path).expect("Could not load WASM file"); + let loader = Loader::from_path(path).expect("Could not load WASM file"); let wasm = Wasm::new(&loader, None, None).expect("Could not load WASM sections"); let sourcemap = SourceMap::from_slice( wasm.build(false, None) From df61391ed1f160be4d6d217e5c14393601b6f206 Mon Sep 17 00:00:00 2001 From: Mark Tolmacs Date: Sat, 4 Jan 2025 18:14:21 +0100 Subject: [PATCH 31/36] Update MSRV to 1.76.0 --- .clippy.toml | 4 ++-- .github/dependabot.yml | 4 ++-- .github/workflows/check.yml | 2 +- README.md | 9 +++++++-- wasm2map/Cargo.toml | 2 +- 5 files changed, 13 insertions(+), 8 deletions(-) diff --git a/.clippy.toml b/.clippy.toml index bb5bda0..1228d7c 100644 --- a/.clippy.toml +++ b/.clippy.toml @@ -1,7 +1,7 @@ -msrv = "1.64.0" # MSRV +msrv = "1.76.0" # MSRV disallowed-methods = [ { path = "std::option::Option::map_or", reason = "use `map(..).unwrap_or(..)`" }, { path = "std::option::Option::map_or_else", reason = "use `map(..).unwrap_or_else(..)`" }, { path = "std::result::Result::map_or", reason = "use `map(..).unwrap_or(..)`" }, { path = "std::result::Result::map_or_else", reason = "use `map(..).unwrap_or_else(..)`" }, -] \ No newline at end of file +] diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 8139a93..05e9ab9 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -3,11 +3,11 @@ updates: - package-ecosystem: github-actions directory: / schedule: - interval: daily + interval: weekly - package-ecosystem: cargo directory: / schedule: - interval: daily + interval: weekly ignore: - dependency-name: "*" # patch and minor updates don't matter for libraries diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 4ed9621..a2ec923 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -79,7 +79,7 @@ jobs: # https://docs.github.com/en/actions/learn-github-actions/contexts#context-availability strategy: matrix: - msrv: [1.64.0] # 2021 edition requires 1.56 + msrv: [1.76.0] # 2021 edition requires 1.56 name: ubuntu / ${{ matrix.msrv }} steps: - uses: actions/checkout@v4 diff --git a/README.md b/README.md index d7d1686..2ecf2d5 100644 --- a/README.md +++ b/README.md @@ -3,16 +3,18 @@ ![Build status](https://github.com/mtolmacs/wasm2map/actions/workflows/test.yml/badge.svg) [![crates.io](https://img.shields.io/crates/v/wasm2map.svg)](https://crates.io/crates/wasm2map) [![Documentation](https://docs.rs/wasm2map/badge.svg)](https://docs.rs/wasm2map) -![Min Rust 1.64.0](https://badgen.net/badge/Min%20Rust/1.64.0) +![Min Rust 1.76.0](https://badgen.net/badge/Min%20Rust/1.76.0) Generates a browser-supported sourcemap for WASM binaries containing DWARF debug information and associates it with the WASM binary, so when loaded in the browser you can see the rust line, character and source code (if available) in the debug panel and console. NOTE: Can build without unsafe code (the only unsafe code is related to using the memmap2 crate). ### Before + ![Before WASM sourcemapping](https://raw.githubusercontent.com/mtolmacs/wasm2map/main/assets/before.png) ### After + ![After WASM sourcemapping](https://raw.githubusercontent.com/mtolmacs/wasm2map/main/assets/after.png) # Usage @@ -47,15 +49,18 @@ let mapper = WASM::load("/path/to/the/file.wasm"); ``` # Current limitations + - It does not bundle the source code in the sourcemap currently, so source browsing will not work in the browser # Contribution + Your contributions are welcome, especially bug reports and testing on various platforms. Feel free to open a PR if you can contribute a fix. If you would like to contribute an API change, extension or a new trait implementation, please open an issue first and discuss before starting work on a PR. For details please read the CONTRIBUTING.md file. # License + Licensed under either of Apache License, Version 2.0 or MIT license at your option. Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this crate by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. -`SPDX-License-Identifier: Apache-2.0 OR MIT` \ No newline at end of file +`SPDX-License-Identifier: Apache-2.0 OR MIT` diff --git a/wasm2map/Cargo.toml b/wasm2map/Cargo.toml index b475fa9..ccc570d 100644 --- a/wasm2map/Cargo.toml +++ b/wasm2map/Cargo.toml @@ -30,7 +30,7 @@ default-features = false optional = true [dependencies.object] -version = ">=0.31.1" # MSRV 1.64 support ended, earlier does not qualify +version = ">=0.31.1" features = ["std", "wasm"] [dependencies] From 91787f2bbcef3986c9c0ebb26cc188cd894771f0 Mon Sep 17 00:00:00 2001 From: Mark Tolmacs Date: Sat, 4 Jan 2025 18:15:27 +0100 Subject: [PATCH 32/36] Fix formatting --- cargo-wasm2map/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cargo-wasm2map/src/main.rs b/cargo-wasm2map/src/main.rs index 94c3389..f6a492d 100644 --- a/cargo-wasm2map/src/main.rs +++ b/cargo-wasm2map/src/main.rs @@ -14,7 +14,7 @@ use clap::{Args, Parser}; use std::{fs, path::PathBuf}; -use wasm2map::{Wasm, Loader}; +use wasm2map::{Loader, Wasm}; // Cargo commands receive the name of the subcommand as the main command // so we need to consume the name of our executable in order to get to the From ebe2521a83031467d7d8097b0456e57fc36979df Mon Sep 17 00:00:00 2001 From: Mark Tolmacs Date: Sat, 4 Jan 2025 18:24:45 +0100 Subject: [PATCH 33/36] More specific dep versions for -Zminimal-versions --- Cargo.lock | 647 +++++++++++++------------------------------- wasm2map/Cargo.toml | 2 + 2 files changed, 194 insertions(+), 455 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cf457ec..7fc704c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,60 +3,65 @@ version = 3 [[package]] -name = "adler2" -version = "2.0.0" +name = "adler" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "cbe262130bf8e280f95bb7f04f74a82dca9950bbdc12c68b4d3dab0112494d37" [[package]] name = "anstream" -version = "0.6.18" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +checksum = "4cd2405b3ac1faab2990b74d728624cd9fd115651fcecc7c2d8daf01376275ba" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", - "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" [[package]] name = "anstyle-parse" -version = "0.2.6" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.2" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" dependencies = [ "windows-sys", ] [[package]] name = "anstyle-wincon" -version = "3.0.6" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" dependencies = [ "anstyle", "windows-sys", ] +[[package]] +name = "autocfg" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" + [[package]] name = "base64-simd" version = "0.7.0" @@ -68,9 +73,9 @@ dependencies = [ [[package]] name = "bitflags" -version = "2.6.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "f5cde24d1b2e2216a726368b2363a273739c91f4e3eb4e0dd12d672d396ad989" [[package]] name = "bitvec" @@ -86,9 +91,9 @@ dependencies = [ [[package]] name = "byteorder" -version = "1.5.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "ffea412272c01cbee45e0d34f71c54af698d48f7d404a61fb46b71f48e3f30db" [[package]] name = "cargo-wasm2map" @@ -104,15 +109,15 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "0c4e7bb64a8ebb0d856483e1e682ea3422f883c5f5615a90d51a2c82fe87fdd3" [[package]] name = "clap" -version = "4.5.23" +version = "4.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" +checksum = "949626d00e063efc93b6dca932419ceb5432f99769911c0b995f7e884c778813" dependencies = [ "clap_builder", "clap_derive", @@ -120,9 +125,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.23" +version = "4.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" +checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" dependencies = [ "anstream", "anstyle", @@ -132,14 +137,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.18" +version = "4.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +checksum = "90239a040c80f5e14809ca132ddc4176ab33d5e17e49691793296e3fcb34d72f" dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.8", ] [[package]] @@ -150,24 +155,24 @@ checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "colorchoice" -version = "1.0.3" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" dependencies = [ "cfg-if", ] [[package]] name = "data-encoding" -version = "2.6.0" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" +checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb" [[package]] name = "debugid" @@ -179,17 +184,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "fallible-iterator" version = "0.3.0" @@ -198,23 +192,30 @@ checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" [[package]] name = "flate2" -version = "1.0.35" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" dependencies = [ "crc32fast", "miniz_oxide", ] [[package]] -name = "form_urlencoded" -version = "1.2.1" +name = "fuchsia-zircon" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "3b5365afd01fdf916e775a224e844f80b3b9710d0f4f00903e219e859474d7ae" dependencies = [ - "percent-encoding", + "bitflags", + "fuchsia-zircon-sys", ] +[[package]] +name = "fuchsia-zircon-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "069def9a0e5feb7e9120635f6ebad24d853a6affbb077fec84d0888316cf9ae6" + [[package]] name = "funty" version = "2.0.0" @@ -223,20 +224,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "gcc" -version = "0.3.55" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] +checksum = "03e5e057d53094f2c3322217b5b7780b1a0a0f4878b107420087438ed3b7f648" [[package]] name = "gimli" @@ -249,155 +239,33 @@ dependencies = [ ] [[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "icu_collections" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locid" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - -[[package]] -name = "icu_normalizer" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" - -[[package]] -name = "icu_properties" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locid_transform", - "icu_properties_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "1.5.0" +name = "hashbrown" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" - -[[package]] -name = "icu_provider" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerovec", -] +checksum = "8c21d40587b92fa6a6c6e3c1bdbf87d75511db5672f9c93175574b3a00df1758" [[package]] -name = "icu_provider_macros" -version = "1.5.0" +name = "heck" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "idna" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" dependencies = [ - "icu_normalizer", - "icu_properties", + "matches", + "unicode-bidi", + "unicode-normalization", ] [[package]] name = "if_chain" -version = "1.0.2" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" +checksum = "c3360c7b59e5ffa2653671fb74b4741a5d343c03f331c0a4aeda42b5c2b0ec7d" [[package]] name = "ilog" @@ -406,34 +274,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d6896d5a5d605a3b80da159ccc5a6e1fad346b4d2c1ad51046e22536b9a362" [[package]] -name = "is_terminal_polyfill" -version = "1.70.1" +name = "indexmap" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" +dependencies = [ + "autocfg", + "hashbrown", +] [[package]] name = "itoa" -version = "1.0.14" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" [[package]] name = "libc" -version = "0.2.169" +version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" [[package]] -name = "litemap" -version = "0.7.4" +name = "matches" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +checksum = "15305656809ce5a4805b1ff2946892810992197ce1270ff79baded852187942e" [[package]] name = "memchr" -version = "2.7.4" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" [[package]] name = "memmap2" @@ -446,11 +318,11 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" dependencies = [ - "adler2", + "adler", ] [[package]] @@ -461,9 +333,9 @@ checksum = "f5438dd2b2ff4c6df6e1ce22d825ed2fa93ee2922235cc45186991717f0a892d" [[package]] name = "object" -version = "0.36.7" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" dependencies = [ "flate2", "memchr", @@ -479,33 +351,24 @@ checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "ppv-lite86" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" -dependencies = [ - "zerocopy", -] +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.38" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" dependencies = [ "proc-macro2", ] @@ -518,32 +381,22 @@ checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" [[package]] name = "rand" -version = "0.8.5" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand 0.4.1", ] [[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" +name = "rand" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "9d5f78082e6a6d042862611e9640cf20776185fee506cf6cf67e93c6225cee31" dependencies = [ - "getrandom", + "fuchsia-zircon", + "libc", ] [[package]] @@ -569,18 +422,20 @@ checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] name = "ruzstd" -version = "0.7.3" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fad02996bfc73da3e301efe90b1837be9ed8f4a462b6ed410aa35d00381de89f" +checksum = "9a15e661f0f9dac21f3494fe5d23a6338c0ac116a2d22c2b63010acd89467ffe" dependencies = [ + "byteorder", + "thiserror", "twox-hash", ] [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "c92464b447c0ee8c4fb3824ecc8383b81717b9f1e74ba2e72540aef7b9f82997" [[package]] name = "semver" @@ -599,32 +454,31 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.217" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +checksum = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.217" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +checksum = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.11", ] [[package]] name = "serde_json" -version = "1.0.134" +version = "1.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" +checksum = "9371ade75d4c2d6cb154141b9752cf3781ec9c05e0e5cf35060e1e70ee7b9c25" dependencies = [ "itoa", - "memchr", "ryu", "serde", ] @@ -638,17 +492,11 @@ dependencies = [ "outref", ] -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - [[package]] name = "sourcemap" -version = "9.1.2" +version = "9.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27c4ea7042fd1a155ad95335b5d505ab00d5124ea0332a06c8390d200bb1a76a" +checksum = "4d146f02f4bbbabbbe3da0f9cd3ea2ab779defc4ed1f070b5bd83ea48ed78811" dependencies = [ "base64-simd", "bitvec", @@ -665,42 +513,42 @@ dependencies = [ [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "ffbc596e092fe5f598b12ef46cc03754085ac2f4d8c739ad61c4ae266cc3b3fa" [[package]] name = "static_assertions" -version = "1.1.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +checksum = "0fa13613355688665b68639b1c378a62dbedea78aff0fc59a4fa656cbbdec657" [[package]] name = "strsim" -version = "0.11.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" [[package]] name = "syn" -version = "2.0.94" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "987bc0be1cdea8b10216bd06e2ca407d40b9543468fafd3ddfb02f36e77f71f3" +checksum = "dff0acdb207ae2fe6d5976617f887eb1e35a2ba52c13c7234c790960cdad9238" dependencies = [ "proc-macro2", "quote", - "unicode-ident", + "unicode-xid", ] [[package]] -name = "synstructure" -version = "0.13.1" +name = "syn" +version = "2.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "bcc02725fd69ab9f26eab07fad303e2497fad6fb9eba4f96c4d1687bdf704ad9" dependencies = [ "proc-macro2", "quote", - "syn", + "unicode-ident", ] [[package]] @@ -711,96 +559,89 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "thiserror" -version = "2.0.9" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" +checksum = "a6e37992ba0f05f3aa079be7f453c91b55d15a01a7aad202baa9c6fa48c3e6b5" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.9" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" +checksum = "0f3308bffe57639095bdb057e73850afecf2730c3b5539af96e6ae096644f4db" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.11", ] [[package]] -name = "tinystr" -version = "0.7.6" +name = "twox-hash" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "04f8ab788026715fa63b31960869617cba39117e520eb415b0139543e325ab59" dependencies = [ - "displaydoc", - "zerovec", + "cfg-if", + "static_assertions", ] [[package]] -name = "twox-hash" -version = "1.6.3" +name = "unicode-bidi" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" +checksum = "2560b941fdb9ea38301b9b708504d612fcdf9c91a8c31d82219bd74cb07d304d" dependencies = [ - "cfg-if", - "static_assertions", + "matches", ] [[package]] name = "unicode-id-start" -version = "1.3.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f322b60f6b9736017344fa0635d64be2f458fbc04eef65f6be22976dd1ffd5b" +checksum = "e15598ae4ac01f33d64525526e028beb497b216015dd768c44187a62b44cbce8" [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" [[package]] -name = "url" -version = "2.5.4" +name = "unicode-normalization" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] +checksum = "51ccda9ef9efa3f7ef5d91e8f9b83bbe6955f9bf86aec89d5cce2c874625920f" [[package]] -name = "utf16_iter" -version = "1.0.5" +name = "unicode-xid" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" +checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" [[package]] -name = "utf8_iter" -version = "1.0.4" +name = "url" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +checksum = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb" +dependencies = [ + "idna", + "matches", + "percent-encoding", +] [[package]] name = "utf8parse" -version = "0.2.2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "uuid" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "8cfcd319456c4d6ea10087ed423473267e1a071f3bc0aa89f80d60997843c6f0" [[package]] name = "wasm2map" @@ -814,41 +655,43 @@ dependencies = [ "memmap2", "normalize-path", "object", - "rand", + "rand 0.3.23", "rustversion", "serde_json", "sourcemap", + "tap", "thiserror", + "unicode-id-start", ] [[package]] name = "wasmparser" -version = "0.222.0" +version = "0.102.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4adf50fde1b1a49c1add6a80d47aea500c88db70551805853aa8b88f3ea27ab5" +checksum = "48134de3d7598219ab9eaf6b91b15d8e50d31da76b8519fe4ecfcec2cf35104b" dependencies = [ - "bitflags", + "indexmap", + "url", ] [[package]] name = "windows-sys" -version = "0.59.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" -version = "0.52.6" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", - "windows_i686_gnullvm", "windows_i686_msvc", "windows_x86_64_gnu", "windows_x86_64_gnullvm", @@ -857,157 +700,51 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.6" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.6" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" [[package]] name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_msvc" -version = "0.52.6" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_x86_64_gnu" -version = "0.52.6" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.6" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - -[[package]] -name = "writeable" -version = "0.5.5" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "wyz" -version = "0.5.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +checksum = "30b31594f29d27036c383b53b59ed3476874d518f0efb151b27a4c275141390e" dependencies = [ "tap", ] - -[[package]] -name = "yoke" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "byteorder", - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zerofrom" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[package]] -name = "zerovec" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] diff --git a/wasm2map/Cargo.toml b/wasm2map/Cargo.toml index ccc570d..8494c28 100644 --- a/wasm2map/Cargo.toml +++ b/wasm2map/Cargo.toml @@ -44,6 +44,8 @@ ilog = "=1.0.1" cfg-if = ">= 0.1.5" rand = ">= 0.3.23" flate2 = ">= 1.0.26" +tap = ">= 1.0.1" +unicode-id-start = ">= 1.1.0" [build-dependencies] # For -Zminimal-versions From 25224ee1fccae0dadf7795a9965834f297cb2259 Mon Sep 17 00:00:00 2001 From: Mark Tolmacs Date: Sat, 4 Jan 2025 18:33:31 +0100 Subject: [PATCH 34/36] Remove ilog polyfill with MSRV bump --- wasm2map/src/lib.rs | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/wasm2map/src/lib.rs b/wasm2map/src/lib.rs index 063fd77..0f9b87e 100644 --- a/wasm2map/src/lib.rs +++ b/wasm2map/src/lib.rs @@ -25,8 +25,6 @@ use dwarf::Reader; pub use error::Error; use error::InternalError; use gimli::Reader as _; -#[rustversion::before(1.65)] -use ilog::IntLog; #[cfg(feature = "loader")] pub use loader::Loader; use normalize_path::NormalizePath; @@ -234,18 +232,3 @@ impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { } } } - -#[rustversion::before(1.65)] -//#[allow(unstable_name_collisions)] -trait PolyfillIlog { - fn ilog(self, base: u32) -> u32; -} - -#[rustversion::before(1.65)] -impl PolyfillIlog for u32 { - fn ilog(self, base: u32) -> u32 { - u32::try_from(self.log2() / base.log2()).expect( - "Invariant of logarithm with arbitrary base from u32 cannot be converted to u32", - ) - } -} From e3f9ff658825e42de3a303f7754c3340c3708ef3 Mon Sep 17 00:00:00 2001 From: Mark Tolmacs Date: Sat, 4 Jan 2025 20:02:33 +0100 Subject: [PATCH 35/36] Reintroducing tests from main --- Cargo.lock | 646 ++++++++++++++++++++++++++++++------------- wasm2map/Cargo.toml | 3 + wasm2map/src/lib.rs | 5 +- wasm2map/src/test.rs | 74 ++++- 4 files changed, 533 insertions(+), 195 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7fc704c..312bb0a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,65 +3,60 @@ version = 3 [[package]] -name = "adler" -version = "1.0.0" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbe262130bf8e280f95bb7f04f74a82dca9950bbdc12c68b4d3dab0112494d37" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "anstream" -version = "0.6.7" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd2405b3ac1faab2990b74d728624cd9fd115651fcecc7c2d8daf01376275ba" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.0" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.0" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ "windows-sys", ] [[package]] name = "anstyle-wincon" -version = "3.0.1" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", "windows-sys", ] -[[package]] -name = "autocfg" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" - [[package]] name = "base64-simd" version = "0.7.0" @@ -73,9 +68,9 @@ dependencies = [ [[package]] name = "bitflags" -version = "1.0.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5cde24d1b2e2216a726368b2363a273739c91f4e3eb4e0dd12d672d396ad989" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "bitvec" @@ -91,9 +86,9 @@ dependencies = [ [[package]] name = "byteorder" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffea412272c01cbee45e0d34f71c54af698d48f7d404a61fb46b71f48e3f30db" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "cargo-wasm2map" @@ -109,15 +104,15 @@ dependencies = [ [[package]] name = "cfg-if" -version = "0.1.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4e7bb64a8ebb0d856483e1e682ea3422f883c5f5615a90d51a2c82fe87fdd3" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.5.3" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "949626d00e063efc93b6dca932419ceb5432f99769911c0b995f7e884c778813" +checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" dependencies = [ "clap_builder", "clap_derive", @@ -125,9 +120,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.2" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" +checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" dependencies = [ "anstream", "anstyle", @@ -137,14 +132,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.3" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90239a040c80f5e14809ca132ddc4176ab33d5e17e49691793296e3fcb34d72f" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.8", + "syn", ] [[package]] @@ -155,24 +150,24 @@ checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "crc32fast" -version = "1.2.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] [[package]] name = "data-encoding" -version = "2.3.3" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" [[package]] name = "debugid" @@ -184,6 +179,17 @@ dependencies = [ "uuid", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "fallible-iterator" version = "0.3.0" @@ -192,30 +198,23 @@ checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" [[package]] name = "flate2" -version = "1.0.26" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", "miniz_oxide", ] [[package]] -name = "fuchsia-zircon" -version = "0.3.1" +name = "form_urlencoded" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b5365afd01fdf916e775a224e844f80b3b9710d0f4f00903e219e859474d7ae" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ - "bitflags", - "fuchsia-zircon-sys", + "percent-encoding", ] -[[package]] -name = "fuchsia-zircon-sys" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "069def9a0e5feb7e9120635f6ebad24d853a6affbb077fec84d0888316cf9ae6" - [[package]] name = "funty" version = "2.0.0" @@ -224,9 +223,20 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "gcc" -version = "0.3.23" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03e5e057d53094f2c3322217b5b7780b1a0a0f4878b107420087438ed3b7f648" +checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] [[package]] name = "gimli" @@ -238,34 +248,156 @@ dependencies = [ "stable_deref_trait", ] -[[package]] -name = "hashbrown" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c21d40587b92fa6a6c6e3c1bdbf87d75511db5672f9c93175574b3a00df1758" - [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "idna" -version = "0.2.0" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", + "icu_normalizer", + "icu_properties", ] [[package]] name = "if_chain" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3360c7b59e5ffa2653671fb74b4741a5d343c03f331c0a4aeda42b5c2b0ec7d" +checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" [[package]] name = "ilog" @@ -274,38 +406,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d6896d5a5d605a3b80da159ccc5a6e1fad346b4d2c1ad51046e22536b9a362" [[package]] -name = "indexmap" -version = "1.9.1" +name = "is_terminal_polyfill" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" -dependencies = [ - "autocfg", - "hashbrown", -] +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itoa" -version = "0.4.3" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "libc" -version = "0.2.151" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] -name = "matches" -version = "0.1.2" +name = "litemap" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15305656809ce5a4805b1ff2946892810992197ce1270ff79baded852187942e" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" [[package]] name = "memchr" -version = "2.4.1" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap2" @@ -318,11 +446,11 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" dependencies = [ - "adler", + "adler2", ] [[package]] @@ -333,9 +461,9 @@ checksum = "f5438dd2b2ff4c6df6e1ce22d825ed2fa93ee2922235cc45186991717f0a892d" [[package]] name = "object" -version = "0.31.1" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "flate2", "memchr", @@ -351,24 +479,33 @@ checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" [[package]] name = "percent-encoding" -version = "2.1.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -381,22 +518,32 @@ checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" [[package]] name = "rand" -version = "0.3.23" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand 0.4.1", + "rand_chacha", + "rand_core", ] [[package]] -name = "rand" -version = "0.4.1" +name = "rand_chacha" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5f78082e6a6d042862611e9640cf20776185fee506cf6cf67e93c6225cee31" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ - "fuchsia-zircon", - "libc", + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", ] [[package]] @@ -422,20 +569,18 @@ checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] name = "ruzstd" -version = "0.3.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a15e661f0f9dac21f3494fe5d23a6338c0ac116a2d22c2b63010acd89467ffe" +checksum = "fad02996bfc73da3e301efe90b1837be9ed8f4a462b6ed410aa35d00381de89f" dependencies = [ - "byteorder", - "thiserror", "twox-hash", ] [[package]] name = "ryu" -version = "1.0.0" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c92464b447c0ee8c4fb3824ecc8383b81717b9f1e74ba2e72540aef7b9f82997" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "semver" @@ -454,31 +599,32 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.104" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.104" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 1.0.11", + "syn", ] [[package]] name = "serde_json" -version = "1.0.48" +version = "1.0.134" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9371ade75d4c2d6cb154141b9752cf3781ec9c05e0e5cf35060e1e70ee7b9c25" +checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -492,11 +638,17 @@ dependencies = [ "outref", ] +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + [[package]] name = "sourcemap" -version = "9.1.0" +version = "9.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d146f02f4bbbabbbe3da0f9cd3ea2ab779defc4ed1f070b5bd83ea48ed78811" +checksum = "27c4ea7042fd1a155ad95335b5d505ab00d5124ea0332a06c8390d200bb1a76a" dependencies = [ "base64-simd", "bitvec", @@ -513,42 +665,42 @@ dependencies = [ [[package]] name = "stable_deref_trait" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbc596e092fe5f598b12ef46cc03754085ac2f4d8c739ad61c4ae266cc3b3fa" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "static_assertions" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa13613355688665b68639b1c378a62dbedea78aff0fc59a4fa656cbbdec657" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strsim" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "1.0.11" +version = "2.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff0acdb207ae2fe6d5976617f887eb1e35a2ba52c13c7234c790960cdad9238" +checksum = "987bc0be1cdea8b10216bd06e2ca407d40b9543468fafd3ddfb02f36e77f71f3" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] -name = "syn" -version = "2.0.8" +name = "synstructure" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc02725fd69ab9f26eab07fad303e2497fad6fb9eba4f96c4d1687bdf704ad9" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "unicode-ident", + "syn", ] [[package]] @@ -559,89 +711,96 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "thiserror" -version = "1.0.7" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6e37992ba0f05f3aa079be7f453c91b55d15a01a7aad202baa9c6fa48c3e6b5" +checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.7" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3308bffe57639095bdb057e73850afecf2730c3b5539af96e6ae096644f4db" +checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" dependencies = [ "proc-macro2", "quote", - "syn 1.0.11", + "syn", ] [[package]] -name = "twox-hash" -version = "1.6.0" +name = "tinystr" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04f8ab788026715fa63b31960869617cba39117e520eb415b0139543e325ab59" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" dependencies = [ - "cfg-if", - "static_assertions", + "displaydoc", + "zerovec", ] [[package]] -name = "unicode-bidi" -version = "0.3.0" +name = "twox-hash" +version = "1.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2560b941fdb9ea38301b9b708504d612fcdf9c91a8c31d82219bd74cb07d304d" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ - "matches", + "cfg-if", + "static_assertions", ] [[package]] name = "unicode-id-start" -version = "1.1.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e15598ae4ac01f33d64525526e028beb497b216015dd768c44187a62b44cbce8" +checksum = "2f322b60f6b9736017344fa0635d64be2f458fbc04eef65f6be22976dd1ffd5b" [[package]] name = "unicode-ident" -version = "1.0.0" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] -name = "unicode-normalization" -version = "0.1.5" +name = "url" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51ccda9ef9efa3f7ef5d91e8f9b83bbe6955f9bf86aec89d5cce2c874625920f" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] [[package]] -name = "unicode-xid" -version = "0.2.0" +name = "utf16_iter" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" [[package]] -name = "url" -version = "2.1.1" +name = "utf8_iter" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb" -dependencies = [ - "idna", - "matches", - "percent-encoding", -] +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.0.0" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cfcd319456c4d6ea10087ed423473267e1a071f3bc0aa89f80d60997843c6f0" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm2map" @@ -655,7 +814,8 @@ dependencies = [ "memmap2", "normalize-path", "object", - "rand 0.3.23", + "rand", + "rustc_version", "rustversion", "serde_json", "sourcemap", @@ -666,32 +826,32 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.102.0" +version = "0.222.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48134de3d7598219ab9eaf6b91b15d8e50d31da76b8519fe4ecfcec2cf35104b" +checksum = "4adf50fde1b1a49c1add6a80d47aea500c88db70551805853aa8b88f3ea27ab5" dependencies = [ - "indexmap", - "url", + "bitflags", ] [[package]] name = "windows-sys" -version = "0.48.0" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" -version = "0.48.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", + "windows_i686_gnullvm", "windows_i686_msvc", "windows_x86_64_gnu", "windows_x86_64_gnullvm", @@ -700,51 +860,157 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "wyz" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b31594f29d27036c383b53b59ed3476874d518f0efb151b27a4c275141390e" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" dependencies = [ "tap", ] + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/wasm2map/Cargo.toml b/wasm2map/Cargo.toml index 8494c28..30742ff 100644 --- a/wasm2map/Cargo.toml +++ b/wasm2map/Cargo.toml @@ -47,6 +47,9 @@ flate2 = ">= 1.0.26" tap = ">= 1.0.1" unicode-id-start = ">= 1.1.0" +[dev-dependencies] +rustc_version = "*" + [build-dependencies] # For -Zminimal-versions gcc = ">= 0.3.4" diff --git a/wasm2map/src/lib.rs b/wasm2map/src/lib.rs index 0f9b87e..e26e309 100644 --- a/wasm2map/src/lib.rs +++ b/wasm2map/src/lib.rs @@ -45,9 +45,8 @@ pub struct Wasm<'wasm, R: ReadRef<'wasm>> { } impl<'wasm, R: ReadRef<'wasm>> Wasm<'wasm, R> { - /// - /// - /// + /// Create a new Wasm instance from a binary file and + /// optional DWO parent and also optional supplemental file pub fn new(binary: R, dwo_parent: Option, sup_file: Option) -> Result { let file = File::parse(binary)?; let offset = file diff --git a/wasm2map/src/test.rs b/wasm2map/src/test.rs index 6e94d39..ce5915c 100644 --- a/wasm2map/src/test.rs +++ b/wasm2map/src/test.rs @@ -108,6 +108,62 @@ fn position_retrieval_works() { }); } +/// The Rust library core files are included in DWARF as relative file paths. +/// This test checks if some of the Rust core files are included in the sources +/// list with some leading parent directories, meaning the relative paths in +/// DWARF are resolved. +#[test] +fn relative_paths_are_considered() { + testutils::run_test(|out| { + if let Ok(loader) = Loader::from_path(out) { + let sourcemap = Wasm::new(&loader, None, None) + .expect("Could not load WASM sections from test build output") + .build(false, None) + .expect("Failed to build sourcemap from test build output"); + + assert!(sourcemap.contains("core/src/any.rs")); + assert!(sourcemap.contains("core/src/panicking.rs")); + } else { + unreachable!() + } + }); +} + +#[test] +fn does_not_contain_absolute_paths() { + let workspace = testutils::get_workspace_dir().into_os_string(); + testutils::run_test(|out| { + if let Ok(loader) = Loader::from_path(out) { + let sourcemap = Wasm::new(&loader, None, None) + .expect("Could not load WASM sections from test build output") + .build(false, None) + .expect("Failed to build sourcemap from test build output"); + + assert!(!sourcemap.contains(workspace.to_str().unwrap())); + } else { + unreachable!() + } + }); +} + +/// When the caller requests the bundling of source file contents, we check +/// that the generated sourcemap has the user source code for the test code. +#[test] +fn can_bundle_source() { + testutils::run_test(|out| { + if let Ok(loader) = Loader::from_path(out) { + let sourcemap = Wasm::new(&loader, None, None) + .expect("Could not load WASM sections from test build output") + .build(true, None) + .expect("Failed to build sourcemap from test build output"); + + assert!(sourcemap.contains("fn main() {}")); + } else { + unreachable!() + } + }); +} + mod testutils { use std::{ fs, panic, @@ -139,13 +195,24 @@ mod testutils { // // NOTE: We also force the WASM32 target obviously, so the tests need that toolchain pub fn build_with_rustc(source: &'_ str, output: &'_ str) { + if rustc_version::version().unwrap() != rustc_version::Version::parse("1.83.0").unwrap() { + panic!("Test suite is only confirmed to work on Rust 1.83.0"); + } + let mut file = get_workspace_dir(); file.push("target"); file.push(format!("test{}.rs", get_thread_id())); std::fs::write(&file, source).unwrap(); let mut rustc = Command::new("rustc") - .args(["--target", "wasm32-unknown-unknown", "-g", "-o", output]) + .args([ + "--target", + "wasm32-unknown-unknown", + //"--crate-type=cdylib", + "-g", + "-o", + output, + ]) .arg(file) .stdout(Stdio::piped()) .spawn() @@ -162,7 +229,10 @@ mod testutils { out.push("target"); out.push(format!("test{}.wasm", get_thread_id())); - build_with_rustc("fn main() {}", out.display().to_string().as_str()); + build_with_rustc( + "#[allow(dead_code)] fn main() {}", + out.display().to_string().as_str(), + ); out.to_string_lossy().to_string() } From ddfa6f3437e23c48b67ade32c2398baef680b365 Mon Sep 17 00:00:00 2001 From: Mark Tolmacs Date: Fri, 28 Feb 2025 12:09:05 +0100 Subject: [PATCH 36/36] Test fix --- wasm2map/src/test.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/wasm2map/src/test.rs b/wasm2map/src/test.rs index ce5915c..6aeb9ab 100644 --- a/wasm2map/src/test.rs +++ b/wasm2map/src/test.rs @@ -4,7 +4,7 @@ use sourcemap::SourceMap; use crate::{Loader, Wasm}; -use std::{panic, path::Path}; +use std::{fs::File, io::Write, panic, path::Path}; /// Tests the format of the sourcemap, makes sure the JSON is valid and /// the required keys are present, with the right type of values. @@ -157,6 +157,11 @@ fn can_bundle_source() { .build(true, None) .expect("Failed to build sourcemap from test build output"); + File::create("test.json") + .unwrap() + .write_all(sourcemap.as_bytes()) + .unwrap(); + assert!(sourcemap.contains("fn main() {}")); } else { unreachable!()