diff --git a/.dockerignore b/.dockerignore
index e861ea7b6..29fd6ce6b 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -2,5 +2,6 @@
**
!lib/**
!src/**
+!examples/**
!Cargo.toml
!Cargo.lock
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 000000000..4dbbd44d8
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,65 @@
+arch:
+ - arm64
+
+language: rust
+rust:
+ - nightly-2019-08-15
+
+cache:
+ directories:
+ - /home/travis/.sccache/
+ - /home/travis/.cargo/bin/
+
+script:
+ # Sccache
+ # - curl -L https://github.com/mozilla/sccache/releases/download/0.2.10/sccache-0.2.10-x86_64-unknown-linux-musl.tar.gz | tar xzf -
+ # - export RUSTC_WRAPPER=`pwd`/sccache-0.2.10-x86_64-unknown-linux-musl/sccache
+ - test -f /home/travis/.cargo/bin/sccache || cargo install sccache
+ - export RUSTC_WRAPPER=/home/travis/.cargo/bin/sccache
+ - mkdir -p /home/travis/.sccache/
+ - export SCCACHE_DIR="/home/travis/.sccache/"
+ - SCCACHE_ERROR_LOG=`pwd`/sccache.log RUST_LOG=debug $RUSTC_WRAPPER --start-server
+ - $RUSTC_WRAPPER -s
+
+ # Tests
+ - make spectests-singlepass
+
+before_deploy:
+ # Release
+ - make release-singlepass
+ - make wapm
+ - make build-install
+ - mkdir -p artifacts
+ - cp ./wasmer.tar.gz ./artifacts/$(./scripts/binary-name.sh)
+
+# before_deploy:
+# # Set up git user name and tag this commit
+# - git config --local user.name "Syrus Akbary"
+# - git config --local user.email "syrus@wasmer.io"
+# - export TRAVIS_TAG="0.10.2"
+# # - git tag $TRAVIS_TAG
+
+deploy:
+ provider: releases
+ file_glob: true
+ file: artifacts/*
+ api_key: $GITHUB_OAUTH_TOKEN
+ # This is set to the previous artifacts are not deleted by travis
+ skip_cleanup: true
+ on:
+ tags: true
+ # branch: feature/singlepass-aarch64
+
+addons:
+ apt:
+ packages:
+ - cmake
+
+branches:
+ only:
+ - master
+ - staging
+ - trying
+ # Making sure Travis runs on new Tags
+ - /^\d+\.\d+(\.\d+)?(-\S*)?$/
+ - /^v\d+\.\d+(\.\d+)?(-\S*)?$/
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 49d90aaae..4b5b8a80a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,11 +1,57 @@
# Changelog
-All PRs to the Wasmer repository must add to this file.
-
-Blocks of changes will separated by version increments.
-
## **[Unreleased]**
+- [#1029](https://github.com/wasmerio/wasmer/pull/1029) Add the “floating” `WasiVersion::Latest` version.
+- [#1006](https://github.com/wasmerio/wasmer/pull/1006) Fix minor panic issue when `wasmer::compile_with` called with llvm backend
+- [#1009](https://github.com/wasmerio/wasmer/pull/1009) Enable LLVM verifier for all tests, add new llvm-backend-tests crate.
+- [#1022](https://github.com/wasmerio/wasmer/pull/1022) Add caching support for Singlepass backend.
+- [#1004](https://github.com/wasmerio/wasmer/pull/1004) Add the Auto backend to enable to adapt backend usage depending on wasm file executed.
+
+## 0.11.0 - 2019-11-22
+
+- [#713](https://github.com/wasmerio/wasmer/pull/713) Add AArch64 support for singlepass.
+- [#995](https://github.com/wasmerio/wasmer/pull/995) Detect when a global is read without being initialized (emit a proper error instead of panicking)
+- [#996](https://github.com/wasmerio/wasmer/pull/997) Refactored spectests, emtests and wasitests to use default compiler logic
+- [#992](https://github.com/wasmerio/wasmer/pull/992) Updates WAPM version to 0.4.1, fix arguments issue introduced in #990
+- [#990](https://github.com/wasmerio/wasmer/pull/990) Default wasmer CLI to `run`. Wasmer will now attempt to parse unrecognized command line options as if they were applied to the run command: `wasmer mywasm.wasm --dir=.` now works!
+- [#987](https://github.com/wasmerio/wasmer/pull/987) Fix `runtime-c-api` header files when compiled by gnuc.
+- [#957](https://github.com/wasmerio/wasmer/pull/957) Change the meaning of `wasmer_wasi::is_wasi_module` to detect any type of WASI module, add support for new wasi snapshot_preview1
+- [#934](https://github.com/wasmerio/wasmer/pull/934) Simplify float expressions in the LLVM backend.
+
+## 0.10.2 - 2019-11-18
+
+- [#968](https://github.com/wasmerio/wasmer/pull/968) Added `--invoke` option to the command
+- [#964](https://github.com/wasmerio/wasmer/pull/964) Enable cross-compilation for specific target
+- [#971](https://github.com/wasmerio/wasmer/pull/971) In LLVM backend, use unaligned loads and stores for non-atomic accesses to wasmer memory.
+- [#960](https://github.com/wasmerio/wasmer/pull/960) Fix `runtime-c-api` header files when compiled by clang.
+- [#925](https://github.com/wasmerio/wasmer/pull/925) Host functions can be closures with a captured environment.
+- [#917](https://github.com/wasmerio/wasmer/pull/917) Host functions (aka imported functions) may not have `&mut vm::Ctx` as first argument, i.e. the presence of the `&mut vm::Ctx` argument is optional.
+- [#915](https://github.com/wasmerio/wasmer/pull/915) All backends share the same definition of `Trampoline` (defined in `wasmer-runtime-core`).
+
+## 0.10.1 - 2019-11-11
+
+- [#952](https://github.com/wasmerio/wasmer/pull/952) Use C preprocessor to properly hide trampoline functions on Windows and non-x86_64 targets.
+
+## 0.10.0 - 2019-11-11
+
+Special thanks to [@newpavlov](https://github.com/newpavlov) and [@Maxgy](https://github.com/Maxgy) for their contributions!
+
+- [#942](https://github.com/wasmerio/wasmer/pull/942) Deny missing docs in runtime core and add missing docs
+- [#939](https://github.com/wasmerio/wasmer/pull/939) Fix bug causing attempts to append to files with WASI to delete the contents of the file
+- [#940](https://github.com/wasmerio/wasmer/pull/940) Update supported Rust version to 1.38+
+- [#923](https://github.com/wasmerio/wasmer/pull/923) Fix memory leak in the C API caused by an incorrect cast in `wasmer_trampoline_buffer_destroy`
+- [#921](https://github.com/wasmerio/wasmer/pull/921) In LLVM backend, annotate all memory accesses with TBAA metadata.
+- [#883](https://github.com/wasmerio/wasmer/pull/883) Allow floating point operations to have arbitrary inputs, even including SNaNs.
+- [#856](https://github.com/wasmerio/wasmer/pull/856) Expose methods in the runtime C API to get a WASI import object
+
+## 0.9.0 - 2019-10-23
+
+Special thanks to @alocquet for their contributions!
+
+- [#898](https://github.com/wasmerio/wasmer/pull/898) State tracking is now disabled by default in the LLVM backend. It can be enabled with `--track-state`.
+- [#861](https://github.com/wasmerio/wasmer/pull/861) Add descriptions to `unimplemented!` macro in various places
+- [#897](https://github.com/wasmerio/wasmer/pull/897) Removes special casing of stdin, stdout, and stderr in WASI. Closing these files now works. Removes `stdin`, `stdout`, and `stderr` from `WasiFS`, replaced by the methods `stdout`, `stdout_mut`, and so on.
- [#863](https://github.com/wasmerio/wasmer/pull/863) Fix min and max for cases involving NaN and negative zero when using the LLVM backend.
## 0.8.0 - 2019-10-02
diff --git a/Cargo.lock b/Cargo.lock
index 9c0d362ed..eb081c3db 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1,5 +1,10 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
+[[package]]
+name = "adler32"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
[[package]]
name = "aho-corasick"
version = "0.7.6"
@@ -23,70 +28,73 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "arrayvec"
-version = "0.4.11"
+version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
-]
[[package]]
name = "atty"
version = "0.2.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "autocfg"
-version = "0.1.6"
+version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
-name = "bincode"
-version = "1.1.4"
+name = "backtrace"
+version = "0.3.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
+ "backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
-name = "bindgen"
-version = "0.51.1"
+name = "backtrace-sys"
+version = "0.1.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "cexpr 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
- "clang-sys 0.28.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "rustc-hash 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "which 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "base64"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "bincode"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "bitflags"
-version = "1.1.0"
+version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "blake2b_simd"
-version = "0.5.8"
+version = "0.5.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
"constant_time_eq 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -98,7 +106,7 @@ dependencies = [
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"regex-automata 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -106,45 +114,41 @@ name = "byteorder"
version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
+[[package]]
+name = "bytes"
+version = "0.4.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
[[package]]
name = "c2-chacha"
-version = "0.2.2"
+version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "ppv-lite86 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "capstone"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "capstone-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "capstone-sys"
-version = "0.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "cargo_toml"
-version = "0.6.4"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_derive 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
- "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_derive 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
+ "toml 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "cast"
-version = "0.2.2"
+version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
[[package]]
name = "cbindgen"
@@ -153,43 +157,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
"quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_json 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
"tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "toml 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "toml 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "cc"
-version = "1.0.45"
+version = "1.0.47"
source = "registry+https://github.com/rust-lang/crates.io-index"
-[[package]]
-name = "cexpr"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
[[package]]
name = "cfg-if"
-version = "0.1.9"
+version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-[[package]]
-name = "clang-sys"
-version = "0.28.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
- "libloading 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
[[package]]
name = "clap"
version = "2.33.0"
@@ -197,7 +183,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
"atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
- "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
"textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
"unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -209,7 +195,7 @@ name = "cloudabi"
version = "0.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -217,7 +203,7 @@ name = "cmake"
version = "0.1.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -225,6 +211,46 @@ name = "constant_time_eq"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
+[[package]]
+name = "cookie"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
+ "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "cookie_store"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "publicsuffix 1.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_json 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)",
+ "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
+ "try_from 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "core-foundation"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
[[package]]
name = "cranelift-bforest"
version = "0.44.0"
@@ -242,10 +268,10 @@ dependencies = [
"cranelift-codegen-meta 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cranelift-codegen-shared 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cranelift-entity 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
"target-lexicon 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -278,28 +304,36 @@ dependencies = [
"target-lexicon 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
+[[package]]
+name = "crc32fast"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
[[package]]
name = "criterion"
version = "0.2.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
- "cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
"criterion-plot 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
"csv 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
- "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
"rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
"rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"rand_xoshiro 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "rayon 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "rayon-core 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_derive 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rayon 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rayon-core 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_derive 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_json 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)",
"tinytemplate 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
"walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -310,29 +344,29 @@ version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "crossbeam-deque"
-version = "0.7.1"
+version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "crossbeam-epoch 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "crossbeam-epoch"
-version = "0.7.2"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
- "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
- "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "memoffset 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
"scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -344,12 +378,30 @@ dependencies = [
"crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
]
+[[package]]
+name = "crossbeam-queue"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
[[package]]
name = "crossbeam-utils"
version = "0.6.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -361,8 +413,8 @@ dependencies = [
"bstr 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
"csv-core 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
"itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -375,11 +427,11 @@ dependencies = [
[[package]]
name = "ctor"
-version = "0.1.10"
+version = "0.1.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -390,54 +442,45 @@ dependencies = [
"generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)",
]
+[[package]]
+name = "dtoa"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
[[package]]
name = "dynasm"
-version = "0.3.2"
+version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)",
+ "owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "dynasmrt"
-version = "0.3.1"
+version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "either"
-version = "1.5.2"
+version = "1.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
-name = "enum-methods"
-version = "0.0.8"
+name = "encoding_rs"
+version = "0.8.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "env_logger"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
- "humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -445,7 +488,7 @@ name = "erased-serde"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -454,7 +497,7 @@ version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"errno-dragonfly 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -464,30 +507,63 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "error-chain"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "failure"
-version = "0.1.5"
+version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)",
+ "failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "failure_derive"
-version = "0.1.5"
+version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)",
- "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
-name = "field-offset"
+name = "flate2"
+version = "1.0.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+ "miniz_oxide 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "foreign-types"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "foreign-types-shared"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -496,6 +572,34 @@ name = "fuchsia-cprng"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
+[[package]]
+name = "fuchsia-zircon"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "fuchsia-zircon-sys"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "futures"
+version = "0.1.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "futures-cpupool"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
[[package]]
name = "gcc"
version = "0.3.55"
@@ -503,11 +607,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "generational-arena"
-version = "0.2.3"
+version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -520,11 +624,11 @@ dependencies = [
[[package]]
name = "getrandom"
-version = "0.1.12"
+version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
"wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -533,9 +637,9 @@ name = "ghost"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
"quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -558,12 +662,37 @@ dependencies = [
"scroll 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
]
+[[package]]
+name = "h2"
+version = "0.1.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
+ "http 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
+ "indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "string 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
[[package]]
name = "heck"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -572,43 +701,124 @@ version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
-name = "humantime"
-version = "1.3.0"
+name = "http"
+version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "http-body"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
+ "http 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "httparse"
+version = "1.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "hyper"
+version = "0.12.35"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
+ "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "h2 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)",
+ "http 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
+ "http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-reactor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-threadpool 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "want 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "hyper-tls"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
+ "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)",
+ "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "idna"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-normalization 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "idna"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-normalization 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "indexmap"
-version = "1.2.0"
+version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
+ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "inkwell"
version = "0.1.0"
-source = "git+https://github.com/wasmerio/inkwell?branch=llvm8-0#8f480124663b812ee76cd4370f3ee170135b9d0e"
+source = "git+https://github.com/TheDan64/inkwell?rev=781620e9fa30e51a6e03bd0d49b5f5bb7a782520#781620e9fa30e51a6e03bd0d49b5f5bb7a782520"
dependencies = [
- "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "enum-methods 0.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "inkwell_internal_macros 0.1.0 (git+https://github.com/wasmerio/inkwell?branch=llvm8-0)",
- "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
+ "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "inkwell_internals 0.1.0 (git+https://github.com/TheDan64/inkwell?rev=781620e9fa30e51a6e03bd0d49b5f5bb7a782520)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
"llvm-sys 80.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "once_cell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
"regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
-name = "inkwell_internal_macros"
+name = "inkwell_internals"
version = "0.1.0"
-source = "git+https://github.com/wasmerio/inkwell?branch=llvm8-0#8f480124663b812ee76cd4370f3ee170135b9d0e"
+source = "git+https://github.com/TheDan64/inkwell?rev=781620e9fa30e51a6e03bd0d49b5f5bb7a782520#781620e9fa30e51a6e03bd0d49b5f5bb7a782520"
dependencies = [
- "cargo_toml 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cargo_toml 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
"quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
+ "reqwest 0.9.22 (registry+https://github.com/rust-lang/crates.io-index)",
"syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -617,7 +827,7 @@ name = "inventory"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "ctor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ctor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
"ghost 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
"inventory-impl 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -627,17 +837,25 @@ name = "inventory-impl"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
"quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "iovec"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "itertools"
-version = "0.8.0"
+version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -665,33 +883,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "libc"
-version = "0.2.62"
+version = "0.2.65"
source = "registry+https://github.com/rust-lang/crates.io-index"
-[[package]]
-name = "libloading"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
[[package]]
name = "llvm-sys"
version = "80.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
"regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
"semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "lock_api"
-version = "0.3.1"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -702,9 +911,19 @@ name = "log"
version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
]
+[[package]]
+name = "matches"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "maybe-uninit"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
[[package]]
name = "md5"
version = "0.6.1"
@@ -715,16 +934,7 @@ name = "memchr"
version = "2.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "memmap"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -732,63 +942,162 @@ name = "memmap"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "memoffset"
-version = "0.5.1"
+version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
]
+[[package]]
+name = "mime"
+version = "0.3.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "mime_guess"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "mime 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "miniz_oxide"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "mio"
+version = "0.6.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
+ "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "miow"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "native-tls"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "openssl 0.10.26 (registry+https://github.com/rust-lang/crates.io-index)",
+ "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "openssl-sys 0.9.53 (registry+https://github.com/rust-lang/crates.io-index)",
+ "schannel 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
+ "security-framework 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "net2"
+version = "0.2.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
[[package]]
name = "nix"
version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)",
- "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
"void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
]
-[[package]]
-name = "nodrop"
-version = "0.1.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "nom"
-version = "4.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
[[package]]
name = "num-traits"
-version = "0.2.8"
+version = "0.2.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "num_cpus"
-version = "1.10.1"
+version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
+ "hermit-abi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "openssl"
+version = "0.10.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+ "openssl-sys 0.9.53 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "openssl-probe"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "openssl-sys"
+version = "0.9.53"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)",
+ "vcpkg 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "owning_ref"
-version = "0.3.3"
+version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -800,7 +1109,7 @@ version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -808,10 +1117,10 @@ dependencies = [
name = "parallel"
version = "0.1.0"
dependencies = [
- "rayon 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rayon 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
- "wasmer-runtime 0.8.0",
- "wasmer-runtime-core 0.8.0",
+ "wasmer-runtime 0.11.0",
+ "wasmer-runtime-core 0.11.0",
]
[[package]]
@@ -827,7 +1136,7 @@ name = "parking_lot"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "lock_api 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lock_api 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
"parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
"rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -837,18 +1146,28 @@ name = "parking_lot_core"
version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
"cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
"redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)",
"rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
-name = "peeking_take_while"
-version = "0.1.2"
+name = "percent-encoding"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "percent-encoding"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
@@ -862,7 +1181,7 @@ version = "0.1.0"
[[package]]
name = "ppv-lite86"
-version = "0.2.5"
+version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
@@ -870,9 +1189,9 @@ name = "proc-macro-error"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
"quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -885,21 +1204,23 @@ dependencies = [
[[package]]
name = "proc-macro2"
-version = "1.0.3"
+version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
-name = "quick-error"
-version = "1.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "quote"
-version = "0.3.15"
+name = "publicsuffix"
+version = "1.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
[[package]]
name = "quote"
@@ -914,7 +1235,25 @@ name = "quote"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "rand"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -922,19 +1261,28 @@ name = "rand"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "getrandom 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
+ "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
"rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
"rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
+[[package]]
+name = "rand_chacha"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
[[package]]
name = "rand_chacha"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "c2-chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
"rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -956,7 +1304,15 @@ name = "rand_core"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "getrandom 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "rand_hc"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -967,6 +1323,24 @@ dependencies = [
"rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
+[[package]]
+name = "rand_isaac"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "rand_jitter"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
[[package]]
name = "rand_os"
version = "0.1.3"
@@ -974,12 +1348,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
"fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
"rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
"rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
+[[package]]
+name = "rand_pcg"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "rand_xorshift"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
[[package]]
name = "rand_xoshiro"
version = "0.1.0"
@@ -994,31 +1385,31 @@ name = "raw-cpuid"
version = "6.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
"rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "rayon"
-version = "1.2.0"
+version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "rayon-core 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rayon-core 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "rayon-core"
-version = "1.6.0"
+version = "1.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "crossbeam-queue 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -1067,13 +1458,43 @@ dependencies = [
]
[[package]]
-name = "rustc-hash"
-version = "1.0.1"
+name = "reqwest"
+version = "0.9.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cookie_store 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "encoding_rs 0.8.20 (registry+https://github.com/rust-lang/crates.io-index)",
+ "flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)",
+ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
+ "http 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
+ "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)",
+ "hyper-tls 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "mime 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
+ "mime_guess 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_json 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_urlencoded 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-threadpool 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winreg 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
]
+[[package]]
+name = "rustc-demangle"
+version = "0.1.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
[[package]]
name = "rustc_version"
version = "0.2.3"
@@ -1084,7 +1505,7 @@ dependencies = [
[[package]]
name = "ryu"
-version = "1.0.0"
+version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
@@ -1095,6 +1516,15 @@ dependencies = [
"winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
]
+[[package]]
+name = "schannel"
+version = "0.1.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
[[package]]
name = "scopeguard"
version = "1.0.0"
@@ -1119,6 +1549,25 @@ dependencies = [
"syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)",
]
+[[package]]
+name = "security-framework"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+ "security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "security-framework-sys"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
[[package]]
name = "semver"
version = "0.9.0"
@@ -1134,10 +1583,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "serde"
-version = "1.0.101"
+version = "1.0.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "serde_derive 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_derive 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -1146,7 +1595,7 @@ version = "0.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -1154,37 +1603,56 @@ name = "serde_bytes"
version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "serde_derive"
-version = "1.0.101"
+version = "1.0.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
"quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "serde_json"
-version = "1.0.40"
+version = "1.0.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
-name = "shlex"
-version = "0.1.1"
+name = "serde_urlencoded"
+version = "0.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
+ "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "slab"
+version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "smallvec"
-version = "0.6.10"
+version = "0.6.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
@@ -1192,6 +1660,14 @@ name = "stable_deref_trait"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
+[[package]]
+name = "string"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
[[package]]
name = "strsim"
version = "0.8.0"
@@ -1199,33 +1675,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "structopt"
-version = "0.3.2"
+version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "structopt-derive 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "structopt-derive 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "structopt-derive"
-version = "0.3.2"
+version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
"proc-macro-error 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
"quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "syn"
-version = "0.11.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
- "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -1240,46 +1706,33 @@ dependencies = [
[[package]]
name = "syn"
-version = "1.0.5"
+version = "1.0.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
"quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
"unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
-[[package]]
-name = "synom"
-version = "0.11.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
[[package]]
name = "synstructure"
-version = "0.10.2"
+version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
-[[package]]
-name = "take_mut"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
[[package]]
name = "target-lexicon"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
+ "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_json 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -1287,22 +1740,14 @@ name = "tempfile"
version = "3.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
"rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
"redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)",
"remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
-[[package]]
-name = "termcolor"
-version = "1.0.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "wincolor 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
[[package]]
name = "textwrap"
version = "0.11.0"
@@ -1324,7 +1769,7 @@ name = "time"
version = "0.1.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
"redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -1334,24 +1779,152 @@ name = "tinytemplate"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_json 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "tokio"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
+ "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-reactor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-threadpool 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "tokio-buf"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "tokio-current-thread"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "tokio-executor"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "tokio-io"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "tokio-reactor"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-sync 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "tokio-sync"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "tokio-tcp"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
+ "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-reactor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "tokio-threadpool"
+version = "0.1.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "tokio-timer"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
+ "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "toml"
-version = "0.4.10"
+version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
-name = "toml"
-version = "0.5.3"
+name = "try-lock"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "try_from"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -1367,7 +1940,7 @@ dependencies = [
"erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
"inventory 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
"typetag-impl 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -1376,14 +1949,38 @@ name = "typetag-impl"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
"quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "unicase"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "unicode-segmentation"
-version = "1.3.0"
+version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
@@ -1391,11 +1988,6 @@ name = "unicode-width"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-[[package]]
-name = "unicode-xid"
-version = "0.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
[[package]]
name = "unicode-xid"
version = "0.1.0"
@@ -1406,6 +1998,39 @@ name = "unicode-xid"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
+[[package]]
+name = "url"
+version = "1.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "url"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "uuid"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "vcpkg"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
[[package]]
name = "vec_map"
version = "0.8.1"
@@ -1416,6 +2041,11 @@ name = "version_check"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
+[[package]]
+name = "version_check"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
[[package]]
name = "void"
version = "1.0.2"
@@ -1426,9 +2056,9 @@ name = "wabt"
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_derive 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_derive 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_json 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)",
"wabt-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -1437,7 +2067,7 @@ name = "wabt-sys"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
"cmake 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
"glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -1452,6 +2082,16 @@ dependencies = [
"winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
]
+[[package]]
+name = "want"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
[[package]]
name = "wasi"
version = "0.7.0"
@@ -1459,52 +2099,52 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "wasmer"
-version = "0.8.0"
+version = "0.11.0"
dependencies = [
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
"errno 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
"glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
- "structopt 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
+ "structopt 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
"typetag 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"wabt 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "wasmer-clif-backend 0.8.0",
- "wasmer-dev-utils 0.8.0",
- "wasmer-emscripten 0.8.0",
- "wasmer-emscripten-tests 0.8.0",
+ "wasmer-clif-backend 0.11.0",
+ "wasmer-dev-utils 0.11.0",
+ "wasmer-emscripten 0.11.0",
+ "wasmer-emscripten-tests 0.11.0",
"wasmer-kernel-loader 0.1.0",
- "wasmer-llvm-backend 0.8.0",
- "wasmer-middleware-common 0.8.0",
- "wasmer-middleware-common-tests 0.8.0",
- "wasmer-runtime 0.8.0",
- "wasmer-runtime-core 0.8.0",
- "wasmer-singlepass-backend 0.8.0",
- "wasmer-wasi 0.8.0",
- "wasmer-wasi-tests 0.8.0",
+ "wasmer-llvm-backend 0.11.0",
+ "wasmer-middleware-common 0.11.0",
+ "wasmer-middleware-common-tests 0.11.0",
+ "wasmer-runtime 0.11.0",
+ "wasmer-runtime-core 0.11.0",
+ "wasmer-singlepass-backend 0.11.0",
+ "wasmer-wasi 0.11.0",
+ "wasmer-wasi-tests 0.11.0",
]
[[package]]
name = "wasmer-clif-backend"
-version = "0.8.0"
+version = "0.11.0"
dependencies = [
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
"cranelift-codegen 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cranelift-entity 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cranelift-native 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
"nix 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "rayon 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rayon 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
"serde-bench 0.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_bytes 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_derive 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_derive 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
"target-lexicon 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
"wasmer-clif-fork-frontend 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)",
"wasmer-clif-fork-wasm 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "wasmer-runtime-core 0.8.0",
- "wasmer-win-exception-handler 0.8.0",
- "wasmparser 0.39.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "wasmer-runtime-core 0.11.0",
+ "wasmer-win-exception-handler 0.11.0",
+ "wasmparser 0.39.3 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -1515,7 +2155,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"cranelift-codegen 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
"target-lexicon 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -1526,231 +2166,242 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"cranelift-codegen 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cranelift-entity 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
"wasmer-clif-fork-frontend 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "wasmparser 0.39.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "wasmparser 0.39.3 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "wasmer-dev-utils"
-version = "0.8.0"
+version = "0.11.0"
dependencies = [
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "wasmer-emscripten"
-version = "0.8.0"
+version = "0.11.0"
dependencies = [
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
- "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
"time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
- "wasmer-runtime-core 0.8.0",
+ "wasmer-runtime-core 0.11.0",
]
[[package]]
name = "wasmer-emscripten-tests"
-version = "0.8.0"
+version = "0.11.0"
dependencies = [
"glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"wabt 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "wasmer-clif-backend 0.8.0",
- "wasmer-dev-utils 0.8.0",
- "wasmer-emscripten 0.8.0",
- "wasmer-llvm-backend 0.8.0",
- "wasmer-runtime-core 0.8.0",
- "wasmer-singlepass-backend 0.8.0",
+ "wasmer-clif-backend 0.11.0",
+ "wasmer-dev-utils 0.11.0",
+ "wasmer-emscripten 0.11.0",
+ "wasmer-llvm-backend 0.11.0",
+ "wasmer-runtime 0.11.0",
+ "wasmer-singlepass-backend 0.11.0",
]
[[package]]
name = "wasmer-kernel-loader"
version = "0.1.0"
dependencies = [
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
- "wasmer-runtime-core 0.8.0",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+ "wasmer-runtime-core 0.11.0",
]
[[package]]
name = "wasmer-llvm-backend"
-version = "0.8.0"
+version = "0.11.0"
dependencies = [
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "capstone 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
"goblin 0.0.24 (registry+https://github.com/rust-lang/crates.io-index)",
- "inkwell 0.1.0 (git+https://github.com/wasmerio/inkwell?branch=llvm8-0)",
+ "inkwell 0.1.0 (git+https://github.com/TheDan64/inkwell?rev=781620e9fa30e51a6e03bd0d49b5f5bb7a782520)",
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
"nix 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)",
"regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
"rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
"semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
"wabt 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "wasmer-runtime-core 0.8.0",
- "wasmparser 0.39.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "wasmer-runtime-core 0.11.0",
+ "wasmparser 0.39.3 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
-name = "wasmer-middleware-common"
-version = "0.8.0"
+name = "wasmer-llvm-backend-tests"
+version = "0.10.2"
dependencies = [
- "wasmer-runtime-core 0.8.0",
+ "wabt 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "wasmer-llvm-backend 0.11.0",
+ "wasmer-runtime 0.11.0",
+ "wasmer-runtime-core 0.11.0",
+]
+
+[[package]]
+name = "wasmer-middleware-common"
+version = "0.11.0"
+dependencies = [
+ "wasmer-runtime-core 0.11.0",
]
[[package]]
name = "wasmer-middleware-common-tests"
-version = "0.8.0"
+version = "0.11.0"
dependencies = [
"criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
"wabt 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "wasmer-clif-backend 0.8.0",
- "wasmer-llvm-backend 0.8.0",
- "wasmer-middleware-common 0.8.0",
- "wasmer-runtime-core 0.8.0",
- "wasmer-singlepass-backend 0.8.0",
+ "wasmer-clif-backend 0.11.0",
+ "wasmer-llvm-backend 0.11.0",
+ "wasmer-middleware-common 0.11.0",
+ "wasmer-runtime-core 0.11.0",
+ "wasmer-singlepass-backend 0.11.0",
]
[[package]]
name = "wasmer-runtime"
-version = "0.8.0"
+version = "0.11.0"
dependencies = [
"criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"wabt 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "wasmer-clif-backend 0.8.0",
- "wasmer-llvm-backend 0.8.0",
- "wasmer-runtime-core 0.8.0",
- "wasmer-singlepass-backend 0.8.0",
+ "wasmer-clif-backend 0.11.0",
+ "wasmer-llvm-backend 0.11.0",
+ "wasmer-runtime-core 0.11.0",
+ "wasmer-singlepass-backend 0.11.0",
]
[[package]]
name = "wasmer-runtime-c-api"
-version = "0.8.0"
+version = "0.11.0"
dependencies = [
"cbindgen 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
- "wasmer-runtime 0.8.0",
- "wasmer-runtime-core 0.8.0",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+ "wasmer-runtime 0.11.0",
+ "wasmer-runtime-core 0.11.0",
+ "wasmer-wasi 0.11.0",
]
[[package]]
name = "wasmer-runtime-core"
-version = "0.8.0"
+version = "0.11.0"
dependencies = [
- "bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "blake2b_simd 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bincode 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "blake2b_simd 0.5.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
"digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
"errno 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "field-offset 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
"hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "indexmap 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
"nix 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)",
"page_size 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
"parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
"rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
"serde-bench 0.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_bytes 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_derive 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
- "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
- "wasmparser 0.39.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_derive 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
+ "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
+ "wasmparser 0.39.3 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
-name = "wasmer-singlepass-backend"
-version = "0.8.0"
+name = "wasmer-runtime-core-tests"
+version = "0.11.0"
dependencies = [
+ "wabt 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "wasmer-clif-backend 0.11.0",
+ "wasmer-llvm-backend 0.11.0",
+ "wasmer-runtime-core 0.11.0",
+ "wasmer-singlepass-backend 0.11.0",
+]
+
+[[package]]
+name = "wasmer-singlepass-backend"
+version = "0.11.0"
+dependencies = [
+ "bincode 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "dynasm 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "dynasmrt 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "dynasm 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "dynasmrt 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
"nix 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
- "wasmer-runtime-core 0.8.0",
- "wasmparser 0.39.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_derive 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
+ "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
+ "wasmer-runtime-core 0.11.0",
]
[[package]]
name = "wasmer-spectests"
-version = "0.8.0"
+version = "0.11.0"
dependencies = [
"glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"wabt 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "wasmer-clif-backend 0.8.0",
- "wasmer-llvm-backend 0.8.0",
- "wasmer-runtime-core 0.8.0",
- "wasmer-singlepass-backend 0.8.0",
+ "wasmer-clif-backend 0.11.0",
+ "wasmer-llvm-backend 0.11.0",
+ "wasmer-runtime 0.11.0",
+ "wasmer-singlepass-backend 0.11.0",
]
[[package]]
name = "wasmer-wasi"
-version = "0.8.0"
+version = "0.11.0"
dependencies = [
- "bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bincode 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "generational-arena 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
+ "generational-arena 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
"time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
"typetag 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "wasmer-runtime-core 0.8.0",
+ "wasmer-runtime-core 0.11.0",
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "wasmer-wasi-tests"
-version = "0.8.0"
+version = "0.11.0"
dependencies = [
"glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "wasmer-clif-backend 0.8.0",
- "wasmer-dev-utils 0.8.0",
- "wasmer-llvm-backend 0.8.0",
- "wasmer-runtime 0.8.0",
- "wasmer-runtime-core 0.8.0",
- "wasmer-singlepass-backend 0.8.0",
- "wasmer-wasi 0.8.0",
+ "wasmer-clif-backend 0.11.0",
+ "wasmer-dev-utils 0.11.0",
+ "wasmer-llvm-backend 0.11.0",
+ "wasmer-runtime 0.11.0",
+ "wasmer-singlepass-backend 0.11.0",
+ "wasmer-wasi 0.11.0",
]
[[package]]
name = "wasmer-win-exception-handler"
-version = "0.8.0"
+version = "0.11.0"
dependencies = [
- "bindgen 0.51.1 (registry+https://github.com/rust-lang/crates.io-index)",
"cmake 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
- "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "wasmer-runtime-core 0.8.0",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+ "wasmer-runtime-core 0.11.0",
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "wasmparser"
-version = "0.39.1"
+version = "0.39.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-[[package]]
-name = "which"
-version = "3.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
[[package]]
name = "winapi"
version = "0.2.8"
@@ -1789,193 +2440,264 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
-name = "wincolor"
-version = "1.0.2"
+name = "winreg"
+version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "ws2_32-sys"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[metadata]
+"checksum adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2"
"checksum aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "58fb5e95d83b38284460a5fda7d6470aa0b8844d283a0b614b8535e880800d2d"
"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
"checksum arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee"
-"checksum arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b8d73f9beda665eaa98ab9e4f7442bd4e7de6652587de55b2525e52e29c1b0ba"
+"checksum arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8"
"checksum atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1803c647a3ec87095e7ae7acfca019e98de5ec9a7d01343f611cf3152ed71a90"
-"checksum autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b671c8fb71b457dd4ae18c4ba1e59aa81793daacc361d82fcd410cef0d491875"
-"checksum bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9f04a5e50dc80b3d5d35320889053637d15011aed5e66b66b37ae798c65da6f7"
-"checksum bindgen 0.51.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ebd71393f1ec0509b553aa012b9b58e81dadbdff7130bd3b8cba576e69b32f75"
-"checksum bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d155346769a6855b86399e9bc3814ab343cd3d62c7e985113d46a0ec3c281fd"
-"checksum blake2b_simd 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)" = "5850aeee1552f495dd0250014cf64b82b7c8879a89d83b33bbdace2cc4f63182"
+"checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2"
+"checksum backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)" = "924c76597f0d9ca25d762c25a4d369d51267536465dc5064bdf0eb073ed477ea"
+"checksum backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6575f128516de27e3ce99689419835fce9643a9b215a14d2b5b685be018491"
+"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e"
+"checksum bincode 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8ab639324e3ee8774d296864fbc0dbbb256cf1a41c490b94cba90c082915f92"
+"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
+"checksum blake2b_simd 0.5.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b83b7baab1e671718d78204225800d6b170e648188ac7dc992e9d6bddf87d0c0"
"checksum bstr 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8d6c2c5b58ab920a4f5aeaaca34b4488074e8cc7596af94e6f8c6ff247c60245"
"checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5"
-"checksum c2-chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7d64d04786e0f528460fc884753cf8dddcc466be308f6026f8e355c41a0e4101"
-"checksum capstone 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "031ba51c39151a1d6336ec859646153187204b0147c7b3f6fe2de636f1b8dbb3"
-"checksum capstone-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fae25eddcb80e24f98c35952c37a91ff7f8d0f60dbbdafb9763e8d5cc566b8d7"
-"checksum cargo_toml 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "097f5ce64ba566a83d9d914fd005de1e5937fdd57d8c5d99a7593040955d75a9"
-"checksum cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "926013f2860c46252efceabb19f4a6b308197505082c609025aa6706c011d427"
+"checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c"
+"checksum c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb"
+"checksum cargo_toml 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e7877b00aaf997d7ed66a81281d3a8b9f9da5361df05b72785b985349979a0f3"
+"checksum cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0"
"checksum cbindgen 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9daec6140ab4dcd38c3dd57e580b59a621172a526ac79f1527af760a55afeafd"
-"checksum cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)" = "4fc9a35e1f4290eb9e5fc54ba6cf40671ed2a2514c3eeb2b2a908dda2ea5a1be"
-"checksum cexpr 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a7fa24eb00d5ffab90eaeaf1092ac85c04c64aaf358ea6f84505b8116d24c6af"
-"checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33"
-"checksum clang-sys 0.28.1 (registry+https://github.com/rust-lang/crates.io-index)" = "81de550971c976f176130da4b2978d3b524eaa0fd9ac31f3ceb5ae1231fb4853"
+"checksum cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)" = "aa87058dce70a3ff5621797f1506cb837edd02ac4c0ae642b4542dce802908b8"
+"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
"checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9"
"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
"checksum cmake 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "81fb25b677f8bf1eb325017cb6bb8452f87969db0fedb4f757b297bee78a7c62"
"checksum constant_time_eq 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "995a44c877f9212528ccc74b21a232f66ad69001e40ede5bcee2ac9ef2657120"
+"checksum cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "888604f00b3db336d2af898ec3c1d5d0ddf5e6d462220f2ededc33a87ac4bbd5"
+"checksum cookie_store 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "46750b3f362965f197996c4448e4a0935e791bf7d6631bfce9ee0af3d24c919c"
+"checksum core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "25b9e03f145fd4f2bf705e07b900cd41fc636598fe5dc452fd0db1441c3f496d"
+"checksum core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b"
"checksum cranelift-bforest 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fff04f4ad82c9704a22e753c6268cc6a89add76f094b837cefbba1c665411451"
"checksum cranelift-codegen 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6ff4a221ec1b95df4b1d20a99fec4fe92a28bebf3a815f2eca72b26f9a627485"
"checksum cranelift-codegen-meta 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dd47f665e2ee8f177b97d1f5ce2bd70f54d3b793abb26d92942bfaa4a381fe9f"
"checksum cranelift-codegen-shared 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05bb95945fd940bd5fc2616b063ce69e55de3d9449a32fa40f6bb99a927085bf"
"checksum cranelift-entity 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e8753f15d9bde04988834705d437b6f6e4b4da0527968b8d40d7342262d43052"
"checksum cranelift-native 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fd16b58e95af9ee837218cf41e70306becc1fc7d7dada55dac42df5130a4a4ba"
+"checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1"
"checksum criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "0363053954f3e679645fc443321ca128b7b950a6fe288cf5f9335cc22ee58394"
"checksum criterion-plot 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "76f9212ddf2f4a9eb2d401635190600656a1f88a932ef53d06e7fa4c7e02fb8e"
-"checksum crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18cd2e169ad86297e6bc0ad9aa679aee9daa4f19e8163860faf7c164e4f5a71"
-"checksum crossbeam-epoch 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fedcd6772e37f3da2a9af9bf12ebe046c0dfe657992377b4df982a2b54cd37a9"
+"checksum crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3aa945d63861bfe624b55d153a39684da1e8c0bc8fba932f7ee3a3c16cea3ca"
+"checksum crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5064ebdbf05ce3cb95e45c8b086f72263f4166b29b97f6baff7ef7fe047b55ac"
"checksum crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b"
+"checksum crossbeam-queue 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dfd6515864a82d2f877b42813d4553292c6659498c9a2aa31bab5a15243c2700"
"checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6"
+"checksum crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce446db02cdc3165b94ae73111e570793400d0794e46125cc4056c81cbb039f4"
"checksum csv 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "37519ccdfd73a75821cac9319d4fce15a81b9fcf75f951df5b9988aa3a0af87d"
"checksum csv-core 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9b5cadb6b25c77aeff80ba701712494213f4a8418fcda2ee11b6560c3ad0bf4c"
-"checksum ctor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "5b6b2f4752cc29efbfd03474c532ce8f916f2d44ec5bb8c21f93bc76e5365528"
+"checksum ctor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "cd8ce37ad4184ab2ce004c33bf6379185d3b1c95801cab51026bd271bf68eedc"
"checksum digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5"
-"checksum dynasm 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f36d49ab6f8ecc642d2c6ee10fda04ba68003ef0277300866745cdde160e6b40"
-"checksum dynasmrt 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a4c408a211e7f5762829f5e46bdff0c14bc3b1517a21a4bb781c716bf88b0c68"
-"checksum either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5527cfe0d098f36e3f8839852688e63c8fff1c90b2b405aef730615f9a7bcf7b"
-"checksum enum-methods 0.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7798e7da2d4cb0d6d6fc467e8d6b5bf247e9e989f786dde1732d79899c32bb10"
-"checksum env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "aafcde04e90a5226a6443b7aabdb016ba2f8307c847d524724bd9b346dd1a2d3"
+"checksum dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ea57b42383d091c85abcc2706240b94ab2a8fa1fc81c10ff23c4de06e2a90b5e"
+"checksum dynasm 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "42a814e1edeb85dd2a3c6fc0d6bf76d02ca5695d438c70ecee3d90774f3259c5"
+"checksum dynasmrt 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8a393aaeb4441a48bcf47b5b6155971f82cc1eb77e22855403ccc0415ac8328d"
+"checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3"
+"checksum encoding_rs 0.8.20 (registry+https://github.com/rust-lang/crates.io-index)" = "87240518927716f79692c2ed85bfe6e98196d18c6401ec75355760233a7e12e9"
"checksum erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3beee4bc16478a1b26f2e80ad819a52d24745e292f521a63c16eea5f74b7eb60"
"checksum errno 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c2a071601ed01b988f896ab14b95e67335d1eeb50190932a1320f7fe3cadc84e"
"checksum errno-dragonfly 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "14ca354e36190500e1e1fb267c647932382b54053c50b14970856c0b00a35067"
-"checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2"
-"checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1"
-"checksum field-offset 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "64e9bc339e426139e02601fa69d101e96a92aee71b58bc01697ec2a63a5c9e68"
+"checksum error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3ab49e9dcb602294bc42f9a7dfc9bc6e936fca4418ea300dbfb84fe16de0b7d9"
+"checksum failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f8273f13c977665c5db7eb2b99ae520952fe5ac831ae4cd09d80c4c7042b5ed9"
+"checksum failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0bc225b78e0391e4b8683440bf2e63c2deeeb2ce5189eab46e2b68c6d3725d08"
+"checksum flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6bd6d6f4752952feb71363cffc9ebac9411b75b87c6ab6058c40c8900cf43c0f"
+"checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3"
+"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
+"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
+"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
+"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
+"checksum futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)" = "1b980f2816d6ee8673b6517b52cb0e808a180efc92e5c19d02cdda79066703ef"
+"checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4"
"checksum gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)" = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2"
-"checksum generational-arena 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "921c3803adaeb9f9639de5149d9f0f9f4b79f00c423915b701db2e02ed80b9ce"
+"checksum generational-arena 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "675c9623fbcdb4b402176db720bf5d95883a36303703ed1bd3a03482382f735a"
"checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec"
-"checksum getrandom 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "473a1265acc8ff1e808cd0a1af8cee3c2ee5200916058a2ca113c29f2d903571"
+"checksum getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "e7db7ca94ed4cd01190ceee0d8a8052f08a247aa1b469a7f68c6a3b71afcf407"
"checksum ghost 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2a36606a68532b5640dc86bb1f33c64b45c4682aad4c50f3937b317ea387f3d6"
"checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb"
"checksum glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
"checksum goblin 0.0.24 (registry+https://github.com/rust-lang/crates.io-index)" = "e3fa261d919c1ae9d1e4533c4a2f99e10938603c4208d56c05bec7a872b661b0"
+"checksum h2 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462"
"checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205"
+"checksum hermit-abi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "307c3c9f937f38e3534b1d6447ecf090cafcc9744e4a6360e8b037b2cf5af120"
"checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77"
-"checksum humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f"
-"checksum indexmap 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a61202fbe46c4a951e9404a720a0180bcf3212c750d735cb5c4ba4dc551299f3"
-"checksum inkwell 0.1.0 (git+https://github.com/wasmerio/inkwell?branch=llvm8-0)" = ""
-"checksum inkwell_internal_macros 0.1.0 (git+https://github.com/wasmerio/inkwell?branch=llvm8-0)" = ""
+"checksum http 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)" = "d7e06e336150b178206af098a055e3621e8336027e2b4d126bda0bc64824baaf"
+"checksum http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d"
+"checksum httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9"
+"checksum hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)" = "9dbe6ed1438e1f8ad955a4701e9a944938e9519f6888d12d8558b645e247d5f6"
+"checksum hyper-tls 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3a800d6aa50af4b5850b2b0f659625ce9504df908e9733b635720483be26174f"
+"checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e"
+"checksum idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9"
+"checksum indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d7b3ea5827fcb9d4fda14bf4da5f136f0db2ae9c8f4bd4e2d1c6fde4e6db2"
+"checksum inkwell 0.1.0 (git+https://github.com/TheDan64/inkwell?rev=781620e9fa30e51a6e03bd0d49b5f5bb7a782520)" = ""
+"checksum inkwell_internals 0.1.0 (git+https://github.com/TheDan64/inkwell?rev=781620e9fa30e51a6e03bd0d49b5f5bb7a782520)" = ""
"checksum inventory 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f4cece20baea71d9f3435e7bbe9adf4765f091c5fe404975f844006964a71299"
"checksum inventory-impl 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c2869bf972e998977b1cb87e60df70341d48e48dca0823f534feb91ea44adaf9"
-"checksum itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b8467d9c1cebe26feb08c640139247fac215782d35371ade9a2136ed6085358"
+"checksum iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e"
+"checksum itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484"
"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f"
"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
-"checksum libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)" = "34fcd2c08d2f832f376f4173a231990fa5aef4e99fb569867318a227ef4c06ba"
-"checksum libloading 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753"
+"checksum libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)" = "1a31a0627fdf1f6a39ec0dd577e101440b7db22672c0901fe00a9a6fbb5c24e8"
"checksum llvm-sys 80.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2110cd4daf9cd8e39dd3b933b1a2a2ac7315e91f7c92b3a20beab526c63b5978"
-"checksum lock_api 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f8912e782533a93a167888781b836336a6ca5da6175c05944c86cf28c31104dc"
+"checksum lock_api 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e57b3997725d2b60dbec1297f6c2e2957cc383db1cebd6be812163f969c7d586"
"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7"
+"checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
+"checksum maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
"checksum md5 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e6bcd6433cff03a4bfc3d9834d504467db1f1cf6d0ea765d37d330249ed629d"
"checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e"
-"checksum memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e2ffa2c986de11a9df78620c01eeaaf27d94d3ff02bf81bfcca953102dd0c6ff"
"checksum memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b"
-"checksum memoffset 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ce6075db033bbbb7ee5a0bbd3a3186bbae616f57fb001c485c7ff77955f8177f"
+"checksum memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "75189eb85871ea5c2e2c15abbdd541185f63b408415e5051f5cac122d8c774b9"
+"checksum mime 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "dd1d63acd1b78403cc0c325605908475dd9b9a3acbf65ed8bcab97e27014afcf"
+"checksum mime_guess 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1a0ed03949aef72dbdf3116a383d7b38b4768e6f960528cd6a6044aa9ed68599"
+"checksum miniz_oxide 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6f3f74f726ae935c3f514300cc6773a0c9492abc5e972d42ba0c0ebb88757625"
+"checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23"
+"checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919"
+"checksum native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b2df1a4c22fd44a62147fd8f13dd0f95c9d8ca7b2610299b2a2f9cf8964274e"
+"checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88"
"checksum nix 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3b2e0b4f3320ed72aaedb9a5ac838690a8047c7b275da22711fddff4f8a14229"
-"checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945"
-"checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6"
-"checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32"
-"checksum num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcef43580c035376c0705c42792c294b66974abbfd2789b511784023f71f3273"
-"checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37"
+"checksum num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c81ffc11c212fa327657cb19dd85eb7419e163b5b076bede2bdb5c974c07e4"
+"checksum num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "76dac5ed2a876980778b8b85f75a71b6cbf0db0b1232ee12f826bccb00d09d72"
+"checksum once_cell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "891f486f630e5c5a4916c7e16c4b24a53e78c860b646e9f8e005e4f16847bfed"
+"checksum openssl 0.10.26 (registry+https://github.com/rust-lang/crates.io-index)" = "3a3cc5799d98e1088141b8e01ff760112bbd9f19d850c124500566ca6901a585"
+"checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de"
+"checksum openssl-sys 0.9.53 (registry+https://github.com/rust-lang/crates.io-index)" = "465d16ae7fc0e313318f7de5cecf57b2fbe7511fd213978b457e1c96ff46736f"
+"checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13"
"checksum page_size 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f89ef58b3d32420dbd1a43d2f38ae92f6239ef12bb556ab09ca55445f5a67242"
"checksum parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252"
"checksum parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b"
-"checksum peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
+"checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831"
+"checksum percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
+"checksum pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)" = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677"
"checksum plain 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6"
-"checksum ppv-lite86 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e3cbf9f658cdb5000fcf6f362b8ea2ba154b9f146a61c7a20d647034c6b6561b"
+"checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b"
"checksum proc-macro-error 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "aeccfe4d5d8ea175d5f0e4a2ad0637e0f4121d63bd99d356fb1f39ab2e7c6097"
"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759"
-"checksum proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e98a83a9f9b331f54b924e68a66acb1bb35cb01fb0a23645139967abefb697e8"
-"checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0"
-"checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a"
+"checksum proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9c9e470a8dc4aeae2dee2f335e8f533e2d4b347e1434e5671afc49b054592f27"
+"checksum publicsuffix 1.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3bbaa49075179162b49acac1c6aa45fb4dafb5f13cf6794276d77bc7fd95757b"
"checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1"
"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
+"checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca"
"checksum rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3ae1b169243eaf61759b8475a998f0a385e42042370f3a7dbaf35246eacc8412"
+"checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef"
"checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853"
"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
"checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
"checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
+"checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4"
"checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
+"checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08"
+"checksum rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b"
"checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071"
+"checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44"
+"checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c"
"checksum rand_xoshiro 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "03b418169fb9c46533f326efd6eed2576699c44ca92d3052a066214a8d828929"
"checksum raw-cpuid 6.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "30a9d219c32c9132f7be513c18be77c9881c7107d2ab5569d205a6a0f0e6dc7d"
-"checksum rayon 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "83a27732a533a1be0a0035a111fe76db89ad312f6f0347004c220c57f209a123"
-"checksum rayon-core 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "98dcf634205083b17d0861252431eb2acbfb698ab7478a2d20de07954f47ec7b"
+"checksum rayon 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "43739f8831493b276363637423d3622d4bd6394ab6f0a9c4a552e208aeb7fddd"
+"checksum rayon-core 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f8bf17de6f23b05473c437eb958b9c850bfc8af0961fe17b4cc92d5a627b4791"
"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
"checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84"
"checksum regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dc220bd33bdce8f093101afe22a037b8eb0e5af33592e6a9caafff0d4cb81cbd"
"checksum regex-automata 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "92b73c2a1770c255c240eaa4ee600df1704a38dc3feaa6e949e7fcd4f8dc09f9"
"checksum regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "11a7e20d1cce64ef2fed88b66d347f88bd9babb82845b2b858f3edbf59a4f716"
"checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e"
-"checksum rustc-hash 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7540fc8b0c49f096ee9c961cda096467dce8084bec6bdca2fc83895fd9b28cb8"
+"checksum reqwest 0.9.22 (registry+https://github.com/rust-lang/crates.io-index)" = "2c2064233e442ce85c77231ebd67d9eca395207dec2127fe0bbedde4bd29a650"
+"checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783"
"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
-"checksum ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c92464b447c0ee8c4fb3824ecc8383b81717b9f1e74ba2e72540aef7b9f82997"
+"checksum ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8"
"checksum same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "585e8ddcedc187886a30fa705c47985c3fa88d06624095856b36ca0b82ff4421"
+"checksum schannel 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "87f550b06b6cba9c8b8be3ee73f391990116bf527450d2556e9b9ce263b9a021"
"checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d"
"checksum scroll 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f84d114ef17fd144153d608fba7c446b0145d038985e7a8cc5d08bb0ce20383"
"checksum scroll_derive 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8f1aa96c45e7f5a91cb7fabe7b279f02fea7126239fc40b732316e8b6a2d0fcb"
+"checksum security-framework 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8ef2429d7cefe5fd28bd1d2ed41c944547d4ff84776f5935b456da44593a16df"
+"checksum security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e31493fc37615debb8c5090a7aeb4a9730bc61e77ab10b9af59f1a202284f895"
"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
-"checksum serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)" = "9796c9b7ba2ffe7a9ce53c2287dfc48080f4b2b362fcc245a259b3a7201119dd"
+"checksum serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)" = "1217f97ab8e8904b57dd22eb61cde455fa7446a9c1cf43966066da047c1f3702"
"checksum serde-bench 0.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "d733da87e79faaac25616e33d26299a41143fd4cd42746cbb0e91d8feea243fd"
"checksum serde_bytes 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "45af0182ff64abaeea290235eb67da3825a576c5d53e642c4d5b652e12e6effc"
-"checksum serde_derive 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)" = "4b133a43a1ecd55d4086bd5b4dc6c1751c68b1bfbeba7a5040442022c7e7c02e"
-"checksum serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)" = "051c49229f282f7c6f3813f8286cc1e3323e8051823fce42c7ea80fe13521704"
-"checksum shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2"
-"checksum smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "ab606a9c5e214920bb66c458cd7be8ef094f813f20fe77a54cc7dbfff220d4b7"
+"checksum serde_derive 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)" = "a8c6faef9a2e64b0064f48570289b4bf8823b7581f1d6157c1b52152306651d0"
+"checksum serde_json 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)" = "1a3351dcbc1f067e2c92ab7c3c1f288ad1a4cffc470b5aaddb4c2e0a3ae80043"
+"checksum serde_urlencoded 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "642dd69105886af2efd227f75a520ec9b44a820d65bc133a9131f7d229fd165a"
+"checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
+"checksum smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6"
+"checksum smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4ecf3b85f68e8abaa7555aa5abdb1153079387e60b718283d732f03897fcfc86"
"checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8"
+"checksum string 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d"
"checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
-"checksum structopt 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe8d3289b63ef2f196d89e7701f986583c0895e764b78f052a55b9b5d34d84a"
-"checksum structopt-derive 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f3add731f5b4fb85931d362a3c92deb1ad7113649a8d51701fb257673705f122"
-"checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad"
+"checksum structopt 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "30b3a3e93f5ad553c38b3301c8a0a0cec829a36783f6a0c467fc4bf553a5f5bf"
+"checksum structopt-derive 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea692d40005b3ceba90a9fe7a78fa8d4b82b0ce627eebbffc329aab850f3410e"
"checksum syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)" = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5"
-"checksum syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "66850e97125af79138385e9b88339cbcd037e3f28ceab8c5ad98e64f0f1f80bf"
-"checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6"
-"checksum synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f"
-"checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60"
+"checksum syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "661641ea2aa15845cddeb97dad000d22070bb5c1fb456b96c1cba883ec691e92"
+"checksum synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545"
"checksum target-lexicon 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7975cb2c6f37d77b190bc5004a2bb015971464756fde9514651a525ada2a741a"
"checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9"
-"checksum termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "96d6098003bde162e4277c70665bd87c326f5a0c3f3fbfb285787fa482d54e6e"
"checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b"
"checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f"
"checksum tinytemplate 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4574b75faccaacddb9b284faecdf0b544b80b6b294f3d062d325c5726a209c20"
-"checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f"
-"checksum toml 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c7aabe75941d914b72bf3e5d3932ed92ce0664d49d8432305a8b547c37227724"
+"checksum tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)" = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6"
+"checksum tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46"
+"checksum tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "d16217cad7f1b840c5a97dfb3c43b0c871fef423a6e8d2118c604e843662a443"
+"checksum tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "0f27ee0e6db01c5f0b2973824547ce7e637b2ed79b891a9677b0de9bd532b6ac"
+"checksum tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926"
+"checksum tokio-reactor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "c56391be9805bc80163151c0b9e5164ee64f4b0200962c346fea12773158f22d"
+"checksum tokio-sync 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "d06554cce1ae4a50f42fba8023918afa931413aded705b560e29600ccf7c6d76"
+"checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119"
+"checksum tokio-threadpool 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "2bd2c6a3885302581f4401c82af70d792bb9df1700e7437b0aeb4ada94d5388c"
+"checksum tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "f2106812d500ed25a4f38235b9cae8f78a09edf43203e16e59c3b769a342a60e"
+"checksum toml 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "01d1404644c8b12b16bfcffa4322403a91a451584daaaa7c28d3152e6cbc98cf"
+"checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382"
+"checksum try_from 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "283d3b89e1368717881a9d51dad843cc435380d8109c9e47d38780a324698d8b"
"checksum typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9"
"checksum typetag 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6ebb2c484029d695fb68a06d80e1536c68d491b3e0cf874c66abed255e831cfe"
"checksum typetag-impl 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b63fd4799e4d0ec5cf0b055ebb8e2c3a657bbf76a84f6edc77ca60780e000204"
-"checksum unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1967f4cdfc355b37fd76d2a954fb2ed3871034eb4f26d60537d88795cfc332a9"
+"checksum unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6"
+"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
+"checksum unicode-normalization 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b561e267b2326bb4cebfc0ef9e68355c7abe6c6f522aeac2f5bf95d56c59bdcf"
+"checksum unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0"
"checksum unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7007dbd421b92cc6e28410fe7362e2e0a2503394908f417b68ec8d1c364c4e20"
-"checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc"
"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
+"checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a"
+"checksum url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "75b414f6c464c879d7f9babf951f23bc3743fb7313c081b2e6ca719067ea9d61"
+"checksum uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "90dbc611eb48397705a6b0f6e917da23ae517e4d127123d2cf7674206627d32a"
+"checksum vcpkg 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "33dd455d0f96e90a75803cfeb7f948768c08d70a6de9a8d2362461935698bf95"
"checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a"
"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
+"checksum version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce"
"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
"checksum wabt 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3c5c5c1286c6e578416982609f47594265f9d489f9b836157d403ad605a46693"
"checksum wabt-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "af5d153dc96aad7dc13ab90835b892c69867948112d95299e522d370c4e13a08"
"checksum walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9658c94fa8b940eab2250bd5a457f9c48b748420d71293b165c8cdbe2f55f71e"
+"checksum want 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230"
"checksum wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d"
"checksum wasmer-clif-fork-frontend 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0cf2f552a9c1fda0555087170424bd8fedc63a079a97bb5638a4ef9b0d9656aa"
"checksum wasmer-clif-fork-wasm 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0073b512e1af5948d34be7944b74c747bbe735ccff2e2f28c26ed4c90725de8e"
-"checksum wasmparser 0.39.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a026c1436af49d5537c7561c7474f81f7a754e36445fe52e6e88795a9747291c"
-"checksum which 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "240a31163872f7e8e49f35b42b58485e35355b07eb009d9f3686733541339a69"
+"checksum wasmparser 0.39.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c702914acda5feeeffbc29e4d953e5b9ce79d8b98da4dbf18a77086e116c5470"
"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6"
"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
"checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9"
"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
-"checksum wincolor 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "96f5016b18804d24db43cebf3c77269e7569b8954a8464501c216cc5e070eaa9"
+"checksum winreg 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9"
+"checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
diff --git a/Cargo.toml b/Cargo.toml
index 4d619059e..557fade49 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,12 +1,13 @@
[package]
name = "wasmer"
-version = "0.8.0"
+version = "0.11.0"
authors = ["The Wasmer Engineering Team "]
edition = "2018"
repository = "https://github.com/wasmerio/wasmer"
publish = true
description = "High-Performance WebAssembly JIT interpreter"
license = "MIT"
+default-run = "wasmer"
include = [
"examples/**/*",
"src/**/*",
@@ -23,7 +24,7 @@ byteorder = "1.3"
errno = "0.2"
structopt = "0.3"
wabt = "0.9.1"
-wasmer-clif-backend = { path = "lib/clif-backend" }
+wasmer-clif-backend = { path = "lib/clif-backend", optional = true }
wasmer-singlepass-backend = { path = "lib/singlepass-backend", optional = true }
wasmer-middleware-common = { path = "lib/middleware-common" }
wasmer-runtime = { path = "lib/runtime" }
@@ -43,11 +44,13 @@ members = [
"lib/singlepass-backend",
"lib/runtime",
"lib/runtime-core",
+ "lib/runtime-core-tests",
"lib/emscripten",
"lib/spectests",
"lib/win-exception-handler",
"lib/runtime-c-api",
"lib/llvm-backend",
+ "lib/llvm-backend-tests",
"lib/wasi",
"lib/middleware-common",
"lib/kernel-loader",
@@ -56,8 +59,8 @@ members = [
"lib/wasi-tests",
"lib/emscripten-tests",
"lib/middleware-common-tests",
- "examples/plugin-for-example",
"examples/parallel",
+ "examples/plugin-for-example",
"examples/parallel-guest",
]
@@ -71,32 +74,31 @@ serde = { version = "1", features = ["derive"] } # used by the plugin example
typetag = "0.1" # used by the plugin example
[features]
-default = ["fast-tests", "wasi", "backend-cranelift"]
+default = ["fast-tests", "wasi"]
"loader-kernel" = ["wasmer-kernel-loader"]
debug = ["wasmer-runtime-core/debug"]
trace = ["wasmer-runtime-core/trace"]
+docs = ["wasmer-runtime/docs"]
extra-debug = ["wasmer-clif-backend/debug", "wasmer-runtime-core/debug"]
# This feature will allow cargo test to run much faster
fast-tests = []
backend-cranelift = [
+ "wasmer-clif-backend",
"wasmer-runtime-core/backend-cranelift",
"wasmer-runtime/cranelift",
"wasmer-middleware-common-tests/clif",
- "wasmer-wasi-tests/clif"
]
backend-llvm = [
"wasmer-llvm-backend",
"wasmer-runtime-core/backend-llvm",
"wasmer-runtime/llvm",
"wasmer-middleware-common-tests/llvm",
- "wasmer-wasi-tests/llvm"
]
backend-singlepass = [
"wasmer-singlepass-backend",
"wasmer-runtime-core/backend-singlepass",
"wasmer-runtime/singlepass",
"wasmer-middleware-common-tests/singlepass",
- "wasmer-wasi-tests/singlepass"
]
wasi = ["wasmer-wasi"]
managed = ["backend-singlepass", "wasmer-runtime-core/managed"]
diff --git a/Dockerfile b/Dockerfile
index 43fcda359..73507be30 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM circleci/rust:1.33.0-stretch as wasmer-build-env
+FROM circleci/rust:1.38.0-stretch as wasmer-build-env
RUN sudo apt-get update && \
sudo apt-get install -y --no-install-recommends \
cmake \
@@ -17,9 +17,9 @@ FROM wasmer-build-env AS wasmer-build
WORKDIR /home/circleci/wasmer
COPY . /home/circleci/wasmer
RUN sudo chmod -R 777 .
-RUN cargo build --release
+RUN cargo build --release --features backend-cranelift
FROM debian:stretch AS wasmer
WORKDIR /root/
COPY --from=wasmer-build /home/circleci/wasmer/target/release/wasmer .
-ENTRYPOINT ["./wasmer"]
\ No newline at end of file
+ENTRYPOINT ["./wasmer"]
diff --git a/Makefile b/Makefile
index 58b85dbb1..4acde7925 100644
--- a/Makefile
+++ b/Makefile
@@ -25,7 +25,7 @@ generate: generate-spectests generate-emtests generate-wasitests
# Spectests
spectests-singlepass:
- cargo test --manifest-path lib/spectests/Cargo.toml --release --features singlepass -- --nocapture
+ cargo test --manifest-path lib/spectests/Cargo.toml --release --features singlepass -- --nocapture --test-threads 1
spectests-cranelift:
cargo test --manifest-path lib/spectests/Cargo.toml --release --features clif -- --nocapture
@@ -89,24 +89,43 @@ wasitests: wasitests-unit wasitests-singlepass wasitests-cranelift wasitests-llv
# Backends
singlepass: spectests-singlepass emtests-singlepass middleware-singlepass wasitests-singlepass
cargo test -p wasmer-singlepass-backend --release
+ cargo test -p wasmer-runtime-core-tests --release --no-default-features --features backend-singlepass
cranelift: spectests-cranelift emtests-cranelift middleware-cranelift wasitests-cranelift
cargo test -p wasmer-clif-backend --release
+ cargo test -p wasmer-runtime-core-tests --release
llvm: spectests-llvm emtests-llvm wasitests-llvm
cargo test -p wasmer-llvm-backend --release
+ cargo test -p wasmer-llvm-backend-tests --release
+ cargo test -p wasmer-runtime-core-tests --release --no-default-features --features backend-llvm
# All tests
capi:
- cargo build --release
+ cargo build --release --features backend-cranelift
cargo build -p wasmer-runtime-c-api --release
test-capi: capi
cargo test -p wasmer-runtime-c-api --release
+capi-test: test-capi
+
test-rest:
- cargo test --release --all --exclude wasmer-runtime-c-api --exclude wasmer-emscripten --exclude wasmer-spectests --exclude wasmer-wasi --exclude wasmer-middleware-common --exclude wasmer-middleware-common-tests --exclude wasmer-singlepass-backend --exclude wasmer-clif-backend --exclude wasmer-llvm-backend --exclude wasmer-wasi-tests --exclude wasmer-emscripten-tests
+ cargo test --release \
+ --all \
+ --exclude wasmer-runtime-c-api \
+ --exclude wasmer-emscripten \
+ --exclude wasmer-spectests \
+ --exclude wasmer-wasi \
+ --exclude wasmer-middleware-common \
+ --exclude wasmer-middleware-common-tests \
+ --exclude wasmer-singlepass-backend \
+ --exclude wasmer-clif-backend \
+ --exclude wasmer-llvm-backend \
+ --exclude wasmer-wasi-tests \
+ --exclude wasmer-emscripten-tests \
+ --exclude wasmer-runtime-core-tests
circleci-clean:
@if [ ! -z "${CIRCLE_JOB}" ]; then rm -f /home/circleci/project/target/debug/deps/libcranelift_wasm* && rm -f /Users/distiller/project/target/debug/deps/libcranelift_wasm*; fi;
@@ -133,37 +152,82 @@ lint:
precommit: lint test
debug:
- cargo build --release --features backend-singlepass,debug,trace
+ cargo build --release --features backend-cranelift,backend-singlepass,debug,trace
install:
cargo install --path .
# Checks
check-bench-singlepass:
- cargo bench --all --no-run --no-default-features --features "backend-singlepass" \
+ cargo check --benches --all --no-default-features --features "backend-singlepass" \
--exclude wasmer-clif-backend --exclude wasmer-llvm-backend --exclude wasmer-kernel-loader
check-bench-clif:
- cargo bench --all --no-run --no-default-features --features "backend-cranelift" \
+ cargo check --benches --all --no-default-features --features "backend-cranelift" \
--exclude wasmer-singlepass-backend --exclude wasmer-llvm-backend --exclude wasmer-kernel-loader \
--exclude wasmer-middleware-common-tests
check-bench-llvm:
- cargo bench --all --no-run --no-default-features --features "backend-llvm" \
+ cargo check --benches --all --no-default-features --features "backend-llvm" \
--exclude wasmer-singlepass-backend --exclude wasmer-clif-backend --exclude wasmer-kernel-loader
check-bench: check-bench-singlepass check-bench-llvm
+# TODO: We wanted `--workspace --exclude wasmer-runtime`, but can't due
+# to https://github.com/rust-lang/cargo/issues/6745 .
+NOT_RUNTIME_CRATES = -p wasmer-clif-backend -p wasmer-singlepass-backend -p wasmer-middleware-common -p wasmer-runtime-core -p wasmer-emscripten -p wasmer-llvm-backend -p wasmer-wasi -p wasmer-kernel-loader -p wasmer-dev-utils -p wasmer-wasi-tests -p wasmer-middleware-common-tests -p wasmer-emscripten-tests
+RUNTIME_CHECK = cargo check --manifest-path lib/runtime/Cargo.toml --no-default-features
check: check-bench
- cargo check --release --features backend-singlepass,backend-llvm,loader-kernel,debug
+ cargo check $(NOT_RUNTIME_CRATES)
+ cargo check --release $(NOT_RUNTIME_CRATES)
+ cargo check --all-features $(NOT_RUNTIME_CRATES)
+ cargo check --release --all-features $(NOT_RUNTIME_CRATES)
+ # wasmer-runtime doesn't work with all backends enabled at once.
+ #
+ # We test using manifest-path directly so as to disable the default.
+ # `--no-default-features` only disables the default features in the
+ # current package, not the package specified by `-p`. This is
+ # intentional.
+ #
+ # Test default features, test 'debug' feature only in non-release
+ # builds, test as many combined features as possible with each backend
+ # as default, and test a minimal set of features with only one backend
+ # at a time.
+ cargo check --manifest-path lib/runtime/Cargo.toml
+ cargo check --release --manifest-path lib/runtime/Cargo.toml
+
+ $(RUNTIME_CHECK) \
+ --features=cranelift,cache,debug,llvm,singlepass,default-backend-singlepass
+ $(RUNTIME_CHECK) --release \
+ --features=cranelift,cache,llvm,singlepass,default-backend-singlepass
+ $(RUNTIME_CHECK) \
+ --features=cranelift,cache,debug,llvm,singlepass,default-backend-cranelift
+ $(RUNTIME_CHECK) --release \
+ --features=cranelift,cache,llvm,singlepass,default-backend-cranelift
+ $(RUNTIME_CHECK) \
+ --features=cranelift,cache,debug,llvm,singlepass,default-backend-llvm
+ $(RUNTIME_CHECK) --release \
+ --features=cranelift,cache,llvm,singlepass,default-backend-llvm
+ $(RUNTIME_CHECK) \
+ --features=singlepass,default-backend-singlepass,debug
+ $(RUNTIME_CHECK) --release \
+ --features=singlepass,default-backend-singlepass
+ $(RUNTIME_CHECK) \
+ --features=cranelift,default-backend-cranelift,debug
+ $(RUNTIME_CHECK) --release \
+ --features=cranelift,default-backend-cranelift
+ $(RUNTIME_CHECK) \
+ --features=llvm,default-backend-llvm,debug
+ $(RUNTIME_CHECK) --release \
+ --features=llvm,default-backend-llvm
# Release
release:
- cargo build --release --features backend-singlepass,backend-llvm,loader-kernel
+ cargo build --release --features backend-singlepass,backend-cranelift,backend-llvm,loader-kernel
# Only one backend (cranelift)
release-clif:
# If you are on macOS, you will need mingw-w64 for cross compiling to Windows
# brew install mingw-w64
- cargo build --release
+ cargo build --release --features backend-cranelift
release-singlepass:
cargo build --release --features backend-singlepass
@@ -202,4 +266,7 @@ dep-graph:
cargo deps --optional-deps --filter wasmer-wasi wasmer-wasi-tests wasmer-kernel-loader wasmer-dev-utils wasmer-llvm-backend wasmer-emscripten wasmer-emscripten-tests wasmer-runtime-core wasmer-runtime wasmer-middleware-common wasmer-middleware-common-tests wasmer-singlepass-backend wasmer-clif-backend wasmer --manifest-path Cargo.toml | dot -Tpng > wasmer_depgraph.png
docs:
- cargo doc --features=backend-singlepass,backend-llvm,wasi,managed
+ cargo doc --features=backend-singlepass,backend-cranelift,backend-llvm,docs,wasi,managed
+
+wapm:
+ cargo build --release --manifest-path wapm-cli/Cargo.toml --features "telemetry update-notifications"
diff --git a/README.md b/README.md
index e69fe2d1c..0391bbd9b 100644
--- a/README.md
+++ b/README.md
@@ -8,6 +8,9 @@
+
+
+
@@ -21,9 +24,9 @@
## Introduction
-[Wasmer](https://wasmer.io/) is a standalone WebAssembly runtime for running WebAssembly [outside of the browser](https://webassembly.org/docs/non-web/), supporting [WASI](https://github.com/WebAssembly/WASI) and [Emscripten](https://emscripten.org/).
+[Wasmer](https://wasmer.io/) is a standalone WebAssembly runtime for running WebAssembly [outside of the browser](https://webassembly.org/docs/non-web/), supporting [WASI](https://github.com/WebAssembly/WASI) and [Emscripten](https://emscripten.org/). Wasmer can be used standalone (via the CLI) and embedded in different languages, running in x86 and [ARM devices](https://medium.com/wasmer/running-webassembly-on-arm-7d365ed0e50c).
-Install the Wasmer CLI with:
+Install the Wasmer and [WAPM](https://wapm.io) cli with:
```sh
curl https://get.wasmer.io -sSfL | sh
@@ -44,6 +47,7 @@ Wasmer runtime can be used as a library embedded in different languages, so you
|  | [**PHP**](https://github.com/wasmerio/php-ext-wasm) | Wasmer | actively developed |  |  |
|  | [**Ruby**](https://github.com/wasmerio/ruby-ext-wasm) | Wasmer | actively developed |  |  |
|  | [**Postgres**](https://github.com/wasmerio/postgres-ext-wasm) | Wasmer | actively developed |  |  |
+|  | [**JavaScript**](https://github.com/wasmerio/wasmer-js) | Wasmer | actively developed |  |  |
|  | [**C#/.Net**](https://github.com/migueldeicaza/WasmerSharp) | [Miguel de Icaza](https://github.com/migueldeicaza) | actively developed |  |  |
|  | [**R**](https://github.com/dirkschumacher/wasmr) | [Dirk Schumacher](https://github.com/dirkschumacher) | actively developed | |  |
|  | [**Swift**](https://github.com/markmals/swift-ext-wasm) | [Mark Malström](https://github.com/markmals/) | passively maintained | |  |
@@ -58,28 +62,15 @@ Once installed, you will be able to run any WebAssembly files (_including Lua, P
```sh
# Run Lua
-wasmer run examples/lua.wasm
+wasmer examples/lua.wasm
```
*You can find more `wasm/wat` examples in the [examples](./examples) directory.*
-#### With wapm
+### Docs
-Installing Wasmer through `wasmer.io` includes
-[`wapm`](https://github.com/wasmerio/wapm-cli), the [WebAssembly Package Manager](https://wapm.io/).
+Wasmer documentation lives on [docs.wasmer.io](https://docs.wasmer.io).
-wapm allows you to easily download, run, and distribute WebAssembly binaries.
-
-```sh
-# Install cowsay globally
-wapm install -g cowsay
-
-# Run cowsay
-wapm run cowsay "Hello, world!"
-```
-
-For more information about wapm, check out the [website](https://www.wapm.io)
-and this [example program](https://github.com/wapm-packages/rust-wasi-example).
## Code Structure
@@ -166,21 +157,18 @@ nginx and Lua do not work on Windows - you can track the progress on [this issue
2. Install [Rust for Windows](https://win.rustup.rs)
-3. Install [Python for Windows](https://www.python.org/downloads/release/python-2714/). The Windows x86-64 MSI installer is fine.
- Make sure to enable "Add python.exe to Path" during installation.
-
-4. Install [Git for Windows](https://git-scm.com/download/win). Allow it to add `git.exe` to your PATH (default
+3. Install [Git for Windows](https://git-scm.com/download/win). Allow it to add `git.exe` to your PATH (default
settings for the installer are fine).
-5. Install [CMake](https://cmake.org/download/). Ensure CMake is in your PATH.
+4. Install [CMake](https://cmake.org/download/). Ensure CMake is in your PATH.
-6. Install [LLVM 8.0](https://prereleases.llvm.org/win-snapshots/LLVM-8.0.0-r351033-win64.exe)
+5. Install [LLVM 8.0](https://prereleases.llvm.org/win-snapshots/LLVM-8.0.0-r351033-win64.exe)
## Building
-[](https://blog.rust-lang.org/2019/08/15/Rust-1.37.0.html)
+[](https://blog.rust-lang.org/2019/09/26/Rust-1.38.0.html)
Wasmer is built with [Cargo](https://crates.io/), the Rust package manager.
@@ -237,7 +225,7 @@ Each integration can be tested separately:
* Spec tests: `make spectests`
* Emscripten: `make emtests`
-* WASI: `make wasi`
+* WASI: `make wasitests`
* Middleware: `make middleware`
* C API: `make capi`
@@ -261,8 +249,8 @@ Below are some of the goals of this project (in order of priority):
- [x] It should be 100% compatible with the [WebAssembly spec tests](https://github.com/wasmerio/wasmer/tree/master/lib/spectests/spectests)
- [x] It should be fast _(partially achieved)_
- [x] Support WASI - released in [0.3.0](https://github.com/wasmerio/wasmer/releases/tag/0.3.0)
-- [x] Support Emscripten calls _(in the works)_
-- [ ] Support Go JS ABI calls
+- [x] Support Emscripten calls
+- [ ] Support Go JS ABI calls _(in the works)_
## Architecture
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index c0c350d54..2409dadda 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -22,7 +22,7 @@ jobs:
- script: cargo fmt --all -- --check
displayName: Lint
variables:
- rust_toolchain: '1.37.0'
+ rust_toolchain: '1.38.0'
- job: Test
strategy:
@@ -39,7 +39,7 @@ jobs:
CARGO_HTTP_CHECK_REVOKE: false
windows:
imageName: "vs2017-win2016"
- rust_toolchain: '1.37.0'
+ rust_toolchain: '1.38.0'
pool:
vmImage: $(imageName)
condition: in(variables['Build.SourceBranch'], 'refs/heads/master', 'refs/heads/staging', 'refs/heads/trying')
@@ -60,6 +60,10 @@ jobs:
cat /proc/meminfo
displayName: System info - Extended (Linux)
condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux'))
+ - bash: |
+ sysctl -a | grep machdep.cpu
+ displayName: System info - Extended (Mac)
+ condition: and(succeeded(), eq(variables['Agent.OS'], 'Darwin'))
- bash: make test
displayName: Tests (*nix)
condition: and(succeeded(), not(eq(variables['Agent.OS'], 'Windows_NT')))
@@ -96,11 +100,15 @@ jobs:
MACOSX_DEPLOYMENT_TARGET: 10.10
windows:
imageName: "vs2017-win2016"
- rust_toolchain: '1.37.0'
+ rust_toolchain: '1.38.0'
# RUSTFLAGS: -Ctarget-feature=+crt-static
pool:
vmImage: $(imageName)
- condition: in(variables['Build.SourceBranch'], 'refs/heads/master', 'refs/heads/staging', 'refs/heads/trying')
+ condition: |
+ or(
+ in(variables['Build.SourceBranch'], 'refs/heads/master', 'refs/heads/staging', 'refs/heads/trying'),
+ startsWith(variables['Build.SourceBranch'], 'refs/tags')
+ )
steps:
- checkout: self
submodules: true
@@ -119,10 +127,10 @@ jobs:
displayName: Build (Windows)
condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT'))
- bash: |
- cargo build --release --manifest-path wapm-cli/Cargo.toml --features "telemetry update-notifications"
+ make wapm
displayName: Build WAPM
condition: |
- eq(variables['Build.SourceBranch'], 'refs/heads/master')
+ startsWith(variables['Build.SourceBranch'], 'refs/tags')
- bash: |
make build-install
cp ./wasmer.tar.gz ./artifacts/$(./scripts/binary-name.sh)
@@ -130,7 +138,7 @@ jobs:
condition: |
and(
succeeded(),
- eq(variables['Build.SourceBranch'], 'refs/heads/master'),
+ startsWith(variables['Build.SourceBranch'], 'refs/tags'),
not(eq(variables['Agent.OS'], 'Windows_NT'))
)
- bash: |
@@ -141,7 +149,7 @@ jobs:
condition: |
and(
succeeded(),
- eq(variables['Build.SourceBranch'], 'refs/heads/master'),
+ startsWith(variables['Build.SourceBranch'], 'refs/tags'),
eq(variables['Agent.OS'], 'Windows_NT')
)
- publish: $(System.DefaultWorkingDirectory)/artifacts
@@ -159,11 +167,15 @@ jobs:
MACOSX_DEPLOYMENT_TARGET: 10.10
windows:
imageName: "vs2017-win2016"
- rust_toolchain: '1.37.0'
+ rust_toolchain: '1.38.0'
# RUSTFLAGS: -Ctarget-feature=+crt-static
pool:
vmImage: $(imageName)
- condition: in(variables['Build.SourceBranch'], 'refs/heads/master', 'refs/heads/staging', 'refs/heads/trying')
+ condition: |
+ or(
+ in(variables['Build.SourceBranch'], 'refs/heads/master', 'refs/heads/staging', 'refs/heads/trying'),
+ startsWith(variables['Build.SourceBranch'], 'refs/tags')
+ )
steps:
- checkout: self
submodules: true
@@ -201,7 +213,8 @@ jobs:
dependsOn:
- Build_CLI
- Build_Library
- condition: eq(variables['Build.SourceBranch'], 'refs/heads/master')
+ condition: |
+ startsWith(variables['Build.SourceBranch'], 'refs/tags')
steps:
# - download: current
- task: DownloadPipelineArtifact@1
@@ -212,14 +225,23 @@ jobs:
displayName: List Artifacts
env:
ARTIFACT_STAGING_DIRECTORY: $(Build.ArtifactStagingDirectory)
+ - script: VERSION_TAG=`git describe --tags` && echo "##vso[task.setvariable variable=VERSION_TAG]$VERSION_TAG"
+ displayName: Set the tag name as an environment variable
- task: GithubRelease@0
displayName: "Create GitHub Release"
- condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master'))
+ condition: and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/tags'))
inputs:
- gitHubConnection: wasmer
- repositoryName: wasmerio/wasmer
- tag: dev
- assets: $(Build.ArtifactStagingDirectory)
+ gitHubConnection: 'wasmer'
+ repositoryName: 'wasmerio/wasmer'
+ action: 'create'
+ target: '$(Build.SourceVersion)'
+ title: '$(VERSION_TAG)'
+ addChangeLog: false
+ tagSource: 'auto'
+ # TODO: automate it all by getting the release notes from somewhere else and using the `releaseNotesFile` key
+ isDraft: false
+ isPreRelease: false
+ assets: '$(Build.ArtifactStagingDirectory)/**'
- job: Docs
pool:
@@ -246,3 +268,4 @@ trigger:
- master
- staging
- trying
+ - refs/tags/*
diff --git a/docs/assets/languages/js.svg b/docs/assets/languages/js.svg
new file mode 100755
index 000000000..6a186f383
--- /dev/null
+++ b/docs/assets/languages/js.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/docs/feature_matrix.md b/docs/feature_matrix.md
index cdb6ff8ad..18d303270 100644
--- a/docs/feature_matrix.md
+++ b/docs/feature_matrix.md
@@ -4,13 +4,24 @@
| | Singlepass | Cranelift | LLVM |
| - | :-: | :-: | :-: |
-| Caching | ⬜ | ✅ | ✅ |
+| Caching | ✅ | ✅ | ✅ |
| Emscripten | ✅ | ✅ | ✅ |
| Metering | ✅ | ⬜ | ✅ |
| Multi-value return | ⬜ | ⬜ | ⬜ |
-| OSR | 🔄 | ❓ | ❓ |
+| OSR | 🔄 | ⬜ | 🔄 |
| SIMD | ⬜ | ⬜ | ✅ |
| WASI | ✅ | ✅ | ✅ |
+| WASMER_BACKTRACE | ✅ | ⬜ | ⬜ |
+
+## Operating System
+| | GNU Linux | Mac OSX | Windows NT |
+| - | :-: | :-: | :-: |
+| Cranelift Backend | ✅ | ✅ | ✅ |
+| LLVM Backend | ✅ | ✅ | ✅ |
+| Singlepass Backend | ✅ | ✅ | [#347](https://github.com/wasmerio/wasmer/issues/347) |
+| WASI | ✅ | ✅ | ✅* |
+
+* `poll_fd` is not fully implemented for Windows yet
## Language integration
@@ -18,8 +29,14 @@ TODO: define a set of features that are relevant and mark them here
Current ideas:
-- WASI FS API
- Callbacks
-- Exiting early in hostcall
- Metering
- Caching
+
+> TODO: expand this table, it's focused on new features that we haven't implemented yet and doesn't list all language integrations
+
+| | Rust | C / C++ | Go | Python | Ruby |
+| - | :-: | :-: | :-: | :-: | :-: |
+| Terminate in host call | ✅ | ⬜ | ⬜ | ⬜ | ⬜ |
+| WASI | ✅ | ✅ | 🔄 | ⬜ | ⬜ |
+| WASI FS API | ✅ | ⬜ | ⬜ | ⬜ | ⬜ |
diff --git a/examples/fib.wat b/examples/fib.wat
new file mode 100644
index 000000000..a797fdae4
--- /dev/null
+++ b/examples/fib.wat
@@ -0,0 +1,20 @@
+(module
+ (func $main (result i32)
+ (call $fib (i32.const 40))
+ )
+
+ (func $fib (param $n i32) (result i32)
+ (if (i32.eq (get_local $n) (i32.const 0))
+ (then (return (i32.const 1)))
+ )
+ (if (i32.eq (get_local $n) (i32.const 1))
+ (then (return (i32.const 1)))
+ )
+ (i32.add
+ (call $fib (i32.sub (get_local $n) (i32.const 1)))
+ (call $fib (i32.sub (get_local $n) (i32.const 2)))
+ )
+ )
+
+ (export "main" (func $main))
+)
diff --git a/examples/hello_world/Cargo.toml b/examples/hello_world/Cargo.toml
new file mode 100644
index 000000000..a71d719ed
--- /dev/null
+++ b/examples/hello_world/Cargo.toml
@@ -0,0 +1,9 @@
+[package]
+name = "hello_world"
+version = "0.1.0"
+authors = ["losfair "]
+edition = "2018"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
diff --git a/examples/hello_world/src/main.rs b/examples/hello_world/src/main.rs
new file mode 100644
index 000000000..ca24b9cea
--- /dev/null
+++ b/examples/hello_world/src/main.rs
@@ -0,0 +1,7 @@
+fn main() {
+ for i in 0..8 {
+ let s = format!("Hello, {}", i);
+ println!("{}", s);
+ }
+ panic!("OK");
+}
diff --git a/examples/iterative_hash/src/main.rs b/examples/iterative_hash/src/main.rs
index 043bc02a1..66ed10405 100644
--- a/examples/iterative_hash/src/main.rs
+++ b/examples/iterative_hash/src/main.rs
@@ -20,7 +20,7 @@ fn main() {
let diff = millis - last_millis;
if diff >= 100 {
record_count += 1;
- println!("{}", (i - round_count) as f64 / diff as f64);
+ println!("{}", ((i - round_count) as u128) * 1000000 / diff );
last_millis = millis;
round_count = i;
}
diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml
index 713443355..8d6a38140 100644
--- a/fuzz/Cargo.toml
+++ b/fuzz/Cargo.toml
@@ -12,6 +12,8 @@ cargo-fuzz = true
wasmer-runtime = { path = "../lib/runtime" }
wasmer-runtime-core = { path = "../lib/runtime-core" }
wasmer = { path = "../" }
+wasmer-llvm-backend = { path = "../lib/llvm-backend" }
+wasmer-singlepass-backend = { path = "../lib/singlepass-backend" }
libfuzzer-sys = { git = "https://github.com/rust-fuzz/libfuzzer-sys.git" }
# Prevent this from interfering with workspaces
diff --git a/fuzz/README.md b/fuzz/README.md
index 00939ee5a..36f7e0c4c 100644
--- a/fuzz/README.md
+++ b/fuzz/README.md
@@ -47,7 +47,7 @@ The fuzzer works best when it has examples of small Wasm files to start with. Us
```sh
mkdir spec-test-corpus
-for i in lib/spectests/spectests/*.wast; do wast2json $i -o spec-test-corpus/$(basename $i).json; done
+for i in lib/spectests/spectests/*.wast; do wast2json --enable-all $i -o spec-test-corpus/$(basename $i).json; done
mv spec-test-corpus/*.wasm fuzz/corpus/simple_instantiate/
rm -r spec-test-corpus
```
diff --git a/fuzz/fuzz_targets/compile_wasm.rs b/fuzz/fuzz_targets/compile_wasm.rs
index 4abe062f5..e36d8c396 100644
--- a/fuzz/fuzz_targets/compile_wasm.rs
+++ b/fuzz/fuzz_targets/compile_wasm.rs
@@ -2,9 +2,24 @@
#[macro_use]
extern crate libfuzzer_sys;
extern crate wasmer_runtime;
+extern crate wasmer_runtime_core;
+extern crate wasmer_llvm_backend;
+extern crate wasmer_singlepass_backend;
-use wasmer_runtime::compile;
+use wasmer_runtime::{compile, compile_with};
+use wasmer_runtime_core::backend::Compiler;
+
+fn get_llvm_compiler() -> impl Compiler {
+ use wasmer_llvm_backend::LLVMCompiler;
+ LLVMCompiler::new()
+}
+fn get_singlepass_compiler() -> impl Compiler {
+ use wasmer_singlepass_backend::SinglePassCompiler;
+ SinglePassCompiler::new()
+}
fuzz_target!(|data: &[u8]| {
+ let _ = compile_with(data, &get_llvm_compiler());
let _ = compile(data);
+ let _ = compile_with(data, &get_singlepass_compiler());
});
diff --git a/install.sh b/install.sh
index a4fc2b841..e6c874e2a 100755
--- a/install.sh
+++ b/install.sh
@@ -208,9 +208,11 @@ initArch() {
printf "$cyan> Using WASMER_ARCH ($WASMER_ARCH).$reset\n"
ARCH="$WASMER_ARCH"
fi
+ # If you modify this list, please also modify scripts/binary-name.sh
case $ARCH in
amd64) ARCH="amd64";;
x86_64) ARCH="amd64";;
+ aarch64) ARCH="arm64";;
# i386) ARCH="386";;
*) printf "$red> The system architecture (${ARCH}) is not supported by this installation script.$reset\n"; exit 1;;
esac
diff --git a/lib/clif-backend/Cargo.toml b/lib/clif-backend/Cargo.toml
index c940b1b6e..1dea62a24 100644
--- a/lib/clif-backend/Cargo.toml
+++ b/lib/clif-backend/Cargo.toml
@@ -1,15 +1,17 @@
[package]
name = "wasmer-clif-backend"
-version = "0.8.0"
+version = "0.11.0"
description = "Wasmer runtime Cranelift compiler backend"
license = "MIT"
authors = ["The Wasmer Engineering Team "]
repository = "https://github.com/wasmerio/wasmer"
+keywords = ["wasm", "webassembly", "compiler", "JIT", "AOT"]
+categories = ["wasm"]
edition = "2018"
readme = "README.md"
[dependencies]
-wasmer-runtime-core = { path = "../runtime-core", version = "0.8.0" }
+wasmer-runtime-core = { path = "../runtime-core", version = "0.11.0" }
cranelift-native = "0.44.0"
cranelift-codegen = "0.44.0"
cranelift-entity = "0.44.0"
@@ -35,7 +37,7 @@ version = "0.0.7"
[target.'cfg(windows)'.dependencies]
winapi = { version = "0.3", features = ["errhandlingapi", "minwindef", "minwinbase", "winnt"] }
-wasmer-win-exception-handler = { path = "../win-exception-handler", version = "0.8.0" }
+wasmer-win-exception-handler = { path = "../win-exception-handler", version = "0.11.0" }
[features]
debug = ["wasmer-runtime-core/debug"]
diff --git a/lib/clif-backend/src/code.rs b/lib/clif-backend/src/code.rs
index b2ccc6652..d86d19b4f 100644
--- a/lib/clif-backend/src/code.rs
+++ b/lib/clif-backend/src/code.rs
@@ -54,6 +54,10 @@ impl ModuleCodeGenerator
}
}
+ fn new_with_target(_: Option, _: Option, _: Option) -> Self {
+ unimplemented!("cross compilation is not available for clif backend")
+ }
+
fn backend_id() -> Backend {
Backend::Cranelift
}
@@ -128,166 +132,6 @@ impl ModuleCodeGenerator
.state
.initialize(&builder.func.signature, exit_block);
- #[cfg(feature = "debug")]
- {
- use cranelift_codegen::cursor::{Cursor, FuncCursor};
- use cranelift_codegen::ir::InstBuilder;
- let entry_ebb = func.layout.entry_block().unwrap();
- let ebb = func.dfg.make_ebb();
- func.layout.insert_ebb(ebb, entry_ebb);
- let mut pos = FuncCursor::new(&mut func).at_first_insertion_point(ebb);
- let params = pos.func.dfg.ebb_params(entry_ebb).to_vec();
-
- let new_ebb_params: Vec<_> = params
- .iter()
- .map(|¶m| {
- pos.func
- .dfg
- .append_ebb_param(ebb, pos.func.dfg.value_type(param))
- })
- .collect();
-
- let start_debug = {
- let signature = pos.func.import_signature(ir::Signature {
- call_conv: self.target_config().default_call_conv,
- params: vec![
- ir::AbiParam::special(ir::types::I64, ir::ArgumentPurpose::VMContext),
- ir::AbiParam::new(ir::types::I32),
- ],
- returns: vec![],
- });
-
- let name = ir::ExternalName::testcase("strtdbug");
-
- pos.func.import_function(ir::ExtFuncData {
- name,
- signature,
- colocated: false,
- })
- };
-
- let end_debug = {
- let signature = pos.func.import_signature(ir::Signature {
- call_conv: self.target_config().default_call_conv,
- params: vec![ir::AbiParam::special(
- ir::types::I64,
- ir::ArgumentPurpose::VMContext,
- )],
- returns: vec![],
- });
-
- let name = ir::ExternalName::testcase("enddbug");
-
- pos.func.import_function(ir::ExtFuncData {
- name,
- signature,
- colocated: false,
- })
- };
-
- let i32_print = {
- let signature = pos.func.import_signature(ir::Signature {
- call_conv: self.target_config().default_call_conv,
- params: vec![
- ir::AbiParam::special(ir::types::I64, ir::ArgumentPurpose::VMContext),
- ir::AbiParam::new(ir::types::I32),
- ],
- returns: vec![],
- });
-
- let name = ir::ExternalName::testcase("i32print");
-
- pos.func.import_function(ir::ExtFuncData {
- name,
- signature,
- colocated: false,
- })
- };
-
- let i64_print = {
- let signature = pos.func.import_signature(ir::Signature {
- call_conv: self.target_config().default_call_conv,
- params: vec![
- ir::AbiParam::special(ir::types::I64, ir::ArgumentPurpose::VMContext),
- ir::AbiParam::new(ir::types::I64),
- ],
- returns: vec![],
- });
-
- let name = ir::ExternalName::testcase("i64print");
-
- pos.func.import_function(ir::ExtFuncData {
- name,
- signature,
- colocated: false,
- })
- };
-
- let f32_print = {
- let signature = pos.func.import_signature(ir::Signature {
- call_conv: self.target_config().default_call_conv,
- params: vec![
- ir::AbiParam::special(ir::types::I64, ir::ArgumentPurpose::VMContext),
- ir::AbiParam::new(ir::types::F32),
- ],
- returns: vec![],
- });
-
- let name = ir::ExternalName::testcase("f32print");
-
- pos.func.import_function(ir::ExtFuncData {
- name,
- signature,
- colocated: false,
- })
- };
-
- let f64_print = {
- let signature = pos.func.import_signature(ir::Signature {
- call_conv: self.target_config().default_call_conv,
- params: vec![
- ir::AbiParam::special(ir::types::I64, ir::ArgumentPurpose::VMContext),
- ir::AbiParam::new(ir::types::F64),
- ],
- returns: vec![],
- });
-
- let name = ir::ExternalName::testcase("f64print");
-
- pos.func.import_function(ir::ExtFuncData {
- name,
- signature,
- colocated: false,
- })
- };
-
- let vmctx = pos
- .func
- .special_param(ir::ArgumentPurpose::VMContext)
- .expect("missing vmctx parameter");
-
- let func_index = pos.ins().iconst(
- ir::types::I32,
- func_index.index() as i64 + self.module.info.imported_functions.len() as i64,
- );
-
- pos.ins().call(start_debug, &[vmctx, func_index]);
-
- for param in new_ebb_params.iter().cloned() {
- match pos.func.dfg.value_type(param) {
- ir::types::I32 => pos.ins().call(i32_print, &[vmctx, param]),
- ir::types::I64 => pos.ins().call(i64_print, &[vmctx, param]),
- ir::types::F32 => pos.ins().call(f32_print, &[vmctx, param]),
- ir::types::F64 => pos.ins().call(f64_print, &[vmctx, param]),
- _ => unimplemented!(),
- };
- }
-
- pos.ins().call(end_debug, &[vmctx]);
-
- pos.ins().jump(entry_ebb, new_ebb_params.as_slice());
- }
-
self.functions.push(func_env);
Ok(self.functions.last_mut().unwrap())
}
@@ -851,7 +695,9 @@ impl FuncEnvironment for FunctionEnvironment {
}
/// Generates a call IR with `callee` and `call_args` and inserts it at `pos`
- /// TODO: add support for imported functions
+ ///
+ /// It's about generating code that calls a local or imported function; in
+ /// WebAssembly: `(call $foo)`.
fn translate_call(
&mut self,
mut pos: FuncCursor,
@@ -923,20 +769,31 @@ impl FuncEnvironment for FunctionEnvironment {
readonly: true,
});
- let imported_vmctx_addr = pos.func.create_global_value(ir::GlobalValueData::Load {
- base: imported_func_struct_addr,
- offset: (vm::ImportedFunc::offset_vmctx() as i32).into(),
- global_type: ptr_type,
- readonly: true,
- });
+ let imported_func_ctx_addr =
+ pos.func.create_global_value(ir::GlobalValueData::Load {
+ base: imported_func_struct_addr,
+ offset: (vm::ImportedFunc::offset_func_ctx() as i32).into(),
+ global_type: ptr_type,
+ readonly: true,
+ });
+
+ let imported_func_ctx_vmctx_addr =
+ pos.func.create_global_value(ir::GlobalValueData::Load {
+ base: imported_func_ctx_addr,
+ offset: (vm::FuncCtx::offset_vmctx() as i32).into(),
+ global_type: ptr_type,
+ readonly: true,
+ });
let imported_func_addr = pos.ins().global_value(ptr_type, imported_func_addr);
- let imported_vmctx_addr = pos.ins().global_value(ptr_type, imported_vmctx_addr);
+ let imported_func_ctx_vmctx_addr = pos
+ .ins()
+ .global_value(ptr_type, imported_func_ctx_vmctx_addr);
let sig_ref = pos.func.dfg.ext_funcs[callee].signature;
let mut args = Vec::with_capacity(call_args.len() + 1);
- args.push(imported_vmctx_addr);
+ args.push(imported_func_ctx_vmctx_addr);
args.extend(call_args.iter().cloned());
Ok(pos
diff --git a/lib/clif-backend/src/lib.rs b/lib/clif-backend/src/lib.rs
index ddecdbaf0..06bffc791 100644
--- a/lib/clif-backend/src/lib.rs
+++ b/lib/clif-backend/src/lib.rs
@@ -1,5 +1,10 @@
+//! The Wasmer Cranelift Backend crate is used to compile wasm binary code via parse events from the
+//! Wasmer runtime common parser code into machine code.
+//!
+
#![deny(
dead_code,
+ missing_docs,
nonstandard_style,
unused_imports,
unused_mut,
@@ -53,6 +58,8 @@ pub const VERSION: &str = env!("CARGO_PKG_VERSION");
use wasmer_runtime_core::codegen::SimpleStreamingCompilerGen;
+/// Streaming compiler implementation for the Cranelift backed. Compiles web assembly binary into
+/// machine code.
pub type CraneliftCompiler = SimpleStreamingCompilerGen<
code::CraneliftModuleCodeGenerator,
code::CraneliftFunctionCodeGenerator,
diff --git a/lib/clif-backend/src/relocation.rs b/lib/clif-backend/src/relocation.rs
index bb07c7c59..a86bdeec9 100644
--- a/lib/clif-backend/src/relocation.rs
+++ b/lib/clif-backend/src/relocation.rs
@@ -105,7 +105,7 @@ impl binemit::RelocSink for RelocSink {
_ebb_offset: binemit::CodeOffset,
) {
// This should use the `offsets` field of `ir::Function`.
- unimplemented!();
+ unimplemented!("RelocSink::reloc_ebb");
}
fn reloc_external(
&mut self,
@@ -146,7 +146,7 @@ impl binemit::RelocSink for RelocSink {
DYNAMIC_MEM_GROW => VmCallKind::DynamicMemoryGrow,
DYNAMIC_MEM_SIZE => VmCallKind::DynamicMemorySize,
- _ => unimplemented!(),
+ _ => unimplemented!("reloc_external VmCall::Local {}", index),
})),
IMPORT_NAMESPACE => RelocationType::VmCall(VmCall::Import(match index {
STATIC_MEM_GROW => VmCallKind::StaticMemoryGrow,
@@ -157,10 +157,10 @@ impl binemit::RelocSink for RelocSink {
DYNAMIC_MEM_GROW => VmCallKind::DynamicMemoryGrow,
DYNAMIC_MEM_SIZE => VmCallKind::DynamicMemorySize,
- _ => unimplemented!(),
+ _ => unimplemented!("reloc_external VmCall::Import {}", index),
})),
SIG_NAMESPACE => RelocationType::Signature(SigIndex::new(index as usize)),
- _ => unimplemented!(),
+ _ => unimplemented!("reloc_external SigIndex {}", index),
};
self.external_relocs.push(ExternalRelocation {
reloc,
@@ -204,7 +204,7 @@ impl binemit::RelocSink for RelocSink {
}
fn reloc_constant(&mut self, _: u32, _: cranelift_codegen::binemit::Reloc, _: u32) {
- unimplemented!()
+ unimplemented!("RelocSink::reloc_constant")
}
fn reloc_jt(
@@ -213,7 +213,7 @@ impl binemit::RelocSink for RelocSink {
_reloc: binemit::Reloc,
_jt: ir::JumpTable,
) {
- unimplemented!();
+ unimplemented!("RelocSink::reloc_jt");
}
}
diff --git a/lib/clif-backend/src/resolver.rs b/lib/clif-backend/src/resolver.rs
index 7a868f35e..efc038d58 100644
--- a/lib/clif-backend/src/resolver.rs
+++ b/lib/clif-backend/src/resolver.rs
@@ -1,32 +1,31 @@
-use crate::{cache::BackendCache, trampoline::Trampolines};
use crate::{
+ cache::BackendCache,
libcalls,
relocation::{
ExternalRelocation, LibCall, LocalRelocation, LocalTrapSink, Reloc, RelocSink,
RelocationType, TrapSink, VmCall, VmCallKind,
},
signal::HandlerData,
+ trampoline::Trampolines,
};
-use rayon::prelude::*;
-
use byteorder::{ByteOrder, LittleEndian};
use cranelift_codegen::{
binemit::{Stackmap, StackmapSink},
ir, isa, Context,
};
+use rayon::prelude::*;
use std::{
mem,
ptr::{write_unaligned, NonNull},
sync::Arc,
};
-
-use wasmer_runtime_core::cache::Error as CacheError;
use wasmer_runtime_core::{
self,
backend::{
sys::{Memory, Protect},
SigRegistry,
},
+ cache::Error as CacheError,
error::{CompileError, CompileResult},
module::ModuleInfo,
structures::{Map, SliceMap, TypedIndex},
@@ -250,17 +249,9 @@ impl FuncResolverBuilder {
#[cfg(not(target_os = "windows"))]
LibCall::Probestack => __rust_probestack as isize,
},
- RelocationType::Intrinsic(ref name) => match name.as_str() {
- "i32print" => i32_print as isize,
- "i64print" => i64_print as isize,
- "f32print" => f32_print as isize,
- "f64print" => f64_print as isize,
- "strtdbug" => start_debug as isize,
- "enddbug" => end_debug as isize,
- _ => Err(CompileError::InternalError {
- msg: format!("unexpected intrinsic: {}", name),
- })?,
- },
+ RelocationType::Intrinsic(ref name) => Err(CompileError::InternalError {
+ msg: format!("unexpected intrinsic: {}", name),
+ })?,
RelocationType::VmCall(vmcall) => match vmcall {
VmCall::Local(kind) => match kind {
VmCallKind::StaticMemoryGrow | VmCallKind::SharedStaticMemoryGrow => {
@@ -371,28 +362,3 @@ impl FuncResolver {
fn round_up(n: usize, multiple: usize) -> usize {
(n + multiple - 1) & !(multiple - 1)
}
-
-extern "C" fn i32_print(_ctx: &mut vm::Ctx, n: i32) {
- eprint!(" i32: {},", n);
-}
-extern "C" fn i64_print(_ctx: &mut vm::Ctx, n: i64) {
- eprint!(" i64: {},", n);
-}
-extern "C" fn f32_print(_ctx: &mut vm::Ctx, n: f32) {
- eprint!(" f32: {},", n);
-}
-extern "C" fn f64_print(_ctx: &mut vm::Ctx, n: f64) {
- eprint!(" f64: {},", n);
-}
-extern "C" fn start_debug(ctx: &mut vm::Ctx, func_index: u32) {
- if let Some(symbol_map) = unsafe { ctx.borrow_symbol_map() } {
- if let Some(fn_name) = symbol_map.get(&func_index) {
- eprint!("func ({} ({})), args: [", fn_name, func_index);
- return;
- }
- }
- eprint!("func ({}), args: [", func_index);
-}
-extern "C" fn end_debug(_ctx: &mut vm::Ctx) {
- eprintln!(" ]");
-}
diff --git a/lib/clif-backend/src/signal/mod.rs b/lib/clif-backend/src/signal/mod.rs
index 3facce2ad..116da3f56 100644
--- a/lib/clif-backend/src/signal/mod.rs
+++ b/lib/clif-backend/src/signal/mod.rs
@@ -1,12 +1,14 @@
-use crate::relocation::{TrapData, TrapSink};
-use crate::resolver::FuncResolver;
-use crate::trampoline::Trampolines;
+use crate::{
+ relocation::{TrapData, TrapSink},
+ resolver::FuncResolver,
+ trampoline::Trampolines,
+};
use libc::c_void;
use std::{any::Any, cell::Cell, ptr::NonNull, sync::Arc};
use wasmer_runtime_core::{
backend::RunnableModule,
module::ModuleInfo,
- typed_func::{Wasm, WasmTrapInfo},
+ typed_func::{Trampoline, Wasm, WasmTrapInfo},
types::{LocalFuncIndex, SigIndex},
vm,
};
@@ -59,7 +61,7 @@ impl RunnableModule for Caller {
fn get_trampoline(&self, _: &ModuleInfo, sig_index: SigIndex) -> Option {
unsafe extern "C" fn invoke(
- trampoline: unsafe extern "C" fn(*mut vm::Ctx, NonNull, *const u64, *mut u64),
+ trampoline: Trampoline,
ctx: *mut vm::Ctx,
func: NonNull,
args: *const u64,
diff --git a/lib/clif-backend/src/signal/unix.rs b/lib/clif-backend/src/signal/unix.rs
index 39f3aa893..79b6619d3 100644
--- a/lib/clif-backend/src/signal/unix.rs
+++ b/lib/clif-backend/src/signal/unix.rs
@@ -98,7 +98,10 @@ pub fn call_protected(
},
Ok(SIGSEGV) | Ok(SIGBUS) => WasmTrapInfo::MemoryOutOfBounds,
Ok(SIGFPE) => WasmTrapInfo::IllegalArithmetic,
- _ => unimplemented!(),
+ _ => unimplemented!(
+ "WasmTrapInfo::Unknown signal:{:?}",
+ Signal::from_c_int(signum)
+ ),
}))
} else {
let signal = match Signal::from_c_int(signum) {
diff --git a/lib/clif-backend/src/signal/windows.rs b/lib/clif-backend/src/signal/windows.rs
index d755cd575..363119c6e 100644
--- a/lib/clif-backend/src/signal/windows.rs
+++ b/lib/clif-backend/src/signal/windows.rs
@@ -1,24 +1,30 @@
-use crate::relocation::{TrapCode, TrapData};
-use crate::signal::{CallProtError, HandlerData};
-use crate::trampoline::Trampoline;
-use std::cell::Cell;
-use std::ffi::c_void;
-use std::ptr::{self, NonNull};
-use wasmer_runtime_core::typed_func::WasmTrapInfo;
-use wasmer_runtime_core::vm::Ctx;
-use wasmer_runtime_core::vm::Func;
+use crate::{
+ relocation::{TrapCode, TrapData},
+ signal::{CallProtError, HandlerData},
+};
+use std::{
+ cell::Cell,
+ ffi::c_void,
+ ptr::{self, NonNull},
+};
+use wasmer_runtime_core::{
+ typed_func::{Trampoline, WasmTrapInfo},
+ vm::{Ctx, Func},
+};
use wasmer_win_exception_handler::CallProtectedData;
pub use wasmer_win_exception_handler::_call_protected;
-use winapi::shared::minwindef::DWORD;
-use winapi::um::minwinbase::{
- EXCEPTION_ACCESS_VIOLATION, EXCEPTION_ARRAY_BOUNDS_EXCEEDED, EXCEPTION_BREAKPOINT,
- EXCEPTION_DATATYPE_MISALIGNMENT, EXCEPTION_FLT_DENORMAL_OPERAND, EXCEPTION_FLT_DIVIDE_BY_ZERO,
- EXCEPTION_FLT_INEXACT_RESULT, EXCEPTION_FLT_INVALID_OPERATION, EXCEPTION_FLT_OVERFLOW,
- EXCEPTION_FLT_STACK_CHECK, EXCEPTION_FLT_UNDERFLOW, EXCEPTION_GUARD_PAGE,
- EXCEPTION_ILLEGAL_INSTRUCTION, EXCEPTION_INT_DIVIDE_BY_ZERO, EXCEPTION_INT_OVERFLOW,
- EXCEPTION_INVALID_HANDLE, EXCEPTION_IN_PAGE_ERROR, EXCEPTION_NONCONTINUABLE_EXCEPTION,
- EXCEPTION_POSSIBLE_DEADLOCK, EXCEPTION_PRIV_INSTRUCTION, EXCEPTION_SINGLE_STEP,
- EXCEPTION_STACK_OVERFLOW,
+use winapi::{
+ shared::minwindef::DWORD,
+ um::minwinbase::{
+ EXCEPTION_ACCESS_VIOLATION, EXCEPTION_ARRAY_BOUNDS_EXCEEDED, EXCEPTION_BREAKPOINT,
+ EXCEPTION_DATATYPE_MISALIGNMENT, EXCEPTION_FLT_DENORMAL_OPERAND,
+ EXCEPTION_FLT_DIVIDE_BY_ZERO, EXCEPTION_FLT_INEXACT_RESULT,
+ EXCEPTION_FLT_INVALID_OPERATION, EXCEPTION_FLT_OVERFLOW, EXCEPTION_FLT_STACK_CHECK,
+ EXCEPTION_FLT_UNDERFLOW, EXCEPTION_GUARD_PAGE, EXCEPTION_ILLEGAL_INSTRUCTION,
+ EXCEPTION_INT_DIVIDE_BY_ZERO, EXCEPTION_INT_OVERFLOW, EXCEPTION_INVALID_HANDLE,
+ EXCEPTION_IN_PAGE_ERROR, EXCEPTION_NONCONTINUABLE_EXCEPTION, EXCEPTION_POSSIBLE_DEADLOCK,
+ EXCEPTION_PRIV_INSTRUCTION, EXCEPTION_SINGLE_STEP, EXCEPTION_STACK_OVERFLOW,
+ },
};
thread_local! {
@@ -110,5 +116,5 @@ pub fn call_protected(
pub unsafe fn trigger_trap() -> ! {
// TODO
- unimplemented!();
+ unimplemented!("windows::trigger_trap");
}
diff --git a/lib/clif-backend/src/trampoline.rs b/lib/clif-backend/src/trampoline.rs
index a6fc6572b..fcd1ff83d 100644
--- a/lib/clif-backend/src/trampoline.rs
+++ b/lib/clif-backend/src/trampoline.rs
@@ -1,18 +1,16 @@
-use crate::cache::TrampolineCache;
-use crate::resolver::NoopStackmapSink;
+use crate::{cache::TrampolineCache, resolver::NoopStackmapSink};
use cranelift_codegen::{
binemit::{NullTrapSink, Reloc, RelocSink},
cursor::{Cursor, FuncCursor},
ir::{self, InstBuilder},
isa, Context,
};
-use std::collections::HashMap;
-use std::{iter, mem, ptr::NonNull};
+use std::{collections::HashMap, iter, mem};
use wasmer_runtime_core::{
backend::sys::{Memory, Protect},
module::{ExportIndex, ModuleInfo},
+ typed_func::Trampoline,
types::{FuncSig, SigIndex, Type},
- vm,
};
struct NullRelocSink {}
@@ -22,14 +20,12 @@ impl RelocSink for NullRelocSink {
fn reloc_external(&mut self, _: u32, _: Reloc, _: &ir::ExternalName, _: i64) {}
fn reloc_constant(&mut self, _: u32, _: Reloc, _: u32) {
- unimplemented!()
+ unimplemented!("RelocSink::reloc_constant")
}
fn reloc_jt(&mut self, _: u32, _: Reloc, _: ir::JumpTable) {}
}
-pub type Trampoline = unsafe extern "C" fn(*mut vm::Ctx, NonNull, *const u64, *mut u64);
-
pub struct Trampolines {
memory: Memory,
offsets: HashMap,
diff --git a/lib/dev-utils/Cargo.toml b/lib/dev-utils/Cargo.toml
index bb6957b3a..81fb49757 100644
--- a/lib/dev-utils/Cargo.toml
+++ b/lib/dev-utils/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "wasmer-dev-utils"
-version = "0.8.0"
+version = "0.11.0"
description = "Wasmer runtime core library"
license = "MIT"
authors = ["The Wasmer Engineering Team "]
diff --git a/lib/emscripten-tests/Cargo.toml b/lib/emscripten-tests/Cargo.toml
index 53bf8d2c2..2439b4295 100644
--- a/lib/emscripten-tests/Cargo.toml
+++ b/lib/emscripten-tests/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "wasmer-emscripten-tests"
-version = "0.8.0"
+version = "0.11.0"
description = "Tests for our Emscripten implementation"
license = "MIT"
authors = ["The Wasmer Engineering Team "]
@@ -9,20 +9,20 @@ publish = false
build = "build/mod.rs"
[dependencies]
-wasmer-emscripten = { path = "../emscripten", version = "0.8.0" }
-wasmer-runtime-core = { path = "../runtime-core", version = "0.8.0" }
-wasmer-clif-backend = { path = "../clif-backend", version = "0.8.0" }
-wasmer-llvm-backend = { path = "../llvm-backend", version = "0.8.0", optional = true }
-wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.8.0", optional = true }
+wasmer-emscripten = { path = "../emscripten", version = "0.11.0" }
+wasmer-runtime = { path = "../runtime", version = "0.11.0", default-features = false }
+wasmer-clif-backend = { path = "../clif-backend", version = "0.11.0", optional = true}
+wasmer-llvm-backend = { path = "../llvm-backend", version = "0.11.0", optional = true, features = ["test"] }
+wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.11.0", optional = true }
[dev-dependencies]
wabt = "0.9.1"
-wasmer-dev-utils = { path = "../dev-utils", version = "0.8.0"}
+wasmer-dev-utils = { path = "../dev-utils", version = "0.11.0"}
[build-dependencies]
glob = "0.3"
[features]
-clif = []
-llvm = ["wasmer-llvm-backend"]
-singlepass = ["wasmer-singlepass-backend"]
+clif = ["wasmer-clif-backend", "wasmer-runtime/default-backend-cranelift"]
+singlepass = ["wasmer-singlepass-backend", "wasmer-runtime/default-backend-singlepass"]
+llvm = ["wasmer-llvm-backend", "wasmer-runtime/default-backend-llvm"]
diff --git a/lib/emscripten-tests/src/lib.rs b/lib/emscripten-tests/src/lib.rs
index 1da0abc73..59bcf90eb 100644
--- a/lib/emscripten-tests/src/lib.rs
+++ b/lib/emscripten-tests/src/lib.rs
@@ -3,40 +3,13 @@ mod tests {
use std::sync::Arc;
use wabt::wat2wasm;
use wasmer_emscripten::is_emscripten_module;
- use wasmer_runtime_core::backend::Compiler;
- use wasmer_runtime_core::compile_with;
-
- #[cfg(feature = "clif")]
- fn get_compiler() -> impl Compiler {
- use wasmer_clif_backend::CraneliftCompiler;
- CraneliftCompiler::new()
- }
-
- #[cfg(feature = "llvm")]
- fn get_compiler() -> impl Compiler {
- use wasmer_llvm_backend::LLVMCompiler;
- LLVMCompiler::new()
- }
-
- #[cfg(feature = "singlepass")]
- fn get_compiler() -> impl Compiler {
- use wasmer_singlepass_backend::SinglePassCompiler;
- SinglePassCompiler::new()
- }
-
- #[cfg(not(any(feature = "llvm", feature = "clif", feature = "singlepass")))]
- fn get_compiler() -> impl Compiler {
- panic!("compiler not specified, activate a compiler via features");
- use wasmer_clif_backend::CraneliftCompiler;
- CraneliftCompiler::new()
- }
+ use wasmer_runtime::compile;
#[test]
fn should_detect_emscripten_files() {
const WAST_BYTES: &[u8] = include_bytes!("tests/is_emscripten_true.wast");
let wasm_binary = wat2wasm(WAST_BYTES.to_vec()).expect("Can't convert to wasm");
- let module =
- compile_with(&wasm_binary[..], &get_compiler()).expect("WASM can't be compiled");
+ let module = compile(&wasm_binary[..]).expect("WASM can't be compiled");
let module = Arc::new(module);
assert!(is_emscripten_module(&module));
}
@@ -45,8 +18,7 @@ mod tests {
fn should_detect_non_emscripten_files() {
const WAST_BYTES: &[u8] = include_bytes!("tests/is_emscripten_false.wast");
let wasm_binary = wat2wasm(WAST_BYTES.to_vec()).expect("Can't convert to wasm");
- let module =
- compile_with(&wasm_binary[..], &get_compiler()).expect("WASM can't be compiled");
+ let module = compile(&wasm_binary[..]).expect("WASM can't be compiled");
let module = Arc::new(module);
assert!(!is_emscripten_module(&module));
}
diff --git a/lib/emscripten-tests/tests/emtests/_common.rs b/lib/emscripten-tests/tests/emtests/_common.rs
index 1e5dfba6e..2e6c590d9 100644
--- a/lib/emscripten-tests/tests/emtests/_common.rs
+++ b/lib/emscripten-tests/tests/emtests/_common.rs
@@ -5,39 +5,12 @@ macro_rules! assert_emscripten_output {
EmscriptenGlobals,
generate_emscripten_env,
};
- use wasmer_runtime_core::{
- backend::Compiler,
- };
+ use wasmer_runtime::compile;
use wasmer_dev_utils::stdio::StdioCapturer;
- #[cfg(feature = "clif")]
- fn get_compiler() -> impl Compiler {
- use wasmer_clif_backend::CraneliftCompiler;
- CraneliftCompiler::new()
- }
-
- #[cfg(feature = "llvm")]
- fn get_compiler() -> impl Compiler {
- use wasmer_llvm_backend::LLVMCompiler;
- LLVMCompiler::new()
- }
-
- #[cfg(feature = "singlepass")]
- fn get_compiler() -> impl Compiler {
- use wasmer_singlepass_backend::SinglePassCompiler;
- SinglePassCompiler::new()
- }
-
- #[cfg(not(any(feature = "llvm", feature = "clif", feature = "singlepass")))]
- fn get_compiler() -> impl Compiler {
- panic!("compiler not specified, activate a compiler via features");
- use wasmer_clif_backend::CraneliftCompiler;
- CraneliftCompiler::new()
- }
-
let wasm_bytes = include_bytes!($file);
- let module = wasmer_runtime_core::compile_with(&wasm_bytes[..], &get_compiler())
+ let module = compile(&wasm_bytes[..])
.expect("WASM can't be compiled");
// let module = compile(&wasm_bytes[..])
diff --git a/lib/emscripten/Cargo.toml b/lib/emscripten/Cargo.toml
index e55fb221a..dffbe0942 100644
--- a/lib/emscripten/Cargo.toml
+++ b/lib/emscripten/Cargo.toml
@@ -1,10 +1,12 @@
[package]
name = "wasmer-emscripten"
-version = "0.8.0"
+version = "0.11.0"
description = "Wasmer runtime emscripten implementation library"
license = "MIT"
authors = ["The Wasmer Engineering Team "]
repository = "https://github.com/wasmerio/wasmer"
+keywords = ["wasm", "webassembly", "ABI", "emscripten", "posix"]
+categories = ["wasm"]
edition = "2018"
[dependencies]
@@ -12,10 +14,10 @@ byteorder = "1.3"
lazy_static = "1.4"
libc = "0.2.60"
time = "0.1"
-wasmer-runtime-core = { path = "../runtime-core", version = "0.8.0" }
+wasmer-runtime-core = { path = "../runtime-core", version = "0.11.0" }
[target.'cfg(windows)'.dependencies]
-rand = "0.7"
+getrandom = "0.1"
[features]
debug = ["wasmer-runtime-core/debug"]
diff --git a/lib/emscripten/src/exception.rs b/lib/emscripten/src/exception.rs
index 09f04a798..09ae286f8 100644
--- a/lib/emscripten/src/exception.rs
+++ b/lib/emscripten/src/exception.rs
@@ -10,22 +10,22 @@ pub fn ___cxa_allocate_exception(ctx: &mut Ctx, size: u32) -> u32 {
pub fn ___cxa_current_primary_exception(_ctx: &mut Ctx) -> u32 {
debug!("emscripten::___cxa_current_primary_exception");
- unimplemented!()
+ unimplemented!("emscripten::___cxa_current_primary_exception")
}
pub fn ___cxa_decrement_exception_refcount(_ctx: &mut Ctx, _a: u32) {
debug!("emscripten::___cxa_decrement_exception_refcount({})", _a);
- unimplemented!()
+ unimplemented!("emscripten::___cxa_decrement_exception_refcount({})", _a)
}
pub fn ___cxa_increment_exception_refcount(_ctx: &mut Ctx, _a: u32) {
debug!("emscripten::___cxa_increment_exception_refcount({})", _a);
- unimplemented!()
+ unimplemented!("emscripten::___cxa_increment_exception_refcount({})", _a)
}
pub fn ___cxa_rethrow_primary_exception(_ctx: &mut Ctx, _a: u32) {
debug!("emscripten::___cxa_rethrow_primary_exception({})", _a);
- unimplemented!()
+ unimplemented!("emscripten::___cxa_rethrow_primary_exception({})", _a)
}
/// emscripten: ___cxa_throw
diff --git a/lib/emscripten/src/io/mod.rs b/lib/emscripten/src/io/mod.rs
index 6666cd5af..bad5935fe 100644
--- a/lib/emscripten/src/io/mod.rs
+++ b/lib/emscripten/src/io/mod.rs
@@ -15,13 +15,13 @@ use wasmer_runtime_core::vm::Ctx;
/// getprotobyname
pub fn getprotobyname(_ctx: &mut Ctx, _name_ptr: i32) -> i32 {
debug!("emscripten::getprotobyname");
- unimplemented!()
+ unimplemented!("emscripten::getprotobyname")
}
/// getprotobynumber
pub fn getprotobynumber(_ctx: &mut Ctx, _one: i32) -> i32 {
debug!("emscripten::getprotobynumber");
- unimplemented!()
+ unimplemented!("emscripten::getprotobynumber")
}
/// sigdelset
@@ -53,11 +53,11 @@ pub fn sigfillset(ctx: &mut Ctx, set: i32) -> i32 {
/// tzset
pub fn tzset(_ctx: &mut Ctx) {
debug!("emscripten::tzset - stub");
- //unimplemented!()
+ //unimplemented!("emscripten::tzset - stub")
}
/// strptime
pub fn strptime(_ctx: &mut Ctx, _one: i32, _two: i32, _three: i32) -> i32 {
debug!("emscripten::strptime");
- unimplemented!()
+ unimplemented!("emscripten::strptime")
}
diff --git a/lib/emscripten/src/io/windows.rs b/lib/emscripten/src/io/windows.rs
index a3c6f70aa..a7d6dc60b 100644
--- a/lib/emscripten/src/io/windows.rs
+++ b/lib/emscripten/src/io/windows.rs
@@ -36,11 +36,11 @@ pub fn printf(_ctx: &mut Ctx, memory_offset: i32, extra: i32) -> i32 {
/// chroot
pub fn chroot(_ctx: &mut Ctx, _name_ptr: i32) -> i32 {
debug!("emscripten::chroot");
- unimplemented!()
+ unimplemented!("emscripten::chroot")
}
/// getpwuid
pub fn getpwuid(_ctx: &mut Ctx, _uid: i32) -> i32 {
debug!("emscripten::getpwuid");
- unimplemented!()
+ unimplemented!("emscripten::getpwuid")
}
diff --git a/lib/emscripten/src/lib.rs b/lib/emscripten/src/lib.rs
index 7dc808bde..1c9b8a1f7 100644
--- a/lib/emscripten/src/lib.rs
+++ b/lib/emscripten/src/lib.rs
@@ -111,7 +111,7 @@ pub struct EmscriptenData<'a> {
pub dyn_call_iii: Option>,
pub dyn_call_iiii: Option>,
pub dyn_call_iifi: Option>,
- pub dyn_call_v: Option>,
+ pub dyn_call_v: Option>,
pub dyn_call_vi: Option>,
pub dyn_call_vii: Option>,
pub dyn_call_viii: Option>,
@@ -168,7 +168,7 @@ pub struct EmscriptenData<'a> {
pub temp_ret_0: i32,
pub stack_save: Option>,
- pub stack_restore: Option>,
+ pub stack_restore: Option>,
pub set_threw: Option>,
pub mapped_dirs: HashMap,
}
diff --git a/lib/emscripten/src/syscalls/unix.rs b/lib/emscripten/src/syscalls/unix.rs
index efcff0a5e..62d807c02 100644
--- a/lib/emscripten/src/syscalls/unix.rs
+++ b/lib/emscripten/src/syscalls/unix.rs
@@ -7,6 +7,7 @@ use libc::{
accept,
access,
bind,
+ c_char,
c_int,
c_ulong,
c_void,
@@ -259,7 +260,7 @@ pub fn ___syscall194(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_in
ftruncate64(_fd, _length)
}
#[cfg(target_os = "macos")]
- unimplemented!()
+ unimplemented!("emscripten::___syscall194 (ftruncate64) {}", _which)
}
/// lchown
@@ -1063,14 +1064,14 @@ pub fn ___syscall220(ctx: &mut Ctx, _which: i32, mut varargs: VarArgs) -> i32 {
let upper_bound = std::cmp::min((*dirent).d_reclen, 255) as usize;
let mut i = 0;
while i < upper_bound {
- *(dirp.add(pos + 11 + i) as *mut i8) = (*dirent).d_name[i] as _;
+ *(dirp.add(pos + 11 + i) as *mut c_char) = (*dirent).d_name[i] as c_char;
i += 1;
}
// We set the termination string char
- *(dirp.add(pos + 11 + i) as *mut i8) = 0 as i8;
+ *(dirp.add(pos + 11 + i) as *mut c_char) = 0 as c_char;
debug!(
" => file {}",
- CStr::from_ptr(dirp.add(pos + 11) as *const i8)
+ CStr::from_ptr(dirp.add(pos + 11) as *const c_char)
.to_str()
.unwrap()
);
@@ -1111,6 +1112,6 @@ pub fn ___syscall324(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_in
}
#[cfg(target_os = "macos")]
{
- unimplemented!()
+ unimplemented!("emscripten::___syscall324 (fallocate) {}", _which)
}
}
diff --git a/lib/emscripten/src/syscalls/windows.rs b/lib/emscripten/src/syscalls/windows.rs
index f6a867356..b5ed6cc83 100644
--- a/lib/emscripten/src/syscalls/windows.rs
+++ b/lib/emscripten/src/syscalls/windows.rs
@@ -2,7 +2,6 @@ use crate::utils::{copy_cstr_into_wasm, get_cstr_path};
use crate::varargs::VarArgs;
use libc::mkdir;
use libc::open;
-use rand::Rng;
use std::env;
use std::ffi::CString;
use std::fs::File;
@@ -39,7 +38,8 @@ pub fn ___syscall5(ctx: &mut Ctx, which: c_int, mut varargs: VarArgs) -> c_int {
let ptr = tmp_dir_c_str.as_ptr() as *const i8;
let mut urandom_file = File::create(tmp_dir).unwrap();
// create some random bytes and put them into the file
- let random_bytes = rand::thread_rng().gen::<[u8; 32]>();
+ let mut random_bytes = [0u8; 32];
+ getrandom::getrandom(&mut random_bytes).unwrap();
let _ = urandom_file.write_all(&random_bytes).unwrap();
// put the file path string into wasm memory
let urandom_file_offset = unsafe { copy_cstr_into_wasm(ctx, ptr) };
@@ -66,13 +66,13 @@ pub fn ___syscall5(ctx: &mut Ctx, which: c_int, mut varargs: VarArgs) -> c_int {
/// link
pub fn ___syscall9(_ctx: &mut Ctx, _which: c_int, mut _varargs: VarArgs) -> c_int {
debug!("emscripten::___syscall9 (link) {}", _which);
- unimplemented!()
+ unimplemented!("emscripten::___syscall9 (link) {}", _which);
}
/// ftruncate64
pub fn ___syscall194(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
debug!("emscripten::___syscall194 - stub");
- unimplemented!()
+ unimplemented!("emscripten::___syscall194 - stub")
}
// chown
@@ -86,13 +86,13 @@ pub fn ___syscall212(_ctx: &mut Ctx, which: c_int, mut _varargs: VarArgs) -> c_i
/// access
pub fn ___syscall33(_ctx: &mut Ctx, _which: c_int, mut _varargs: VarArgs) -> c_int {
debug!("emscripten::___syscall33 (access) {}", _which);
- unimplemented!()
+ unimplemented!("emscripten::___syscall33 (access) {}", _which);
}
/// nice
pub fn ___syscall34(_ctx: &mut Ctx, _which: c_int, mut _varargs: VarArgs) -> c_int {
debug!("emscripten::___syscall34 (nice) {}", _which);
- unimplemented!()
+ unimplemented!("emscripten::___syscall34 (nice) {}", _which);
}
// mkdir
@@ -113,19 +113,19 @@ pub fn ___syscall39(ctx: &mut Ctx, which: c_int, mut varargs: VarArgs) -> c_int
/// dup
pub fn ___syscall41(_ctx: &mut Ctx, _which: c_int, _varargs: VarArgs) -> c_int {
debug!("emscripten::___syscall41 (dup) {}", _which);
- unimplemented!()
+ unimplemented!("emscripten::___syscall41 (dup) {}", _which);
}
/// getrusage
pub fn ___syscall77(_ctx: &mut Ctx, _which: c_int, _varargs: VarArgs) -> c_int {
debug!("emscripten::___syscall77 (getrusage) {}", _which);
- unimplemented!()
+ unimplemented!("emscripten::___syscall77 (getrusage) {}", _which);
}
/// symlink
pub fn ___syscall83(_ctx: &mut Ctx, _which: c_int, _varargs: VarArgs) -> c_int {
debug!("emscripten::___syscall83 (symlink) {}", _which);
- unimplemented!()
+ unimplemented!("emscripten::___syscall83 (symlink) {}", _which);
}
/// readlink
@@ -143,38 +143,38 @@ pub fn ___syscall132(_ctx: &mut Ctx, _which: c_int, mut _varargs: VarArgs) -> c_
/// lchown
pub fn ___syscall198(_ctx: &mut Ctx, _which: c_int, _varargs: VarArgs) -> c_int {
debug!("emscripten::___syscall198 (lchown) {}", _which);
- unimplemented!()
+ unimplemented!("emscripten::___syscall198 (lchown) {}", _which);
}
/// getgid32
pub fn ___syscall200(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
debug!("emscripten::___syscall200 (getgid32)");
- unimplemented!();
+ unimplemented!("emscripten::___syscall200 (getgid32)");
}
// geteuid32
pub fn ___syscall201(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
debug!("emscripten::___syscall201 (geteuid32)");
- unimplemented!();
+ unimplemented!("emscripten::___syscall201 (geteuid32)");
}
// getegid32
pub fn ___syscall202(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
// gid_t
debug!("emscripten::___syscall202 (getegid32)");
- unimplemented!();
+ unimplemented!("emscripten::___syscall202 (getegid32)");
}
/// getgroups
pub fn ___syscall205(_ctx: &mut Ctx, _which: c_int, _varargs: VarArgs) -> c_int {
debug!("emscripten::___syscall205 (getgroups) {}", _which);
- unimplemented!()
+ unimplemented!("emscripten::___syscall205 (getgroups) {}", _which);
}
/// madvise
pub fn ___syscall219(_ctx: &mut Ctx, _which: c_int, _varargs: VarArgs) -> c_int {
debug!("emscripten::___syscall212 (chown) {}", _which);
- unimplemented!()
+ unimplemented!("emscripten::___syscall212 (chown) {}", _which);
}
/// dup3
@@ -194,7 +194,7 @@ pub fn ___syscall54(_ctx: &mut Ctx, which: c_int, mut _varargs: VarArgs) -> c_in
/// fchmod
pub fn ___syscall94(_ctx: &mut Ctx, _which: c_int, _varargs: VarArgs) -> c_int {
debug!("emscripten::___syscall118 (fchmod) {}", _which);
- unimplemented!()
+ unimplemented!("emscripten::___syscall118 (fchmod) {}", _which);
}
// socketcall
@@ -209,7 +209,7 @@ pub fn ___syscall102(_ctx: &mut Ctx, which: c_int, mut _varargs: VarArgs) -> c_i
/// fsync
pub fn ___syscall118(_ctx: &mut Ctx, _which: c_int, _varargs: VarArgs) -> c_int {
debug!("emscripten::___syscall118 (fsync) {}", _which);
- unimplemented!()
+ unimplemented!("emscripten::___syscall118 (fsync) {}", _which);
}
// pread
@@ -247,7 +247,7 @@ pub fn ___syscall142(_ctx: &mut Ctx, which: c_int, mut _varargs: VarArgs) -> c_i
/// fdatasync
pub fn ___syscall148(_ctx: &mut Ctx, _which: c_int, _varargs: VarArgs) -> c_int {
debug!("emscripten::___syscall148 (fdatasync) {}", _which);
- unimplemented!();
+ unimplemented!("emscripten::___syscall148 (fdatasync) {}", _which);
}
// setpgid
@@ -300,11 +300,11 @@ pub fn ___syscall221(_ctx: &mut Ctx, _which: c_int, mut _varargs: VarArgs) -> c_
/// fchown
pub fn ___syscall207(_ctx: &mut Ctx, _which: c_int, _varargs: VarArgs) -> c_int {
debug!("emscripten::___syscall207 (fchown) {}", _which);
- unimplemented!()
+ unimplemented!("emscripten::___syscall207 (fchown) {}", _which)
}
/// fallocate
pub fn ___syscall324(_ctx: &mut Ctx, _which: c_int, _varargs: VarArgs) -> c_int {
debug!("emscripten::___syscall324 (fallocate) {}", _which);
- unimplemented!()
+ unimplemented!("emscripten::___syscall324 (fallocate) {}", _which)
}
diff --git a/lib/llvm-backend-tests/Cargo.toml b/lib/llvm-backend-tests/Cargo.toml
new file mode 100644
index 000000000..bb6b24b51
--- /dev/null
+++ b/lib/llvm-backend-tests/Cargo.toml
@@ -0,0 +1,15 @@
+[package]
+name = "wasmer-llvm-backend-tests"
+version = "0.10.2"
+authors = ["Nick Lewycky "]
+edition = "2018"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+wabt = "0.9.1"
+wasmer-runtime-core = { path = "../runtime-core", version = "0.11.0" }
+wasmer-runtime = { path = "../runtime", version = "0.11.0" }
+wasmer-llvm-backend = { path = "../llvm-backend", version = "0.11.0", features = ["test"] }
+
+[features]
diff --git a/lib/llvm-backend-tests/src/lib.rs b/lib/llvm-backend-tests/src/lib.rs
new file mode 100644
index 000000000..ea79b7872
--- /dev/null
+++ b/lib/llvm-backend-tests/src/lib.rs
@@ -0,0 +1,7 @@
+pub use wabt::wat2wasm;
+use wasmer_llvm_backend::LLVMCompiler;
+use wasmer_runtime_core::backend::Compiler;
+
+pub fn get_compiler() -> impl Compiler {
+ LLVMCompiler::new()
+}
diff --git a/lib/llvm-backend-tests/tests/compile.rs b/lib/llvm-backend-tests/tests/compile.rs
new file mode 100644
index 000000000..17071a44a
--- /dev/null
+++ b/lib/llvm-backend-tests/tests/compile.rs
@@ -0,0 +1,40 @@
+use wasmer_llvm_backend_tests::{get_compiler, wat2wasm};
+use wasmer_runtime::imports;
+use wasmer_runtime_core::compile_with;
+
+#[test]
+fn crash_return_with_float_on_stack() {
+ const MODULE: &str = r#"
+(module
+ (type (;0;) (func))
+ (type (;1;) (func (param f64) (result f64)))
+ (func $_start (type 0))
+ (func $fmod (type 1) (param f64) (result f64)
+ local.get 0
+ f64.const 0x0p+0 (;=0;)
+ f64.mul
+ return)
+)
+"#;
+ let wasm_binary = wat2wasm(MODULE.as_bytes()).expect("WAST not valid or malformed");
+ let module = compile_with(&wasm_binary, &get_compiler()).unwrap();
+ module.instantiate(&imports! {}).unwrap();
+}
+
+#[test]
+fn crash_select_with_mismatched_pending() {
+ const MODULE: &str = r#"
+ (module
+ (func (param f64)
+ f64.const 0x0p+0 (;=0;)
+ local.get 0
+ f64.add
+ f64.const 0x0p+0 (;=0;)
+ i32.const 0
+ select
+ drop))
+"#;
+ let wasm_binary = wat2wasm(MODULE.as_bytes()).expect("WAST not valid or malformed");
+ let module = compile_with(&wasm_binary, &get_compiler()).unwrap();
+ module.instantiate(&imports! {}).unwrap();
+}
diff --git a/lib/llvm-backend/Cargo.toml b/lib/llvm-backend/Cargo.toml
index 1cc15ec89..b9fa7e6a7 100644
--- a/lib/llvm-backend/Cargo.toml
+++ b/lib/llvm-backend/Cargo.toml
@@ -1,22 +1,25 @@
[package]
name = "wasmer-llvm-backend"
-version = "0.8.0"
+version = "0.11.0"
+license = "MIT"
authors = ["The Wasmer Engineering Team "]
+repository = "https://github.com/wasmerio/wasmer"
+keywords = ["wasm", "webassembly", "compiler", "JIT", "llvm"]
+categories = ["wasm"]
edition = "2018"
readme = "README.md"
[dependencies]
-wasmer-runtime-core = { path = "../runtime-core", version = "0.8.0" }
+wasmer-runtime-core = { path = "../runtime-core", version = "0.11.0" }
wasmparser = "0.39.1"
smallvec = "0.6"
goblin = "0.0.24"
libc = "0.2.60"
-capstone = { version = "0.6", optional = true }
byteorder = "1"
[dependencies.inkwell]
-git = "https://github.com/wasmerio/inkwell"
-branch = "llvm8-0"
+git = "https://github.com/TheDan64/inkwell"
+rev = "781620e9fa30e51a6e03bd0d49b5f5bb7a782520"
default-features = false
features = ["llvm8-0", "target-x86"]
@@ -38,4 +41,4 @@ wabt = "0.9.1"
[features]
debug = ["wasmer-runtime-core/debug"]
-disasm = ["capstone"]
+test = []
diff --git a/lib/llvm-backend/src/backend.rs b/lib/llvm-backend/src/backend.rs
index 682bd7278..a5d262035 100644
--- a/lib/llvm-backend/src/backend.rs
+++ b/lib/llvm-backend/src/backend.rs
@@ -1,21 +1,24 @@
use super::stackmap::StackmapRegistry;
-use crate::intrinsics::Intrinsics;
-use crate::structs::{Callbacks, LLVMModule, LLVMResult, MemProtect};
+use crate::{
+ intrinsics::Intrinsics,
+ structs::{Callbacks, LLVMModule, LLVMResult, MemProtect},
+};
use inkwell::{
memory_buffer::MemoryBuffer,
module::Module,
- targets::{CodeModel, FileType, InitializationConfig, RelocMode, Target, TargetMachine},
- OptimizationLevel,
+ targets::{FileType, TargetMachine},
};
use libc::c_char;
use std::{
any::Any,
+ cell::RefCell,
ffi::{c_void, CString},
fs::File,
io::Write,
mem,
ops::Deref,
ptr::{self, NonNull},
+ rc::Rc,
slice, str,
sync::{Arc, Once},
};
@@ -28,7 +31,7 @@ use wasmer_runtime_core::{
module::ModuleInfo,
state::ModuleStateMap,
structures::TypedIndex,
- typed_func::{Wasm, WasmTrapInfo},
+ typed_func::{Trampoline, Wasm, WasmTrapInfo},
types::{LocalFuncIndex, SigIndex},
vm, vmcalls,
};
@@ -58,7 +61,7 @@ extern "C" {
#[allow(improper_ctypes)]
fn invoke_trampoline(
- trampoline: unsafe extern "C" fn(*mut vm::Ctx, NonNull, *const u64, *mut u64),
+ trampoline: Trampoline,
vmctx_ptr: *mut vm::Ctx,
func_ptr: NonNull,
params: *const u64,
@@ -168,34 +171,14 @@ pub struct LLVMBackend {
impl LLVMBackend {
pub fn new(
- module: Module,
+ module: Rc>,
_intrinsics: Intrinsics,
_stackmaps: &StackmapRegistry,
_module_info: &ModuleInfo,
+ target_machine: &TargetMachine,
) -> (Self, LLVMCache) {
- Target::initialize_x86(&InitializationConfig {
- asm_parser: true,
- asm_printer: true,
- base: true,
- disassembler: true,
- info: true,
- machine_code: true,
- });
- let triple = TargetMachine::get_default_triple().to_string();
- let target = Target::from_triple(&triple).unwrap();
- let target_machine = target
- .create_target_machine(
- &triple,
- &TargetMachine::get_host_cpu_name().to_string(),
- &TargetMachine::get_host_cpu_features().to_string(),
- OptimizationLevel::Aggressive,
- RelocMode::Static,
- CodeModel::Large,
- )
- .unwrap();
-
let memory_buffer = target_machine
- .write_to_memory_buffer(&module, FileType::Object)
+ .write_to_memory_buffer(&module.borrow_mut(), FileType::Object)
.unwrap();
let mem_buf_slice = memory_buffer.as_slice();
@@ -408,12 +391,7 @@ impl RunnableModule for LLVMBackend {
}
fn get_trampoline(&self, _: &ModuleInfo, sig_index: SigIndex) -> Option {
- let trampoline: unsafe extern "C" fn(
- *mut vm::Ctx,
- NonNull,
- *const u64,
- *mut u64,
- ) = unsafe {
+ let trampoline: Trampoline = unsafe {
let name = if cfg!(target_os = "macos") {
format!("_trmp{}", sig_index.index())
} else {
@@ -477,33 +455,3 @@ impl CacheGen for LLVMCache {
Ok(([].as_ref().into(), memory))
}
}
-
-#[cfg(feature = "disasm")]
-unsafe fn disass_ptr(ptr: *const u8, size: usize, inst_count: usize) {
- use capstone::arch::BuildsCapstone;
- let mut cs = capstone::Capstone::new() // Call builder-pattern
- .x86() // X86 architecture
- .mode(capstone::arch::x86::ArchMode::Mode64) // 64-bit mode
- .detail(true) // Generate extra instruction details
- .build()
- .expect("Failed to create Capstone object");
-
- // Get disassembled instructions
- let insns = cs
- .disasm_count(
- std::slice::from_raw_parts(ptr, size),
- ptr as u64,
- inst_count,
- )
- .expect("Failed to disassemble");
-
- println!("count = {}", insns.len());
- for insn in insns.iter() {
- println!(
- "0x{:x}: {:6} {}",
- insn.address(),
- insn.mnemonic().unwrap_or(""),
- insn.op_str().unwrap_or("")
- );
- }
-}
diff --git a/lib/llvm-backend/src/code.rs b/lib/llvm-backend/src/code.rs
index 9ccb0c990..c0f6e07dd 100644
--- a/lib/llvm-backend/src/code.rs
+++ b/lib/llvm-backend/src/code.rs
@@ -1,21 +1,34 @@
+use crate::{
+ backend::LLVMBackend,
+ intrinsics::{tbaa_label, CtxType, GlobalCache, Intrinsics, MemoryCache},
+ read_info::{blocktype_to_type, type_to_type},
+ stackmap::{StackmapEntry, StackmapEntryKind, StackmapRegistry, ValueSemantic},
+ state::{ControlFrame, ExtraInfo, IfElseState, State},
+ trampolines::generate_trampolines,
+};
use inkwell::{
builder::Builder,
context::Context,
module::{Linkage, Module},
passes::PassManager,
+ targets::{CodeModel, InitializationConfig, RelocMode, Target, TargetMachine},
types::{BasicType, BasicTypeEnum, FunctionType, PointerType, VectorType},
values::{
BasicValue, BasicValueEnum, FloatValue, FunctionValue, IntValue, PhiValue, PointerValue,
VectorValue,
},
- AddressSpace, AtomicOrdering, AtomicRMWBinOp, FloatPredicate, IntPredicate,
+ AddressSpace, AtomicOrdering, AtomicRMWBinOp, FloatPredicate, IntPredicate, OptimizationLevel,
};
use smallvec::SmallVec;
-use std::cell::RefCell;
-use std::rc::Rc;
-use std::sync::{Arc, RwLock};
+use std::{
+ cell::RefCell,
+ collections::HashMap,
+ mem::ManuallyDrop,
+ rc::Rc,
+ sync::{Arc, RwLock},
+};
use wasmer_runtime_core::{
- backend::{Backend, CacheGen, Token},
+ backend::{Backend, CacheGen, CompilerConfig, Token},
cache::{Artifact, Error as CacheError},
codegen::*,
memory::MemoryType,
@@ -27,19 +40,12 @@ use wasmer_runtime_core::{
};
use wasmparser::{BinaryReaderError, MemoryImmediate, Operator, Type as WpType};
-use crate::backend::LLVMBackend;
-use crate::intrinsics::{CtxType, GlobalCache, Intrinsics, MemoryCache};
-use crate::read_info::{blocktype_to_type, type_to_type};
-use crate::stackmap::{StackmapEntry, StackmapEntryKind, StackmapRegistry, ValueSemantic};
-use crate::state::{ControlFrame, IfElseState, State};
-use crate::trampolines::generate_trampolines;
-
-fn func_sig_to_llvm(
- context: &Context,
- intrinsics: &Intrinsics,
+fn func_sig_to_llvm<'ctx>(
+ context: &'ctx Context,
+ intrinsics: &Intrinsics<'ctx>,
sig: &FuncSig,
- type_to_llvm: fn(intrinsics: &Intrinsics, ty: Type) -> BasicTypeEnum,
-) -> FunctionType {
+ type_to_llvm: fn(intrinsics: &Intrinsics<'ctx>, ty: Type) -> BasicTypeEnum<'ctx>,
+) -> FunctionType<'ctx> {
let user_param_types = sig.params().iter().map(|&ty| type_to_llvm(intrinsics, ty));
let param_types: Vec<_> = std::iter::once(intrinsics.ctx_ptr_ty.as_basic_type_enum())
@@ -62,7 +68,7 @@ fn func_sig_to_llvm(
}
}
-fn type_to_llvm(intrinsics: &Intrinsics, ty: Type) -> BasicTypeEnum {
+fn type_to_llvm<'ctx>(intrinsics: &Intrinsics<'ctx>, ty: Type) -> BasicTypeEnum<'ctx> {
match ty {
Type::I32 => intrinsics.i32_ty.as_basic_type_enum(),
Type::I64 => intrinsics.i64_ty.as_basic_type_enum(),
@@ -72,7 +78,7 @@ fn type_to_llvm(intrinsics: &Intrinsics, ty: Type) -> BasicTypeEnum {
}
}
-fn type_to_llvm_int_only(intrinsics: &Intrinsics, ty: Type) -> BasicTypeEnum {
+fn type_to_llvm_int_only<'ctx>(intrinsics: &Intrinsics<'ctx>, ty: Type) -> BasicTypeEnum<'ctx> {
match ty {
Type::I32 | Type::F32 => intrinsics.i32_ty.as_basic_type_enum(),
Type::I64 | Type::F64 => intrinsics.i64_ty.as_basic_type_enum(),
@@ -81,13 +87,13 @@ fn type_to_llvm_int_only(intrinsics: &Intrinsics, ty: Type) -> BasicTypeEnum {
}
// Create a vector where each lane contains the same value.
-fn splat_vector(
- builder: &Builder,
- intrinsics: &Intrinsics,
- value: BasicValueEnum,
- vec_ty: VectorType,
+fn splat_vector<'ctx>(
+ builder: &Builder<'ctx>,
+ intrinsics: &Intrinsics<'ctx>,
+ value: BasicValueEnum<'ctx>,
+ vec_ty: VectorType<'ctx>,
name: &str,
-) -> VectorValue {
+) -> VectorValue<'ctx> {
// Use insert_element to insert the element into an undef vector, then use
// shuffle vector to copy that lane to all lanes.
builder.build_shuffle_vector(
@@ -101,18 +107,18 @@ fn splat_vector(
// Convert floating point vector to integer and saturate when out of range.
// TODO: generalize to non-vectors using FloatMathType, IntMathType, etc. for
// https://github.com/WebAssembly/nontrapping-float-to-int-conversions/blob/master/proposals/nontrapping-float-to-int-conversion/Overview.md
-fn trunc_sat(
- builder: &Builder,
- intrinsics: &Intrinsics,
- fvec_ty: VectorType,
- ivec_ty: VectorType,
+fn trunc_sat<'ctx>(
+ builder: &Builder<'ctx>,
+ intrinsics: &Intrinsics<'ctx>,
+ fvec_ty: VectorType<'ctx>,
+ ivec_ty: VectorType<'ctx>,
lower_bound: u64, // Exclusive (lowest representable value)
upper_bound: u64, // Exclusive (greatest representable value)
int_min_value: u64,
int_max_value: u64,
- value: IntValue,
+ value: IntValue<'ctx>,
name: &str,
-) -> IntValue {
+) -> IntValue<'ctx> {
// a) Compare vector with itself to identify NaN lanes.
// b) Compare vector with splat of inttofp(upper_bound) to identify
// lanes that need to saturate to max.
@@ -220,11 +226,11 @@ fn trunc_sat(
.into_int_value()
}
-fn trap_if_not_representable_as_int(
- builder: &Builder,
- intrinsics: &Intrinsics,
- context: &Context,
- function: &FunctionValue,
+fn trap_if_not_representable_as_int<'ctx>(
+ builder: &Builder<'ctx>,
+ intrinsics: &Intrinsics<'ctx>,
+ context: &'ctx Context,
+ function: &FunctionValue<'ctx>,
lower_bound: u64, // Inclusive (not a trapping value)
upper_bound: u64, // Inclusive (not a trapping value)
value: FloatValue,
@@ -256,8 +262,8 @@ fn trap_if_not_representable_as_int(
"out_of_bounds",
);
- let failure_block = context.append_basic_block(function, "conversion_failure_block");
- let continue_block = context.append_basic_block(function, "conversion_success_block");
+ let failure_block = context.append_basic_block(*function, "conversion_failure_block");
+ let continue_block = context.append_basic_block(*function, "conversion_success_block");
builder.build_conditional_branch(out_of_bounds, &failure_block, &continue_block);
builder.position_at_end(&failure_block);
@@ -270,11 +276,11 @@ fn trap_if_not_representable_as_int(
builder.position_at_end(&continue_block);
}
-fn trap_if_zero_or_overflow(
- builder: &Builder,
- intrinsics: &Intrinsics,
- context: &Context,
- function: &FunctionValue,
+fn trap_if_zero_or_overflow<'ctx>(
+ builder: &Builder<'ctx>,
+ intrinsics: &Intrinsics<'ctx>,
+ context: &'ctx Context,
+ function: &FunctionValue<'ctx>,
left: IntValue,
right: IntValue,
) {
@@ -321,8 +327,8 @@ fn trap_if_zero_or_overflow(
.unwrap()
.into_int_value();
- let shouldnt_trap_block = context.append_basic_block(function, "shouldnt_trap_block");
- let should_trap_block = context.append_basic_block(function, "should_trap_block");
+ let shouldnt_trap_block = context.append_basic_block(*function, "shouldnt_trap_block");
+ let should_trap_block = context.append_basic_block(*function, "should_trap_block");
builder.build_conditional_branch(should_trap, &should_trap_block, &shouldnt_trap_block);
builder.position_at_end(&should_trap_block);
builder.build_call(
@@ -334,11 +340,11 @@ fn trap_if_zero_or_overflow(
builder.position_at_end(&shouldnt_trap_block);
}
-fn trap_if_zero(
- builder: &Builder,
- intrinsics: &Intrinsics,
- context: &Context,
- function: &FunctionValue,
+fn trap_if_zero<'ctx>(
+ builder: &Builder<'ctx>,
+ intrinsics: &Intrinsics<'ctx>,
+ context: &'ctx Context,
+ function: &FunctionValue<'ctx>,
value: IntValue,
) {
let int_type = value.get_type();
@@ -363,8 +369,8 @@ fn trap_if_zero(
.unwrap()
.into_int_value();
- let shouldnt_trap_block = context.append_basic_block(function, "shouldnt_trap_block");
- let should_trap_block = context.append_basic_block(function, "should_trap_block");
+ let shouldnt_trap_block = context.append_basic_block(*function, "shouldnt_trap_block");
+ let should_trap_block = context.append_basic_block(*function, "should_trap_block");
builder.build_conditional_branch(should_trap, &should_trap_block, &shouldnt_trap_block);
builder.position_at_end(&should_trap_block);
builder.build_call(
@@ -376,12 +382,161 @@ fn trap_if_zero(
builder.position_at_end(&shouldnt_trap_block);
}
+fn v128_into_int_vec<'ctx>(
+ builder: &Builder<'ctx>,
+ intrinsics: &Intrinsics<'ctx>,
+ value: BasicValueEnum<'ctx>,
+ info: ExtraInfo,
+ int_vec_ty: VectorType<'ctx>,
+) -> (VectorValue<'ctx>, ExtraInfo) {
+ let (value, info) = if info.has_pending_f32_nan() {
+ let value = builder.build_bitcast(value, intrinsics.f32x4_ty, "");
+ (
+ canonicalize_nans(builder, intrinsics, value),
+ info.strip_pending(),
+ )
+ } else if info.has_pending_f64_nan() {
+ let value = builder.build_bitcast(value, intrinsics.f64x2_ty, "");
+ (
+ canonicalize_nans(builder, intrinsics, value),
+ info.strip_pending(),
+ )
+ } else {
+ (value, info)
+ };
+ (
+ builder
+ .build_bitcast(value, int_vec_ty, "")
+ .into_vector_value(),
+ info,
+ )
+}
+
+fn v128_into_i8x16<'ctx>(
+ builder: &Builder<'ctx>,
+ intrinsics: &Intrinsics<'ctx>,
+ value: BasicValueEnum<'ctx>,
+ info: ExtraInfo,
+) -> (VectorValue<'ctx>, ExtraInfo) {
+ v128_into_int_vec(builder, intrinsics, value, info, intrinsics.i8x16_ty)
+}
+
+fn v128_into_i16x8<'ctx>(
+ builder: &Builder<'ctx>,
+ intrinsics: &Intrinsics<'ctx>,
+ value: BasicValueEnum<'ctx>,
+ info: ExtraInfo,
+) -> (VectorValue<'ctx>, ExtraInfo) {
+ v128_into_int_vec(builder, intrinsics, value, info, intrinsics.i16x8_ty)
+}
+
+fn v128_into_i32x4<'ctx>(
+ builder: &Builder<'ctx>,
+ intrinsics: &Intrinsics<'ctx>,
+ value: BasicValueEnum<'ctx>,
+ info: ExtraInfo,
+) -> (VectorValue<'ctx>, ExtraInfo) {
+ v128_into_int_vec(builder, intrinsics, value, info, intrinsics.i32x4_ty)
+}
+
+fn v128_into_i64x2<'ctx>(
+ builder: &Builder<'ctx>,
+ intrinsics: &Intrinsics<'ctx>,
+ value: BasicValueEnum<'ctx>,
+ info: ExtraInfo,
+) -> (VectorValue<'ctx>, ExtraInfo) {
+ v128_into_int_vec(builder, intrinsics, value, info, intrinsics.i64x2_ty)
+}
+
+// If the value is pending a 64-bit canonicalization, do it now.
+// Return a f32x4 vector.
+fn v128_into_f32x4<'ctx>(
+ builder: &Builder<'ctx>,
+ intrinsics: &Intrinsics<'ctx>,
+ value: BasicValueEnum<'ctx>,
+ info: ExtraInfo,
+) -> (VectorValue<'ctx>, ExtraInfo) {
+ let (value, info) = if info.has_pending_f64_nan() {
+ let value = builder.build_bitcast(value, intrinsics.f64x2_ty, "");
+ (
+ canonicalize_nans(builder, intrinsics, value),
+ info.strip_pending(),
+ )
+ } else {
+ (value, info)
+ };
+ (
+ builder
+ .build_bitcast(value, intrinsics.f32x4_ty, "")
+ .into_vector_value(),
+ info,
+ )
+}
+
+// If the value is pending a 32-bit canonicalization, do it now.
+// Return a f64x2 vector.
+fn v128_into_f64x2<'ctx>(
+ builder: &Builder<'ctx>,
+ intrinsics: &Intrinsics<'ctx>,
+ value: BasicValueEnum<'ctx>,
+ info: ExtraInfo,
+) -> (VectorValue<'ctx>, ExtraInfo) {
+ let (value, info) = if info.has_pending_f32_nan() {
+ let value = builder.build_bitcast(value, intrinsics.f32x4_ty, "");
+ (
+ canonicalize_nans(builder, intrinsics, value),
+ info.strip_pending(),
+ )
+ } else {
+ (value, info)
+ };
+ (
+ builder
+ .build_bitcast(value, intrinsics.f64x2_ty, "")
+ .into_vector_value(),
+ info,
+ )
+}
+
+fn apply_pending_canonicalization<'ctx>(
+ builder: &Builder<'ctx>,
+ intrinsics: &Intrinsics<'ctx>,
+ value: BasicValueEnum<'ctx>,
+ info: ExtraInfo,
+) -> BasicValueEnum<'ctx> {
+ if info.has_pending_f32_nan() {
+ if value.get_type().is_vector_type()
+ || value.get_type() == intrinsics.i128_ty.as_basic_type_enum()
+ {
+ let ty = value.get_type();
+ let value = builder.build_bitcast(value, intrinsics.f32x4_ty, "");
+ let value = canonicalize_nans(builder, intrinsics, value);
+ builder.build_bitcast(value, ty, "")
+ } else {
+ canonicalize_nans(builder, intrinsics, value)
+ }
+ } else if info.has_pending_f64_nan() {
+ if value.get_type().is_vector_type()
+ || value.get_type() == intrinsics.i128_ty.as_basic_type_enum()
+ {
+ let ty = value.get_type();
+ let value = builder.build_bitcast(value, intrinsics.f64x2_ty, "");
+ let value = canonicalize_nans(builder, intrinsics, value);
+ builder.build_bitcast(value, ty, "")
+ } else {
+ canonicalize_nans(builder, intrinsics, value)
+ }
+ } else {
+ value
+ }
+}
+
// Replaces any NaN with the canonical QNaN, otherwise leaves the value alone.
-fn canonicalize_nans(
- builder: &Builder,
- intrinsics: &Intrinsics,
- value: BasicValueEnum,
-) -> BasicValueEnum {
+fn canonicalize_nans<'ctx>(
+ builder: &Builder<'ctx>,
+ intrinsics: &Intrinsics<'ctx>,
+ value: BasicValueEnum<'ctx>,
+) -> BasicValueEnum<'ctx> {
let f_ty = value.get_type();
let canonicalized = if f_ty.is_vector_type() {
let value = value.into_vector_value();
@@ -415,62 +570,110 @@ fn canonicalize_nans(
canonicalized
}
-fn resolve_memory_ptr(
- builder: &Builder,
- intrinsics: &Intrinsics,
- context: &Context,
- function: &FunctionValue,
- state: &mut State,
- ctx: &mut CtxType,
+fn resolve_memory_ptr<'ctx>(
+ builder: &Builder<'ctx>,
+ intrinsics: &Intrinsics<'ctx>,
+ context: &'ctx Context,
+ module: Rc>>,
+ function: &FunctionValue<'ctx>,
+ state: &mut State<'ctx>,
+ ctx: &mut CtxType<'static, 'ctx>,
memarg: &MemoryImmediate,
- ptr_ty: PointerType,
+ ptr_ty: PointerType<'ctx>,
value_size: usize,
-) -> Result {
- // Ignore alignment hint for the time being.
- let imm_offset = intrinsics.i64_ty.const_int(memarg.offset as u64, false);
- let value_size_v = intrinsics.i64_ty.const_int(value_size as u64, false);
- let var_offset_i32 = state.pop1()?.into_int_value();
- let var_offset =
- builder.build_int_z_extend(var_offset_i32, intrinsics.i64_ty, &state.var_name());
- let effective_offset = builder.build_int_add(var_offset, imm_offset, &state.var_name());
- let end_offset = builder.build_int_add(effective_offset, value_size_v, &state.var_name());
- let memory_cache = ctx.memory(MemoryIndex::new(0), intrinsics);
-
- let mem_base_int = match memory_cache {
+) -> Result, BinaryReaderError> {
+ // Look up the memory base (as pointer) and bounds (as unsigned integer).
+ let memory_cache = ctx.memory(MemoryIndex::new(0), intrinsics, module.clone());
+ let (mem_base, mem_bound, minimum, _maximum) = match memory_cache {
MemoryCache::Dynamic {
ptr_to_base_ptr,
ptr_to_bounds,
+ minimum,
+ maximum,
} => {
let base = builder
.build_load(ptr_to_base_ptr, "base")
.into_pointer_value();
let bounds = builder.build_load(ptr_to_bounds, "bounds").into_int_value();
+ tbaa_label(
+ &module,
+ intrinsics,
+ "dynamic_memory_base",
+ base.as_instruction_value().unwrap(),
+ Some(0),
+ );
+ tbaa_label(
+ &module,
+ intrinsics,
+ "dynamic_memory_bounds",
+ bounds.as_instruction_value().unwrap(),
+ Some(0),
+ );
+ (base, bounds, minimum, maximum)
+ }
+ MemoryCache::Static {
+ base_ptr,
+ bounds,
+ minimum,
+ maximum,
+ } => (base_ptr, bounds, minimum, maximum),
+ };
+ let mem_base = builder
+ .build_bitcast(mem_base, intrinsics.i8_ptr_ty, &state.var_name())
+ .into_pointer_value();
- let base_as_int = builder.build_ptr_to_int(base, intrinsics.i64_ty, "base_as_int");
+ // Compute the offset over the memory_base.
+ let imm_offset = intrinsics.i64_ty.const_int(memarg.offset as u64, false);
+ let var_offset_i32 = state.pop1()?.into_int_value();
+ let var_offset =
+ builder.build_int_z_extend(var_offset_i32, intrinsics.i64_ty, &state.var_name());
+ let effective_offset = builder.build_int_add(var_offset, imm_offset, &state.var_name());
- let base_in_bounds_1 = builder.build_int_compare(
+ if let MemoryCache::Dynamic { .. } = memory_cache {
+ // If the memory is dynamic, do a bounds check. For static we rely on
+ // the size being a multiple of the page size and hitting a guard page.
+ let value_size_v = intrinsics.i64_ty.const_int(value_size as u64, false);
+ let ptr_in_bounds = if effective_offset.is_const() {
+ let load_offset_end = effective_offset.const_add(value_size_v);
+ let ptr_in_bounds = load_offset_end.const_int_compare(
IntPredicate::ULE,
- end_offset,
- bounds,
- "base_in_bounds_1",
+ intrinsics.i64_ty.const_int(minimum.bytes().0 as u64, false),
);
- let base_in_bounds_2 = builder.build_int_compare(
- IntPredicate::ULT,
- effective_offset,
- end_offset,
- "base_in_bounds_2",
- );
- let base_in_bounds =
- builder.build_and(base_in_bounds_1, base_in_bounds_2, "base_in_bounds");
+ if ptr_in_bounds.get_zero_extended_constant() == Some(1) {
+ Some(ptr_in_bounds)
+ } else {
+ None
+ }
+ } else {
+ None
+ }
+ .unwrap_or_else(|| {
+ let load_offset_end =
+ builder.build_int_add(effective_offset, value_size_v, &state.var_name());
- let base_in_bounds = builder
+ builder.build_int_compare(
+ IntPredicate::ULE,
+ load_offset_end,
+ mem_bound,
+ &state.var_name(),
+ )
+ });
+ if !ptr_in_bounds.is_constant_int()
+ || ptr_in_bounds.get_zero_extended_constant().unwrap() != 1
+ {
+ // LLVM may have folded this into 'i1 true' in which case we know
+ // the pointer is in bounds. LLVM may also have folded it into a
+ // constant expression, not known to be either true or false yet.
+ // If it's false, unknown-but-constant, or not-a-constant, emit a
+ // runtime bounds check. LLVM may yet succeed at optimizing it away.
+ let ptr_in_bounds = builder
.build_call(
intrinsics.expect_i1,
&[
- base_in_bounds.as_basic_value_enum(),
+ ptr_in_bounds.as_basic_value_enum(),
intrinsics.i1_ty.const_int(1, false).as_basic_value_enum(),
],
- "base_in_bounds_expect",
+ "ptr_in_bounds_expect",
)
.try_as_basic_value()
.left()
@@ -478,10 +681,10 @@ fn resolve_memory_ptr(
.into_int_value();
let in_bounds_continue_block =
- context.append_basic_block(function, "in_bounds_continue_block");
- let not_in_bounds_block = context.append_basic_block(function, "not_in_bounds_block");
+ context.append_basic_block(*function, "in_bounds_continue_block");
+ let not_in_bounds_block = context.append_basic_block(*function, "not_in_bounds_block");
builder.build_conditional_branch(
- base_in_bounds,
+ ptr_in_bounds,
&in_bounds_continue_block,
¬_in_bounds_block,
);
@@ -493,30 +696,25 @@ fn resolve_memory_ptr(
);
builder.build_unreachable();
builder.position_at_end(&in_bounds_continue_block);
-
- base_as_int
}
- MemoryCache::Static {
- base_ptr,
- bounds: _,
- } => builder.build_ptr_to_int(base_ptr, intrinsics.i64_ty, "base_as_int"),
- };
+ }
- let effective_address_int =
- builder.build_int_add(mem_base_int, effective_offset, &state.var_name());
- Ok(builder.build_int_to_ptr(effective_address_int, ptr_ty, &state.var_name()))
+ let ptr = unsafe { builder.build_gep(mem_base, &[effective_offset], &state.var_name()) };
+ Ok(builder
+ .build_bitcast(ptr, ptr_ty, &state.var_name())
+ .into_pointer_value())
}
-fn emit_stack_map(
+fn emit_stack_map<'ctx>(
_module_info: &ModuleInfo,
- intrinsics: &Intrinsics,
- builder: &Builder,
+ intrinsics: &Intrinsics<'ctx>,
+ builder: &Builder<'ctx>,
local_function_id: usize,
target: &mut StackmapRegistry,
kind: StackmapEntryKind,
locals: &[PointerValue],
- state: &State,
- _ctx: &mut CtxType,
+ state: &State<'ctx>,
+ _ctx: &mut CtxType<'_, 'ctx>,
opcode_offset: usize,
) {
let stackmap_id = target.entries.len();
@@ -538,7 +736,7 @@ fn emit_stack_map(
params.extend_from_slice(&locals);
value_semantics.extend((0..locals.len()).map(ValueSemantic::WasmLocal));
- params.extend_from_slice(&state.stack);
+ params.extend(state.stack.iter().map(|x| x.0));
value_semantics.extend((0..state.stack.len()).map(ValueSemantic::WasmStack));
// FIXME: Information needed for Abstract -> Runtime state transform is not fully preserved
@@ -560,9 +758,9 @@ fn emit_stack_map(
});
}
-fn finalize_opcode_stack_map(
- intrinsics: &Intrinsics,
- builder: &Builder,
+fn finalize_opcode_stack_map<'ctx>(
+ intrinsics: &Intrinsics<'ctx>,
+ builder: &Builder<'ctx>,
local_function_id: usize,
target: &mut StackmapRegistry,
kind: StackmapEntryKind,
@@ -591,13 +789,13 @@ fn finalize_opcode_stack_map(
});
}
-fn trap_if_misaligned(
- builder: &Builder,
- intrinsics: &Intrinsics,
- context: &Context,
- function: &FunctionValue,
+fn trap_if_misaligned<'ctx>(
+ builder: &Builder<'ctx>,
+ intrinsics: &Intrinsics<'ctx>,
+ context: &'ctx Context,
+ function: &FunctionValue<'ctx>,
memarg: &MemoryImmediate,
- ptr: PointerValue,
+ ptr: PointerValue<'ctx>,
) {
let align = match memarg.flags & 3 {
0 => {
@@ -629,8 +827,8 @@ fn trap_if_misaligned(
.unwrap()
.into_int_value();
- let continue_block = context.append_basic_block(function, "aligned_access_continue_block");
- let not_aligned_block = context.append_basic_block(function, "misaligned_trap_block");
+ let continue_block = context.append_basic_block(*function, "aligned_access_continue_block");
+ let not_aligned_block = context.append_basic_block(*function, "misaligned_trap_block");
builder.build_conditional_branch(aligned, &continue_block, ¬_aligned_block);
builder.position_at_end(¬_aligned_block);
@@ -664,38 +862,45 @@ pub unsafe extern "C" fn callback_trampoline(
}
}
-pub struct LLVMModuleCodeGenerator {
- context: Option,
- builder: Option,
- intrinsics: Option,
- functions: Vec,
- signatures: Map,
+pub struct LLVMModuleCodeGenerator<'ctx> {
+ context: Option<&'ctx Context>,
+ builder: Option>,
+ intrinsics: Option>,
+ functions: Vec>,
+ signatures: Map>,
signatures_raw: Map,
function_signatures: Option>>,
+ llvm_functions: Rc>>>,
func_import_count: usize,
- personality_func: FunctionValue,
- module: Module,
+ personality_func: ManuallyDrop>,
+ module: ManuallyDrop>>>,
stackmaps: Rc>,
+ track_state: bool,
+ target_machine: TargetMachine,
}
-pub struct LLVMFunctionCodeGenerator {
- context: Option,
- builder: Option,
- intrinsics: Option,
- state: State,
- function: FunctionValue,
+pub struct LLVMFunctionCodeGenerator<'ctx> {
+ context: Option<&'ctx Context>,
+ builder: Option>,
+ alloca_builder: Option>,
+ intrinsics: Option>,
+ state: State<'ctx>,
+ llvm_functions: Rc>>>,
+ function: FunctionValue<'ctx>,
func_sig: FuncSig,
- signatures: Map,
- locals: Vec, // Contains params and locals
+ signatures: Map>,
+ locals: Vec>, // Contains params and locals
num_params: usize,
- ctx: Option>,
+ ctx: Option>,
unreachable_depth: usize,
stackmaps: Rc>,
index: usize,
opcode_offset: usize,
+ track_state: bool,
+ module: Rc>>,
}
-impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
+impl<'ctx> FunctionCodeGenerator for LLVMFunctionCodeGenerator<'ctx> {
fn feed_return(&mut self, _ty: WpType) -> Result<(), CodegenError> {
Ok(())
}
@@ -704,12 +909,9 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
Ok(())
}
- fn feed_local(&mut self, ty: WpType, n: usize) -> Result<(), CodegenError> {
+ fn feed_local(&mut self, ty: WpType, count: usize) -> Result<(), CodegenError> {
let param_len = self.num_params;
- let mut local_idx = 0;
- // let (count, ty) = local?;
- let count = n;
let wasmer_ty = type_to_type(ty)?;
let intrinsics = self.intrinsics.as_ref().unwrap();
@@ -724,14 +926,22 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
};
let builder = self.builder.as_ref().unwrap();
+ let alloca_builder = self.alloca_builder.as_ref().unwrap();
- for _ in 0..count {
- let alloca = builder.build_alloca(ty, &format!("local{}", param_len + local_idx));
-
+ for local_idx in 0..count {
+ let alloca =
+ alloca_builder.build_alloca(ty, &format!("local{}", param_len + local_idx));
builder.build_store(alloca, default_value);
-
+ if local_idx == 0 {
+ alloca_builder.position_before(
+ &alloca
+ .as_instruction()
+ .unwrap()
+ .get_next_instruction()
+ .unwrap(),
+ );
+ }
self.locals.push(alloca);
- local_idx += 1;
}
Ok(())
}
@@ -741,7 +951,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
.context
.as_ref()
.unwrap()
- .append_basic_block(&self.function, "start_of_code");
+ .append_basic_block(self.function, "start_of_code");
let entry_end_inst = self
.builder
.as_ref()
@@ -756,10 +966,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
cache_builder.position_before(&entry_end_inst);
let module_info =
unsafe { ::std::mem::transmute::<&ModuleInfo, &'static ModuleInfo>(module_info) };
- let function = unsafe {
- ::std::mem::transmute::<&FunctionValue, &'static FunctionValue>(&self.function)
- };
- let ctx = CtxType::new(module_info, function, cache_builder);
+ let ctx = CtxType::new(module_info, &self.function, cache_builder);
self.ctx = Some(ctx);
@@ -768,27 +975,29 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
let builder = self.builder.as_ref().unwrap();
let intrinsics = self.intrinsics.as_ref().unwrap();
- let mut stackmaps = self.stackmaps.borrow_mut();
- emit_stack_map(
- &module_info,
- &intrinsics,
- &builder,
- self.index,
- &mut *stackmaps,
- StackmapEntryKind::FunctionHeader,
- &self.locals,
- &state,
- self.ctx.as_mut().unwrap(),
- ::std::usize::MAX,
- );
- finalize_opcode_stack_map(
- &intrinsics,
- &builder,
- self.index,
- &mut *stackmaps,
- StackmapEntryKind::FunctionHeader,
- ::std::usize::MAX,
- );
+ if self.track_state {
+ let mut stackmaps = self.stackmaps.borrow_mut();
+ emit_stack_map(
+ &module_info,
+ &intrinsics,
+ &builder,
+ self.index,
+ &mut *stackmaps,
+ StackmapEntryKind::FunctionHeader,
+ &self.locals,
+ &state,
+ self.ctx.as_mut().unwrap(),
+ ::std::usize::MAX,
+ );
+ finalize_opcode_stack_map(
+ &intrinsics,
+ &builder,
+ self.index,
+ &mut *stackmaps,
+ StackmapEntryKind::FunctionHeader,
+ ::std::usize::MAX,
+ );
+ }
}
Ok(())
@@ -830,17 +1039,33 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
InternalEvent::GetInternal(idx) => {
if state.reachable {
let idx = idx as usize;
- let field_ptr = ctx.internal_field(idx, intrinsics, builder);
+ let field_ptr =
+ ctx.internal_field(idx, intrinsics, self.module.clone(), builder);
let result = builder.build_load(field_ptr, "get_internal");
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "internal",
+ result.as_instruction_value().unwrap(),
+ Some(idx as u32),
+ );
state.push1(result);
}
}
InternalEvent::SetInternal(idx) => {
if state.reachable {
let idx = idx as usize;
- let field_ptr = ctx.internal_field(idx, intrinsics, builder);
+ let field_ptr =
+ ctx.internal_field(idx, intrinsics, self.module.clone(), builder);
let v = state.pop1()?;
- builder.build_store(field_ptr, v);
+ let store = builder.build_store(field_ptr, v);
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "internal",
+ store,
+ Some(idx as u32),
+ );
}
}
}
@@ -883,7 +1108,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
offset: -1isize as usize,
})?;
- let end_block = context.append_basic_block(&function, "end");
+ let end_block = context.append_basic_block(function, "end");
builder.position_at_end(&end_block);
let phis = if let Ok(wasmer_ty) = blocktype_to_type(ty) {
@@ -900,8 +1125,8 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder.position_at_end(¤t_block);
}
Operator::Loop { ty } => {
- let loop_body = context.append_basic_block(&function, "loop_body");
- let loop_next = context.append_basic_block(&function, "loop_outer");
+ let loop_body = context.append_basic_block(function, "loop_body");
+ let loop_next = context.append_basic_block(function, "loop_outer");
builder.build_unconditional_branch(&loop_body);
@@ -918,33 +1143,35 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder.position_at_end(&loop_body);
- if let Some(offset) = opcode_offset {
- let mut stackmaps = self.stackmaps.borrow_mut();
- emit_stack_map(
- &info,
- intrinsics,
- builder,
- self.index,
- &mut *stackmaps,
- StackmapEntryKind::Loop,
- &self.locals,
- state,
- ctx,
- offset,
- );
- let signal_mem = ctx.signal_mem();
- let iv = builder
- .build_store(signal_mem, context.i8_type().const_int(0 as u64, false));
- // Any 'store' can be made volatile.
- iv.set_volatile(true).unwrap();
- finalize_opcode_stack_map(
- intrinsics,
- builder,
- self.index,
- &mut *stackmaps,
- StackmapEntryKind::Loop,
- offset,
- );
+ if self.track_state {
+ if let Some(offset) = opcode_offset {
+ let mut stackmaps = self.stackmaps.borrow_mut();
+ emit_stack_map(
+ &info,
+ intrinsics,
+ builder,
+ self.index,
+ &mut *stackmaps,
+ StackmapEntryKind::Loop,
+ &self.locals,
+ state,
+ ctx,
+ offset,
+ );
+ let signal_mem = ctx.signal_mem();
+ let iv = builder
+ .build_store(signal_mem, context.i8_type().const_int(0 as u64, false));
+ // Any 'store' can be made volatile.
+ iv.set_volatile(true).unwrap();
+ finalize_opcode_stack_map(
+ intrinsics,
+ builder,
+ self.index,
+ &mut *stackmaps,
+ StackmapEntryKind::Loop,
+ offset,
+ );
+ }
}
state.push_loop(loop_body, loop_next, phis);
@@ -963,13 +1190,16 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
frame.phis().len()
};
- let values = state.peekn(value_len)?;
+ let values = state.peekn_extra(value_len)?;
+ let values = values.iter().map(|(v, info)| {
+ apply_pending_canonicalization(builder, intrinsics, *v, *info)
+ });
// For each result of the block we're branching to,
// pop a value off the value stack and load it into
// the corresponding phi.
- for (phi, value) in frame.phis().iter().zip(values.iter()) {
- phi.add_incoming(&[(value, ¤t_block)]);
+ for (phi, value) in frame.phis().iter().zip(values) {
+ phi.add_incoming(&[(&value, ¤t_block)]);
}
builder.build_unconditional_branch(frame.br_dest());
@@ -992,13 +1222,16 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
frame.phis().len()
};
- let param_stack = state.peekn(value_len)?;
+ let param_stack = state.peekn_extra(value_len)?;
+ let param_stack = param_stack.iter().map(|(v, info)| {
+ apply_pending_canonicalization(builder, intrinsics, *v, *info)
+ });
- for (phi, value) in frame.phis().iter().zip(param_stack.iter()) {
- phi.add_incoming(&[(value, ¤t_block)]);
+ for (phi, value) in frame.phis().iter().zip(param_stack) {
+ phi.add_incoming(&[(&value, ¤t_block)]);
}
- let else_block = context.append_basic_block(&function, "else");
+ let else_block = context.append_basic_block(function, "else");
let cond_value = builder.build_int_compare(
IntPredicate::NE,
@@ -1022,7 +1255,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
let default_frame = state.frame_at_depth(default_depth)?;
let args = if default_frame.is_loop() {
- &[]
+ Vec::new()
} else {
let res_len = default_frame.phis().len();
state.peekn(res_len)?
@@ -1064,9 +1297,9 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
message: "not currently in a block",
offset: -1isize as usize,
})?;
- let if_then_block = context.append_basic_block(&function, "if_then");
- let if_else_block = context.append_basic_block(&function, "if_else");
- let end_block = context.append_basic_block(&function, "if_end");
+ let if_then_block = context.append_basic_block(function, "if_then");
+ let if_else_block = context.append_basic_block(function, "if_else");
+ let end_block = context.append_basic_block(function, "if_end");
let end_phis = {
builder.position_at_end(&end_block);
@@ -1101,16 +1334,19 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
Operator::Else => {
if state.reachable {
let frame = state.frame_at_depth(0)?;
- builder.build_unconditional_branch(frame.code_after());
let current_block = builder.get_insert_block().ok_or(BinaryReaderError {
message: "not currently in a block",
offset: -1isize as usize,
})?;
for phi in frame.phis().to_vec().iter().rev() {
- let value = state.pop1()?;
+ let (value, info) = state.pop1_extra()?;
+ let value =
+ apply_pending_canonicalization(builder, intrinsics, value, info);
phi.add_incoming(&[(&value, ¤t_block)])
}
+ let frame = state.frame_at_depth(0)?;
+ builder.build_unconditional_branch(frame.code_after());
}
let (if_else_block, if_else_state) = if let ControlFrame::IfElse {
@@ -1138,12 +1374,14 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
})?;
if state.reachable {
- builder.build_unconditional_branch(frame.code_after());
-
for phi in frame.phis().iter().rev() {
- let value = state.pop1()?;
+ let (value, info) = state.pop1_extra()?;
+ let value =
+ apply_pending_canonicalization(builder, intrinsics, value, info);
phi.add_incoming(&[(&value, ¤t_block)]);
}
+
+ builder.build_unconditional_branch(frame.code_after());
}
if let ControlFrame::IfElse {
@@ -1189,54 +1427,56 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
}
}
Operator::Return => {
- let frame = state.outermost_frame()?;
let current_block = builder.get_insert_block().ok_or(BinaryReaderError {
message: "not currently in a block",
offset: -1isize as usize,
})?;
- builder.build_unconditional_branch(frame.br_dest());
-
- let phis = frame.phis().to_vec();
-
- for phi in phis.iter() {
- let arg = state.pop1()?;
+ let frame = state.outermost_frame()?;
+ for phi in frame.phis().to_vec().iter() {
+ let (arg, info) = state.pop1_extra()?;
+ let arg = apply_pending_canonicalization(builder, intrinsics, arg, info);
phi.add_incoming(&[(&arg, ¤t_block)]);
}
+ let frame = state.outermost_frame()?;
+ builder.build_unconditional_branch(frame.br_dest());
+
state.reachable = false;
}
Operator::Unreachable => {
// Emit an unreachable instruction.
- // If llvm cannot prove that this is never touched,
+ // If llvm cannot prove that this is never reached,
// it will emit a `ud2` instruction on x86_64 arches.
// Comment out this `if` block to allow spectests to pass.
// TODO: fix this
if let Some(offset) = opcode_offset {
- let mut stackmaps = self.stackmaps.borrow_mut();
- emit_stack_map(
- &info,
- intrinsics,
- builder,
- self.index,
- &mut *stackmaps,
- StackmapEntryKind::Trappable,
- &self.locals,
- state,
- ctx,
- offset,
- );
- builder.build_call(intrinsics.trap, &[], "trap");
- finalize_opcode_stack_map(
- intrinsics,
- builder,
- self.index,
- &mut *stackmaps,
- StackmapEntryKind::Trappable,
- offset,
- );
+ if self.track_state {
+ let mut stackmaps = self.stackmaps.borrow_mut();
+ emit_stack_map(
+ &info,
+ intrinsics,
+ builder,
+ self.index,
+ &mut *stackmaps,
+ StackmapEntryKind::Trappable,
+ &self.locals,
+ state,
+ ctx,
+ offset,
+ );
+ builder.build_call(intrinsics.trap, &[], "trap");
+ finalize_opcode_stack_map(
+ intrinsics,
+ builder,
+ self.index,
+ &mut *stackmaps,
+ StackmapEntryKind::Trappable,
+ offset,
+ );
+ }
}
builder.build_call(
@@ -1263,21 +1503,41 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
// Generate const values.
Operator::I32Const { value } => {
let i = intrinsics.i32_ty.const_int(value as u64, false);
- state.push1(i);
+ let info = if is_f32_arithmetic(value as u32) {
+ ExtraInfo::arithmetic_f32()
+ } else {
+ Default::default()
+ };
+ state.push1_extra(i, info);
}
Operator::I64Const { value } => {
let i = intrinsics.i64_ty.const_int(value as u64, false);
- state.push1(i);
+ let info = if is_f64_arithmetic(value as u64) {
+ ExtraInfo::arithmetic_f64()
+ } else {
+ Default::default()
+ };
+ state.push1_extra(i, info);
}
Operator::F32Const { value } => {
let bits = intrinsics.i32_ty.const_int(value.bits() as u64, false);
+ let info = if is_f32_arithmetic(value.bits()) {
+ ExtraInfo::arithmetic_f32()
+ } else {
+ Default::default()
+ };
let f = builder.build_bitcast(bits, intrinsics.f32_ty, "f");
- state.push1(f);
+ state.push1_extra(f, info);
}
Operator::F64Const { value } => {
let bits = intrinsics.i64_ty.const_int(value.bits(), false);
+ let info = if is_f64_arithmetic(value.bits()) {
+ ExtraInfo::arithmetic_f64()
+ } else {
+ Default::default()
+ };
let f = builder.build_bitcast(bits, intrinsics.f64_ty, "f");
- state.push1(f);
+ state.push1_extra(f, info);
}
Operator::V128Const { value } => {
let mut hi: [u8; 8] = Default::default();
@@ -1286,11 +1546,31 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
lo.copy_from_slice(&value.bytes()[8..16]);
let packed = [u64::from_le_bytes(hi), u64::from_le_bytes(lo)];
let i = intrinsics.i128_ty.const_int_arbitrary_precision(&packed);
- state.push1(i);
+ let mut quad1: [u8; 4] = Default::default();
+ let mut quad2: [u8; 4] = Default::default();
+ let mut quad3: [u8; 4] = Default::default();
+ let mut quad4: [u8; 4] = Default::default();
+ quad1.copy_from_slice(&value.bytes()[0..4]);
+ quad2.copy_from_slice(&value.bytes()[4..8]);
+ quad3.copy_from_slice(&value.bytes()[8..12]);
+ quad4.copy_from_slice(&value.bytes()[12..16]);
+ let mut info: ExtraInfo = Default::default();
+ if is_f32_arithmetic(u32::from_le_bytes(quad1))
+ && is_f32_arithmetic(u32::from_le_bytes(quad2))
+ && is_f32_arithmetic(u32::from_le_bytes(quad3))
+ && is_f32_arithmetic(u32::from_le_bytes(quad4))
+ {
+ info |= ExtraInfo::arithmetic_f32();
+ }
+ if is_f64_arithmetic(packed[0]) && is_f64_arithmetic(packed[1]) {
+ info |= ExtraInfo::arithmetic_f64();
+ }
+ state.push1_extra(i, info);
}
Operator::I8x16Splat => {
- let v = state.pop1()?.into_int_value();
+ let (v, i) = state.pop1_extra()?;
+ let v = v.into_int_value();
let v = builder.build_int_truncate(v, intrinsics.i8_ty, "");
let res = splat_vector(
builder,
@@ -1300,10 +1580,11 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
&state.var_name(),
);
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
- state.push1(res);
+ state.push1_extra(res, i);
}
Operator::I16x8Splat => {
- let v = state.pop1()?.into_int_value();
+ let (v, i) = state.pop1_extra()?;
+ let v = v.into_int_value();
let v = builder.build_int_truncate(v, intrinsics.i16_ty, "");
let res = splat_vector(
builder,
@@ -1313,10 +1594,10 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
&state.var_name(),
);
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
- state.push1(res);
+ state.push1_extra(res, i);
}
Operator::I32x4Splat => {
- let v = state.pop1()?;
+ let (v, i) = state.pop1_extra()?;
let res = splat_vector(
builder,
intrinsics,
@@ -1325,10 +1606,10 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
&state.var_name(),
);
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
- state.push1(res);
+ state.push1_extra(res, i);
}
Operator::I64x2Splat => {
- let v = state.pop1()?;
+ let (v, i) = state.pop1_extra()?;
let res = splat_vector(
builder,
intrinsics,
@@ -1337,10 +1618,10 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
&state.var_name(),
);
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
- state.push1(res);
+ state.push1_extra(res, i);
}
Operator::F32x4Splat => {
- let v = state.pop1()?;
+ let (v, i) = state.pop1_extra()?;
let res = splat_vector(
builder,
intrinsics,
@@ -1349,10 +1630,12 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
&state.var_name(),
);
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
- state.push1(res);
+ // The spec is unclear, we interpret splat as preserving NaN
+ // payload bits.
+ state.push1_extra(res, i);
}
Operator::F64x2Splat => {
- let v = state.pop1()?;
+ let (v, i) = state.pop1_extra()?;
let res = splat_vector(
builder,
intrinsics,
@@ -1361,46 +1644,74 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
&state.var_name(),
);
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
- state.push1(res);
+ // The spec is unclear, we interpret splat as preserving NaN
+ // payload bits.
+ state.push1_extra(res, i);
}
// Operate on locals.
Operator::GetLocal { local_index } => {
let pointer_value = locals[local_index as usize];
let v = builder.build_load(pointer_value, &state.var_name());
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "local",
+ v.as_instruction_value().unwrap(),
+ Some(local_index),
+ );
state.push1(v);
}
Operator::SetLocal { local_index } => {
let pointer_value = locals[local_index as usize];
- let v = state.pop1()?;
- builder.build_store(pointer_value, v);
+ let (v, i) = state.pop1_extra()?;
+ let v = apply_pending_canonicalization(builder, intrinsics, v, i);
+ let store = builder.build_store(pointer_value, v);
+ tbaa_label(&self.module, intrinsics, "local", store, Some(local_index));
}
Operator::TeeLocal { local_index } => {
let pointer_value = locals[local_index as usize];
- let v = state.peek1()?;
- builder.build_store(pointer_value, v);
+ let (v, i) = state.peek1_extra()?;
+ let v = apply_pending_canonicalization(builder, intrinsics, v, i);
+ let store = builder.build_store(pointer_value, v);
+ tbaa_label(&self.module, intrinsics, "local", store, Some(local_index));
}
Operator::GetGlobal { global_index } => {
let index = GlobalIndex::new(global_index as usize);
- let global_cache = ctx.global_cache(index, intrinsics);
+ let global_cache = ctx.global_cache(index, intrinsics, self.module.clone());
match global_cache {
GlobalCache::Const { value } => {
state.push1(value);
}
GlobalCache::Mut { ptr_to_value } => {
let value = builder.build_load(ptr_to_value, "global_value");
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "global",
+ value.as_instruction_value().unwrap(),
+ Some(global_index),
+ );
state.push1(value);
}
}
}
Operator::SetGlobal { global_index } => {
- let value = state.pop1()?;
+ let (value, info) = state.pop1_extra()?;
+ let value = apply_pending_canonicalization(builder, intrinsics, value, info);
let index = GlobalIndex::new(global_index as usize);
- let global_cache = ctx.global_cache(index, intrinsics);
+ let global_cache = ctx.global_cache(index, intrinsics, self.module.clone());
match global_cache {
GlobalCache::Mut { ptr_to_value } => {
- builder.build_store(ptr_to_value, value);
+ let store = builder.build_store(ptr_to_value, value);
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "global",
+ store,
+ Some(global_index),
+ );
}
GlobalCache::Const { value: _ } => {
return Err(CodegenError {
@@ -1411,7 +1722,26 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
}
Operator::Select => {
- let (v1, v2, cond) = state.pop3()?;
+ let ((v1, i1), (v2, i2), (cond, _)) = state.pop3_extra()?;
+ // We don't bother canonicalizing 'cond' here because we only
+ // compare it to zero, and that's invariant under
+ // canonicalization.
+
+ // If the pending bits of v1 and v2 are the same, we can pass
+ // them along to the result. Otherwise, apply pending
+ // canonicalizations now.
+ let (v1, i1, v2, i2) = if i1.has_pending_f32_nan() != i2.has_pending_f32_nan()
+ || i1.has_pending_f64_nan() != i2.has_pending_f64_nan()
+ {
+ (
+ apply_pending_canonicalization(builder, intrinsics, v1, i1),
+ i1.strip_pending(),
+ apply_pending_canonicalization(builder, intrinsics, v2, i2),
+ i2.strip_pending(),
+ )
+ } else {
+ (v1, i1, v2, i2)
+ };
let cond_value = builder.build_int_compare(
IntPredicate::NE,
cond.into_int_value(),
@@ -1419,7 +1749,19 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
&state.var_name(),
);
let res = builder.build_select(cond_value, v1, v2, &state.var_name());
- state.push1(res);
+ let info = {
+ let mut info = i1.strip_pending() & i2.strip_pending();
+ if i1.has_pending_f32_nan() {
+ debug_assert!(i2.has_pending_f32_nan());
+ info |= ExtraInfo::pending_f32_nan();
+ }
+ if i1.has_pending_f64_nan() {
+ debug_assert!(i2.has_pending_f64_nan());
+ info |= ExtraInfo::pending_f64_nan();
+ }
+ info
+ };
+ state.push1_extra(res, info);
}
Operator::Call { function_index } => {
let func_index = FuncIndex::new(function_index as usize);
@@ -1428,62 +1770,74 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
let func_sig = &info.signatures[sigindex];
let (params, func_ptr) = match func_index.local_or_import(info) {
- LocalOrImport::Local(local_func_index) => {
+ LocalOrImport::Local(_) => {
let params: Vec<_> = std::iter::once(ctx.basic())
.chain(
state
- .peekn(func_sig.params().len())?
+ .peekn_extra(func_sig.params().len())?
.iter()
.enumerate()
- .map(|(i, &v)| match func_sig.params()[i] {
+ .map(|(i, (v, info))| match func_sig.params()[i] {
Type::F32 => builder.build_bitcast(
- v,
+ apply_pending_canonicalization(
+ builder, intrinsics, *v, *info,
+ ),
intrinsics.i32_ty,
&state.var_name(),
),
Type::F64 => builder.build_bitcast(
- v,
+ apply_pending_canonicalization(
+ builder, intrinsics, *v, *info,
+ ),
intrinsics.i64_ty,
&state.var_name(),
),
- _ => v,
+ Type::V128 => apply_pending_canonicalization(
+ builder, intrinsics, *v, *info,
+ ),
+ _ => *v,
}),
)
.collect();
- let func_ptr =
- ctx.local_func(local_func_index, llvm_sig, intrinsics, builder);
+ let func_ptr = self.llvm_functions.borrow_mut()[&func_index];
- (params, func_ptr)
+ (params, func_ptr.as_global_value().as_pointer_value())
}
LocalOrImport::Import(import_func_index) => {
let (func_ptr_untyped, ctx_ptr) =
- ctx.imported_func(import_func_index, intrinsics);
+ ctx.imported_func(import_func_index, intrinsics, self.module.clone());
let params: Vec<_> = std::iter::once(ctx_ptr.as_basic_value_enum())
.chain(
state
- .peekn(func_sig.params().len())?
+ .peekn_extra(func_sig.params().len())?
.iter()
.enumerate()
- .map(|(i, &v)| match func_sig.params()[i] {
+ .map(|(i, (v, info))| match func_sig.params()[i] {
Type::F32 => builder.build_bitcast(
- v,
+ apply_pending_canonicalization(
+ builder, intrinsics, *v, *info,
+ ),
intrinsics.i32_ty,
&state.var_name(),
),
Type::F64 => builder.build_bitcast(
- v,
+ apply_pending_canonicalization(
+ builder, intrinsics, *v, *info,
+ ),
intrinsics.i64_ty,
&state.var_name(),
),
- _ => v,
+ Type::V128 => apply_pending_canonicalization(
+ builder, intrinsics, *v, *info,
+ ),
+ _ => *v,
}),
)
.collect();
let func_ptr_ty = llvm_sig.ptr_type(AddressSpace::Generic);
-
let func_ptr = builder.build_pointer_cast(
func_ptr_untyped,
func_ptr_ty,
@@ -1495,32 +1849,36 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
};
state.popn(func_sig.params().len())?;
- if let Some(offset) = opcode_offset {
- let mut stackmaps = self.stackmaps.borrow_mut();
- emit_stack_map(
- &info,
- intrinsics,
- builder,
- self.index,
- &mut *stackmaps,
- StackmapEntryKind::Call,
- &self.locals,
- state,
- ctx,
- offset,
- )
+ if self.track_state {
+ if let Some(offset) = opcode_offset {
+ let mut stackmaps = self.stackmaps.borrow_mut();
+ emit_stack_map(
+ &info,
+ intrinsics,
+ builder,
+ self.index,
+ &mut *stackmaps,
+ StackmapEntryKind::Call,
+ &self.locals,
+ state,
+ ctx,
+ offset,
+ )
+ }
}
let call_site = builder.build_call(func_ptr, ¶ms, &state.var_name());
- if let Some(offset) = opcode_offset {
- let mut stackmaps = self.stackmaps.borrow_mut();
- finalize_opcode_stack_map(
- intrinsics,
- builder,
- self.index,
- &mut *stackmaps,
- StackmapEntryKind::Call,
- offset,
- )
+ if self.track_state {
+ if let Some(offset) = opcode_offset {
+ let mut stackmaps = self.stackmaps.borrow_mut();
+ finalize_opcode_stack_map(
+ intrinsics,
+ builder,
+ self.index,
+ &mut *stackmaps,
+ StackmapEntryKind::Call,
+ offset,
+ )
+ }
}
if let Some(basic_value) = call_site.try_as_basic_value().left() {
@@ -1550,8 +1908,12 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
Operator::CallIndirect { index, table_index } => {
let sig_index = SigIndex::new(index as usize);
let expected_dynamic_sigindex = ctx.dynamic_sigindex(sig_index, intrinsics);
- let (table_base, table_bound) =
- ctx.table(TableIndex::new(table_index as usize), intrinsics, builder);
+ let (table_base, table_bound) = ctx.table(
+ TableIndex::new(table_index as usize),
+ intrinsics,
+ self.module.clone(),
+ builder,
+ );
let func_index = state.pop1()?.into_int_value();
// We assume the table has the `anyfunc` element type.
@@ -1620,9 +1982,9 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
.into_int_value();
let in_bounds_continue_block =
- context.append_basic_block(&function, "in_bounds_continue_block");
+ context.append_basic_block(function, "in_bounds_continue_block");
let not_in_bounds_block =
- context.append_basic_block(&function, "not_in_bounds_block");
+ context.append_basic_block(function, "not_in_bounds_block");
builder.build_conditional_branch(
index_in_bounds,
&in_bounds_continue_block,
@@ -1661,9 +2023,9 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
.unwrap()
.into_int_value();
- let continue_block = context.append_basic_block(&function, "continue_block");
+ let continue_block = context.append_basic_block(function, "continue_block");
let sigindices_notequal_block =
- context.append_basic_block(&function, "sigindices_notequal_block");
+ context.append_basic_block(function, "sigindices_notequal_block");
builder.build_conditional_branch(
sigindices_equal,
&continue_block,
@@ -1682,16 +2044,23 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
let wasmer_fn_sig = &info.signatures[sig_index];
let fn_ty = signatures[sig_index];
- let pushed_args = state.popn_save(wasmer_fn_sig.params().len())?;
+ let pushed_args = state.popn_save_extra(wasmer_fn_sig.params().len())?;
let args: Vec<_> = std::iter::once(ctx_ptr)
- .chain(pushed_args.into_iter().enumerate().map(|(i, v)| {
+ .chain(pushed_args.into_iter().enumerate().map(|(i, (v, info))| {
match wasmer_fn_sig.params()[i] {
- Type::F32 => {
- builder.build_bitcast(v, intrinsics.i32_ty, &state.var_name())
- }
- Type::F64 => {
- builder.build_bitcast(v, intrinsics.i64_ty, &state.var_name())
+ Type::F32 => builder.build_bitcast(
+ apply_pending_canonicalization(builder, intrinsics, v, info),
+ intrinsics.i32_ty,
+ &state.var_name(),
+ ),
+ Type::F64 => builder.build_bitcast(
+ apply_pending_canonicalization(builder, intrinsics, v, info),
+ intrinsics.i64_ty,
+ &state.var_name(),
+ ),
+ Type::V128 => {
+ apply_pending_canonicalization(builder, intrinsics, v, info)
}
_ => v,
}
@@ -1704,32 +2073,36 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
"typed_func_ptr",
);
- if let Some(offset) = opcode_offset {
- let mut stackmaps = self.stackmaps.borrow_mut();
- emit_stack_map(
- &info,
- intrinsics,
- builder,
- self.index,
- &mut *stackmaps,
- StackmapEntryKind::Call,
- &self.locals,
- state,
- ctx,
- offset,
- )
+ if self.track_state {
+ if let Some(offset) = opcode_offset {
+ let mut stackmaps = self.stackmaps.borrow_mut();
+ emit_stack_map(
+ &info,
+ intrinsics,
+ builder,
+ self.index,
+ &mut *stackmaps,
+ StackmapEntryKind::Call,
+ &self.locals,
+ state,
+ ctx,
+ offset,
+ )
+ }
}
let call_site = builder.build_call(typed_func_ptr, &args, "indirect_call");
- if let Some(offset) = opcode_offset {
- let mut stackmaps = self.stackmaps.borrow_mut();
- finalize_opcode_stack_map(
- intrinsics,
- builder,
- self.index,
- &mut *stackmaps,
- StackmapEntryKind::Call,
- offset,
- )
+ if self.track_state {
+ if let Some(offset) = opcode_offset {
+ let mut stackmaps = self.stackmaps.borrow_mut();
+ finalize_opcode_stack_map(
+ intrinsics,
+ builder,
+ self.index,
+ &mut *stackmaps,
+ StackmapEntryKind::Call,
+ offset,
+ )
+ }
}
match wasmer_fn_sig.returns() {
@@ -1760,67 +2133,55 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
* https://github.com/sunfishcode/wasm-reference-manual/blob/master/WebAssembly.md#integer-arithmetic-instructions
***************************/
Operator::I32Add | Operator::I64Add => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
let res = builder.build_int_add(v1, v2, &state.var_name());
state.push1(res);
}
Operator::I8x16Add => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i8x16_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i8x16_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i8x16(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i8x16(builder, intrinsics, v2, i2);
let res = builder.build_int_add(v1, v2, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I16x8Add => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i16x8_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i16x8_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i16x8(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i16x8(builder, intrinsics, v2, i2);
let res = builder.build_int_add(v1, v2, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I32x4Add => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i32x4_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i32x4_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i32x4(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i32x4(builder, intrinsics, v2, i2);
let res = builder.build_int_add(v1, v2, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I64x2Add => {
- let (v1, v2) = state.pop2()?;
- let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
- let v1 = builder
- .build_bitcast(v1, intrinsics.i64x2_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i64x2_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i64x2(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i64x2(builder, intrinsics, v2, i2);
let res = builder.build_int_add(v1, v2, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I8x16AddSaturateS => {
- let (v1, v2) = state.pop2()?;
- let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
- let v1 = builder.build_bitcast(v1, intrinsics.i8x16_ty, "");
- let v2 = builder.build_bitcast(v2, intrinsics.i8x16_ty, "");
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i8x16(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i8x16(builder, intrinsics, v2, i2);
let res = builder
- .build_call(intrinsics.sadd_sat_i8x16, &[v1, v2], &state.var_name())
+ .build_call(
+ intrinsics.sadd_sat_i8x16,
+ &[v1.as_basic_value_enum(), v2.as_basic_value_enum()],
+ &state.var_name(),
+ )
.try_as_basic_value()
.left()
.unwrap();
@@ -1828,12 +2189,15 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I16x8AddSaturateS => {
- let (v1, v2) = state.pop2()?;
- let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
- let v1 = builder.build_bitcast(v1, intrinsics.i16x8_ty, "");
- let v2 = builder.build_bitcast(v2, intrinsics.i16x8_ty, "");
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i16x8(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i16x8(builder, intrinsics, v2, i2);
let res = builder
- .build_call(intrinsics.sadd_sat_i16x8, &[v1, v2], &state.var_name())
+ .build_call(
+ intrinsics.sadd_sat_i16x8,
+ &[v1.as_basic_value_enum(), v2.as_basic_value_enum()],
+ &state.var_name(),
+ )
.try_as_basic_value()
.left()
.unwrap();
@@ -1841,12 +2205,15 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I8x16AddSaturateU => {
- let (v1, v2) = state.pop2()?;
- let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
- let v1 = builder.build_bitcast(v1, intrinsics.i8x16_ty, "");
- let v2 = builder.build_bitcast(v2, intrinsics.i8x16_ty, "");
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i8x16(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i8x16(builder, intrinsics, v2, i2);
let res = builder
- .build_call(intrinsics.uadd_sat_i8x16, &[v1, v2], &state.var_name())
+ .build_call(
+ intrinsics.uadd_sat_i8x16,
+ &[v1.as_basic_value_enum(), v2.as_basic_value_enum()],
+ &state.var_name(),
+ )
.try_as_basic_value()
.left()
.unwrap();
@@ -1854,12 +2221,15 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I16x8AddSaturateU => {
- let (v1, v2) = state.pop2()?;
- let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
- let v1 = builder.build_bitcast(v1, intrinsics.i16x8_ty, "");
- let v2 = builder.build_bitcast(v2, intrinsics.i16x8_ty, "");
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i16x8(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i16x8(builder, intrinsics, v2, i2);
let res = builder
- .build_call(intrinsics.uadd_sat_i16x8, &[v1, v2], &state.var_name())
+ .build_call(
+ intrinsics.uadd_sat_i16x8,
+ &[v1.as_basic_value_enum(), v2.as_basic_value_enum()],
+ &state.var_name(),
+ )
.try_as_basic_value()
.left()
.unwrap();
@@ -1867,70 +2237,55 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I32Sub | Operator::I64Sub => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
let res = builder.build_int_sub(v1, v2, &state.var_name());
state.push1(res);
}
Operator::I8x16Sub => {
- let (v1, v2) = state.pop2()?;
- let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
- let v1 = builder
- .build_bitcast(v1, intrinsics.i8x16_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i8x16_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i8x16(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i8x16(builder, intrinsics, v2, i2);
let res = builder.build_int_sub(v1, v2, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I16x8Sub => {
- let (v1, v2) = state.pop2()?;
- let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
- let v1 = builder
- .build_bitcast(v1, intrinsics.i16x8_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i16x8_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i16x8(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i16x8(builder, intrinsics, v2, i2);
let res = builder.build_int_sub(v1, v2, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I32x4Sub => {
- let (v1, v2) = state.pop2()?;
- let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
- let v1 = builder
- .build_bitcast(v1, intrinsics.i32x4_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i32x4_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i32x4(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i32x4(builder, intrinsics, v2, i2);
let res = builder.build_int_sub(v1, v2, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I64x2Sub => {
- let (v1, v2) = state.pop2()?;
- let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
- let v1 = builder
- .build_bitcast(v1, intrinsics.i64x2_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i64x2_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i64x2(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i64x2(builder, intrinsics, v2, i2);
let res = builder.build_int_sub(v1, v2, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I8x16SubSaturateS => {
- let (v1, v2) = state.pop2()?;
- let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
- let v1 = builder.build_bitcast(v1, intrinsics.i8x16_ty, "");
- let v2 = builder.build_bitcast(v2, intrinsics.i8x16_ty, "");
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i8x16(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i8x16(builder, intrinsics, v2, i2);
let res = builder
- .build_call(intrinsics.ssub_sat_i8x16, &[v1, v2], &state.var_name())
+ .build_call(
+ intrinsics.ssub_sat_i8x16,
+ &[v1.as_basic_value_enum(), v2.as_basic_value_enum()],
+ &state.var_name(),
+ )
.try_as_basic_value()
.left()
.unwrap();
@@ -1938,12 +2293,15 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I16x8SubSaturateS => {
- let (v1, v2) = state.pop2()?;
- let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
- let v1 = builder.build_bitcast(v1, intrinsics.i16x8_ty, "");
- let v2 = builder.build_bitcast(v2, intrinsics.i16x8_ty, "");
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i16x8(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i16x8(builder, intrinsics, v2, i2);
let res = builder
- .build_call(intrinsics.ssub_sat_i16x8, &[v1, v2], &state.var_name())
+ .build_call(
+ intrinsics.ssub_sat_i16x8,
+ &[v1.as_basic_value_enum(), v2.as_basic_value_enum()],
+ &state.var_name(),
+ )
.try_as_basic_value()
.left()
.unwrap();
@@ -1951,12 +2309,15 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I8x16SubSaturateU => {
- let (v1, v2) = state.pop2()?;
- let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
- let v1 = builder.build_bitcast(v1, intrinsics.i8x16_ty, "");
- let v2 = builder.build_bitcast(v2, intrinsics.i8x16_ty, "");
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i8x16(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i8x16(builder, intrinsics, v2, i2);
let res = builder
- .build_call(intrinsics.usub_sat_i8x16, &[v1, v2], &state.var_name())
+ .build_call(
+ intrinsics.usub_sat_i8x16,
+ &[v1.as_basic_value_enum(), v2.as_basic_value_enum()],
+ &state.var_name(),
+ )
.try_as_basic_value()
.left()
.unwrap();
@@ -1964,12 +2325,15 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I16x8SubSaturateU => {
- let (v1, v2) = state.pop2()?;
- let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
- let v1 = builder.build_bitcast(v1, intrinsics.i16x8_ty, "");
- let v2 = builder.build_bitcast(v2, intrinsics.i16x8_ty, "");
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i16x8(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i16x8(builder, intrinsics, v2, i2);
let res = builder
- .build_call(intrinsics.usub_sat_i16x8, &[v1, v2], &state.var_name())
+ .build_call(
+ intrinsics.usub_sat_i16x8,
+ &[v1.as_basic_value_enum(), v2.as_basic_value_enum()],
+ &state.var_name(),
+ )
.try_as_basic_value()
.left()
.unwrap();
@@ -1977,52 +2341,41 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I32Mul | Operator::I64Mul => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
let res = builder.build_int_mul(v1, v2, &state.var_name());
state.push1(res);
}
Operator::I8x16Mul => {
- let (v1, v2) = state.pop2()?;
- let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
- let v1 = builder
- .build_bitcast(v1, intrinsics.i8x16_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i8x16_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i8x16(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i8x16(builder, intrinsics, v2, i2);
let res = builder.build_int_mul(v1, v2, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I16x8Mul => {
- let (v1, v2) = state.pop2()?;
- let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
- let v1 = builder
- .build_bitcast(v1, intrinsics.i16x8_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i16x8_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i16x8(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i16x8(builder, intrinsics, v2, i2);
let res = builder.build_int_mul(v1, v2, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I32x4Mul => {
- let (v1, v2) = state.pop2()?;
- let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
- let v1 = builder
- .build_bitcast(v1, intrinsics.i32x4_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i32x4_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i32x4(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i32x4(builder, intrinsics, v2, i2);
let res = builder.build_int_mul(v1, v2, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I32DivS | Operator::I64DivS => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
trap_if_zero_or_overflow(builder, intrinsics, context, &function, v1, v2);
@@ -2031,7 +2384,9 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I32DivU | Operator::I64DivU => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
trap_if_zero(builder, intrinsics, context, &function, v2);
@@ -2040,7 +2395,9 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I32RemS | Operator::I64RemS => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
let int_type = v1.get_type();
let (min_value, neg_one_value) = if int_type == intrinsics.i32_ty {
@@ -2085,7 +2442,9 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I32RemU | Operator::I64RemU => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
trap_if_zero(builder, intrinsics, context, &function, v2);
@@ -2094,25 +2453,34 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I32And | Operator::I64And | Operator::V128And => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
let res = builder.build_and(v1, v2, &state.var_name());
state.push1(res);
}
Operator::I32Or | Operator::I64Or | Operator::V128Or => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
let res = builder.build_or(v1, v2, &state.var_name());
state.push1(res);
}
Operator::I32Xor | Operator::I64Xor | Operator::V128Xor => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
let res = builder.build_xor(v1, v2, &state.var_name());
state.push1(res);
}
Operator::V128Bitselect => {
- let (v1, v2, cond) = state.pop3()?;
+ let ((v1, i1), (v2, i2), (cond, cond_info)) = state.pop3_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
+ let cond = apply_pending_canonicalization(builder, intrinsics, cond, cond_info);
let v1 = builder
.build_bitcast(v1, intrinsics.i1x128_ty, "")
.into_vector_value();
@@ -2127,17 +2495,18 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I32Shl | Operator::I64Shl => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
// TODO: missing 'and' of v2?
let res = builder.build_left_shift(v1, v2, &state.var_name());
state.push1(res);
}
Operator::I8x16Shl => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i8x16_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i8x16(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let v2 = v2.into_int_value();
let v2 = builder.build_and(v2, intrinsics.i32_ty.const_int(7, false), "");
let v2 = builder.build_int_truncate(v2, intrinsics.i8_ty, "");
@@ -2153,10 +2522,9 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I16x8Shl => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i16x8_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i16x8(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let v2 = v2.into_int_value();
let v2 = builder.build_and(v2, intrinsics.i32_ty.const_int(15, false), "");
let v2 = builder.build_int_truncate(v2, intrinsics.i16_ty, "");
@@ -2172,10 +2540,9 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I32x4Shl => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i32x4_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i32x4(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let v2 = v2.into_int_value();
let v2 = builder.build_and(v2, intrinsics.i32_ty.const_int(31, false), "");
let v2 = splat_vector(
@@ -2190,10 +2557,9 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I64x2Shl => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i64x2_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i64x2(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let v2 = v2.into_int_value();
let v2 = builder.build_and(v2, intrinsics.i32_ty.const_int(63, false), "");
let v2 = builder.build_int_z_extend(v2, intrinsics.i64_ty, "");
@@ -2209,17 +2575,18 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I32ShrS | Operator::I64ShrS => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
// TODO: check wasm spec, is this missing v2 mod LaneBits?
let res = builder.build_right_shift(v1, v2, true, &state.var_name());
state.push1(res);
}
Operator::I8x16ShrS => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i8x16_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i8x16(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let v2 = v2.into_int_value();
let v2 = builder.build_and(v2, intrinsics.i32_ty.const_int(7, false), "");
let v2 = builder.build_int_truncate(v2, intrinsics.i8_ty, "");
@@ -2235,10 +2602,9 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I16x8ShrS => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i16x8_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i16x8(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let v2 = v2.into_int_value();
let v2 = builder.build_and(v2, intrinsics.i32_ty.const_int(15, false), "");
let v2 = builder.build_int_truncate(v2, intrinsics.i16_ty, "");
@@ -2254,10 +2620,9 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I32x4ShrS => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i32x4_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i32x4(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let v2 = v2.into_int_value();
let v2 = builder.build_and(v2, intrinsics.i32_ty.const_int(31, false), "");
let v2 = splat_vector(
@@ -2272,10 +2637,9 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I64x2ShrS => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i64x2_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i64x2(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let v2 = v2.into_int_value();
let v2 = builder.build_and(v2, intrinsics.i32_ty.const_int(63, false), "");
let v2 = builder.build_int_z_extend(v2, intrinsics.i64_ty, "");
@@ -2291,16 +2655,17 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I32ShrU | Operator::I64ShrU => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
let res = builder.build_right_shift(v1, v2, false, &state.var_name());
state.push1(res);
}
Operator::I8x16ShrU => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i8x16_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i8x16(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let v2 = v2.into_int_value();
let v2 = builder.build_and(v2, intrinsics.i32_ty.const_int(7, false), "");
let v2 = builder.build_int_truncate(v2, intrinsics.i8_ty, "");
@@ -2316,10 +2681,9 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I16x8ShrU => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i16x8_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i16x8(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let v2 = v2.into_int_value();
let v2 = builder.build_and(v2, intrinsics.i32_ty.const_int(15, false), "");
let v2 = builder.build_int_truncate(v2, intrinsics.i16_ty, "");
@@ -2335,10 +2699,9 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I32x4ShrU => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i32x4_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i32x4(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let v2 = v2.into_int_value();
let v2 = builder.build_and(v2, intrinsics.i32_ty.const_int(31, false), "");
let v2 = splat_vector(
@@ -2353,10 +2716,9 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I64x2ShrU => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i64x2_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i64x2(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let v2 = v2.into_int_value();
let v2 = builder.build_and(v2, intrinsics.i32_ty.const_int(63, false), "");
let v2 = builder.build_int_z_extend(v2, intrinsics.i64_ty, "");
@@ -2372,7 +2734,9 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I32Rotl => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
let lhs = builder.build_left_shift(v1, v2, &state.var_name());
let rhs = {
@@ -2384,7 +2748,9 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I64Rotl => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
let lhs = builder.build_left_shift(v1, v2, &state.var_name());
let rhs = {
@@ -2396,7 +2762,9 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I32Rotr => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
let lhs = builder.build_right_shift(v1, v2, false, &state.var_name());
let rhs = {
@@ -2408,7 +2776,9 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I64Rotr => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
let lhs = builder.build_right_shift(v1, v2, false, &state.var_name());
let rhs = {
@@ -2420,7 +2790,8 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I32Clz => {
- let input = state.pop1()?;
+ let (input, info) = state.pop1_extra()?;
+ let input = apply_pending_canonicalization(builder, intrinsics, input, info);
let is_zero_undef = intrinsics.i1_zero.as_basic_value_enum();
let res = builder
.build_call(
@@ -2431,10 +2802,11 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
.try_as_basic_value()
.left()
.unwrap();
- state.push1(res);
+ state.push1_extra(res, ExtraInfo::arithmetic_f32());
}
Operator::I64Clz => {
- let input = state.pop1()?;
+ let (input, info) = state.pop1_extra()?;
+ let input = apply_pending_canonicalization(builder, intrinsics, input, info);
let is_zero_undef = intrinsics.i1_zero.as_basic_value_enum();
let res = builder
.build_call(
@@ -2445,10 +2817,11 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
.try_as_basic_value()
.left()
.unwrap();
- state.push1(res);
+ state.push1_extra(res, ExtraInfo::arithmetic_f64());
}
Operator::I32Ctz => {
- let input = state.pop1()?;
+ let (input, info) = state.pop1_extra()?;
+ let input = apply_pending_canonicalization(builder, intrinsics, input, info);
let is_zero_undef = intrinsics.i1_zero.as_basic_value_enum();
let res = builder
.build_call(
@@ -2459,10 +2832,11 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
.try_as_basic_value()
.left()
.unwrap();
- state.push1(res);
+ state.push1_extra(res, ExtraInfo::arithmetic_f32());
}
Operator::I64Ctz => {
- let input = state.pop1()?;
+ let (input, info) = state.pop1_extra()?;
+ let input = apply_pending_canonicalization(builder, intrinsics, input, info);
let is_zero_undef = intrinsics.i1_zero.as_basic_value_enum();
let res = builder
.build_call(
@@ -2473,25 +2847,27 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
.try_as_basic_value()
.left()
.unwrap();
- state.push1(res);
+ state.push1_extra(res, ExtraInfo::arithmetic_f64());
}
Operator::I32Popcnt => {
- let input = state.pop1()?;
+ let (input, info) = state.pop1_extra()?;
+ let input = apply_pending_canonicalization(builder, intrinsics, input, info);
let res = builder
.build_call(intrinsics.ctpop_i32, &[input], &state.var_name())
.try_as_basic_value()
.left()
.unwrap();
- state.push1(res);
+ state.push1_extra(res, ExtraInfo::arithmetic_f32());
}
Operator::I64Popcnt => {
- let input = state.pop1()?;
+ let (input, info) = state.pop1_extra()?;
+ let input = apply_pending_canonicalization(builder, intrinsics, input, info);
let res = builder
.build_call(intrinsics.ctpop_i64, &[input], &state.var_name())
.try_as_basic_value()
.left()
.unwrap();
- state.push1(res);
+ state.push1_extra(res, ExtraInfo::arithmetic_f64());
}
Operator::I32Eqz => {
let input = state.pop1()?.into_int_value();
@@ -2502,7 +2878,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
&state.var_name(),
);
let res = builder.build_int_z_extend(cond, intrinsics.i32_ty, &state.var_name());
- state.push1(res);
+ state.push1_extra(res, ExtraInfo::arithmetic_f32());
}
Operator::I64Eqz => {
let input = state.pop1()?.into_int_value();
@@ -2513,132 +2889,160 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
&state.var_name(),
);
let res = builder.build_int_z_extend(cond, intrinsics.i32_ty, &state.var_name());
- state.push1(res);
+ state.push1_extra(res, ExtraInfo::arithmetic_f64());
}
/***************************
* Floating-Point Arithmetic instructions.
* https://github.com/sunfishcode/wasm-reference-manual/blob/master/WebAssembly.md#floating-point-arithmetic-instructions
***************************/
- Operator::F32Add | Operator::F64Add => {
- let (v1, v2) = state.pop2()?;
- let v1 = canonicalize_nans(builder, intrinsics, v1);
- let v2 = canonicalize_nans(builder, intrinsics, v2);
+ Operator::F32Add => {
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
let (v1, v2) = (v1.into_float_value(), v2.into_float_value());
let res = builder.build_float_add(v1, v2, &state.var_name());
- state.push1(res);
+ state.push1_extra(
+ res,
+ (i1.strip_pending() & i2.strip_pending()) | ExtraInfo::pending_f32_nan(),
+ );
+ }
+ Operator::F64Add => {
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, v2) = (v1.into_float_value(), v2.into_float_value());
+ let res = builder.build_float_add(v1, v2, &state.var_name());
+ state.push1_extra(
+ res,
+ (i1.strip_pending() & i2.strip_pending()) | ExtraInfo::pending_f64_nan(),
+ );
}
Operator::F32x4Add => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder.build_bitcast(v1, intrinsics.f32x4_ty, "");
- let v2 = builder.build_bitcast(v2, intrinsics.f32x4_ty, "");
- let v1 = canonicalize_nans(builder, intrinsics, v1);
- let v2 = canonicalize_nans(builder, intrinsics, v2);
- let (v1, v2) = (v1.into_vector_value(), v2.into_vector_value());
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, i1) = v128_into_f32x4(builder, intrinsics, v1, i1);
+ let (v2, i2) = v128_into_f32x4(builder, intrinsics, v2, i2);
let res = builder.build_float_add(v1, v2, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
- state.push1(res);
+ state.push1_extra(
+ res,
+ (i1.strip_pending() & i2.strip_pending()) | ExtraInfo::pending_f32_nan(),
+ );
}
Operator::F64x2Add => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder.build_bitcast(v1, intrinsics.f64x2_ty, "");
- let v2 = builder.build_bitcast(v2, intrinsics.f64x2_ty, "");
- let v1 = canonicalize_nans(builder, intrinsics, v1);
- let v2 = canonicalize_nans(builder, intrinsics, v2);
- let (v1, v2) = (v1.into_vector_value(), v2.into_vector_value());
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, i1) = v128_into_f64x2(builder, intrinsics, v1, i1);
+ let (v2, i2) = v128_into_f64x2(builder, intrinsics, v2, i2);
let res = builder.build_float_add(v1, v2, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
- state.push1(res);
+ state.push1_extra(
+ res,
+ (i1.strip_pending() & i2.strip_pending()) | ExtraInfo::pending_f64_nan(),
+ );
}
- Operator::F32Sub | Operator::F64Sub => {
- let (v1, v2) = state.pop2()?;
- let v1 = canonicalize_nans(builder, intrinsics, v1);
- let v2 = canonicalize_nans(builder, intrinsics, v2);
+ Operator::F32Sub => {
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
let (v1, v2) = (v1.into_float_value(), v2.into_float_value());
let res = builder.build_float_sub(v1, v2, &state.var_name());
- state.push1(res);
+ state.push1_extra(
+ res,
+ (i1.strip_pending() & i2.strip_pending()) | ExtraInfo::pending_f32_nan(),
+ );
+ }
+ Operator::F64Sub => {
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, v2) = (v1.into_float_value(), v2.into_float_value());
+ let res = builder.build_float_sub(v1, v2, &state.var_name());
+ state.push1_extra(
+ res,
+ (i1.strip_pending() & i2.strip_pending()) | ExtraInfo::pending_f64_nan(),
+ );
}
Operator::F32x4Sub => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder.build_bitcast(v1, intrinsics.f32x4_ty, "");
- let v2 = builder.build_bitcast(v2, intrinsics.f32x4_ty, "");
- let v1 = canonicalize_nans(builder, intrinsics, v1);
- let v2 = canonicalize_nans(builder, intrinsics, v2);
- let (v1, v2) = (v1.into_vector_value(), v2.into_vector_value());
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, i1) = v128_into_f32x4(builder, intrinsics, v1, i1);
+ let (v2, i2) = v128_into_f32x4(builder, intrinsics, v2, i2);
let res = builder.build_float_sub(v1, v2, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
- state.push1(res);
+ state.push1_extra(
+ res,
+ (i1.strip_pending() & i2.strip_pending()) | ExtraInfo::pending_f32_nan(),
+ );
}
Operator::F64x2Sub => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder.build_bitcast(v1, intrinsics.f64x2_ty, "");
- let v2 = builder.build_bitcast(v2, intrinsics.f64x2_ty, "");
- let v1 = canonicalize_nans(builder, intrinsics, v1);
- let v2 = canonicalize_nans(builder, intrinsics, v2);
- let (v1, v2) = (v1.into_vector_value(), v2.into_vector_value());
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, i1) = v128_into_f64x2(builder, intrinsics, v1, i1);
+ let (v2, i2) = v128_into_f64x2(builder, intrinsics, v2, i2);
let res = builder.build_float_sub(v1, v2, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
- state.push1(res);
+ state.push1_extra(
+ res,
+ (i1.strip_pending() & i2.strip_pending()) | ExtraInfo::pending_f64_nan(),
+ );
}
- Operator::F32Mul | Operator::F64Mul => {
- let (v1, v2) = state.pop2()?;
- let v1 = canonicalize_nans(builder, intrinsics, v1);
- let v2 = canonicalize_nans(builder, intrinsics, v2);
+ Operator::F32Mul => {
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
let (v1, v2) = (v1.into_float_value(), v2.into_float_value());
let res = builder.build_float_mul(v1, v2, &state.var_name());
- state.push1(res);
+ state.push1_extra(
+ res,
+ (i1.strip_pending() & i2.strip_pending()) | ExtraInfo::pending_f32_nan(),
+ );
+ }
+ Operator::F64Mul => {
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, v2) = (v1.into_float_value(), v2.into_float_value());
+ let res = builder.build_float_mul(v1, v2, &state.var_name());
+ state.push1_extra(
+ res,
+ (i1.strip_pending() & i2.strip_pending()) | ExtraInfo::pending_f64_nan(),
+ );
}
Operator::F32x4Mul => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder.build_bitcast(v1, intrinsics.f32x4_ty, "");
- let v2 = builder.build_bitcast(v2, intrinsics.f32x4_ty, "");
- let v1 = canonicalize_nans(builder, intrinsics, v1);
- let v2 = canonicalize_nans(builder, intrinsics, v2);
- let (v1, v2) = (v1.into_vector_value(), v2.into_vector_value());
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, i1) = v128_into_f32x4(builder, intrinsics, v1, i1);
+ let (v2, i2) = v128_into_f32x4(builder, intrinsics, v2, i2);
let res = builder.build_float_mul(v1, v2, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
- state.push1(res);
+ state.push1_extra(
+ res,
+ (i1.strip_pending() & i2.strip_pending()) | ExtraInfo::pending_f32_nan(),
+ );
}
Operator::F64x2Mul => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder.build_bitcast(v1, intrinsics.f64x2_ty, "");
- let v2 = builder.build_bitcast(v2, intrinsics.f64x2_ty, "");
- let v1 = canonicalize_nans(builder, intrinsics, v1);
- let v2 = canonicalize_nans(builder, intrinsics, v2);
- let (v1, v2) = (v1.into_vector_value(), v2.into_vector_value());
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, i1) = v128_into_f64x2(builder, intrinsics, v1, i1);
+ let (v2, i2) = v128_into_f64x2(builder, intrinsics, v2, i2);
let res = builder.build_float_mul(v1, v2, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
- state.push1(res);
+ state.push1_extra(
+ res,
+ (i1.strip_pending() & i2.strip_pending()) | ExtraInfo::pending_f64_nan(),
+ );
}
- Operator::F32Div | Operator::F64Div => {
+ Operator::F32Div => {
let (v1, v2) = state.pop2()?;
- let v1 = canonicalize_nans(builder, intrinsics, v1);
- let v2 = canonicalize_nans(builder, intrinsics, v2);
let (v1, v2) = (v1.into_float_value(), v2.into_float_value());
let res = builder.build_float_div(v1, v2, &state.var_name());
- state.push1(res);
+ state.push1_extra(res, ExtraInfo::pending_f32_nan());
+ }
+ Operator::F64Div => {
+ let (v1, v2) = state.pop2()?;
+ let (v1, v2) = (v1.into_float_value(), v2.into_float_value());
+ let res = builder.build_float_div(v1, v2, &state.var_name());
+ state.push1_extra(res, ExtraInfo::pending_f64_nan());
}
Operator::F32x4Div => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder.build_bitcast(v1, intrinsics.f32x4_ty, "");
- let v2 = builder.build_bitcast(v2, intrinsics.f32x4_ty, "");
- let v1 = canonicalize_nans(builder, intrinsics, v1);
- let v2 = canonicalize_nans(builder, intrinsics, v2);
- let (v1, v2) = (v1.into_vector_value(), v2.into_vector_value());
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_f32x4(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_f32x4(builder, intrinsics, v2, i2);
let res = builder.build_float_div(v1, v2, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
- state.push1(res);
+ state.push1_extra(res, ExtraInfo::pending_f32_nan());
}
Operator::F64x2Div => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder.build_bitcast(v1, intrinsics.f64x2_ty, "");
- let v2 = builder.build_bitcast(v2, intrinsics.f64x2_ty, "");
- let v1 = canonicalize_nans(builder, intrinsics, v1);
- let v2 = canonicalize_nans(builder, intrinsics, v2);
- let (v1, v2) = (v1.into_vector_value(), v2.into_vector_value());
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_f64x2(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_f64x2(builder, intrinsics, v2, i2);
let res = builder.build_float_div(v1, v2, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
- state.push1(res);
+ state.push1_extra(res, ExtraInfo::pending_f64_nan());
}
Operator::F32Sqrt => {
let input = state.pop1()?;
@@ -2647,7 +3051,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
.try_as_basic_value()
.left()
.unwrap();
- state.push1(res);
+ state.push1_extra(res, ExtraInfo::pending_f32_nan());
}
Operator::F64Sqrt => {
let input = state.pop1()?;
@@ -2656,24 +3060,32 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
.try_as_basic_value()
.left()
.unwrap();
- state.push1(res);
+ state.push1_extra(res, ExtraInfo::pending_f64_nan());
}
Operator::F32x4Sqrt => {
- let input = state.pop1()?.into_int_value();
- let float = builder.build_bitcast(input, intrinsics.f32x4_ty, "float");
+ let (v, i) = state.pop1_extra()?;
+ let (v, _) = v128_into_f32x4(builder, intrinsics, v, i);
let res = builder
- .build_call(intrinsics.sqrt_f32x4, &[float], &state.var_name())
+ .build_call(
+ intrinsics.sqrt_f32x4,
+ &[v.as_basic_value_enum()],
+ &state.var_name(),
+ )
.try_as_basic_value()
.left()
.unwrap();
let bits = builder.build_bitcast(res, intrinsics.i128_ty, "bits");
- state.push1(bits);
+ state.push1_extra(bits, ExtraInfo::pending_f32_nan());
}
Operator::F64x2Sqrt => {
- let input = state.pop1()?.into_int_value();
- let float = builder.build_bitcast(input, intrinsics.f64x2_ty, "float");
+ let (v, i) = state.pop1_extra()?;
+ let (v, _) = v128_into_f64x2(builder, intrinsics, v, i);
let res = builder
- .build_call(intrinsics.sqrt_f64x2, &[float], &state.var_name())
+ .build_call(
+ intrinsics.sqrt_f64x2,
+ &[v.as_basic_value_enum()],
+ &state.var_name(),
+ )
.try_as_basic_value()
.left()
.unwrap();
@@ -2682,11 +3094,17 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
}
Operator::F32Min => {
// This implements the same logic as LLVM's @llvm.minimum
- // intrinsic would, but x86 lowering of that intrinsics
+ // intrinsic would, but x86 lowering of that intrinsic
// encounters a fatal error in LLVM 8 and LLVM 9.
let (v1, v2) = state.pop2()?;
+
+ // To detect min(-0.0, 0.0), we check whether the integer
+ // representations are equal. There's one other case where that
+ // can happen: non-canonical NaNs. Here we unconditionally
+ // canonicalize the NaNs.
let v1 = canonicalize_nans(builder, intrinsics, v1);
let v2 = canonicalize_nans(builder, intrinsics, v2);
+
let (v1, v2) = (v1.into_float_value(), v2.into_float_value());
let v1_is_nan = builder.build_float_compare(
FloatPredicate::UNO,
@@ -2724,15 +3142,23 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
.into_float_value();
let res =
builder.build_select(builder.build_or(v1_is_nan, min_cmp, ""), v1, v2, "");
- state.push1(res);
+ // Because inputs were canonicalized, we always produce
+ // canonical NaN outputs. No pending NaN cleanup.
+ state.push1_extra(res, ExtraInfo::arithmetic_f32());
}
Operator::F64Min => {
// This implements the same logic as LLVM's @llvm.minimum
- // intrinsic would, but x86 lowering of that intrinsics
+ // intrinsic would, but x86 lowering of that intrinsic
// encounters a fatal error in LLVM 8 and LLVM 9.
let (v1, v2) = state.pop2()?;
+
+ // To detect min(-0.0, 0.0), we check whether the integer
+ // representations are equal. There's one other case where that
+ // can happen: non-canonical NaNs. Here we unconditionally
+ // canonicalize the NaNs.
let v1 = canonicalize_nans(builder, intrinsics, v1);
let v2 = canonicalize_nans(builder, intrinsics, v2);
+
let (v1, v2) = (v1.into_float_value(), v2.into_float_value());
let v1_is_nan = builder.build_float_compare(
FloatPredicate::UNO,
@@ -2770,18 +3196,29 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
.into_float_value();
let res =
builder.build_select(builder.build_or(v1_is_nan, min_cmp, ""), v1, v2, "");
- state.push1(res);
+ // Because inputs were canonicalized, we always produce
+ // canonical NaN outputs. No pending NaN cleanup.
+ state.push1_extra(res, ExtraInfo::arithmetic_f64());
}
Operator::F32x4Min => {
// This implements the same logic as LLVM's @llvm.minimum
- // intrinsic would, but x86 lowering of that intrinsics
+ // intrinsic would, but x86 lowering of that intrinsic
// encounters a fatal error in LLVM 8 and LLVM 9.
- let (v1, v2) = state.pop2()?;
- let v1 = builder.build_bitcast(v1, intrinsics.f32x4_ty, "");
- let v2 = builder.build_bitcast(v2, intrinsics.f32x4_ty, "");
- let v1 = canonicalize_nans(builder, intrinsics, v1);
- let v2 = canonicalize_nans(builder, intrinsics, v2);
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_f32x4(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_f32x4(builder, intrinsics, v2, i2);
+
+ // To detect min(-0.0, 0.0), we check whether the integer
+ // representations are equal. There's one other case where that
+ // can happen: non-canonical NaNs. Here we unconditionally
+ // canonicalize the NaNs. Note that this is a different
+ // canonicalization from that which may be performed in the
+ // v128_into_f32x4 function. That may canonicalize as F64x2 if
+ // previous computations may have emitted F64x2 NaNs.
+ let v1 = canonicalize_nans(builder, intrinsics, v1.as_basic_value_enum());
+ let v2 = canonicalize_nans(builder, intrinsics, v2.as_basic_value_enum());
let (v1, v2) = (v1.into_vector_value(), v2.into_vector_value());
+
let v1_is_nan = builder.build_float_compare(
FloatPredicate::UNO,
v1,
@@ -2825,18 +3262,29 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
let res =
builder.build_select(builder.build_or(v1_is_nan, min_cmp, ""), v1, v2, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
- state.push1(res);
+ // Because inputs were canonicalized, we always produce
+ // canonical NaN outputs. No pending NaN cleanup.
+ state.push1_extra(res, ExtraInfo::arithmetic_f32());
}
Operator::F64x2Min => {
// This implements the same logic as LLVM's @llvm.minimum
- // intrinsic would, but x86 lowering of that intrinsics
+ // intrinsic would, but x86 lowering of that intrinsic
// encounters a fatal error in LLVM 8 and LLVM 9.
- let (v1, v2) = state.pop2()?;
- let v1 = builder.build_bitcast(v1, intrinsics.f64x2_ty, "");
- let v2 = builder.build_bitcast(v2, intrinsics.f64x2_ty, "");
- let v1 = canonicalize_nans(builder, intrinsics, v1);
- let v2 = canonicalize_nans(builder, intrinsics, v2);
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_f64x2(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_f64x2(builder, intrinsics, v2, i2);
+
+ // To detect min(-0.0, 0.0), we check whether the integer
+ // representations are equal. There's one other case where that
+ // can happen: non-canonical NaNs. Here we unconditionally
+ // canonicalize the NaNs. Note that this is a different
+ // canonicalization from that which may be performed in the
+ // v128_into_f32x4 function. That may canonicalize as F64x2 if
+ // previous computations may have emitted F64x2 NaNs.
+ let v1 = canonicalize_nans(builder, intrinsics, v1.as_basic_value_enum());
+ let v2 = canonicalize_nans(builder, intrinsics, v2.as_basic_value_enum());
let (v1, v2) = (v1.into_vector_value(), v2.into_vector_value());
+
let v1_is_nan = builder.build_float_compare(
FloatPredicate::UNO,
v1,
@@ -2880,15 +3328,23 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
let res =
builder.build_select(builder.build_or(v1_is_nan, min_cmp, ""), v1, v2, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
- state.push1(res);
+ // Because inputs were canonicalized, we always produce
+ // canonical NaN outputs. No pending NaN cleanup.
+ state.push1_extra(res, ExtraInfo::arithmetic_f64());
}
Operator::F32Max => {
// This implements the same logic as LLVM's @llvm.maximum
- // intrinsic would, but x86 lowering of that intrinsics
+ // intrinsic would, but x86 lowering of that intrinsic
// encounters a fatal error in LLVM 8 and LLVM 9.
let (v1, v2) = state.pop2()?;
+
+ // To detect min(-0.0, 0.0), we check whether the integer
+ // representations are equal. There's one other case where that
+ // can happen: non-canonical NaNs. Here we unconditionally
+ // canonicalize the NaNs.
let v1 = canonicalize_nans(builder, intrinsics, v1);
let v2 = canonicalize_nans(builder, intrinsics, v2);
+
let (v1, v2) = (v1.into_float_value(), v2.into_float_value());
let v1_is_nan = builder.build_float_compare(
FloatPredicate::UNO,
@@ -2925,15 +3381,23 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
.into_float_value();
let res =
builder.build_select(builder.build_or(v1_is_nan, min_cmp, ""), v1, v2, "");
- state.push1(res);
+ // Because inputs were canonicalized, we always produce
+ // canonical NaN outputs. No pending NaN cleanup.
+ state.push1_extra(res, ExtraInfo::arithmetic_f32());
}
Operator::F64Max => {
// This implements the same logic as LLVM's @llvm.maximum
- // intrinsic would, but x86 lowering of that intrinsics
+ // intrinsic would, but x86 lowering of that intrinsic
// encounters a fatal error in LLVM 8 and LLVM 9.
let (v1, v2) = state.pop2()?;
+
+ // To detect min(-0.0, 0.0), we check whether the integer
+ // representations are equal. There's one other case where that
+ // can happen: non-canonical NaNs. Here we unconditionally
+ // canonicalize the NaNs.
let v1 = canonicalize_nans(builder, intrinsics, v1);
let v2 = canonicalize_nans(builder, intrinsics, v2);
+
let (v1, v2) = (v1.into_float_value(), v2.into_float_value());
let v1_is_nan = builder.build_float_compare(
FloatPredicate::UNO,
@@ -2970,17 +3434,27 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
.into_float_value();
let res =
builder.build_select(builder.build_or(v1_is_nan, min_cmp, ""), v1, v2, "");
- state.push1(res);
+ // Because inputs were canonicalized, we always produce
+ // canonical NaN outputs. No pending NaN cleanup.
+ state.push1_extra(res, ExtraInfo::arithmetic_f64());
}
Operator::F32x4Max => {
// This implements the same logic as LLVM's @llvm.maximum
- // intrinsic would, but x86 lowering of that intrinsics
+ // intrinsic would, but x86 lowering of that intrinsic
// encounters a fatal error in LLVM 8 and LLVM 9.
- let (v1, v2) = state.pop2()?;
- let v1 = builder.build_bitcast(v1, intrinsics.f32x4_ty, "");
- let v2 = builder.build_bitcast(v2, intrinsics.f32x4_ty, "");
- let v1 = canonicalize_nans(builder, intrinsics, v1);
- let v2 = canonicalize_nans(builder, intrinsics, v2);
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_f32x4(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_f32x4(builder, intrinsics, v2, i2);
+
+ // To detect min(-0.0, 0.0), we check whether the integer
+ // representations are equal. There's one other case where that
+ // can happen: non-canonical NaNs. Here we unconditionally
+ // canonicalize the NaNs. Note that this is a different
+ // canonicalization from that which may be performed in the
+ // v128_into_f32x4 function. That may canonicalize as F64x2 if
+ // previous computations may have emitted F64x2 NaNs.
+ let v1 = canonicalize_nans(builder, intrinsics, v1.as_basic_value_enum());
+ let v2 = canonicalize_nans(builder, intrinsics, v2.as_basic_value_enum());
let (v1, v2) = (v1.into_vector_value(), v2.into_vector_value());
let v1_is_nan = builder.build_float_compare(
FloatPredicate::UNO,
@@ -3025,17 +3499,27 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
let res =
builder.build_select(builder.build_or(v1_is_nan, min_cmp, ""), v1, v2, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
- state.push1(res);
+ // Because inputs were canonicalized, we always produce
+ // canonical NaN outputs. No pending NaN cleanup.
+ state.push1_extra(res, ExtraInfo::arithmetic_f32());
}
Operator::F64x2Max => {
// This implements the same logic as LLVM's @llvm.maximum
- // intrinsic would, but x86 lowering of that intrinsics
+ // intrinsic would, but x86 lowering of that intrinsic
// encounters a fatal error in LLVM 8 and LLVM 9.
- let (v1, v2) = state.pop2()?;
- let v1 = builder.build_bitcast(v1, intrinsics.f64x2_ty, "");
- let v2 = builder.build_bitcast(v2, intrinsics.f64x2_ty, "");
- let v1 = canonicalize_nans(builder, intrinsics, v1);
- let v2 = canonicalize_nans(builder, intrinsics, v2);
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_f64x2(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_f64x2(builder, intrinsics, v2, i2);
+
+ // To detect min(-0.0, 0.0), we check whether the integer
+ // representations are equal. There's one other case where that
+ // can happen: non-canonical NaNs. Here we unconditionally
+ // canonicalize the NaNs. Note that this is a different
+ // canonicalization from that which may be performed in the
+ // v128_into_f32x4 function. That may canonicalize as F64x2 if
+ // previous computations may have emitted F64x2 NaNs.
+ let v1 = canonicalize_nans(builder, intrinsics, v1.as_basic_value_enum());
+ let v2 = canonicalize_nans(builder, intrinsics, v2.as_basic_value_enum());
let (v1, v2) = (v1.into_vector_value(), v2.into_vector_value());
let v1_is_nan = builder.build_float_compare(
FloatPredicate::UNO,
@@ -3080,160 +3564,218 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
let res =
builder.build_select(builder.build_or(v1_is_nan, min_cmp, ""), v1, v2, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
- state.push1(res);
+ // Because inputs were canonicalized, we always produce
+ // canonical NaN outputs. No pending NaN cleanup.
+ state.push1_extra(res, ExtraInfo::arithmetic_f64());
}
Operator::F32Ceil => {
- let input = state.pop1()?;
+ let (input, info) = state.pop1_extra()?;
let res = builder
.build_call(intrinsics.ceil_f32, &[input], &state.var_name())
.try_as_basic_value()
.left()
.unwrap();
- state.push1(res);
+ state.push1_extra(res, info | ExtraInfo::pending_f32_nan());
}
Operator::F64Ceil => {
- let input = state.pop1()?;
+ let (input, info) = state.pop1_extra()?;
let res = builder
.build_call(intrinsics.ceil_f64, &[input], &state.var_name())
.try_as_basic_value()
.left()
.unwrap();
- state.push1(res);
+ state.push1_extra(res, info | ExtraInfo::pending_f64_nan());
}
Operator::F32Floor => {
- let input = state.pop1()?;
+ let (input, info) = state.pop1_extra()?;
let res = builder
.build_call(intrinsics.floor_f32, &[input], &state.var_name())
.try_as_basic_value()
.left()
.unwrap();
- state.push1(res);
+ state.push1_extra(res, info | ExtraInfo::pending_f32_nan());
}
Operator::F64Floor => {
- let input = state.pop1()?;
+ let (input, info) = state.pop1_extra()?;
let res = builder
.build_call(intrinsics.floor_f64, &[input], &state.var_name())
.try_as_basic_value()
.left()
.unwrap();
- state.push1(res);
+ state.push1_extra(res, info | ExtraInfo::pending_f64_nan());
}
Operator::F32Trunc => {
- let input = state.pop1()?;
+ let (v, i) = state.pop1_extra()?;
let res = builder
- .build_call(intrinsics.trunc_f32, &[input], &state.var_name())
+ .build_call(
+ intrinsics.trunc_f32,
+ &[v.as_basic_value_enum()],
+ &state.var_name(),
+ )
.try_as_basic_value()
.left()
.unwrap();
- state.push1(res);
+ state.push1_extra(res, i);
}
Operator::F64Trunc => {
- let input = state.pop1()?;
+ let (v, i) = state.pop1_extra()?;
let res = builder
- .build_call(intrinsics.trunc_f64, &[input], &state.var_name())
+ .build_call(
+ intrinsics.trunc_f64,
+ &[v.as_basic_value_enum()],
+ &state.var_name(),
+ )
.try_as_basic_value()
.left()
.unwrap();
- state.push1(res);
+ state.push1_extra(res, i);
}
Operator::F32Nearest => {
- let input = state.pop1()?;
+ let (v, i) = state.pop1_extra()?;
let res = builder
- .build_call(intrinsics.nearbyint_f32, &[input], &state.var_name())
+ .build_call(
+ intrinsics.nearbyint_f32,
+ &[v.as_basic_value_enum()],
+ &state.var_name(),
+ )
.try_as_basic_value()
.left()
.unwrap();
- state.push1(res);
+ state.push1_extra(res, i);
}
Operator::F64Nearest => {
- let input = state.pop1()?;
+ let (v, i) = state.pop1_extra()?;
let res = builder
- .build_call(intrinsics.nearbyint_f64, &[input], &state.var_name())
+ .build_call(
+ intrinsics.nearbyint_f64,
+ &[v.as_basic_value_enum()],
+ &state.var_name(),
+ )
.try_as_basic_value()
.left()
.unwrap();
- state.push1(res);
+ state.push1_extra(res, i);
}
Operator::F32Abs => {
- let input = state.pop1()?;
+ let (v, i) = state.pop1_extra()?;
+ let v = apply_pending_canonicalization(builder, intrinsics, v, i);
let res = builder
- .build_call(intrinsics.fabs_f32, &[input], &state.var_name())
+ .build_call(
+ intrinsics.fabs_f32,
+ &[v.as_basic_value_enum()],
+ &state.var_name(),
+ )
.try_as_basic_value()
.left()
.unwrap();
- state.push1(res);
+ // The exact NaN returned by F32Abs is fully defined. Do not
+ // adjust.
+ state.push1_extra(res, i.strip_pending());
}
Operator::F64Abs => {
- let input = state.pop1()?;
+ let (v, i) = state.pop1_extra()?;
+ let v = apply_pending_canonicalization(builder, intrinsics, v, i);
let res = builder
- .build_call(intrinsics.fabs_f64, &[input], &state.var_name())
+ .build_call(
+ intrinsics.fabs_f64,
+ &[v.as_basic_value_enum()],
+ &state.var_name(),
+ )
.try_as_basic_value()
.left()
.unwrap();
- state.push1(res);
+ // The exact NaN returned by F64Abs is fully defined. Do not
+ // adjust.
+ state.push1_extra(res, i.strip_pending());
}
Operator::F32x4Abs => {
- let v = state.pop1()?.into_int_value();
- let v = builder.build_bitcast(v, intrinsics.f32x4_ty, "");
+ let (v, i) = state.pop1_extra()?;
+ let v = builder.build_bitcast(v.into_int_value(), intrinsics.f32x4_ty, "");
+ let v = apply_pending_canonicalization(builder, intrinsics, v, i);
let res = builder
- .build_call(intrinsics.fabs_f32x4, &[v], &state.var_name())
+ .build_call(
+ intrinsics.fabs_f32x4,
+ &[v.as_basic_value_enum()],
+ &state.var_name(),
+ )
.try_as_basic_value()
.left()
.unwrap();
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
- state.push1(res);
+ // The exact NaN returned by F32x4Abs is fully defined. Do not
+ // adjust.
+ state.push1_extra(res, i.strip_pending());
}
Operator::F64x2Abs => {
- let v = state.pop1()?.into_int_value();
- let v = builder.build_bitcast(v, intrinsics.f64x2_ty, "");
+ let (v, i) = state.pop1_extra()?;
+ let v = builder.build_bitcast(v.into_int_value(), intrinsics.f64x2_ty, "");
+ let v = apply_pending_canonicalization(builder, intrinsics, v, i);
let res = builder
.build_call(intrinsics.fabs_f64x2, &[v], &state.var_name())
.try_as_basic_value()
.left()
.unwrap();
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
- state.push1(res);
+ // The exact NaN returned by F32x4Abs is fully defined. Do not
+ // adjust.
+ state.push1_extra(res, i.strip_pending());
}
Operator::F32x4Neg => {
- let v = state.pop1()?.into_int_value();
- let v = builder
- .build_bitcast(v, intrinsics.f32x4_ty, "")
- .into_vector_value();
+ let (v, i) = state.pop1_extra()?;
+ let v = builder.build_bitcast(v.into_int_value(), intrinsics.f32x4_ty, "");
+ let v =
+ apply_pending_canonicalization(builder, intrinsics, v, i).into_vector_value();
let res = builder.build_float_neg(v, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
- state.push1(res);
+ // The exact NaN returned by F32x4Neg is fully defined. Do not
+ // adjust.
+ state.push1_extra(res, i.strip_pending());
}
Operator::F64x2Neg => {
- let v = state.pop1()?.into_int_value();
- let v = builder
- .build_bitcast(v, intrinsics.f64x2_ty, "")
- .into_vector_value();
+ let (v, i) = state.pop1_extra()?;
+ let v = builder.build_bitcast(v.into_int_value(), intrinsics.f64x2_ty, "");
+ let v =
+ apply_pending_canonicalization(builder, intrinsics, v, i).into_vector_value();
let res = builder.build_float_neg(v, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
- state.push1(res);
+ // The exact NaN returned by F64x2Neg is fully defined. Do not
+ // adjust.
+ state.push1_extra(res, i.strip_pending());
}
Operator::F32Neg | Operator::F64Neg => {
- let input = state.pop1()?.into_float_value();
- let res = builder.build_float_neg(input, &state.var_name());
- state.push1(res);
+ let (v, i) = state.pop1_extra()?;
+ let v =
+ apply_pending_canonicalization(builder, intrinsics, v, i).into_float_value();
+ let res = builder.build_float_neg(v, &state.var_name());
+ // The exact NaN returned by F32Neg and F64Neg are fully defined.
+ // Do not adjust.
+ state.push1_extra(res, i.strip_pending());
}
Operator::F32Copysign => {
- let (mag, sgn) = state.pop2()?;
+ let ((mag, mag_info), (sgn, sgn_info)) = state.pop2_extra()?;
+ let mag = apply_pending_canonicalization(builder, intrinsics, mag, mag_info);
+ let sgn = apply_pending_canonicalization(builder, intrinsics, sgn, sgn_info);
let res = builder
.build_call(intrinsics.copysign_f32, &[mag, sgn], &state.var_name())
.try_as_basic_value()
.left()
.unwrap();
- state.push1(res);
+ // The exact NaN returned by F32Copysign is fully defined.
+ // Do not adjust.
+ state.push1_extra(res, mag_info.strip_pending());
}
Operator::F64Copysign => {
- let (msg, sgn) = state.pop2()?;
+ let ((mag, mag_info), (sgn, sgn_info)) = state.pop2_extra()?;
+ let mag = apply_pending_canonicalization(builder, intrinsics, mag, mag_info);
+ let sgn = apply_pending_canonicalization(builder, intrinsics, sgn, sgn_info);
let res = builder
- .build_call(intrinsics.copysign_f64, &[msg, sgn], &state.var_name())
+ .build_call(intrinsics.copysign_f64, &[mag, sgn], &state.var_name())
.try_as_basic_value()
.left()
.unwrap();
- state.push1(res);
+ // The exact NaN returned by F32Copysign is fully defined.
+ // Do not adjust.
+ state.push1_extra(res, mag_info.strip_pending());
}
/***************************
@@ -3241,460 +3783,384 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
* https://github.com/sunfishcode/wasm-reference-manual/blob/master/WebAssembly.md#integer-comparison-instructions
***************************/
Operator::I32Eq | Operator::I64Eq => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
let cond = builder.build_int_compare(IntPredicate::EQ, v1, v2, &state.var_name());
let res = builder.build_int_z_extend(cond, intrinsics.i32_ty, &state.var_name());
- state.push1(res);
+ state.push1_extra(
+ res,
+ ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64(),
+ );
}
Operator::I8x16Eq => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i8x16_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i8x16_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i8x16(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i8x16(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::EQ, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i8x16_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I16x8Eq => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i16x8_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i16x8_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i16x8(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i16x8(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::EQ, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i16x8_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I32x4Eq => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i32x4_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i32x4_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i32x4(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i32x4(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::EQ, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i32x4_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I32Ne | Operator::I64Ne => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
let cond = builder.build_int_compare(IntPredicate::NE, v1, v2, &state.var_name());
let res = builder.build_int_z_extend(cond, intrinsics.i32_ty, &state.var_name());
- state.push1(res);
+ state.push1_extra(
+ res,
+ ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64(),
+ );
}
Operator::I8x16Ne => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i8x16_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i8x16_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i8x16(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i8x16(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::NE, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i8x16_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I16x8Ne => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i16x8_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i16x8_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i16x8(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i16x8(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::NE, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i16x8_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I32x4Ne => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i32x4_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i32x4_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i32x4(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i32x4(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::NE, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i32x4_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I32LtS | Operator::I64LtS => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
let cond = builder.build_int_compare(IntPredicate::SLT, v1, v2, &state.var_name());
let res = builder.build_int_z_extend(cond, intrinsics.i32_ty, &state.var_name());
- state.push1(res);
+ state.push1_extra(
+ res,
+ ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64(),
+ );
}
Operator::I8x16LtS => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i8x16_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i8x16_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i8x16(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i8x16(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::SLT, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i8x16_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I16x8LtS => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i16x8_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i16x8_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i16x8(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i16x8(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::SLT, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i16x8_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I32x4LtS => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i32x4_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i32x4_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i32x4(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i32x4(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::SLT, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i32x4_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I32LtU | Operator::I64LtU => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
let cond = builder.build_int_compare(IntPredicate::ULT, v1, v2, &state.var_name());
let res = builder.build_int_z_extend(cond, intrinsics.i32_ty, &state.var_name());
state.push1(res);
}
Operator::I8x16LtU => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i8x16_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i8x16_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i8x16(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i8x16(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::ULT, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i8x16_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I16x8LtU => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i16x8_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i16x8_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i16x8(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i16x8(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::ULT, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i16x8_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I32x4LtU => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i32x4_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i32x4_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i32x4(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i32x4(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::ULT, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i32x4_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I32LeS | Operator::I64LeS => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
let cond = builder.build_int_compare(IntPredicate::SLE, v1, v2, &state.var_name());
let res = builder.build_int_z_extend(cond, intrinsics.i32_ty, &state.var_name());
- state.push1(res);
+ state.push1_extra(
+ res,
+ ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64(),
+ );
}
Operator::I8x16LeS => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i8x16_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i8x16_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i8x16(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i8x16(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::SLE, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i8x16_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I16x8LeS => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i16x8_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i16x8_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i16x8(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i16x8(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::SLE, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i16x8_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I32x4LeS => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i32x4_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i32x4_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i32x4(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i32x4(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::SLE, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i32x4_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I32LeU | Operator::I64LeU => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
let cond = builder.build_int_compare(IntPredicate::ULE, v1, v2, &state.var_name());
let res = builder.build_int_z_extend(cond, intrinsics.i32_ty, &state.var_name());
- state.push1(res);
+ state.push1_extra(
+ res,
+ ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64(),
+ );
}
Operator::I8x16LeU => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i8x16_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i8x16_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i8x16(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i8x16(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::ULE, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i8x16_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I16x8LeU => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i16x8_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i16x8_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i16x8(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i16x8(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::ULE, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i16x8_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I32x4LeU => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i32x4_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i32x4_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i32x4(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i32x4(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::ULE, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i32x4_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I32GtS | Operator::I64GtS => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
let cond = builder.build_int_compare(IntPredicate::SGT, v1, v2, &state.var_name());
let res = builder.build_int_z_extend(cond, intrinsics.i32_ty, &state.var_name());
- state.push1(res);
+ state.push1_extra(
+ res,
+ ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64(),
+ );
}
Operator::I8x16GtS => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i8x16_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i8x16_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i8x16(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i8x16(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::SGT, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i8x16_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I16x8GtS => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i16x8_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i16x8_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i16x8(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i16x8(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::SGT, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i16x8_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I32x4GtS => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i32x4_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i32x4_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i32x4(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i32x4(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::SGT, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i32x4_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I32GtU | Operator::I64GtU => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
let cond = builder.build_int_compare(IntPredicate::UGT, v1, v2, &state.var_name());
let res = builder.build_int_z_extend(cond, intrinsics.i32_ty, &state.var_name());
- state.push1(res);
+ state.push1_extra(
+ res,
+ ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64(),
+ );
}
Operator::I8x16GtU => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i8x16_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i8x16_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i8x16(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i8x16(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::UGT, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i8x16_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I16x8GtU => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i16x8_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i16x8_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i16x8(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i16x8(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::UGT, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i16x8_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I32x4GtU => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i32x4_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i32x4_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i32x4(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i32x4(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::UGT, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i32x4_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I32GeS | Operator::I64GeS => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
let cond = builder.build_int_compare(IntPredicate::SGE, v1, v2, &state.var_name());
let res = builder.build_int_z_extend(cond, intrinsics.i32_ty, &state.var_name());
state.push1(res);
}
Operator::I8x16GeS => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i8x16_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i8x16_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i8x16(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i8x16(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::SGE, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i8x16_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I16x8GeS => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i16x8_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i16x8_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i16x8(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i16x8(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::SGE, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i16x8_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I32x4GeS => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i32x4_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i32x4_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i32x4(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i32x4(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::SGE, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i32x4_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I32GeU | Operator::I64GeU => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
let cond = builder.build_int_compare(IntPredicate::UGE, v1, v2, &state.var_name());
let res = builder.build_int_z_extend(cond, intrinsics.i32_ty, &state.var_name());
- state.push1(res);
+ state.push1_extra(
+ res,
+ ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64(),
+ );
}
Operator::I8x16GeU => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i8x16_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i8x16_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i8x16(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i8x16(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::UGE, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i8x16_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I16x8GeU => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i16x8_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i16x8_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i16x8(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i16x8(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::UGE, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i16x8_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I32x4GeU => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i32x4_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.i32x4_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i32x4(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_i32x4(builder, intrinsics, v2, i2);
let res = builder.build_int_compare(IntPredicate::UGE, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i32x4_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
@@ -3711,29 +4177,24 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
let cond =
builder.build_float_compare(FloatPredicate::OEQ, v1, v2, &state.var_name());
let res = builder.build_int_z_extend(cond, intrinsics.i32_ty, &state.var_name());
- state.push1(res);
+ state.push1_extra(
+ res,
+ ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64(),
+ );
}
Operator::F32x4Eq => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.f32x4_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.f32x4_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_f32x4(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_f32x4(builder, intrinsics, v2, i2);
let res = builder.build_float_compare(FloatPredicate::OEQ, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i32x4_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::F64x2Eq => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.f64x2_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.f64x2_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_f64x2(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_f64x2(builder, intrinsics, v2, i2);
let res = builder.build_float_compare(FloatPredicate::OEQ, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i64x2_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
@@ -3745,29 +4206,24 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
let cond =
builder.build_float_compare(FloatPredicate::UNE, v1, v2, &state.var_name());
let res = builder.build_int_z_extend(cond, intrinsics.i32_ty, &state.var_name());
- state.push1(res);
+ state.push1_extra(
+ res,
+ ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64(),
+ );
}
Operator::F32x4Ne => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.f32x4_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.f32x4_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_f32x4(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_f32x4(builder, intrinsics, v2, i2);
let res = builder.build_float_compare(FloatPredicate::UNE, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i32x4_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::F64x2Ne => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.f64x2_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.f64x2_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_f64x2(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_f64x2(builder, intrinsics, v2, i2);
let res = builder.build_float_compare(FloatPredicate::UNE, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i64x2_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
@@ -3779,29 +4235,24 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
let cond =
builder.build_float_compare(FloatPredicate::OLT, v1, v2, &state.var_name());
let res = builder.build_int_z_extend(cond, intrinsics.i32_ty, &state.var_name());
- state.push1(res);
+ state.push1_extra(
+ res,
+ ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64(),
+ );
}
Operator::F32x4Lt => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.f32x4_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.f32x4_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_f32x4(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_f32x4(builder, intrinsics, v2, i2);
let res = builder.build_float_compare(FloatPredicate::OLT, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i32x4_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::F64x2Lt => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.f64x2_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.f64x2_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_f64x2(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_f64x2(builder, intrinsics, v2, i2);
let res = builder.build_float_compare(FloatPredicate::OLT, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i64x2_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
@@ -3813,29 +4264,24 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
let cond =
builder.build_float_compare(FloatPredicate::OLE, v1, v2, &state.var_name());
let res = builder.build_int_z_extend(cond, intrinsics.i32_ty, &state.var_name());
- state.push1(res);
+ state.push1_extra(
+ res,
+ ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64(),
+ );
}
Operator::F32x4Le => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.f32x4_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.f32x4_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_f32x4(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_f32x4(builder, intrinsics, v2, i2);
let res = builder.build_float_compare(FloatPredicate::OLE, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i32x4_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::F64x2Le => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.f64x2_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.f64x2_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_f64x2(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_f64x2(builder, intrinsics, v2, i2);
let res = builder.build_float_compare(FloatPredicate::OLE, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i64x2_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
@@ -3847,29 +4293,24 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
let cond =
builder.build_float_compare(FloatPredicate::OGT, v1, v2, &state.var_name());
let res = builder.build_int_z_extend(cond, intrinsics.i32_ty, &state.var_name());
- state.push1(res);
+ state.push1_extra(
+ res,
+ ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64(),
+ );
}
Operator::F32x4Gt => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.f32x4_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.f32x4_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_f32x4(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_f32x4(builder, intrinsics, v2, i2);
let res = builder.build_float_compare(FloatPredicate::OGT, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i32x4_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::F64x2Gt => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.f64x2_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.f64x2_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_f64x2(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_f64x2(builder, intrinsics, v2, i2);
let res = builder.build_float_compare(FloatPredicate::OGT, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i64x2_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
@@ -3881,29 +4322,24 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
let cond =
builder.build_float_compare(FloatPredicate::OGE, v1, v2, &state.var_name());
let res = builder.build_int_z_extend(cond, intrinsics.i32_ty, &state.var_name());
- state.push1(res);
+ state.push1_extra(
+ res,
+ ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64(),
+ );
}
Operator::F32x4Ge => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.f32x4_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.f32x4_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_f32x4(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_f32x4(builder, intrinsics, v2, i2);
let res = builder.build_float_compare(FloatPredicate::OGE, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i32x4_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::F64x2Ge => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.f64x2_ty, "")
- .into_vector_value();
- let v2 = builder
- .build_bitcast(v2, intrinsics.f64x2_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_f64x2(builder, intrinsics, v1, i1);
+ let (v2, _) = v128_into_f64x2(builder, intrinsics, v2, i2);
let res = builder.build_float_compare(FloatPredicate::OGE, v1, v2, "");
let res = builder.build_int_s_extend(res, intrinsics.i64x2_ty, "");
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
@@ -3915,22 +4351,30 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
* https://github.com/sunfishcode/wasm-reference-manual/blob/master/WebAssembly.md#conversion-instructions
***************************/
Operator::I32WrapI64 => {
- let v1 = state.pop1()?.into_int_value();
- let res = builder.build_int_truncate(v1, intrinsics.i32_ty, &state.var_name());
+ let (v, i) = state.pop1_extra()?;
+ let v = apply_pending_canonicalization(builder, intrinsics, v, i);
+ let v = v.into_int_value();
+ let res = builder.build_int_truncate(v, intrinsics.i32_ty, &state.var_name());
state.push1(res);
}
Operator::I64ExtendSI32 => {
- let v1 = state.pop1()?.into_int_value();
- let res = builder.build_int_s_extend(v1, intrinsics.i64_ty, &state.var_name());
+ let (v, i) = state.pop1_extra()?;
+ let v = apply_pending_canonicalization(builder, intrinsics, v, i);
+ let v = v.into_int_value();
+ let res = builder.build_int_s_extend(v, intrinsics.i64_ty, &state.var_name());
state.push1(res);
}
Operator::I64ExtendUI32 => {
- let v1 = state.pop1()?.into_int_value();
- let res = builder.build_int_z_extend(v1, intrinsics.i64_ty, &state.var_name());
- state.push1(res);
+ let (v, i) = state.pop1_extra()?;
+ let v = apply_pending_canonicalization(builder, intrinsics, v, i);
+ let v = v.into_int_value();
+ let res = builder.build_int_z_extend(v, intrinsics.i64_ty, &state.var_name());
+ state.push1_extra(res, ExtraInfo::arithmetic_f64());
}
Operator::I32x4TruncSF32x4Sat => {
- let v = state.pop1()?.into_int_value();
+ let (v, i) = state.pop1_extra()?;
+ let v = apply_pending_canonicalization(builder, intrinsics, v, i);
+ let v = v.into_int_value();
let res = trunc_sat(
builder,
intrinsics,
@@ -3946,7 +4390,9 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I32x4TruncUF32x4Sat => {
- let v = state.pop1()?.into_int_value();
+ let (v, i) = state.pop1_extra()?;
+ let v = apply_pending_canonicalization(builder, intrinsics, v, i);
+ let v = v.into_int_value();
let res = trunc_sat(
builder,
intrinsics,
@@ -3962,7 +4408,9 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I64x2TruncSF64x2Sat => {
- let v = state.pop1()?.into_int_value();
+ let (v, i) = state.pop1_extra()?;
+ let v = apply_pending_canonicalization(builder, intrinsics, v, i);
+ let v = v.into_int_value();
let res = trunc_sat(
builder,
intrinsics,
@@ -3978,7 +4426,9 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I64x2TruncUF64x2Sat => {
- let v = state.pop1()?.into_int_value();
+ let (v, i) = state.pop1_extra()?;
+ let v = apply_pending_canonicalization(builder, intrinsics, v, i);
+ let v = v.into_int_value();
let res = trunc_sat(
builder,
intrinsics,
@@ -4123,39 +4573,47 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::F32DemoteF64 => {
- let v1 = state.pop1()?;
- let v1 = canonicalize_nans(builder, intrinsics, v1).into_float_value();
- let res = builder.build_float_trunc(v1, intrinsics.f32_ty, &state.var_name());
- state.push1(res);
+ let v = state.pop1()?;
+ let v = v.into_float_value();
+ let res = builder.build_float_trunc(v, intrinsics.f32_ty, &state.var_name());
+ state.push1_extra(res, ExtraInfo::pending_f32_nan());
}
Operator::F64PromoteF32 => {
- let v1 = state.pop1()?;
- let v1 = canonicalize_nans(builder, intrinsics, v1).into_float_value();
- let res = builder.build_float_ext(v1, intrinsics.f64_ty, &state.var_name());
- state.push1(res);
+ let v = state.pop1()?;
+ let v = v.into_float_value();
+ let res = builder.build_float_ext(v, intrinsics.f64_ty, &state.var_name());
+ state.push1_extra(res, ExtraInfo::pending_f64_nan());
}
Operator::F32ConvertSI32 | Operator::F32ConvertSI64 => {
- let v1 = state.pop1()?.into_int_value();
+ let (v, i) = state.pop1_extra()?;
+ let v = apply_pending_canonicalization(builder, intrinsics, v, i);
+ let v = v.into_int_value();
let res =
- builder.build_signed_int_to_float(v1, intrinsics.f32_ty, &state.var_name());
+ builder.build_signed_int_to_float(v, intrinsics.f32_ty, &state.var_name());
state.push1(res);
}
Operator::F64ConvertSI32 | Operator::F64ConvertSI64 => {
- let v1 = state.pop1()?.into_int_value();
+ let (v, i) = state.pop1_extra()?;
+ let v = apply_pending_canonicalization(builder, intrinsics, v, i);
+ let v = v.into_int_value();
let res =
- builder.build_signed_int_to_float(v1, intrinsics.f64_ty, &state.var_name());
+ builder.build_signed_int_to_float(v, intrinsics.f64_ty, &state.var_name());
state.push1(res);
}
Operator::F32ConvertUI32 | Operator::F32ConvertUI64 => {
- let v1 = state.pop1()?.into_int_value();
+ let (v, i) = state.pop1_extra()?;
+ let v = apply_pending_canonicalization(builder, intrinsics, v, i);
+ let v = v.into_int_value();
let res =
- builder.build_unsigned_int_to_float(v1, intrinsics.f32_ty, &state.var_name());
+ builder.build_unsigned_int_to_float(v, intrinsics.f32_ty, &state.var_name());
state.push1(res);
}
Operator::F64ConvertUI32 | Operator::F64ConvertUI64 => {
- let v1 = state.pop1()?.into_int_value();
+ let (v, i) = state.pop1_extra()?;
+ let v = apply_pending_canonicalization(builder, intrinsics, v, i);
+ let v = v.into_int_value();
let res =
- builder.build_unsigned_int_to_float(v1, intrinsics.f64_ty, &state.var_name());
+ builder.build_unsigned_int_to_float(v, intrinsics.f64_ty, &state.var_name());
state.push1(res);
}
Operator::F32x4ConvertSI32x4 => {
@@ -4199,24 +4657,26 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I32ReinterpretF32 => {
- let v = state.pop1()?;
+ let (v, i) = state.pop1_extra()?;
+ let v = apply_pending_canonicalization(builder, intrinsics, v, i);
let ret = builder.build_bitcast(v, intrinsics.i32_ty, &state.var_name());
- state.push1(ret);
+ state.push1_extra(ret, ExtraInfo::arithmetic_f32());
}
Operator::I64ReinterpretF64 => {
- let v = state.pop1()?;
+ let (v, i) = state.pop1_extra()?;
+ let v = apply_pending_canonicalization(builder, intrinsics, v, i);
let ret = builder.build_bitcast(v, intrinsics.i64_ty, &state.var_name());
- state.push1(ret);
+ state.push1_extra(ret, ExtraInfo::arithmetic_f64());
}
Operator::F32ReinterpretI32 => {
- let v = state.pop1()?;
+ let (v, i) = state.pop1_extra()?;
let ret = builder.build_bitcast(v, intrinsics.f32_ty, &state.var_name());
- state.push1(ret);
+ state.push1_extra(ret, i);
}
Operator::F64ReinterpretI64 => {
- let v = state.pop1()?;
+ let (v, i) = state.pop1_extra()?;
let ret = builder.build_bitcast(v, intrinsics.f64_ty, &state.var_name());
- state.push1(ret);
+ state.push1_extra(ret, i);
}
/***************************
@@ -4273,6 +4733,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -4281,6 +4742,18 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
4,
)?;
let result = builder.build_load(effective_address, &state.var_name());
+ result
+ .as_instruction_value()
+ .unwrap()
+ .set_alignment(1)
+ .unwrap();
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "memory",
+ result.as_instruction_value().unwrap(),
+ Some(0),
+ );
state.push1(result);
}
Operator::I64Load { ref memarg } => {
@@ -4288,6 +4761,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -4296,6 +4770,18 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
8,
)?;
let result = builder.build_load(effective_address, &state.var_name());
+ result
+ .as_instruction_value()
+ .unwrap()
+ .set_alignment(1)
+ .unwrap();
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "memory",
+ result.as_instruction_value().unwrap(),
+ Some(0),
+ );
state.push1(result);
}
Operator::F32Load { ref memarg } => {
@@ -4303,6 +4789,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -4311,6 +4798,18 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
4,
)?;
let result = builder.build_load(effective_address, &state.var_name());
+ result
+ .as_instruction_value()
+ .unwrap()
+ .set_alignment(1)
+ .unwrap();
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "memory",
+ result.as_instruction_value().unwrap(),
+ Some(0),
+ );
state.push1(result);
}
Operator::F64Load { ref memarg } => {
@@ -4318,6 +4817,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -4326,6 +4826,18 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
8,
)?;
let result = builder.build_load(effective_address, &state.var_name());
+ result
+ .as_instruction_value()
+ .unwrap()
+ .set_alignment(1)
+ .unwrap();
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "memory",
+ result.as_instruction_value().unwrap(),
+ Some(0),
+ );
state.push1(result);
}
Operator::V128Load { ref memarg } => {
@@ -4333,6 +4845,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -4341,6 +4854,18 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
16,
)?;
let result = builder.build_load(effective_address, &state.var_name());
+ result
+ .as_instruction_value()
+ .unwrap()
+ .set_alignment(1)
+ .unwrap();
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "memory",
+ result.as_instruction_value().unwrap(),
+ Some(0),
+ );
state.push1(result);
}
@@ -4350,6 +4875,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -4357,7 +4883,9 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
intrinsics.i32_ptr_ty,
4,
)?;
- builder.build_store(effective_address, value);
+ let store = builder.build_store(effective_address, value);
+ store.set_alignment(1).unwrap();
+ tbaa_label(&self.module, intrinsics, "memory", store, Some(0));
}
Operator::I64Store { ref memarg } => {
let value = state.pop1()?;
@@ -4365,6 +4893,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -4372,14 +4901,18 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
intrinsics.i64_ptr_ty,
8,
)?;
- builder.build_store(effective_address, value);
+ let store = builder.build_store(effective_address, value);
+ store.set_alignment(1).unwrap();
+ tbaa_label(&self.module, intrinsics, "memory", store, Some(0));
}
Operator::F32Store { ref memarg } => {
- let value = state.pop1()?;
+ let (v, i) = state.pop1_extra()?;
+ let v = apply_pending_canonicalization(builder, intrinsics, v, i);
let effective_address = resolve_memory_ptr(
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -4387,14 +4920,18 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
intrinsics.f32_ptr_ty,
4,
)?;
- builder.build_store(effective_address, value);
+ let store = builder.build_store(effective_address, v);
+ store.set_alignment(1).unwrap();
+ tbaa_label(&self.module, intrinsics, "memory", store, Some(0));
}
Operator::F64Store { ref memarg } => {
- let value = state.pop1()?;
+ let (v, i) = state.pop1_extra()?;
+ let v = apply_pending_canonicalization(builder, intrinsics, v, i);
let effective_address = resolve_memory_ptr(
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -4402,14 +4939,18 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
intrinsics.f64_ptr_ty,
8,
)?;
- builder.build_store(effective_address, value);
+ let store = builder.build_store(effective_address, v);
+ store.set_alignment(1).unwrap();
+ tbaa_label(&self.module, intrinsics, "memory", store, Some(0));
}
Operator::V128Store { ref memarg } => {
- let value = state.pop1()?;
+ let (v, i) = state.pop1_extra()?;
+ let v = apply_pending_canonicalization(builder, intrinsics, v, i);
let effective_address = resolve_memory_ptr(
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -4417,14 +4958,16 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
intrinsics.i128_ptr_ty,
16,
)?;
- builder.build_store(effective_address, value);
+ let store = builder.build_store(effective_address, v);
+ store.set_alignment(1).unwrap();
+ tbaa_label(&self.module, intrinsics, "memory", store, Some(0));
}
-
Operator::I32Load8S { ref memarg } => {
let effective_address = resolve_memory_ptr(
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -4432,11 +4975,24 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
intrinsics.i8_ptr_ty,
1,
)?;
- let narrow_result = builder
- .build_load(effective_address, &state.var_name())
- .into_int_value();
- let result =
- builder.build_int_s_extend(narrow_result, intrinsics.i32_ty, &state.var_name());
+ let narrow_result = builder.build_load(effective_address, &state.var_name());
+ narrow_result
+ .as_instruction_value()
+ .unwrap()
+ .set_alignment(1)
+ .unwrap();
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "memory",
+ narrow_result.as_instruction_value().unwrap(),
+ Some(0),
+ );
+ let result = builder.build_int_s_extend(
+ narrow_result.into_int_value(),
+ intrinsics.i32_ty,
+ &state.var_name(),
+ );
state.push1(result);
}
Operator::I32Load16S { ref memarg } => {
@@ -4444,6 +5000,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -4451,11 +5008,24 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
intrinsics.i16_ptr_ty,
2,
)?;
- let narrow_result = builder
- .build_load(effective_address, &state.var_name())
- .into_int_value();
- let result =
- builder.build_int_s_extend(narrow_result, intrinsics.i32_ty, &state.var_name());
+ let narrow_result = builder.build_load(effective_address, &state.var_name());
+ narrow_result
+ .as_instruction_value()
+ .unwrap()
+ .set_alignment(1)
+ .unwrap();
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "memory",
+ narrow_result.as_instruction_value().unwrap(),
+ Some(0),
+ );
+ let result = builder.build_int_s_extend(
+ narrow_result.into_int_value(),
+ intrinsics.i32_ty,
+ &state.var_name(),
+ );
state.push1(result);
}
Operator::I64Load8S { ref memarg } => {
@@ -4463,6 +5033,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -4473,6 +5044,18 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
let narrow_result = builder
.build_load(effective_address, &state.var_name())
.into_int_value();
+ narrow_result
+ .as_instruction_value()
+ .unwrap()
+ .set_alignment(1)
+ .unwrap();
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "memory",
+ narrow_result.as_instruction_value().unwrap(),
+ Some(0),
+ );
let result =
builder.build_int_s_extend(narrow_result, intrinsics.i64_ty, &state.var_name());
state.push1(result);
@@ -4482,6 +5065,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -4492,6 +5076,18 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
let narrow_result = builder
.build_load(effective_address, &state.var_name())
.into_int_value();
+ narrow_result
+ .as_instruction_value()
+ .unwrap()
+ .set_alignment(1)
+ .unwrap();
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "memory",
+ narrow_result.as_instruction_value().unwrap(),
+ Some(0),
+ );
let result =
builder.build_int_s_extend(narrow_result, intrinsics.i64_ty, &state.var_name());
state.push1(result);
@@ -4501,6 +5097,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -4508,11 +5105,24 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
intrinsics.i32_ptr_ty,
4,
)?;
- let narrow_result = builder
- .build_load(effective_address, &state.var_name())
- .into_int_value();
- let result =
- builder.build_int_s_extend(narrow_result, intrinsics.i64_ty, &state.var_name());
+ let narrow_result = builder.build_load(effective_address, &state.var_name());
+ narrow_result
+ .as_instruction_value()
+ .unwrap()
+ .set_alignment(1)
+ .unwrap();
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "memory",
+ narrow_result.as_instruction_value().unwrap(),
+ Some(0),
+ );
+ let result = builder.build_int_s_extend(
+ narrow_result.into_int_value(),
+ intrinsics.i64_ty,
+ &state.var_name(),
+ );
state.push1(result);
}
@@ -4521,6 +5131,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -4528,18 +5139,32 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
intrinsics.i8_ptr_ty,
1,
)?;
- let narrow_result = builder
- .build_load(effective_address, &state.var_name())
- .into_int_value();
- let result =
- builder.build_int_z_extend(narrow_result, intrinsics.i32_ty, &state.var_name());
- state.push1(result);
+ let narrow_result = builder.build_load(effective_address, &state.var_name());
+ narrow_result
+ .as_instruction_value()
+ .unwrap()
+ .set_alignment(1)
+ .unwrap();
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "memory",
+ narrow_result.as_instruction_value().unwrap(),
+ Some(0),
+ );
+ let result = builder.build_int_z_extend(
+ narrow_result.into_int_value(),
+ intrinsics.i32_ty,
+ &state.var_name(),
+ );
+ state.push1_extra(result, ExtraInfo::arithmetic_f32());
}
Operator::I32Load16U { ref memarg } => {
let effective_address = resolve_memory_ptr(
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -4547,18 +5172,32 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
intrinsics.i16_ptr_ty,
2,
)?;
- let narrow_result = builder
- .build_load(effective_address, &state.var_name())
- .into_int_value();
- let result =
- builder.build_int_z_extend(narrow_result, intrinsics.i32_ty, &state.var_name());
- state.push1(result);
+ let narrow_result = builder.build_load(effective_address, &state.var_name());
+ narrow_result
+ .as_instruction_value()
+ .unwrap()
+ .set_alignment(1)
+ .unwrap();
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "memory",
+ narrow_result.as_instruction_value().unwrap(),
+ Some(0),
+ );
+ let result = builder.build_int_z_extend(
+ narrow_result.into_int_value(),
+ intrinsics.i32_ty,
+ &state.var_name(),
+ );
+ state.push1_extra(result, ExtraInfo::arithmetic_f32());
}
Operator::I64Load8U { ref memarg } => {
let effective_address = resolve_memory_ptr(
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -4566,18 +5205,32 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
intrinsics.i8_ptr_ty,
1,
)?;
- let narrow_result = builder
- .build_load(effective_address, &state.var_name())
- .into_int_value();
- let result =
- builder.build_int_z_extend(narrow_result, intrinsics.i64_ty, &state.var_name());
- state.push1(result);
+ let narrow_result = builder.build_load(effective_address, &state.var_name());
+ narrow_result
+ .as_instruction_value()
+ .unwrap()
+ .set_alignment(1)
+ .unwrap();
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "memory",
+ narrow_result.as_instruction_value().unwrap(),
+ Some(0),
+ );
+ let result = builder.build_int_z_extend(
+ narrow_result.into_int_value(),
+ intrinsics.i64_ty,
+ &state.var_name(),
+ );
+ state.push1_extra(result, ExtraInfo::arithmetic_f64());
}
Operator::I64Load16U { ref memarg } => {
let effective_address = resolve_memory_ptr(
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -4585,18 +5238,32 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
intrinsics.i16_ptr_ty,
2,
)?;
- let narrow_result = builder
- .build_load(effective_address, &state.var_name())
- .into_int_value();
- let result =
- builder.build_int_z_extend(narrow_result, intrinsics.i64_ty, &state.var_name());
- state.push1(result);
+ let narrow_result = builder.build_load(effective_address, &state.var_name());
+ narrow_result
+ .as_instruction_value()
+ .unwrap()
+ .set_alignment(1)
+ .unwrap();
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "memory",
+ narrow_result.as_instruction_value().unwrap(),
+ Some(0),
+ );
+ let result = builder.build_int_z_extend(
+ narrow_result.into_int_value(),
+ intrinsics.i64_ty,
+ &state.var_name(),
+ );
+ state.push1_extra(result, ExtraInfo::arithmetic_f64());
}
Operator::I64Load32U { ref memarg } => {
let effective_address = resolve_memory_ptr(
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -4604,12 +5271,25 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
intrinsics.i32_ptr_ty,
4,
)?;
- let narrow_result = builder
- .build_load(effective_address, &state.var_name())
- .into_int_value();
- let result =
- builder.build_int_z_extend(narrow_result, intrinsics.i64_ty, &state.var_name());
- state.push1(result);
+ let narrow_result = builder.build_load(effective_address, &state.var_name());
+ narrow_result
+ .as_instruction_value()
+ .unwrap()
+ .set_alignment(1)
+ .unwrap();
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "memory",
+ narrow_result.as_instruction_value().unwrap(),
+ Some(0),
+ );
+ let result = builder.build_int_z_extend(
+ narrow_result.into_int_value(),
+ intrinsics.i64_ty,
+ &state.var_name(),
+ );
+ state.push1_extra(result, ExtraInfo::arithmetic_f64());
}
Operator::I32Store8 { ref memarg } | Operator::I64Store8 { ref memarg } => {
@@ -4618,6 +5298,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -4627,7 +5308,9 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
)?;
let narrow_value =
builder.build_int_truncate(value, intrinsics.i8_ty, &state.var_name());
- builder.build_store(effective_address, narrow_value);
+ let store = builder.build_store(effective_address, narrow_value);
+ store.set_alignment(1).unwrap();
+ tbaa_label(&self.module, intrinsics, "memory", store, Some(0));
}
Operator::I32Store16 { ref memarg } | Operator::I64Store16 { ref memarg } => {
let value = state.pop1()?.into_int_value();
@@ -4635,6 +5318,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -4644,7 +5328,9 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
)?;
let narrow_value =
builder.build_int_truncate(value, intrinsics.i16_ty, &state.var_name());
- builder.build_store(effective_address, narrow_value);
+ let store = builder.build_store(effective_address, narrow_value);
+ store.set_alignment(1).unwrap();
+ tbaa_label(&self.module, intrinsics, "memory", store, Some(0));
}
Operator::I64Store32 { ref memarg } => {
let value = state.pop1()?.into_int_value();
@@ -4652,6 +5338,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -4661,46 +5348,41 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
)?;
let narrow_value =
builder.build_int_truncate(value, intrinsics.i32_ty, &state.var_name());
- builder.build_store(effective_address, narrow_value);
+ let store = builder.build_store(effective_address, narrow_value);
+ store.set_alignment(1).unwrap();
+ tbaa_label(&self.module, intrinsics, "memory", store, Some(0));
}
Operator::I8x16Neg => {
- let v = state.pop1()?.into_int_value();
- let v = builder
- .build_bitcast(v, intrinsics.i8x16_ty, "")
- .into_vector_value();
+ let (v, i) = state.pop1_extra()?;
+ let (v, _) = v128_into_i8x16(builder, intrinsics, v, i);
let res = builder.build_int_sub(v.get_type().const_zero(), v, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I16x8Neg => {
- let v = state.pop1()?.into_int_value();
- let v = builder
- .build_bitcast(v, intrinsics.i16x8_ty, "")
- .into_vector_value();
+ let (v, i) = state.pop1_extra()?;
+ let (v, _) = v128_into_i16x8(builder, intrinsics, v, i);
let res = builder.build_int_sub(v.get_type().const_zero(), v, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I32x4Neg => {
- let v = state.pop1()?.into_int_value();
- let v = builder
- .build_bitcast(v, intrinsics.i32x4_ty, "")
- .into_vector_value();
+ let (v, i) = state.pop1_extra()?;
+ let (v, _) = v128_into_i32x4(builder, intrinsics, v, i);
let res = builder.build_int_sub(v.get_type().const_zero(), v, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::I64x2Neg => {
- let v = state.pop1()?.into_int_value();
- let v = builder
- .build_bitcast(v, intrinsics.i64x2_ty, "")
- .into_vector_value();
+ let (v, i) = state.pop1_extra()?;
+ let (v, _) = v128_into_i64x2(builder, intrinsics, v, i);
let res = builder.build_int_sub(v.get_type().const_zero(), v, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
state.push1(res);
}
Operator::V128Not => {
- let v = state.pop1()?.into_int_value();
+ let (v, i) = state.pop1_extra()?;
+ let v = apply_pending_canonicalization(builder, intrinsics, v, i).into_int_value();
let res = builder.build_not(v, &state.var_name());
state.push1(res);
}
@@ -4708,6 +5390,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
| Operator::I16x8AnyTrue
| Operator::I32x4AnyTrue
| Operator::I64x2AnyTrue => {
+ // Skip canonicalization, it never changes non-zero values to zero or vice versa.
let v = state.pop1()?.into_int_value();
let res = builder.build_int_compare(
IntPredicate::NE,
@@ -4716,7 +5399,10 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
&state.var_name(),
);
let res = builder.build_int_z_extend(res, intrinsics.i32_ty, "");
- state.push1(res);
+ state.push1_extra(
+ res,
+ ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64(),
+ );
}
Operator::I8x16AllTrue
| Operator::I16x8AllTrue
@@ -4729,7 +5415,8 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
Operator::I64x2AllTrue => intrinsics.i64x2_ty,
_ => unreachable!(),
};
- let v = state.pop1()?.into_int_value();
+ let (v, i) = state.pop1_extra()?;
+ let v = apply_pending_canonicalization(builder, intrinsics, v, i).into_int_value();
let lane_int_ty = context.custom_width_int_type(vec_ty.get_size());
let vec = builder.build_bitcast(v, vec_ty, "vec").into_vector_value();
let mask =
@@ -4744,13 +5431,14 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
&state.var_name(),
);
let res = builder.build_int_z_extend(res, intrinsics.i32_ty, "");
- state.push1(res);
+ state.push1_extra(
+ res,
+ ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64(),
+ );
}
Operator::I8x16ExtractLaneS { lane } => {
- let v = state.pop1()?.into_int_value();
- let v = builder
- .build_bitcast(v, intrinsics.i8x16_ty, "")
- .into_vector_value();
+ let (v, i) = state.pop1_extra()?;
+ let (v, _) = v128_into_i8x16(builder, intrinsics, v, i);
let idx = intrinsics.i32_ty.const_int(lane.into(), false);
let res = builder
.build_extract_element(v, idx, &state.var_name())
@@ -4759,22 +5447,18 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I8x16ExtractLaneU { lane } => {
- let v = state.pop1()?.into_int_value();
- let v = builder
- .build_bitcast(v, intrinsics.i8x16_ty, "")
- .into_vector_value();
+ let (v, i) = state.pop1_extra()?;
+ let (v, _) = v128_into_i8x16(builder, intrinsics, v, i);
let idx = intrinsics.i32_ty.const_int(lane.into(), false);
let res = builder
.build_extract_element(v, idx, &state.var_name())
.into_int_value();
let res = builder.build_int_z_extend(res, intrinsics.i32_ty, "");
- state.push1(res);
+ state.push1_extra(res, ExtraInfo::arithmetic_f32());
}
Operator::I16x8ExtractLaneS { lane } => {
- let v = state.pop1()?.into_int_value();
- let v = builder
- .build_bitcast(v, intrinsics.i16x8_ty, "")
- .into_vector_value();
+ let (v, i) = state.pop1_extra()?;
+ let (v, _) = v128_into_i16x8(builder, intrinsics, v, i);
let idx = intrinsics.i32_ty.const_int(lane.into(), false);
let res = builder
.build_extract_element(v, idx, &state.var_name())
@@ -4783,58 +5467,46 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I16x8ExtractLaneU { lane } => {
- let v = state.pop1()?.into_int_value();
- let v = builder
- .build_bitcast(v, intrinsics.i16x8_ty, "")
- .into_vector_value();
+ let (v, i) = state.pop1_extra()?;
+ let (v, _) = v128_into_i16x8(builder, intrinsics, v, i);
let idx = intrinsics.i32_ty.const_int(lane.into(), false);
let res = builder
.build_extract_element(v, idx, &state.var_name())
.into_int_value();
let res = builder.build_int_z_extend(res, intrinsics.i32_ty, "");
- state.push1(res);
+ state.push1_extra(res, ExtraInfo::arithmetic_f32());
}
Operator::I32x4ExtractLane { lane } => {
- let v = state.pop1()?.into_int_value();
- let v = builder
- .build_bitcast(v, intrinsics.i32x4_ty, "")
- .into_vector_value();
+ let (v, i) = state.pop1_extra()?;
+ let (v, i) = v128_into_i32x4(builder, intrinsics, v, i);
let idx = intrinsics.i32_ty.const_int(lane.into(), false);
let res = builder.build_extract_element(v, idx, &state.var_name());
- state.push1(res);
+ state.push1_extra(res, i);
}
Operator::I64x2ExtractLane { lane } => {
- let v = state.pop1()?.into_int_value();
- let v = builder
- .build_bitcast(v, intrinsics.i64x2_ty, "")
- .into_vector_value();
+ let (v, i) = state.pop1_extra()?;
+ let (v, i) = v128_into_i64x2(builder, intrinsics, v, i);
let idx = intrinsics.i32_ty.const_int(lane.into(), false);
let res = builder.build_extract_element(v, idx, &state.var_name());
- state.push1(res);
+ state.push1_extra(res, i);
}
Operator::F32x4ExtractLane { lane } => {
- let v = state.pop1()?.into_int_value();
- let v = builder
- .build_bitcast(v, intrinsics.f32x4_ty, "")
- .into_vector_value();
+ let (v, i) = state.pop1_extra()?;
+ let (v, i) = v128_into_f32x4(builder, intrinsics, v, i);
let idx = intrinsics.i32_ty.const_int(lane.into(), false);
let res = builder.build_extract_element(v, idx, &state.var_name());
- state.push1(res);
+ state.push1_extra(res, i);
}
Operator::F64x2ExtractLane { lane } => {
- let v = state.pop1()?.into_int_value();
- let v = builder
- .build_bitcast(v, intrinsics.f64x2_ty, "")
- .into_vector_value();
+ let (v, i) = state.pop1_extra()?;
+ let (v, i) = v128_into_f64x2(builder, intrinsics, v, i);
let idx = intrinsics.i32_ty.const_int(lane.into(), false);
let res = builder.build_extract_element(v, idx, &state.var_name());
- state.push1(res);
+ state.push1_extra(res, i);
}
Operator::I8x16ReplaceLane { lane } => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i8x16_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, _)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i8x16(builder, intrinsics, v1, i1);
let v2 = v2.into_int_value();
let v2 = builder.build_int_cast(v2, intrinsics.i8_ty, "");
let idx = intrinsics.i32_ty.const_int(lane.into(), false);
@@ -4843,10 +5515,8 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I16x8ReplaceLane { lane } => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i16x8_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, _)) = state.pop2_extra()?;
+ let (v1, _) = v128_into_i16x8(builder, intrinsics, v1, i1);
let v2 = v2.into_int_value();
let v2 = builder.build_int_cast(v2, intrinsics.i16_ty, "");
let idx = intrinsics.i32_ty.const_int(lane.into(), false);
@@ -4855,54 +5525,104 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::I32x4ReplaceLane { lane } => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i32x4_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, i1) = v128_into_i32x4(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let v2 = v2.into_int_value();
+ let i2 = i2.strip_pending();
let idx = intrinsics.i32_ty.const_int(lane.into(), false);
let res = builder.build_insert_element(v1, v2, idx, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
- state.push1(res);
+ state.push1_extra(res, i1 & i2 & ExtraInfo::arithmetic_f32());
}
Operator::I64x2ReplaceLane { lane } => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.i64x2_ty, "")
- .into_vector_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, i1) = v128_into_i64x2(builder, intrinsics, v1, i1);
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let v2 = v2.into_int_value();
+ let i2 = i2.strip_pending();
let idx = intrinsics.i32_ty.const_int(lane.into(), false);
let res = builder.build_insert_element(v1, v2, idx, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
- state.push1(res);
+ state.push1_extra(res, i1 & i2 & ExtraInfo::arithmetic_f64());
}
Operator::F32x4ReplaceLane { lane } => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.f32x4_ty, "")
- .into_vector_value();
- let v2 = v2.into_float_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, i1) = v128_into_f32x4(builder, intrinsics, v1, i1);
+ let push_pending_f32_nan_to_result =
+ i1.has_pending_f32_nan() && i2.has_pending_f32_nan();
+ let (v1, v2) = if !push_pending_f32_nan_to_result {
+ (
+ apply_pending_canonicalization(
+ builder,
+ intrinsics,
+ v1.as_basic_value_enum(),
+ i1,
+ )
+ .into_vector_value(),
+ apply_pending_canonicalization(
+ builder,
+ intrinsics,
+ v2.as_basic_value_enum(),
+ i2,
+ )
+ .into_float_value(),
+ )
+ } else {
+ (v1, v2.into_float_value())
+ };
let idx = intrinsics.i32_ty.const_int(lane.into(), false);
let res = builder.build_insert_element(v1, v2, idx, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
- state.push1(res);
+ let info = if push_pending_f32_nan_to_result {
+ ExtraInfo::pending_f32_nan()
+ } else {
+ i1.strip_pending() & i2.strip_pending()
+ };
+ state.push1_extra(res, info);
}
Operator::F64x2ReplaceLane { lane } => {
- let (v1, v2) = state.pop2()?;
- let v1 = builder
- .build_bitcast(v1, intrinsics.f64x2_ty, "")
- .into_vector_value();
- let v2 = v2.into_float_value();
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let (v1, i1) = v128_into_f64x2(builder, intrinsics, v1, i1);
+ let push_pending_f64_nan_to_result =
+ i1.has_pending_f64_nan() && i2.has_pending_f64_nan();
+ let (v1, v2) = if !push_pending_f64_nan_to_result {
+ (
+ apply_pending_canonicalization(
+ builder,
+ intrinsics,
+ v1.as_basic_value_enum(),
+ i1,
+ )
+ .into_vector_value(),
+ apply_pending_canonicalization(
+ builder,
+ intrinsics,
+ v2.as_basic_value_enum(),
+ i2,
+ )
+ .into_float_value(),
+ )
+ } else {
+ (v1, v2.into_float_value())
+ };
let idx = intrinsics.i32_ty.const_int(lane.into(), false);
let res = builder.build_insert_element(v1, v2, idx, &state.var_name());
let res = builder.build_bitcast(res, intrinsics.i128_ty, "");
- state.push1(res);
+ let info = if push_pending_f64_nan_to_result {
+ ExtraInfo::pending_f64_nan()
+ } else {
+ i1.strip_pending() & i2.strip_pending()
+ };
+ state.push1_extra(res, info);
}
Operator::V8x16Swizzle => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
let v1 = builder
.build_bitcast(v1, intrinsics.i8x16_ty, "")
.into_vector_value();
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let v2 = builder
.build_bitcast(v2, intrinsics.i8x16_ty, "")
.into_vector_value();
@@ -4960,10 +5680,12 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
state.push1(res);
}
Operator::V8x16Shuffle { lanes } => {
- let (v1, v2) = state.pop2()?;
+ let ((v1, i1), (v2, i2)) = state.pop2_extra()?;
+ let v1 = apply_pending_canonicalization(builder, intrinsics, v1, i1);
let v1 = builder
.build_bitcast(v1, intrinsics.i8x16_ty, "")
.into_vector_value();
+ let v2 = apply_pending_canonicalization(builder, intrinsics, v2, i2);
let v2 = builder
.build_bitcast(v2, intrinsics.i8x16_ty, "")
.into_vector_value();
@@ -4983,6 +5705,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -4990,11 +5713,22 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
intrinsics.i8_ptr_ty,
1,
)?;
- let elem = builder.build_load(effective_address, "").into_int_value();
+ let elem = builder.build_load(effective_address, "");
+ elem.as_instruction_value()
+ .unwrap()
+ .set_alignment(1)
+ .unwrap();
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "memory",
+ elem.as_instruction_value().unwrap(),
+ Some(0),
+ );
let res = splat_vector(
builder,
intrinsics,
- elem.as_basic_value_enum(),
+ elem,
intrinsics.i8x16_ty,
&state.var_name(),
);
@@ -5006,6 +5740,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -5013,11 +5748,22 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
intrinsics.i16_ptr_ty,
2,
)?;
- let elem = builder.build_load(effective_address, "").into_int_value();
+ let elem = builder.build_load(effective_address, "");
+ elem.as_instruction_value()
+ .unwrap()
+ .set_alignment(1)
+ .unwrap();
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "memory",
+ elem.as_instruction_value().unwrap(),
+ Some(0),
+ );
let res = splat_vector(
builder,
intrinsics,
- elem.as_basic_value_enum(),
+ elem,
intrinsics.i16x8_ty,
&state.var_name(),
);
@@ -5029,6 +5775,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -5036,11 +5783,22 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
intrinsics.i32_ptr_ty,
4,
)?;
- let elem = builder.build_load(effective_address, "").into_int_value();
+ let elem = builder.build_load(effective_address, "");
+ elem.as_instruction_value()
+ .unwrap()
+ .set_alignment(1)
+ .unwrap();
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "memory",
+ elem.as_instruction_value().unwrap(),
+ Some(0),
+ );
let res = splat_vector(
builder,
intrinsics,
- elem.as_basic_value_enum(),
+ elem,
intrinsics.i32x4_ty,
&state.var_name(),
);
@@ -5052,6 +5810,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -5059,11 +5818,22 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
intrinsics.i64_ptr_ty,
8,
)?;
- let elem = builder.build_load(effective_address, "").into_int_value();
+ let elem = builder.build_load(effective_address, "");
+ elem.as_instruction_value()
+ .unwrap()
+ .set_alignment(1)
+ .unwrap();
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "memory",
+ elem.as_instruction_value().unwrap(),
+ Some(0),
+ );
let res = splat_vector(
builder,
intrinsics,
- elem.as_basic_value_enum(),
+ elem,
intrinsics.i64x2_ty,
&state.var_name(),
);
@@ -5084,6 +5854,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -5104,6 +5875,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
load.set_alignment(4).unwrap();
load.set_atomic_ordering(AtomicOrdering::SequentiallyConsistent)
.unwrap();
+ tbaa_label(&self.module, intrinsics, "memory", load, Some(0));
state.push1(result);
}
Operator::I64AtomicLoad { ref memarg } => {
@@ -5111,6 +5883,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -5131,6 +5904,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
load.set_alignment(8).unwrap();
load.set_atomic_ordering(AtomicOrdering::SequentiallyConsistent)
.unwrap();
+ tbaa_label(&self.module, intrinsics, "memory", load, Some(0));
state.push1(result);
}
Operator::I32AtomicLoad8U { ref memarg } => {
@@ -5138,6 +5912,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -5160,15 +5935,17 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
load.set_alignment(1).unwrap();
load.set_atomic_ordering(AtomicOrdering::SequentiallyConsistent)
.unwrap();
+ tbaa_label(&self.module, intrinsics, "memory", load, Some(0));
let result =
builder.build_int_z_extend(narrow_result, intrinsics.i32_ty, &state.var_name());
- state.push1(result);
+ state.push1_extra(result, ExtraInfo::arithmetic_f32());
}
Operator::I32AtomicLoad16U { ref memarg } => {
let effective_address = resolve_memory_ptr(
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -5191,15 +5968,17 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
load.set_alignment(2).unwrap();
load.set_atomic_ordering(AtomicOrdering::SequentiallyConsistent)
.unwrap();
+ tbaa_label(&self.module, intrinsics, "memory", load, Some(0));
let result =
builder.build_int_z_extend(narrow_result, intrinsics.i32_ty, &state.var_name());
- state.push1(result);
+ state.push1_extra(result, ExtraInfo::arithmetic_f32());
}
Operator::I64AtomicLoad8U { ref memarg } => {
let effective_address = resolve_memory_ptr(
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -5222,15 +6001,17 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
load.set_alignment(1).unwrap();
load.set_atomic_ordering(AtomicOrdering::SequentiallyConsistent)
.unwrap();
+ tbaa_label(&self.module, intrinsics, "memory", load, Some(0));
let result =
builder.build_int_z_extend(narrow_result, intrinsics.i64_ty, &state.var_name());
- state.push1(result);
+ state.push1_extra(result, ExtraInfo::arithmetic_f64());
}
Operator::I64AtomicLoad16U { ref memarg } => {
let effective_address = resolve_memory_ptr(
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -5253,15 +6034,17 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
load.set_alignment(2).unwrap();
load.set_atomic_ordering(AtomicOrdering::SequentiallyConsistent)
.unwrap();
+ tbaa_label(&self.module, intrinsics, "memory", load, Some(0));
let result =
builder.build_int_z_extend(narrow_result, intrinsics.i64_ty, &state.var_name());
- state.push1(result);
+ state.push1_extra(result, ExtraInfo::arithmetic_f64());
}
Operator::I64AtomicLoad32U { ref memarg } => {
let effective_address = resolve_memory_ptr(
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -5284,9 +6067,10 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
load.set_alignment(4).unwrap();
load.set_atomic_ordering(AtomicOrdering::SequentiallyConsistent)
.unwrap();
+ tbaa_label(&self.module, intrinsics, "memory", load, Some(0));
let result =
builder.build_int_z_extend(narrow_result, intrinsics.i64_ty, &state.var_name());
- state.push1(result);
+ state.push1_extra(result, ExtraInfo::arithmetic_f64());
}
Operator::I32AtomicStore { ref memarg } => {
let value = state.pop1()?;
@@ -5294,6 +6078,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -5314,6 +6099,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
store
.set_atomic_ordering(AtomicOrdering::SequentiallyConsistent)
.unwrap();
+ tbaa_label(&self.module, intrinsics, "memory", store, Some(0));
}
Operator::I64AtomicStore { ref memarg } => {
let value = state.pop1()?;
@@ -5321,6 +6107,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -5341,6 +6128,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
store
.set_atomic_ordering(AtomicOrdering::SequentiallyConsistent)
.unwrap();
+ tbaa_label(&self.module, intrinsics, "memory", store, Some(0));
}
Operator::I32AtomicStore8 { ref memarg } | Operator::I64AtomicStore8 { ref memarg } => {
let value = state.pop1()?.into_int_value();
@@ -5348,6 +6136,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -5370,6 +6159,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
store
.set_atomic_ordering(AtomicOrdering::SequentiallyConsistent)
.unwrap();
+ tbaa_label(&self.module, intrinsics, "memory", store, Some(0));
}
Operator::I32AtomicStore16 { ref memarg }
| Operator::I64AtomicStore16 { ref memarg } => {
@@ -5378,6 +6168,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -5400,6 +6191,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
store
.set_atomic_ordering(AtomicOrdering::SequentiallyConsistent)
.unwrap();
+ tbaa_label(&self.module, intrinsics, "memory", store, Some(0));
}
Operator::I64AtomicStore32 { ref memarg } => {
let value = state.pop1()?.into_int_value();
@@ -5407,6 +6199,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -5429,6 +6222,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
store
.set_atomic_ordering(AtomicOrdering::SequentiallyConsistent)
.unwrap();
+ tbaa_label(&self.module, intrinsics, "memory", store, Some(0));
}
Operator::I32AtomicRmw8UAdd { ref memarg } => {
let value = state.pop1()?.into_int_value();
@@ -5436,6 +6230,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -5461,8 +6256,15 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
AtomicOrdering::SequentiallyConsistent,
)
.unwrap();
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "memory",
+ old.as_instruction_value().unwrap(),
+ Some(0),
+ );
let old = builder.build_int_z_extend(old, intrinsics.i32_ty, &state.var_name());
- state.push1(old);
+ state.push1_extra(old, ExtraInfo::arithmetic_f32());
}
Operator::I32AtomicRmw16UAdd { ref memarg } => {
let value = state.pop1()?.into_int_value();
@@ -5470,6 +6272,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -5495,8 +6298,15 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
AtomicOrdering::SequentiallyConsistent,
)
.unwrap();
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "memory",
+ old.as_instruction_value().unwrap(),
+ Some(0),
+ );
let old = builder.build_int_z_extend(old, intrinsics.i32_ty, &state.var_name());
- state.push1(old);
+ state.push1_extra(old, ExtraInfo::arithmetic_f32());
}
Operator::I32AtomicRmwAdd { ref memarg } => {
let value = state.pop1()?.into_int_value();
@@ -5504,6 +6314,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -5527,6 +6338,13 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
AtomicOrdering::SequentiallyConsistent,
)
.unwrap();
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "memory",
+ old.as_instruction_value().unwrap(),
+ Some(0),
+ );
state.push1(old);
}
Operator::I64AtomicRmw8UAdd { ref memarg } => {
@@ -5535,6 +6353,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -5560,8 +6379,15 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
AtomicOrdering::SequentiallyConsistent,
)
.unwrap();
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "memory",
+ old.as_instruction_value().unwrap(),
+ Some(0),
+ );
let old = builder.build_int_z_extend(old, intrinsics.i64_ty, &state.var_name());
- state.push1(old);
+ state.push1_extra(old, ExtraInfo::arithmetic_f64());
}
Operator::I64AtomicRmw16UAdd { ref memarg } => {
let value = state.pop1()?.into_int_value();
@@ -5569,6 +6395,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -5594,8 +6421,15 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
AtomicOrdering::SequentiallyConsistent,
)
.unwrap();
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "memory",
+ old.as_instruction_value().unwrap(),
+ Some(0),
+ );
let old = builder.build_int_z_extend(old, intrinsics.i64_ty, &state.var_name());
- state.push1(old);
+ state.push1_extra(old, ExtraInfo::arithmetic_f64());
}
Operator::I64AtomicRmw32UAdd { ref memarg } => {
let value = state.pop1()?.into_int_value();
@@ -5603,6 +6437,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -5628,8 +6463,15 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
AtomicOrdering::SequentiallyConsistent,
)
.unwrap();
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "memory",
+ old.as_instruction_value().unwrap(),
+ Some(0),
+ );
let old = builder.build_int_z_extend(old, intrinsics.i64_ty, &state.var_name());
- state.push1(old);
+ state.push1_extra(old, ExtraInfo::arithmetic_f64());
}
Operator::I64AtomicRmwAdd { ref memarg } => {
let value = state.pop1()?.into_int_value();
@@ -5637,6 +6479,7 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
builder,
intrinsics,
context,
+ self.module.clone(),
&function,
&mut state,
&mut ctx,
@@ -5660,6 +6503,13 @@ impl FunctionCodeGenerator for LLVMFunctionCodeGenerator {
AtomicOrdering::SequentiallyConsistent,
)
.unwrap();
+ tbaa_label(
+ &self.module,
+ intrinsics,
+ "memory",
+ old.as_instruction_value().unwrap(),
+ Some(0),
+ );
state.push1(old);
}
Operator::I32AtomicRmw8USub { ref memarg } => {
@@ -5668,6 +6518,7 @@ impl FunctionCodeGenerator