Repository: bytecodealliance/wasmtime
Pull request #2357 (2020-11-03 23:12:33)

cranelift: refactor unwind logic to accommodate multiple backends  
Prepares code for #2313

* Make cranelift_codegen::isa::unwind::input public
* Move `UnwindCode`'s common `offset` field out of the structure
* Make `MachCompileResult::unwind_info` more generic
* Record initial stack pointer offset (as in CIE)

The changes allows furthe introduction of fastcall logic and support of ARM-like architectures.



Patch:
diff --git a/Cargo.lock b/Cargo.lock
index 24c4b1eb5..b83f6bb1a 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2,9 +2,9 @@
 # It is not intended for manual editing.
 [[package]]
 name = "addr2line"
-version = "0.13.0"
+version = "0.14.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b6a2d3371669ab3ca9797670853d61402b03d0b4b9ebf33d677dfa720203072"
+checksum = "7c0929d69e78dd9bf5408269919fcbcaeb2e35e5d43e5815517cdc6a8e11a423"
 dependencies = [
  "gimli",
 ]
@@ -23,9 +23,9 @@ checksum = "f6789e291be47ace86a60303502173d84af8327e3627ecf334356ee0f87a164c"
 
 [[package]]
 name = "aho-corasick"
-version = "0.7.13"
+version = "0.7.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "043164d8ba5c4c3035fec9bbee8647c0261d788f3474306f93bb65901cae0e86"
+checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5"
 dependencies = [
  "memchr",
 ]
@@ -39,17 +39,26 @@ dependencies = [
  "winapi",
 ]
 
+[[package]]
+name = "ansi_term"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
+dependencies = [
+ "winapi",
+]
+
 [[package]]
 name = "anyhow"
-version = "1.0.32"
+version = "1.0.34"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6b602bfe940d21c130f3895acd65221e8a61270debe89d628b9cb4e3ccb8569b"
+checksum = "bf8dcb5b4bbaa28653b647d8c77bd4ed40183b48882e130c1f1ffb73de069fd7"
 
 [[package]]
 name = "arbitrary"
-version = "0.4.6"
+version = "0.4.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0922a3e746b5a44e111e5603feb6704e5cc959116f66737f50bb5cbd264e9d87"
+checksum = "db55d72333851e17d572bec876e390cd3b11eb1ef53ae821dd9f3b653d2b4569"
 dependencies = [
  "derive_arbitrary",
 ]
@@ -62,9 +71,9 @@ checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544"
 
 [[package]]
 name = "arrayvec"
-version = "0.5.1"
+version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8"
+checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
 
 [[package]]
 name = "atty"
@@ -79,41 +88,35 @@ dependencies = [
 
 [[package]]
 name = "autocfg"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2"
-
-[[package]]
-name = "autocfg"
-version = "1.0.0"
+version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d"
+checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
 
 [[package]]
 name = "backtrace"
-version = "0.3.50"
+version = "0.3.54"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46254cf2fdcdf1badb5934448c1bcbe046a56537b3987d96c51a7afc5d03f293"
+checksum = "2baad346b2d4e94a24347adeee9c7a93f412ee94b9cc26e5b59dea23848e9f28"
 dependencies = [
  "addr2line",
- "cfg-if 0.1.10",
+ "cfg-if 1.0.0",
  "libc",
  "miniz_oxide",
- "object 0.20.0",
+ "object",
  "rustc-demangle",
 ]
 
 [[package]]
 name = "base64"
-version = "0.11.0"
+version = "0.12.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7"
+checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff"
 
 [[package]]
 name = "base64"
-version = "0.12.3"
+version = "0.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff"
+checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
 
 [[package]]
 name = "bincode"
@@ -148,9 +151,9 @@ checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
 
 [[package]]
 name = "blake2b_simd"
-version = "0.5.10"
+version = "0.5.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8fb2d74254a3a0b5cac33ac9f8ed0e44aa50378d9dbb2e5d83bd21ed1dc2c8a"
+checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587"
 dependencies = [
  "arrayref",
  "arrayvec",
@@ -159,37 +162,19 @@ dependencies = [
 
 [[package]]
 name = "block-buffer"
-version = "0.7.3"
+version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b"
+checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
 dependencies = [
- "block-padding",
- "byte-tools",
- "byteorder",
  "generic-array",
 ]
 
-[[package]]
-name = "block-padding"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5"
-dependencies = [
- "byte-tools",
-]
-
 [[package]]
 name = "bumpalo"
 version = "3.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820"
 
-[[package]]
-name = "byte-tools"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7"
-
 [[package]]
 name = "byteorder"
 version = "1.3.4"
@@ -216,9 +201,9 @@ dependencies = [
 
 [[package]]
 name = "cc"
-version = "1.0.58"
+version = "1.0.61"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f9a06fb2e53271d7c279ec1efea6ab691c35a2ae67ec0d91d7acec0caf13b518"
+checksum = "ed67cbde08356238e75fc4656be4749481eeffb09e19f320a25237d5221c985d"
 dependencies = [
  "jobserver",
 ]
@@ -237,22 +222,24 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
 [[package]]
 name = "chrono"
-version = "0.4.13"
+version = "0.4.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c74d84029116787153e02106bf53e66828452a4b325cc8652b788b5967c0a0b6"
+checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73"
 dependencies = [
+ "libc",
  "num-integer",
  "num-traits",
  "time",
+ "winapi",
 ]
 
 [[package]]
 name = "clap"
-version = "2.33.1"
+version = "2.33.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bdfa80d47f954d53a35a64987ca1422f495b8d6483c0fe9f7117b36c2a792129"
+checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002"
 dependencies = [
- "ansi_term",
+ "ansi_term 0.11.0",
  "atty",
  "bitflags",
  "strsim",
@@ -261,15 +248,6 @@ dependencies = [
  "vec_map",
 ]
 
-[[package]]
-name = "cloudabi"
-version = "0.0.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
-dependencies = [
- "bitflags",
-]
-
 [[package]]
 name = "cmake"
 version = "0.1.44"
@@ -281,21 +259,26 @@ dependencies = [
 
 [[package]]
 name = "console"
-version = "0.11.3"
+version = "0.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c0994e656bba7b922d8dd1245db90672ffb701e684e45be58f20719d69abc5a"
+checksum = "a50aab2529019abfabfa93f1e6c41ef392f91fbf179b347a7e96abb524884a08"
 dependencies = [
  "encode_unicode",
  "lazy_static",
  "libc",
  "regex",
  "terminal_size",
- "termios",
  "unicode-width",
  "winapi",
  "winapi-util",
 ]
 
+[[package]]
+name = "const_fn"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c478836e029dcef17fb47c89023448c64f781a046e0300e257ad8225ae59afab"
+
 [[package]]
 name = "constant_time_eq"
 version = "0.1.5"
@@ -312,9 +295,15 @@ dependencies = [
  "winapi",
 ]
 
+[[package]]
+name = "cpuid-bool"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634"
+
 [[package]]
 name = "cranelift"
-version = "0.67.0"
+version = "0.68.0"
 dependencies = [
  "cranelift-codegen",
  "cranelift-frontend",
@@ -322,14 +311,14 @@ dependencies = [
 
 [[package]]
 name = "cranelift-bforest"
-version = "0.67.0"
+version = "0.68.0"
 dependencies = [
  "cranelift-entity",
 ]
 
 [[package]]
 name = "cranelift-codegen"
-version = "0.67.0"
+version = "0.68.0"
 dependencies = [
  "bincode",
  "byteorder",
@@ -354,7 +343,7 @@ dependencies = [
 
 [[package]]
 name = "cranelift-codegen-meta"
-version = "0.67.0"
+version = "0.68.0"
 dependencies = [
  "cranelift-codegen-shared",
  "cranelift-entity",
@@ -362,11 +351,11 @@ dependencies = [
 
 [[package]]
 name = "cranelift-codegen-shared"
-version = "0.67.0"
+version = "0.68.0"
 
 [[package]]
 name = "cranelift-entity"
-version = "0.67.0"
+version = "0.68.0"
 dependencies = [
  "serde",
 ]
@@ -395,7 +384,7 @@ dependencies = [
 
 [[package]]
 name = "cranelift-frontend"
-version = "0.67.0"
+version = "0.68.0"
 dependencies = [
  "cranelift-codegen",
  "hashbrown",
@@ -406,7 +395,7 @@ dependencies = [
 
 [[package]]
 name = "cranelift-interpreter"
-version = "0.67.0"
+version = "0.68.0"
 dependencies = [
  "cranelift-codegen",
  "cranelift-entity",
@@ -419,7 +408,7 @@ dependencies = [
 
 [[package]]
 name = "cranelift-module"
-version = "0.67.0"
+version = "0.68.0"
 dependencies = [
  "anyhow",
  "cranelift-codegen",
@@ -431,7 +420,7 @@ dependencies = [
 
 [[package]]
 name = "cranelift-native"
-version = "0.67.0"
+version = "0.68.0"
 dependencies = [
  "cranelift-codegen",
  "raw-cpuid",
@@ -440,19 +429,19 @@ dependencies = [
 
 [[package]]
 name = "cranelift-object"
-version = "0.67.0"
+version = "0.68.0"
 dependencies = [
  "anyhow",
  "cranelift-codegen",
  "cranelift-module",
  "log",
- "object 0.21.1",
+ "object",
  "target-lexicon",
 ]
 
 [[package]]
 name = "cranelift-preopt"
-version = "0.67.0"
+version = "0.68.0"
 dependencies = [
  "cranelift-codegen",
  "cranelift-entity",
@@ -460,7 +449,7 @@ dependencies = [
 
 [[package]]
 name = "cranelift-reader"
-version = "0.67.0"
+version = "0.68.0"
 dependencies = [
  "cranelift-codegen",
  "smallvec",
@@ -470,7 +459,7 @@ dependencies = [
 
 [[package]]
 name = "cranelift-serde"
-version = "0.67.0"
+version = "0.68.0"
 dependencies = [
  "clap",
  "cranelift-codegen",
@@ -482,7 +471,7 @@ dependencies = [
 
 [[package]]
 name = "cranelift-simplejit"
-version = "0.67.0"
+version = "0.68.0"
 dependencies = [
  "cranelift",
  "cranelift-codegen",
@@ -537,13 +526,13 @@ dependencies = [
 
 [[package]]
 name = "cranelift-wasm"
-version = "0.67.0"
+version = "0.68.0"
 dependencies = [
  "cranelift-codegen",
  "cranelift-entity",
  "cranelift-frontend",
  "hashbrown",
- "itertools 0.9.0",
+ "itertools",
  "log",
  "serde",
  "smallvec",
@@ -555,58 +544,68 @@ dependencies = [
 
 [[package]]
 name = "crc32fast"
-version = "1.2.0"
+version = "1.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1"
+checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a"
 dependencies = [
- "cfg-if 0.1.10",
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775"
+dependencies = [
+ "cfg-if 1.0.0",
+ "crossbeam-utils 0.8.0",
 ]
 
 [[package]]
 name = "crossbeam-deque"
-version = "0.7.3"
+version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285"
+checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9"
 dependencies = [
+ "cfg-if 1.0.0",
  "crossbeam-epoch",
- "crossbeam-utils",
- "maybe-uninit",
+ "crossbeam-utils 0.8.0",
 ]
 
 [[package]]
 name = "crossbeam-epoch"
-version = "0.8.2"
+version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace"
+checksum = "ec0f606a85340376eef0d6d8fec399e6d4a544d648386c6645eb6d0653b27d9f"
 dependencies = [
- "autocfg 1.0.0",
- "cfg-if 0.1.10",
- "crossbeam-utils",
+ "cfg-if 1.0.0",
+ "const_fn",
+ "crossbeam-utils 0.8.0",
  "lazy_static",
- "maybe-uninit",
- "memoffset",
+ "memoffset 0.5.6",
  "scopeguard",
 ]
 
 [[package]]
-name = "crossbeam-queue"
-version = "0.2.3"
+name = "crossbeam-utils"
+version = "0.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570"
+checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
 dependencies = [
+ "autocfg",
  "cfg-if 0.1.10",
- "crossbeam-utils",
- "maybe-uninit",
+ "lazy_static",
 ]
 
 [[package]]
 name = "crossbeam-utils"
-version = "0.7.2"
+version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
+checksum = "ec91540d98355f690a86367e566ecad2e9e579f230230eb7c21398372be73ea5"
 dependencies = [
- "autocfg 1.0.0",
- "cfg-if 0.1.10",
+ "autocfg",
+ "cfg-if 1.0.0",
+ "const_fn",
  "lazy_static",
 ]
 
@@ -621,9 +620,9 @@ dependencies = [
 
 [[package]]
 name = "derive_arbitrary"
-version = "0.4.6"
+version = "0.4.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0f7c6c81276b6b8702074defbdb1938933ddf98c7f7e0dca8d9e9214dd6c730"
+checksum = "b1a012b5e473dc912f0db0546a1c9c6a194ce8494feb66fa0237160926f9e0e6"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -632,9 +631,9 @@ dependencies = [
 
 [[package]]
 name = "derive_more"
-version = "0.99.9"
+version = "0.99.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "298998b1cf6b5b2c8a7b023dfd45821825ce3ba8a8af55c921a0e734e4653f76"
+checksum = "41cb0e6161ad61ed084a36ba71fbba9e3ac5aee3606fb607fe08da6acbcf3d8c"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -660,18 +659,18 @@ checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499"
 
 [[package]]
 name = "digest"
-version = "0.8.1"
+version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5"
+checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
 dependencies = [
  "generic-array",
 ]
 
 [[package]]
 name = "directories-next"
-version = "1.0.2"
+version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e99a2917b211508b8c64dac237f316bc4d71b4b818521f4ee60ab38d1ea28081"
+checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc"
 dependencies = [
  "cfg-if 1.0.0",
  "dirs-sys-next",
@@ -736,9 +735,9 @@ dependencies = [
 
 [[package]]
 name = "either"
-version = "1.5.3"
+version = "1.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3"
+checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
 
 [[package]]
 name = "encode_unicode"
@@ -753,7 +752,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36"
 dependencies = [
  "atty",
- "humantime",
+ "humantime 1.3.0",
+ "log",
+ "regex",
+ "termcolor",
+]
+
+[[package]]
+name = "env_logger"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54532e3223c5af90a6a757c90b5c5521564b07e5e7a958681bcd2afad421cdcd"
+dependencies = [
+ "atty",
+ "humantime 2.0.1",
  "log",
  "regex",
  "termcolor",
@@ -761,9 +773,9 @@ dependencies = [
 
 [[package]]
 name = "errno"
-version = "0.2.5"
+version = "0.2.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b480f641ccf0faf324e20c1d3e53d81b7484c698b42ea677f6907ae4db195371"
+checksum = "fa68f2fb9cae9d37c9b2b3584aba698a2e97f72d7aef7b9f7aa71d8b54ce46fe"
 dependencies = [
  "errno-dragonfly",
  "libc",
@@ -792,12 +804,6 @@ version = "0.0.0"
 name = "example-wasi-wasm"
 version = "0.0.0"
 
-[[package]]
-name = "fake-simd"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
-
 [[package]]
 name = "fallible-iterator"
 version = "0.2.0"
@@ -806,11 +812,11 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7"
 
 [[package]]
 name = "file-per-thread-logger"
-version = "0.1.3"
+version = "0.1.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b3937f028664bd0e13df401ba49a4567ccda587420365823242977f06609ed1"
+checksum = "4fdbe0d94371f9ce939b555dd342d0686cc4c0cadbcd4b61d70af5ff97eb4126"
 dependencies = [
- "env_logger",
+ "env_logger 0.7.1",
  "log",
 ]
 
@@ -826,11 +832,11 @@ dependencies = [
 
 [[package]]
 name = "filetime"
-version = "0.2.10"
+version = "0.2.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "affc17579b132fc2461adf7c575cc6e8b134ebca52c51f5411388965227dc695"
+checksum = "0c122a393ea57648015bf06fbd3d372378992e86b9ff5a7a497b076a28c79efe"
 dependencies = [
- "cfg-if 0.1.10",
+ "cfg-if 1.0.0",
  "libc",
  "redox_syscall",
  "winapi",
@@ -844,15 +850,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
 
 [[package]]
 name = "fst"
-version = "0.4.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7293de202dbfe786c0b3fe6110a027836c5438ed06db7b715c9955ff4bfea51"
-
-[[package]]
-name = "fuchsia-cprng"
-version = "0.1.1"
+version = "0.4.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
+checksum = "d79238883cf0307100b90aba4a755d8051a3182305dfe7f649a1e9dc0517006f"
 
 [[package]]
 name = "gcc"
@@ -860,31 +860,56 @@ version = "0.3.55"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2"
 
+[[package]]
+name = "generator"
+version = "0.6.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8cdc09201b2e8ca1b19290cf7e65de2246b8e91fb6874279722189c4de7b94dc"
+dependencies = [
+ "cc",
+ "libc",
+ "log",
+ "rustc_version",
+ "winapi",
+]
+
 [[package]]
 name = "generic-array"
-version = "0.12.3"
+version = "0.14.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec"
+checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817"
 dependencies = [
  "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.1.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6"
+dependencies = [
+ "cfg-if 0.1.10",
+ "libc",
+ "wasi 0.9.0+wasi-snapshot-preview1",
 ]
 
 [[package]]
 name = "getrandom"
-version = "0.1.14"
+version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb"
+checksum = "ee8025cf36f917e6a52cce185b7c7177689b838b7ec138364e50cc2277a56cf4"
 dependencies = [
  "cfg-if 0.1.10",
  "libc",
- "wasi",
+ "wasi 0.9.0+wasi-snapshot-preview1",
 ]
 
 [[package]]
 name = "gimli"
-version = "0.22.0"
+version = "0.23.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724"
+checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce"
 dependencies = [
  "fallible-iterator",
  "indexmap",
@@ -917,9 +942,9 @@ dependencies = [
 
 [[package]]
 name = "hermit-abi"
-version = "0.1.15"
+version = "0.1.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3deed196b6e7f9e44a2ae8d94225d80302d81208b1bb673fd21fe634645c85a9"
+checksum = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8"
 dependencies = [
  "libc",
 ]
@@ -933,6 +958,12 @@ dependencies = [
  "quick-error",
 ]
 
+[[package]]
+name = "humantime"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c1ad908cc71012b7bea4d0c53ba96a8cba9962f048fa68d143376143d863b7a"
+
 [[package]]
 name = "id-arena"
 version = "2.2.1"
@@ -941,11 +972,12 @@ checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005"
 
 [[package]]
 name = "indexmap"
-version = "1.4.0"
+version = "1.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c398b2b113b55809ceb9ee3e753fcbac793f1956663f3c36549c1346015c2afe"
+checksum = "55e2e4c765aa53a0424761bf9f41aa7a6ac1efa87238f59560640e27fca028f2"
 dependencies = [
- "autocfg 1.0.0",
+ "autocfg",
+ "hashbrown",
  "serde",
 ]
 
@@ -972,15 +1004,6 @@ dependencies = [
  "syn",
 ]
 
-[[package]]
-name = "itertools"
-version = "0.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484"
-dependencies = [
- "either",
-]
-
 [[package]]
 name = "itertools"
 version = "0.9.0"
@@ -1028,15 +1051,15 @@ checksum = "3576a87f2ba00f6f106fdfcd16db1d698d648a26ad8e0573cad8537c3c362d2a"
 
 [[package]]
 name = "libc"
-version = "0.2.72"
+version = "0.2.80"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a9f8082297d534141b30c8d39e9b1773713ab50fdbe4ff30f750d063b3bfd701"
+checksum = "4d58d1b70b004888f764dfbf6a26a3b0342a1632d33968e4a179d8011c760614"
 
 [[package]]
 name = "libfuzzer-sys"
-version = "0.3.3"
+version = "0.3.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87ccaa86e7872547575190db4f1f915bad8eb0f2ae7491ede35e53ae76abfba9"
+checksum = "ee8c42ab62f43795ed77a965ed07994c5584cdc94fd0ebf14b22ac1524077acc"
 dependencies = [
  "arbitrary",
  "cc",
@@ -1044,7 +1067,7 @@ dependencies = [
 
 [[package]]
 name = "lightbeam"
-version = "0.20.0"
+version = "0.21.0"
 dependencies = [
  "anyhow",
  "capstone",
@@ -1053,9 +1076,9 @@ dependencies = [
  "dynasm",
  "dynasmrt",
  "iter-enum",
- "itertools 0.8.2",
+ "itertools",
  "lazy_static",
- "memoffset",
+ "memoffset 0.6.1",
  "more-asserts",
  "quickcheck",
  "smallvec",
@@ -1068,11 +1091,24 @@ dependencies = [
 
 [[package]]
 name = "log"
-version = "0.4.8"
+version = "0.4.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b"
+dependencies = [
+ "cfg-if 0.1.10",
+]
+
+[[package]]
+name = "loom"
+version = "0.3.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7"
+checksum = "a0e8460f2f2121162705187214720353c517b97bdfb3494c0b1e33d83ebe4bed"
 dependencies = [
  "cfg-if 0.1.10",
+ "generator",
+ "scoped-tls",
+ "serde",
+ "serde_json",
 ]
 
 [[package]]
@@ -1093,17 +1129,11 @@ dependencies = [
  "regex-automata",
 ]
 
-[[package]]
-name = "maybe-uninit"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
-
 [[package]]
 name = "memchr"
-version = "2.3.3"
+version = "2.3.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400"
+checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525"
 
 [[package]]
 name = "memmap"
@@ -1117,20 +1147,30 @@ dependencies = [
 
 [[package]]
 name = "memoffset"
-version = "0.5.5"
+version = "0.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "memoffset"
+version = "0.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c198b026e1bbf08a937e94c6c60f9ec4a2267f5b0d2eec9c1b21b061ce2be55f"
+checksum = "157b4208e3059a8f9e78d559edc658e13df41410cb3ae03979c83130067fdd87"
 dependencies = [
- "autocfg 1.0.0",
+ "autocfg",
 ]
 
 [[package]]
 name = "miniz_oxide"
-version = "0.4.0"
+version = "0.4.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be0f75932c1f6cfae3c04000e40114adf955636e19040f9c0a2c380702aa1c7f"
+checksum = "0f2d26ec3309788e423cfbf68ad1800f061638098d76a83681af979dc4eda19d"
 dependencies = [
  "adler",
+ "autocfg",
 ]
 
 [[package]]
@@ -1141,21 +1181,21 @@ checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238"
 
 [[package]]
 name = "num-integer"
-version = "0.1.43"
+version = "0.1.44"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8d59457e662d541ba17869cf51cf177c0b5f0cbf476c66bdc90bf1edac4f875b"
+checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db"
 dependencies = [
- "autocfg 1.0.0",
+ "autocfg",
  "num-traits",
 ]
 
 [[package]]
 name = "num-traits"
-version = "0.2.12"
+version = "0.2.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac267bcc07f48ee5f8935ab0d24f316fb722d7a1292e2913f0cc196b29ffd611"
+checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
 dependencies = [
- "autocfg 1.0.0",
+ "autocfg",
 ]
 
 [[package]]
@@ -1176,15 +1216,9 @@ checksum = "17b02fc0ff9a9e4b35b3342880f48e896ebf69f2967921fe8646bf5b7125956a"
 
 [[package]]
 name = "object"
-version = "0.20.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ab52be62400ca80aa00285d25253d7f7c437b7375c4de678f5405d3afe82ca5"
-
-[[package]]
-name = "object"
-version = "0.21.1"
+version = "0.22.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37fd5004feb2ce328a52b0b3d01dbf4ffff72583493900ed15f22d4111c51693"
+checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397"
 dependencies = [
  "crc32fast",
  "indexmap",
@@ -1193,15 +1227,15 @@ dependencies = [
 
 [[package]]
 name = "once_cell"
-version = "1.4.0"
+version = "1.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d"
+checksum = "260e51e7efe62b592207e9e13a68e43692a7a279171d6ba57abd208bf23645ad"
 
 [[package]]
 name = "opaque-debug"
-version = "0.2.3"
+version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c"
+checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
 
 [[package]]
 name = "os_pipe"
@@ -1224,7 +1258,7 @@ dependencies = [
 
 [[package]]
 name = "peepmatic"
-version = "0.67.0"
+version = "0.68.0"
 dependencies = [
  "anyhow",
  "peepmatic-automata",
@@ -1239,7 +1273,7 @@ dependencies = [
 
 [[package]]
 name = "peepmatic-automata"
-version = "0.67.0"
+version = "0.68.0"
 dependencies = [
  "serde",
 ]
@@ -1250,7 +1284,7 @@ version = "0.66.0"
 dependencies = [
  "arbitrary",
  "bincode",
- "env_logger",
+ "env_logger 0.8.1",
  "fst",
  "log",
  "peepmatic",
@@ -1259,14 +1293,14 @@ dependencies = [
  "peepmatic-test",
  "peepmatic-test-operator",
  "peepmatic-traits",
- "rand 0.7.3",
+ "rand",
  "serde",
  "wast 26.0.1",
 ]
 
 [[package]]
 name = "peepmatic-macro"
-version = "0.67.0"
+version = "0.68.0"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -1275,7 +1309,7 @@ dependencies = [
 
 [[package]]
 name = "peepmatic-runtime"
-version = "0.67.0"
+version = "0.68.0"
 dependencies = [
  "bincode",
  "bumpalo",
@@ -1291,7 +1325,7 @@ dependencies = [
 
 [[package]]
 name = "peepmatic-souper"
-version = "0.67.0"
+version = "0.68.0"
 dependencies = [
  "anyhow",
  "log",
@@ -1305,7 +1339,7 @@ dependencies = [
 name = "peepmatic-test"
 version = "0.2.0"
 dependencies = [
- "env_logger",
+ "env_logger 0.8.1",
  "log",
  "peepmatic",
  "peepmatic-runtime",
@@ -1315,7 +1349,7 @@ dependencies = [
 
 [[package]]
 name = "peepmatic-test-operator"
-version = "0.67.0"
+version = "0.68.0"
 dependencies = [
  "peepmatic-traits",
  "serde",
@@ -1324,13 +1358,19 @@ dependencies = [
 
 [[package]]
 name = "peepmatic-traits"
-version = "0.67.0"
+version = "0.68.0"
+
+[[package]]
+name = "pin-project-lite"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c917123afa01924fc84bb20c4c03f004d9c38e5127e3c039bbf7f4b9c76a2f6b"
 
 [[package]]
 name = "ppv-lite86"
-version = "0.2.8"
+version = "0.2.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea"
+checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"
 
 [[package]]
 name = "pretty_env_logger"
@@ -1338,15 +1378,15 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "926d36b9553851b8b0005f1275891b392ee4d2d833852c417ed025477350fb9d"
 dependencies = [
- "env_logger",
+ "env_logger 0.7.1",
  "log",
 ]
 
 [[package]]
 name = "proc-macro-error"
-version = "1.0.3"
+version = "1.0.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc175e9777c3116627248584e8f8b3e2987405cabe1c0adf7d1dd28f09dc7880"
+checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
 dependencies = [
  "proc-macro-error-attr",
  "proc-macro2",
@@ -1357,31 +1397,29 @@ dependencies = [
 
 [[package]]
 name = "proc-macro-error-attr"
-version = "1.0.3"
+version = "1.0.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3cc9795ca17eb581285ec44936da7fc2335a3f34f2ddd13118b6f4d515435c50"
+checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
- "syn-mid",
  "version_check",
 ]
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.18"
+version = "1.0.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "beae6331a816b1f65d04c45b078fd8e6c93e8071771f41b8163255bbd8d7c8fa"
+checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
 dependencies = [
  "unicode-xid",
 ]
 
 [[package]]
 name = "proptest"
-version = "0.9.6"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01c477819b845fe023d33583ebf10c9f62518c8d79a0960ba5c36d6ac8a55a5b"
+checksum = "12e6c80c1139113c28ee4670dc50cc42915228b51f56a9e407f0ec60f966646f"
 dependencies = [
  "bit-set",
  "bitflags",
@@ -1389,8 +1427,8 @@ dependencies = [
  "lazy_static",
  "num-traits",
  "quick-error",
- "rand 0.6.5",
- "rand_chacha 0.1.1",
+ "rand",
+ "rand_chacha",
  "rand_xorshift",
  "regex-syntax",
  "rusty-fork",
@@ -1418,10 +1456,10 @@ version = "0.9.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a44883e74aa97ad63db83c4bf8ca490f02b2fc02f92575e720c8551e843c945f"
 dependencies = [
- "env_logger",
+ "env_logger 0.7.1",
  "log",
- "rand 0.7.3",
- "rand_core 0.5.1",
+ "rand",
+ "rand_core",
 ]
 
 [[package]]
@@ -1433,47 +1471,18 @@ dependencies = [
  "proc-macro2",
 ]
 
-[[package]]
-name = "rand"
-version = "0.6.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca"
-dependencies = [
- "autocfg 0.1.7",
- "libc",
- "rand_chacha 0.1.1",
- "rand_core 0.4.2",
- "rand_hc 0.1.0",
- "rand_isaac",
- "rand_jitter",
- "rand_os",
- "rand_pcg 0.1.2",
- "rand_xorshift",
- "winapi",
-]
-
 [[package]]
 name = "rand"
 version = "0.7.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
 dependencies = [
- "getrandom",
+ "getrandom 0.1.15",
  "libc",
- "rand_chacha 0.2.2",
- "rand_core 0.5.1",
- "rand_hc 0.2.0",
- "rand_pcg 0.2.1",
-]
-
-[[package]]
-name = "rand_chacha"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef"
-dependencies = [
- "autocfg 0.1.7",
- "rand_core 0.3.1",
+ "rand_chacha",
+ "rand_core",
+ "rand_hc",
+ "rand_pcg",
 ]
 
 [[package]]
@@ -1483,40 +1492,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
 dependencies = [
  "ppv-lite86",
- "rand_core 0.5.1",
+ "rand_core",
 ]
 
-[[package]]
-name = "rand_core"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
-dependencies = [
- "rand_core 0.4.2",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
-
 [[package]]
 name = "rand_core"
 version = "0.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
 dependencies = [
- "getrandom",
-]
-
-[[package]]
-name = "rand_hc"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4"
-dependencies = [
- "rand_core 0.3.1",
+ "getrandom 0.1.15",
 ]
 
 [[package]]
@@ -1525,51 +1510,7 @@ version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
 dependencies = [
- "rand_core 0.5.1",
-]
-
-[[package]]
-name = "rand_isaac"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08"
-dependencies = [
- "rand_core 0.3.1",
-]
-
-[[package]]
-name = "rand_jitter"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b"
-dependencies = [
- "libc",
- "rand_core 0.4.2",
- "winapi",
-]
-
-[[package]]
-name = "rand_os"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071"
-dependencies = [
- "cloudabi",
- "fuchsia-cprng",
- "libc",
- "rand_core 0.4.2",
- "rdrand",
- "winapi",
-]
-
-[[package]]
-name = "rand_pcg"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44"
-dependencies = [
- "autocfg 0.1.7",
- "rand_core 0.4.2",
+ "rand_core",
 ]
 
 [[package]]
@@ -1578,23 +1519,23 @@ version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429"
 dependencies = [
- "rand_core 0.5.1",
+ "rand_core",
 ]
 
 [[package]]
 name = "rand_xorshift"
-version = "0.1.1"
+version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c"
+checksum = "77d416b86801d23dde1aa643023b775c3a462efc0ed96443add11546cdf1dca8"
 dependencies = [
- "rand_core 0.3.1",
+ "rand_core",
 ]
 
 [[package]]
 name = "raw-cpuid"
-version = "7.0.3"
+version = "8.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4a349ca83373cfa5d6dbb66fd76e58b2cca08da71a5f6400de0a0a6a9bceeaf"
+checksum = "1fdf7d9dbd43f3d81d94a49c1c3df73cc2b3827995147e6cf7f89d4ec5483e73"
 dependencies = [
  "bitflags",
  "cc",
@@ -1603,11 +1544,11 @@ dependencies = [
 
 [[package]]
 name = "rayon"
-version = "1.3.1"
+version = "1.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62f02856753d04e03e26929f820d0a0a337ebe71f849801eea335d464b349080"
+checksum = "8b0d8e0819fadc20c74ea8373106ead0600e3a67ef1fe8da56e39b9ae7275674"
 dependencies = [
- "autocfg 1.0.0",
+ "autocfg",
  "crossbeam-deque",
  "either",
  "rayon-core",
@@ -1615,26 +1556,17 @@ dependencies = [
 
 [[package]]
 name = "rayon-core"
-version = "1.7.1"
+version = "1.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e92e15d89083484e11353891f1af602cc661426deb9564c298b270c726973280"
+checksum = "9ab346ac5921dc62ffa9f89b7a773907511cdfa5490c572ae9be1be33e8afa4a"
 dependencies = [
+ "crossbeam-channel",
  "crossbeam-deque",
- "crossbeam-queue",
- "crossbeam-utils",
+ "crossbeam-utils 0.8.0",
  "lazy_static",
  "num_cpus",
 ]
 
-[[package]]
-name = "rdrand"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
-dependencies = [
- "rand_core 0.3.1",
-]
-
 [[package]]
 name = "redox_syscall"
 version = "0.1.57"
@@ -1643,11 +1575,11 @@ checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
 
 [[package]]
 name = "redox_users"
-version = "0.3.4"
+version = "0.3.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09b23093265f8d200fa7b4c2c76297f47e681c655f6f1285a8780d6a022f7431"
+checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d"
 dependencies = [
- "getrandom",
+ "getrandom 0.1.15",
  "redox_syscall",
  "rust-argon2",
 ]
@@ -1666,9 +1598,9 @@ dependencies = [
 
 [[package]]
 name = "regex"
-version = "1.3.9"
+version = "1.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6"
+checksum = "38cf2c13ed4745de91a5eb834e11c00bcc3709e773173b2ce4c56c9fbde04b9c"
 dependencies = [
  "aho-corasick",
  "memchr",
@@ -1688,9 +1620,9 @@ dependencies = [
 
 [[package]]
 name = "regex-syntax"
-version = "0.6.18"
+version = "0.6.21"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8"
+checksum = "3b181ba2dcf07aaccad5448e8ead58db5b742cf85dfe035e2227f137a539a189"
 
 [[package]]
 name = "region"
@@ -1723,21 +1655,21 @@ dependencies = [
 
 [[package]]
 name = "rust-argon2"
-version = "0.7.0"
+version = "0.8.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2bc8af4bda8e1ff4932523b94d3dd20ee30a87232323eda55903ffd71d2fb017"
+checksum = "9dab61250775933275e84053ac235621dfb739556d5c54a2f2e9313b7cf43a19"
 dependencies = [
- "base64 0.11.0",
+ "base64 0.12.3",
  "blake2b_simd",
  "constant_time_eq",
- "crossbeam-utils",
+ "crossbeam-utils 0.7.2",
 ]
 
 [[package]]
 name = "rustc-demangle"
-version = "0.1.16"
+version = "0.1.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783"
+checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232"
 
 [[package]]
 name = "rustc-hash"
@@ -1756,9 +1688,9 @@ dependencies = [
 
 [[package]]
 name = "rusty-fork"
-version = "0.2.2"
+version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3dd93264e10c577503e926bd1430193eeb5d21b059148910082245309b424fae"
+checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f"
 dependencies = [
  "fnv",
  "quick-error",
@@ -1781,6 +1713,12 @@ dependencies = [
  "winapi-util",
 ]
 
+[[package]]
+name = "scoped-tls"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2"
+
 [[package]]
 name = "scopeguard"
 version = "1.1.0"
@@ -1789,18 +1727,18 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
 
 [[package]]
 name = "scroll"
-version = "0.10.1"
+version = "0.10.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "abb2332cb595d33f7edd5700f4cbf94892e680c7f0ae56adab58a35190b66cb1"
+checksum = "fda28d4b4830b807a8b43f7b0e6b5df875311b3e7621d84577188c175b6ec1ec"
 dependencies = [
  "scroll_derive",
 ]
 
 [[package]]
 name = "scroll_derive"
-version = "0.10.2"
+version = "0.10.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e367622f934864ffa1c704ba2b82280aab856e3d8213c84c5720257eb34b15b9"
+checksum = "b12bd20b94c7cdfda8c7ba9b92ad0d9a56e3fa018c25fca83b51aa664c9b4c0d"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -1824,18 +1762,18 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
 
 [[package]]
 name = "serde"
-version = "1.0.114"
+version = "1.0.117"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5317f7588f0a5078ee60ef675ef96735a1442132dc645eb1d12c018620ed8cd3"
+checksum = "b88fa983de7720629c9387e9f517353ed404164b1e482c970a90c1a4aaf7dc1a"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.114"
+version = "1.0.117"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a0be94b04690fbaed37cddffc5c134bf537c8e3329d53e982fe04c374978f8e"
+checksum = "cbd1ae72adb44aab48f325a02444a5fc079349a8d804c1fc922aed3f7454c74e"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -1844,9 +1782,9 @@ dependencies = [
 
 [[package]]
 name = "serde_json"
-version = "1.0.56"
+version = "1.0.59"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3433e879a558dde8b5e8feb2a04899cf34fdde1fafb894687e52105fc1162ac3"
+checksum = "dcac07dbffa1c65e7f816ab9eba78eb142c6d44410f4eeba1e26e4f5dfa56b95"
 dependencies = [
  "itoa",
  "ryu",
@@ -1855,32 +1793,34 @@ dependencies = [
 
 [[package]]
 name = "serde_test"
-version = "1.0.114"
+version = "1.0.117"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f58190d074af17bd48118303db08afadbd506bc2ba511b4582cebd8f882a9b8d"
+checksum = "d9a49e2f787c0fddfd5e758cbbd3cbf81c3a8d12ef091283c52d9e9b4d417d3c"
 dependencies = [
  "serde",
 ]
 
 [[package]]
 name = "sha2"
-version = "0.8.2"
+version = "0.9.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69"
+checksum = "6e7aab86fe2149bad8c507606bdb3f4ef5e7b2380eb92350f56122cca72a42a8"
 dependencies = [
  "block-buffer",
+ "cfg-if 1.0.0",
+ "cpuid-bool",
  "digest",
- "fake-simd",
  "opaque-debug",
 ]
 
 [[package]]
 name = "sharded-slab"
-version = "0.0.9"
+version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06d5a3f5166fb5b42a5439f2eee8b9de149e235961e3eb21c5808fc3ea17ff3e"
+checksum = "7b4921be914e16899a80adefb821f8ddb7974e3f1250223575a44ed994882127"
 dependencies = [
  "lazy_static",
+ "loom",
 ]
 
 [[package]]
@@ -1927,9 +1867,9 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
 
 [[package]]
 name = "structopt"
-version = "0.3.17"
+version = "0.3.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6cc388d94ffabf39b5ed5fadddc40147cb21e605f53db6f8f36a625d27489ac5"
+checksum = "126d630294ec449fae0b16f964e35bf3c74f940da9dca17ee9b905f7b3112eb8"
 dependencies = [
  "clap",
  "lazy_static",
@@ -1938,9 +1878,9 @@ dependencies = [
 
 [[package]]
 name = "structopt-derive"
-version = "0.4.10"
+version = "0.4.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e2513111825077552a6751dfad9e11ce0fba07d7276a3943a037d7e93e64c5f"
+checksum = "65e51c492f9e23a220534971ff5afc14037289de430e3c83f9daf6a1b6ae91e8"
 dependencies = [
  "heck",
  "proc-macro-error",
@@ -1951,31 +1891,20 @@ dependencies = [
 
 [[package]]
 name = "syn"
-version = "1.0.34"
+version = "1.0.48"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "936cae2873c940d92e697597c5eee105fb570cd5689c695806f672883653349b"
+checksum = "cc371affeffc477f42a221a1e4297aedcea33d47d19b61455588bd9d8f6b19ac"
 dependencies = [
  "proc-macro2",
  "quote",
  "unicode-xid",
 ]
 
-[[package]]
-name = "syn-mid"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7be3539f6c128a931cf19dcee741c1af532c7fd387baa739c03dd2e96479338a"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
 [[package]]
 name = "target-lexicon"
-version = "0.11.0"
+version = "0.11.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe2635952a442a01fd4cb53d98858b5e4bb461b02c0d111f22f31772e3e7a8b2"
+checksum = "4ee5a98e506fb7231a304c3a1bd7c132a55016cf65001e0282480665870dfcb9"
 
 [[package]]
 name = "tempfile"
@@ -1985,7 +1914,7 @@ checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9"
 dependencies = [
  "cfg-if 0.1.10",
  "libc",
- "rand 0.7.3",
+ "rand",
  "redox_syscall",
  "remove_dir_all",
  "winapi",
@@ -2020,15 +1949,6 @@ dependencies = [
  "winapi",
 ]
 
-[[package]]
-name = "termios"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6f0fcee7b24a25675de40d5bb4de6e41b0df07bc9856295e7e2b3a3600c400c2"
-dependencies = [
- "libc",
-]
-
 [[package]]
 name = "test-programs"
 version = "0.19.0"
@@ -2056,18 +1976,18 @@ dependencies = [
 
 [[package]]
 name = "thiserror"
-version = "1.0.20"
+version = "1.0.22"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7dfdd070ccd8ccb78f4ad66bf1982dc37f620ef696c6b5028fe2ed83dd3d0d08"
+checksum = "0e9ae34b84616eedaaf1e9dd6026dbe00dcafa92aa0c8077cb69df1fcfe5e53e"
 dependencies = [
  "thiserror-impl",
 ]
 
 [[package]]
 name = "thiserror-impl"
-version = "1.0.20"
+version = "1.0.22"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd80fc12f73063ac132ac92aceea36734f04a1d93c1240c6944e23a3b8841793"
+checksum = "9ba20f23e85b10754cd195504aebf6a27e2e6cbe28c17778a0c930724628dd56"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2085,40 +2005,42 @@ dependencies = [
 
 [[package]]
 name = "time"
-version = "0.1.43"
+version = "0.1.44"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438"
+checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255"
 dependencies = [
  "libc",
+ "wasi 0.10.0+wasi-snapshot-preview1",
  "winapi",
 ]
 
 [[package]]
 name = "toml"
-version = "0.5.6"
+version = "0.5.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a"
+checksum = "75cf45bb0bef80604d001caaec0d09da99611b3c0fd39d3080468875cdb65645"
 dependencies = [
  "serde",
 ]
 
 [[package]]
 name = "tracing"
-version = "0.1.19"
+version = "0.1.21"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d79ca061b032d6ce30c660fded31189ca0b9922bf483cd70759f13a2d86786c"
+checksum = "b0987850db3733619253fe60e17cb59b82d37c7e6c0236bb81e4d6b87c879f27"
 dependencies = [
  "cfg-if 0.1.10",
  "log",
+ "pin-project-lite",
  "tracing-attributes",
  "tracing-core",
 ]
 
 [[package]]
 name = "tracing-attributes"
-version = "0.1.10"
+version = "0.1.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fe233f4227389ab7df5b32649239da7ebe0b281824b4e84b342d04d3fd8c25e"
+checksum = "80e0ccfc3378da0cce270c946b676a376943f5cd16aeba64568e7939806f4ada"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2127,9 +2049,9 @@ dependencies = [
 
 [[package]]
 name = "tracing-core"
-version = "0.1.14"
+version = "0.1.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db63662723c316b43ca36d833707cc93dff82a02ba3d7e354f342682cc8b3545"
+checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f"
 dependencies = [
  "lazy_static",
 ]
@@ -2147,9 +2069,9 @@ dependencies = [
 
 [[package]]
 name = "tracing-serde"
-version = "0.1.1"
+version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6ccba2f8f16e0ed268fc765d9b7ff22e965e7185d32f8f1ec8294fe17d86e79"
+checksum = "fb65ea441fbb84f9f6748fd496cf7f63ec9af5bca94dd86456978d055e8eb28b"
 dependencies = [
  "serde",
  "tracing-core",
@@ -2157,11 +2079,11 @@ dependencies = [
 
 [[package]]
 name = "tracing-subscriber"
-version = "0.2.7"
+version = "0.2.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c72c8cf3ec4ed69fef614d011a5ae4274537a8a8c59133558029bd731eb71659"
+checksum = "a1fa8f0c8f4c594e4fc9debc1990deab13238077271ba84dd853d54902ee3401"
 dependencies = [
- "ansi_term",
+ "ansi_term 0.12.1",
  "chrono",
  "lazy_static",
  "matchers",
@@ -2170,6 +2092,8 @@ dependencies = [
  "serde_json",
  "sharded-slab",
  "smallvec",
+ "thread_local",
+ "tracing",
  "tracing-core",
  "tracing-log",
  "tracing-serde",
@@ -2261,15 +2185,21 @@ version = "0.9.0+wasi-snapshot-preview1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
 
+[[package]]
+name = "wasi"
+version = "0.10.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
+
 [[package]]
 name = "wasi-common"
-version = "0.20.0"
+version = "0.21.0"
 dependencies = [
  "anyhow",
  "cfg-if 1.0.0",
  "cpu-time",
  "filetime",
- "getrandom",
+ "getrandom 0.2.0",
  "lazy_static",
  "libc",
  "thiserror",
@@ -2315,7 +2245,7 @@ dependencies = [
 
 [[package]]
 name = "wasmtime"
-version = "0.20.0"
+version = "0.21.0"
 dependencies = [
  "anyhow",
  "backtrace",
@@ -2346,7 +2276,7 @@ name = "wasmtime-c-api"
 version = "0.19.0"
 dependencies = [
  "anyhow",
- "env_logger",
+ "env_logger 0.8.1",
  "once_cell",
  "wasi-common",
  "wasmtime",
@@ -2365,10 +2295,10 @@ dependencies = [
 
 [[package]]
 name = "wasmtime-cache"
-version = "0.20.0"
+version = "0.21.0"
 dependencies = [
  "anyhow",
- "base64 0.12.3",
+ "base64 0.13.0",
  "bincode",
  "directories-next",
  "errno",
@@ -2389,17 +2319,17 @@ dependencies = [
 
 [[package]]
 name = "wasmtime-cli"
-version = "0.20.0"
+version = "0.21.0"
 dependencies = [
  "anyhow",
- "env_logger",
+ "env_logger 0.8.1",
  "file-per-thread-logger",
  "filecheck",
- "humantime",
+ "humantime 2.0.1",
  "libc",
  "log",
  "more-asserts",
- "object 0.21.1",
+ "object",
  "pretty_env_logger",
  "rayon",
  "structopt",
@@ -2424,7 +2354,7 @@ dependencies = [
 
 [[package]]
 name = "wasmtime-cranelift"
-version = "0.20.0"
+version = "0.21.0"
 dependencies = [
  "cranelift-codegen",
  "cranelift-entity",
@@ -2435,12 +2365,12 @@ dependencies = [
 
 [[package]]
 name = "wasmtime-debug"
-version = "0.20.0"
+version = "0.21.0"
 dependencies = [
  "anyhow",
  "gimli",
  "more-asserts",
- "object 0.21.1",
+ "object",
  "target-lexicon",
  "thiserror",
  "wasmparser 0.65.0",
@@ -2449,7 +2379,7 @@ dependencies = [
 
 [[package]]
 name = "wasmtime-environ"
-version = "0.20.0"
+version = "0.21.0"
 dependencies = [
  "anyhow",
  "cfg-if 1.0.0",
@@ -2486,7 +2416,7 @@ version = "0.19.0"
 dependencies = [
  "anyhow",
  "arbitrary",
- "env_logger",
+ "env_logger 0.8.1",
  "log",
  "rayon",
  "wasm-smith",
@@ -2499,7 +2429,7 @@ dependencies = [
 
 [[package]]
 name = "wasmtime-jit"
-version = "0.20.0"
+version = "0.21.0"
 dependencies = [
  "anyhow",
  "cfg-if 1.0.0",
@@ -2511,7 +2441,7 @@ dependencies = [
  "gimli",
  "log",
  "more-asserts",
- "object 0.21.1",
+ "object",
  "rayon",
  "region",
  "serde",
@@ -2530,7 +2460,7 @@ dependencies = [
 
 [[package]]
 name = "wasmtime-lightbeam"
-version = "0.20.0"
+version = "0.21.0"
 dependencies = [
  "cranelift-codegen",
  "lightbeam",
@@ -2540,11 +2470,11 @@ dependencies = [
 
 [[package]]
 name = "wasmtime-obj"
-version = "0.20.0"
+version = "0.21.0"
 dependencies = [
  "anyhow",
  "more-asserts",
- "object 0.21.1",
+ "object",
  "target-lexicon",
  "wasmtime-debug",
  "wasmtime-environ",
@@ -2552,7 +2482,7 @@ dependencies = [
 
 [[package]]
 name = "wasmtime-profiling"
-version = "0.20.0"
+version = "0.21.0"
 dependencies = [
  "anyhow",
  "cfg-if 1.0.0",
@@ -2560,7 +2490,7 @@ dependencies = [
  "ittapi-rs",
  "lazy_static",
  "libc",
- "object 0.21.1",
+ "object",
  "scroll",
  "serde",
  "target-lexicon",
@@ -2570,7 +2500,7 @@ dependencies = [
 
 [[package]]
 name = "wasmtime-runtime"
-version = "0.20.0"
+version = "0.21.0"
 dependencies = [
  "backtrace",
  "cc",
@@ -2579,7 +2509,7 @@ dependencies = [
  "lazy_static",
  "libc",
  "log",
- "memoffset",
+ "memoffset 0.6.1",
  "more-asserts",
  "psm",
  "region",
@@ -2590,7 +2520,7 @@ dependencies = [
 
 [[package]]
 name = "wasmtime-rust"
-version = "0.20.0"
+version = "0.21.0"
 dependencies = [
  "anyhow",
  "wasmtime",
@@ -2600,7 +2530,7 @@ dependencies = [
 
 [[package]]
 name = "wasmtime-rust-macro"
-version = "0.20.0"
+version = "0.21.0"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2609,7 +2539,7 @@ dependencies = [
 
 [[package]]
 name = "wasmtime-wasi"
-version = "0.20.0"
+version = "0.21.0"
 dependencies = [
  "anyhow",
  "tracing",
@@ -2623,7 +2553,7 @@ dependencies = [
 
 [[package]]
 name = "wasmtime-wast"
-version = "0.20.0"
+version = "0.21.0"
 dependencies = [
  "anyhow",
  "wasmtime",
@@ -2632,7 +2562,7 @@ dependencies = [
 
 [[package]]
 name = "wasmtime-wiggle"
-version = "0.20.0"
+version = "0.21.0"
 dependencies = [
  "wasmtime",
  "wasmtime-wiggle-macro",
@@ -2642,7 +2572,7 @@ dependencies = [
 
 [[package]]
 name = "wasmtime-wiggle-macro"
-version = "0.20.0"
+version = "0.21.0"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2680,7 +2610,7 @@ dependencies = [
 
 [[package]]
 name = "wig"
-version = "0.20.0"
+version = "0.21.0"
 dependencies = [
  "heck",
  "proc-macro2",
@@ -2690,7 +2620,7 @@ dependencies = [
 
 [[package]]
 name = "wiggle"
-version = "0.20.0"
+version = "0.21.0"
 dependencies = [
  "proptest",
  "thiserror",
@@ -2702,7 +2632,7 @@ dependencies = [
 
 [[package]]
 name = "wiggle-generate"
-version = "0.20.0"
+version = "0.21.0"
 dependencies = [
  "anyhow",
  "heck",
@@ -2715,7 +2645,7 @@ dependencies = [
 
 [[package]]
 name = "wiggle-macro"
-version = "0.20.0"
+version = "0.21.0"
 dependencies = [
  "quote",
  "syn",
@@ -2728,7 +2658,7 @@ dependencies = [
 name = "wiggle-test"
 version = "0.19.0"
 dependencies = [
- "env_logger",
+ "env_logger 0.8.1",
  "proptest",
  "thiserror",
  "tracing",
@@ -2769,7 +2699,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 
 [[package]]
 name = "winx"
-version = "0.20.0"
+version = "0.21.0"
 dependencies = [
  "bitflags",
  "cvt",
@@ -2791,7 +2721,7 @@ dependencies = [
 
 [[package]]
 name = "yanix"
-version = "0.20.0"
+version = "0.21.0"
 dependencies = [
  "bitflags",
  "cfg-if 1.0.0",
@@ -2847,6 +2777,6 @@ checksum = "b89249644df056b522696b1bb9e7c18c87e8ffa3e2f0dc3b0155875d6498f01b"
 dependencies = [
  "cc",
  "glob",
- "itertools 0.9.0",
+ "itertools",
  "libc",
 ]
diff --git a/Cargo.toml b/Cargo.toml
index 8376fb49f..5c7bc610b 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasmtime-cli"
-version = "0.20.0"
+version = "0.21.0"
 authors = ["The Wasmtime Project Developers"]
 description = "Command-line interface for Wasmtime"
 license = "Apache-2.0 WITH LLVM-exception"
@@ -22,17 +22,17 @@ doc = false
 
 [dependencies]
 # Enable all supported architectures by default.
-wasmtime = { path = "crates/wasmtime", version = "0.20.0", default-features = false, features = ['cache'] }
-wasmtime-cache = { path = "crates/cache", version = "0.20.0" }
-wasmtime-debug = { path = "crates/debug", version = "0.20.0" }
-wasmtime-environ = { path = "crates/environ", version = "0.20.0" }
-wasmtime-jit = { path = "crates/jit", version = "0.20.0" }
-wasmtime-obj = { path = "crates/obj", version = "0.20.0" }
-wasmtime-wast = { path = "crates/wast", version = "0.20.0" }
-wasmtime-wasi = { path = "crates/wasi", version = "0.20.0" }
-wasi-common = { path = "crates/wasi-common", version = "0.20.0" }
+wasmtime = { path = "crates/wasmtime", version = "0.21.0", default-features = false, features = ['cache'] }
+wasmtime-cache = { path = "crates/cache", version = "0.21.0" }
+wasmtime-debug = { path = "crates/debug", version = "0.21.0" }
+wasmtime-environ = { path = "crates/environ", version = "0.21.0" }
+wasmtime-jit = { path = "crates/jit", version = "0.21.0" }
+wasmtime-obj = { path = "crates/obj", version = "0.21.0" }
+wasmtime-wast = { path = "crates/wast", version = "0.21.0" }
+wasmtime-wasi = { path = "crates/wasi", version = "0.21.0" }
+wasi-common = { path = "crates/wasi-common", version = "0.21.0" }
 structopt = { version = "0.3.5", features = ["color", "suggestions"] }
-object = { version = "0.21.1", default-features = false, features = ["write"] }
+object = { version = "0.22.0", default-features = false, features = ["write"] }
 anyhow = "1.0.19"
 target-lexicon = { version = "0.11.0", default-features = false }
 pretty_env_logger = "0.4.0"
@@ -41,11 +41,11 @@ wat = "1.0.27"
 libc = "0.2.60"
 log = "0.4.8"
 rayon = "1.2.1"
-humantime = "1.3.0"
+humantime = "2.0.0"
 wasmparser = "0.65"
 
 [dev-dependencies]
-env_logger = "0.7.1"
+env_logger = "0.8.1"
 filecheck = "0.5.0"
 more-asserts = "0.2.1"
 tempfile = "3.1.0"
diff --git a/RELEASES.md b/RELEASES.md
index ca3a35148..022b293ec 100644
--- a/RELEASES.md
+++ b/RELEASES.md
@@ -2,6 +2,46 @@
 
 --------------------------------------------------------------------------------
 
+## 0.21.0
+
+Released 2020-11-05.
+
+### Added
+
+* Experimental support for the multi-memory proposal was added.
+  [#2263](https://github.com/bytecodealliance/wasmtime/pull/2263)
+
+* The `Trap::trap_code` API enables learning what kind of trap was raised.
+  [#2309](https://github.com/bytecodealliance/wasmtime/pull/2309)
+
+### Changed
+
+* WebAssembly module validation is now parallelized.
+  [#2059](https://github.com/bytecodealliance/wasmtime/pull/2059)
+
+* Documentation is now available at docs.wasmtime.dev.
+  [#2317](https://github.com/bytecodealliance/wasmtime/pull/2317)
+
+* Windows now compiles like other platforms with a huge guard page instead of
+  having its own custom limit which made modules compile and run more slowly.
+  [#2326](https://github.com/bytecodealliance/wasmtime/pull/2326)
+
+* The size of the cache entry for serialized modules has been greatly reduced.
+  [#2321](https://github.com/bytecodealliance/wasmtime/pull/2321)
+  [#2322](https://github.com/bytecodealliance/wasmtime/pull/2322)
+  [#2324](https://github.com/bytecodealliance/wasmtime/pull/2324)
+  [#2325](https://github.com/bytecodealliance/wasmtime/pull/2325)
+
+* The `FuncType` API constructor and accessors are now iterator-based.
+  [#2365](https://github.com/bytecodealliance/wasmtime/pull/2365)
+
+### Fixed
+
+* A panic in compiling reference-types-using modules has been fixed.
+  [#2350](https://github.com/bytecodealliance/wasmtime/pull/2350)
+
+--------------------------------------------------------------------------------
+
 ## 0.20.0
 
 Released 2020-09-23.
diff --git a/cranelift/Cargo.toml b/cranelift/Cargo.toml
index 5e0cdd12d..5f9e6960b 100644
--- a/cranelift/Cargo.toml
+++ b/cranelift/Cargo.toml
@@ -15,27 +15,27 @@ path = "src/clif-util.rs"
 
 [dependencies]
 cfg-if = "1.0"
-cranelift-codegen = { path = "codegen", version = "0.67.0" }
-cranelift-entity = { path = "entity", version = "0.67.0" }
-cranelift-interpreter = { path = "interpreter", version = "0.67.0" }
-cranelift-reader = { path = "reader", version = "0.67.0" }
-cranelift-frontend = { path = "frontend", version = "0.67.0" }
-cranelift-serde = { path = "serde", version = "0.67.0", optional = true }
-cranelift-wasm = { path = "wasm", version = "0.67.0", optional = true }
-cranelift-native = { path = "native", version = "0.67.0" }
+cranelift-codegen = { path = "codegen", version = "0.68.0" }
+cranelift-entity = { path = "entity", version = "0.68.0" }
+cranelift-interpreter = { path = "interpreter", version = "0.68.0" }
+cranelift-reader = { path = "reader", version = "0.68.0" }
+cranelift-frontend = { path = "frontend", version = "0.68.0" }
+cranelift-serde = { path = "serde", version = "0.68.0", optional = true }
+cranelift-wasm = { path = "wasm", version = "0.68.0", optional = true }
+cranelift-native = { path = "native", version = "0.68.0" }
 cranelift-filetests = { path = "filetests", version = "0.66.0" }
-cranelift-module = { path = "module", version = "0.67.0" }
-cranelift-object = { path = "object", version = "0.67.0" }
-cranelift-simplejit = { path = "simplejit", version = "0.67.0" }
-cranelift-preopt = { path = "preopt", version = "0.67.0" }
-cranelift = { path = "umbrella", version = "0.67.0" }
+cranelift-module = { path = "module", version = "0.68.0" }
+cranelift-object = { path = "object", version = "0.68.0" }
+cranelift-simplejit = { path = "simplejit", version = "0.68.0" }
+cranelift-preopt = { path = "preopt", version = "0.68.0" }
+cranelift = { path = "umbrella", version = "0.68.0" }
 filecheck = "0.5.0"
 log = "0.4.8"
 term = "0.6.1"
 capstone = { version = "0.6.0", optional = true }
 wat = { version = "1.0.18", optional = true }
 target-lexicon = { version = "0.11", features = ["std"] }
-peepmatic-souper = { path = "./peepmatic/crates/souper", version = "0.67.0", optional = true }
+peepmatic-souper = { path = "./peepmatic/crates/souper", version = "0.68.0", optional = true }
 pretty_env_logger = "0.4.0"
 rayon = { version = "1", optional = true }
 file-per-thread-logger = "0.1.2"
diff --git a/cranelift/bforest/Cargo.toml b/cranelift/bforest/Cargo.toml
index 08155b9a6..d3f1edcf8 100644
--- a/cranelift/bforest/Cargo.toml
+++ b/cranelift/bforest/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["The Cranelift Project Developers"]
 name = "cranelift-bforest"
-version = "0.67.0"
+version = "0.68.0"
 description = "A forest of B+-trees"
 license = "Apache-2.0 WITH LLVM-exception"
 documentation = "https://docs.rs/cranelift-bforest"
@@ -12,7 +12,7 @@ keywords = ["btree", "forest", "set", "map"]
 edition = "2018"
 
 [dependencies]
-cranelift-entity = { path = "../entity", version = "0.67.0", default-features = false }
+cranelift-entity = { path = "../entity", version = "0.68.0", default-features = false }
 
 [badges]
 maintenance = { status = "experimental" }
diff --git a/cranelift/codegen/Cargo.toml b/cranelift/codegen/Cargo.toml
index 7a412bcd2..cf11e5db2 100644
--- a/cranelift/codegen/Cargo.toml
+++ b/cranelift/codegen/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["The Cranelift Project Developers"]
 name = "cranelift-codegen"
-version = "0.67.0"
+version = "0.68.0"
 description = "Low-level code generator library"
 license = "Apache-2.0 WITH LLVM-exception"
 documentation = "https://docs.rs/cranelift-codegen"
@@ -13,21 +13,21 @@ build = "build.rs"
 edition = "2018"
 
 [dependencies]
-cranelift-codegen-shared = { path = "./shared", version = "0.67.0" }
-cranelift-entity = { path = "../entity", version = "0.67.0" }
-cranelift-bforest = { path = "../bforest", version = "0.67.0" }
+cranelift-codegen-shared = { path = "./shared", version = "0.68.0" }
+cranelift-entity = { path = "../entity", version = "0.68.0" }
+cranelift-bforest = { path = "../bforest", version = "0.68.0" }
 hashbrown = { version = "0.9.1", optional = true }
 target-lexicon = "0.11"
 log = { version = "0.4.6", default-features = false }
 serde = { version = "1.0.94", features = ["derive"], optional = true }
 bincode = { version = "1.2.1", optional = true }
-gimli = { version = "0.22.0", default-features = false, features = ["write"], optional = true }
+gimli = { version = "0.23.0", default-features = false, features = ["write"], optional = true }
 smallvec = { version = "1.0.0" }
 thiserror = "1.0.4"
 byteorder = { version = "1.3.2", default-features = false }
-peepmatic = { path = "../peepmatic", optional = true, version = "0.67.0" }
-peepmatic-traits = { path = "../peepmatic/crates/traits", optional = true, version = "0.67.0" }
-peepmatic-runtime = { path = "../peepmatic/crates/runtime", optional = true, version = "0.67.0" }
+peepmatic = { path = "../peepmatic", optional = true, version = "0.68.0" }
+peepmatic-traits = { path = "../peepmatic/crates/traits", optional = true, version = "0.68.0" }
+peepmatic-runtime = { path = "../peepmatic/crates/runtime", optional = true, version = "0.68.0" }
 regalloc = { version = "0.0.31" }
 souper-ir = { version = "1", optional = true }
 wast = { version = "26.0.1", optional = true }
@@ -37,7 +37,7 @@ wast = { version = "26.0.1", optional = true }
 # accomodated in `tests`.
 
 [build-dependencies]
-cranelift-codegen-meta = { path = "meta", version = "0.67.0" }
+cranelift-codegen-meta = { path = "meta", version = "0.68.0" }
 
 [features]
 default = ["std", "unwind"]
diff --git a/cranelift/codegen/meta/Cargo.toml b/cranelift/codegen/meta/Cargo.toml
index c03e19c49..967c516e4 100644
--- a/cranelift/codegen/meta/Cargo.toml
+++ b/cranelift/codegen/meta/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 name = "cranelift-codegen-meta"
 authors = ["The Cranelift Project Developers"]
-version = "0.67.0"
+version = "0.68.0"
 description = "Metaprogram for cranelift-codegen code generator library"
 license = "Apache-2.0 WITH LLVM-exception"
 repository = "https://github.com/bytecodealliance/wasmtime"
@@ -12,8 +12,8 @@ edition = "2018"
 rustdoc-args = [ "--document-private-items" ]
 
 [dependencies]
-cranelift-codegen-shared = { path = "../shared", version = "0.67.0" }
-cranelift-entity = { path = "../../entity", version = "0.67.0" }
+cranelift-codegen-shared = { path = "../shared", version = "0.68.0" }
+cranelift-entity = { path = "../../entity", version = "0.68.0" }
 
 [badges]
 maintenance = { status = "experimental" }
diff --git a/cranelift/codegen/shared/Cargo.toml b/cranelift/codegen/shared/Cargo.toml
index 3642c455d..b5e98afd5 100644
--- a/cranelift/codegen/shared/Cargo.toml
+++ b/cranelift/codegen/shared/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["The Cranelift Project Developers"]
 name = "cranelift-codegen-shared"
-version = "0.67.0"
+version = "0.68.0"
 description = "For code shared between cranelift-codegen-meta and cranelift-codegen"
 license = "Apache-2.0 WITH LLVM-exception"
 repository = "https://github.com/bytecodealliance/wasmtime"
diff --git a/cranelift/codegen/src/context.rs b/cranelift/codegen/src/context.rs
index eb4cdf26f..4eb0c3b12 100644
--- a/cranelift/codegen/src/context.rs
+++ b/cranelift/codegen/src/context.rs
@@ -253,13 +253,16 @@ impl Context {
         &self,
         isa: &dyn TargetIsa,
     ) -> CodegenResult<Option<crate::isa::unwind::UnwindInfo>> {
-        if self.mach_compile_result.is_some() {
-            return Ok(self
-                .mach_compile_result
-                .as_ref()
-                .unwrap()
-                .unwind_info
-                .clone());
+        if let Some(backend) = isa.get_mach_backend() {
+            use crate::isa::CallConv;
+            use crate::machinst::UnwindInfoKind;
+            let unwind_info_kind = match self.func.signature.call_conv {
+                CallConv::Fast | CallConv::Cold | CallConv::SystemV => UnwindInfoKind::SystemV,
+                CallConv::WindowsFastcall => UnwindInfoKind::Windows,
+                _ => UnwindInfoKind::None,
+            };
+            let result = self.mach_compile_result.as_ref().unwrap();
+            return backend.emit_unwind_info(result, unwind_info_kind);
         }
         isa.create_unwind_info(&self.func)
     }
diff --git a/cranelift/codegen/src/isa/aarch64/inst/unwind.rs b/cranelift/codegen/src/isa/aarch64/inst/unwind.rs
index 51aad4668..9ea2cb29c 100644
--- a/cranelift/codegen/src/isa/aarch64/inst/unwind.rs
+++ b/cranelift/codegen/src/isa/aarch64/inst/unwind.rs
@@ -1,5 +1,5 @@
 use super::*;
-use crate::isa::unwind::UnwindInfo;
+use crate::isa::unwind::input::UnwindInfo;
 use crate::result::CodegenResult;
 
 pub struct AArch64UnwindInfo;
@@ -7,8 +7,7 @@ pub struct AArch64UnwindInfo;
 impl UnwindInfoGenerator<Inst> for AArch64UnwindInfo {
     fn create_unwind_info(
         _context: UnwindInfoContext<Inst>,
-        _kind: UnwindInfoKind,
-    ) -> CodegenResult<Option<UnwindInfo>> {
+    ) -> CodegenResult<Option<UnwindInfo<Reg>>> {
         // TODO
         Ok(None)
     }
diff --git a/cranelift/codegen/src/isa/arm32/inst/unwind.rs b/cranelift/codegen/src/isa/arm32/inst/unwind.rs
index 78109ed6c..b9ffeba0c 100644
--- a/cranelift/codegen/src/isa/arm32/inst/unwind.rs
+++ b/cranelift/codegen/src/isa/arm32/inst/unwind.rs
@@ -1,5 +1,5 @@
 use super::*;
-use crate::isa::unwind::UnwindInfo;
+use crate::isa::unwind::input::UnwindInfo;
 use crate::result::CodegenResult;
 
 pub struct Arm32UnwindInfo;
@@ -7,8 +7,7 @@ pub struct Arm32UnwindInfo;
 impl UnwindInfoGenerator<Inst> for Arm32UnwindInfo {
     fn create_unwind_info(
         _context: UnwindInfoContext<Inst>,
-        _kind: UnwindInfoKind,
-    ) -> CodegenResult<Option<UnwindInfo>> {
+    ) -> CodegenResult<Option<UnwindInfo<Reg>>> {
         // TODO
         Ok(None)
     }
diff --git a/cranelift/codegen/src/isa/unwind.rs b/cranelift/codegen/src/isa/unwind.rs
index 1d5324976..a4c5f0b6b 100644
--- a/cranelift/codegen/src/isa/unwind.rs
+++ b/cranelift/codegen/src/isa/unwind.rs
@@ -21,51 +21,68 @@ pub enum UnwindInfo {
     SystemV(systemv::UnwindInfo),
 }
 
-pub(crate) mod input {
+/// Intermediate representation for the unwind information
+/// generated by a backend.
+pub mod input {
     use crate::binemit::CodeOffset;
     use alloc::vec::Vec;
     #[cfg(feature = "enable-serde")]
     use serde::{Deserialize, Serialize};
 
+    /// Elementary operation in the unwind operations.
     #[derive(Clone, Debug, PartialEq, Eq)]
     #[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
-    pub(crate) enum UnwindCode<Reg> {
+    pub enum UnwindCode<Reg> {
+        /// Defines that a register is saved at the specified offset.
         SaveRegister {
-            offset: CodeOffset,
+            /// The saved register.
             reg: Reg,
+            /// The specified offset relative to the stack pointer.
             stack_offset: u32,
         },
+        /// Defines that a register is as defined before call.
         RestoreRegister {
-            offset: CodeOffset,
+            /// The restored register.
             reg: Reg,
         },
+        /// The stack pointer was adjusted to allocate the stack.
         StackAlloc {
-            offset: CodeOffset,
+            /// Size to allocate.
             size: u32,
         },
+        /// The stack pointer was adjusted to free the stack.
         StackDealloc {
-            offset: CodeOffset,
+            /// Size to deallocate.
             size: u32,
         },
+        /// The alternative register was assigned as frame pointer base.
         SetFramePointer {
-            offset: CodeOffset,
+            /// The specified register.
             reg: Reg,
         },
-        RememberState {
-            offset: CodeOffset,
-        },
-        RestoreState {
-            offset: CodeOffset,
-        },
+        /// Restores a frame pointer base to default register.
+        RestoreFramePointer,
+        /// Saves the state.
+        RememberState,
+        /// Restores the state.
+        RestoreState,
     }
 
+    /// Unwind information as generated by a backend.
     #[derive(Clone, Debug, PartialEq, Eq)]
     #[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
     pub struct UnwindInfo<Reg> {
-        pub(crate) prologue_size: CodeOffset,
-        pub(crate) prologue_unwind_codes: Vec<UnwindCode<Reg>>,
-        pub(crate) epilogues_unwind_codes: Vec<Vec<UnwindCode<Reg>>>,
-        pub(crate) function_size: CodeOffset,
-        pub(crate) word_size: u8,
+        /// Size of the prologue.
+        pub prologue_size: CodeOffset,
+        /// Unwind codes for prologue.
+        pub prologue_unwind_codes: Vec<(CodeOffset, UnwindCode<Reg>)>,
+        /// Unwind codes for epilogues.
+        pub epilogues_unwind_codes: Vec<Vec<(CodeOffset, UnwindCode<Reg>)>>,
+        /// Entire function size.
+        pub function_size: CodeOffset,
+        /// Platform word size in bytes.
+        pub word_size: u8,
+        /// Initial stack pointer offset.
+        pub initial_sp_offset: u8,
     }
 }
diff --git a/cranelift/codegen/src/isa/unwind/systemv.rs b/cranelift/codegen/src/isa/unwind/systemv.rs
index 3a3f14ab3..dfb2ef593 100644
--- a/cranelift/codegen/src/isa/unwind/systemv.rs
+++ b/cranelift/codegen/src/isa/unwind/systemv.rs
@@ -98,8 +98,8 @@ impl Into<gimli::write::CallFrameInstruction> for CallFrameInstruction {
 pub(crate) trait RegisterMapper<Reg> {
     /// Maps Reg.
     fn map(&self, reg: Reg) -> Result<Register, RegisterMappingError>;
-    /// Gets RSP in gimli's index space.
-    fn rsp(&self) -> Register;
+    /// Gets stack pointer register.
+    fn sp(&self) -> Register;
 }
 
 /// Represents unwind information for a single System V ABI function.
@@ -118,9 +118,9 @@ impl UnwindInfo {
         map_reg: &'b dyn RegisterMapper<Reg>,
     ) -> CodegenResult<Self> {
         use input::UnwindCode;
-        let mut builder = InstructionBuilder::new(unwind.word_size, map_reg);
+        let mut builder = InstructionBuilder::new(unwind.initial_sp_offset, map_reg);
 
-        for c in unwind.prologue_unwind_codes.iter().chain(
+        for (offset, c) in unwind.prologue_unwind_codes.iter().chain(
             unwind
                 .epilogues_unwind_codes
                 .iter()
@@ -128,38 +128,36 @@ impl UnwindInfo {
                 .flatten(),
         ) {
             match c {
-                UnwindCode::SaveRegister {
-                    offset,
-                    reg,
-                    stack_offset: 0,
-                } => {
+                UnwindCode::SaveRegister { reg, stack_offset } => {
                     builder
-                        .save_reg(*offset, *reg)
+                        .save_reg(*offset, *reg, *stack_offset)
                         .map_err(CodegenError::RegisterMappingError)?;
                 }
-                UnwindCode::StackAlloc { offset, size } => {
+                UnwindCode::StackAlloc { size } => {
                     builder.adjust_sp_down_imm(*offset, *size as i64);
                 }
-                UnwindCode::StackDealloc { offset, size } => {
+                UnwindCode::StackDealloc { size } => {
                     builder.adjust_sp_up_imm(*offset, *size as i64);
                 }
-                UnwindCode::RestoreRegister { offset, reg } => {
+                UnwindCode::RestoreRegister { reg } => {
                     builder
                         .restore_reg(*offset, *reg)
                         .map_err(CodegenError::RegisterMappingError)?;
                 }
-                UnwindCode::SetFramePointer { offset, reg } => {
+                UnwindCode::SetFramePointer { reg } => {
                     builder
                         .set_cfa_reg(*offset, *reg)
                         .map_err(CodegenError::RegisterMappingError)?;
                 }
-                UnwindCode::RememberState { offset } => {
+                UnwindCode::RestoreFramePointer => {
+                    builder.restore_cfa(*offset);
+                }
+                UnwindCode::RememberState => {
                     builder.remember_state(*offset);
                 }
-                UnwindCode::RestoreState { offset } => {
+                UnwindCode::RestoreState => {
                     builder.restore_state(*offset);
                 }
-                _ => {}
             }
         }
 
@@ -190,9 +188,9 @@ struct InstructionBuilder<'a, Reg: PartialEq + Copy> {
 }
 
 impl<'a, Reg: PartialEq + Copy> InstructionBuilder<'a, Reg> {
-    fn new(word_size: u8, map_reg: &'a (dyn RegisterMapper<Reg> + 'a)) -> Self {
+    fn new(sp_offset: u8, map_reg: &'a (dyn RegisterMapper<Reg> + 'a)) -> Self {
         Self {
-            sp_offset: word_size as i32, // CFA offset starts at word size offset to account for the return address on stack
+            sp_offset: sp_offset as i32, // CFA offset starts at the specified offset to account for the return address on stack
             saved_state: None,
             frame_register: None,
             map_reg,
@@ -200,11 +198,19 @@ impl<'a, Reg: PartialEq + Copy> InstructionBuilder<'a, Reg> {
         }
     }
 
-    fn save_reg(&mut self, offset: u32, reg: Reg) -> Result<(), RegisterMappingError> {
+    fn save_reg(
+        &mut self,
+        offset: u32,
+        reg: Reg,
+        stack_offset: u32,
+    ) -> Result<(), RegisterMappingError> {
         // Pushes in the prologue are register saves, so record an offset of the save
         self.instructions.push((
             offset,
-            CallFrameInstruction::Offset(self.map_reg.map(reg)?, -self.sp_offset),
+            CallFrameInstruction::Offset(
+                self.map_reg.map(reg)?,
+                stack_offset as i32 - self.sp_offset,
+            ),
         ));
 
         Ok(())
@@ -270,15 +276,16 @@ impl<'a, Reg: PartialEq + Copy> InstructionBuilder<'a, Reg> {
         Ok(())
     }
 
+    fn restore_cfa(&mut self, offset: u32) {
+        // Restore SP and its offset.
+        self.instructions.push((
+            offset,
+            CallFrameInstruction::Cfa(self.map_reg.sp(), self.sp_offset),
+        ));
+        self.frame_register = None;
+    }
+
     fn restore_reg(&mut self, offset: u32, reg: Reg) -> Result<(), RegisterMappingError> {
-        // Update the CFA if this is the restore of the frame pointer register.
-        if Some(reg) == self.frame_register {
-            self.frame_register = None;
-            self.instructions.push((
-                offset,
-                CallFrameInstruction::Cfa(self.map_reg.rsp(), self.sp_offset),
-            ));
-        }
         // Pops in the epilogue are register restores, so record a "same value" for the register
         self.instructions.push((
             offset,
diff --git a/cranelift/codegen/src/isa/unwind/winx64.rs b/cranelift/codegen/src/isa/unwind/winx64.rs
index 3d0198274..b3c21fc47 100644
--- a/cranelift/codegen/src/isa/unwind/winx64.rs
+++ b/cranelift/codegen/src/isa/unwind/winx64.rs
@@ -226,13 +226,9 @@ impl UnwindInfo {
 
         let word_size: u32 = unwind.word_size.into();
         let mut unwind_codes = Vec::new();
-        for c in unwind.prologue_unwind_codes.iter() {
+        for (offset, c) in unwind.prologue_unwind_codes.iter() {
             match c {
-                InputUnwindCode::SaveRegister {
-                    offset,
-                    reg,
-                    stack_offset,
-                } => {
+                InputUnwindCode::SaveRegister { reg, stack_offset } => {
                     let reg = MR::map(*reg);
                     let offset = ensure_unwind_offset(*offset)?;
                     match reg {
@@ -269,7 +265,7 @@ impl UnwindInfo {
                         }
                     }
                 }
-                InputUnwindCode::StackAlloc { offset, size } => {
+                InputUnwindCode::StackAlloc { size } => {
                     unwind_codes.push(UnwindCode::StackAlloc {
                         offset: ensure_unwind_offset(*offset)?,
                         size: *size,
diff --git a/cranelift/codegen/src/isa/x64/inst/emit.rs b/cranelift/codegen/src/isa/x64/inst/emit.rs
index eeb1d3dac..4dbd0981a 100644
--- a/cranelift/codegen/src/isa/x64/inst/emit.rs
+++ b/cranelift/codegen/src/isa/x64/inst/emit.rs
@@ -1979,29 +1979,10 @@ pub(crate) fn emit(
             sink.put1(*imm);
         }
 
-        Inst::XmmLoadConstSeq { val, dst, ty } => {
-            // This sequence is *one* instruction in the vcode, and is expanded only here at
-            // emission time, because we cannot allow the regalloc to insert spills/reloads in
-            // the middle; we depend on hardcoded PC-rel addressing below. TODO Eventually this
-            // "constant inline" code should be replaced by constant pool integration.
-
-            // Load the inline constant.
-            let constant_start_label = sink.get_label();
-            let load_offset = Amode::rip_relative(constant_start_label);
+        Inst::XmmLoadConst { src, dst, ty } => {
+            let load_offset = Amode::rip_relative(sink.get_label_for_constant(*src));
             let load = Inst::load(*ty, load_offset, *dst, ExtKind::None, None);
             load.emit(sink, info, state);
-
-            // Jump over the constant.
-            let constant_end_label = sink.get_label();
-            let jump = Inst::jmp_known(constant_end_label);
-            jump.emit(sink, info, state);
-
-            // Emit the constant.
-            sink.bind_label(constant_start_label);
-            for i in val.iter() {
-                sink.put1(*i);
-            }
-            sink.bind_label(constant_end_label);
         }
 
         Inst::XmmUninitializedValue { .. } => {
diff --git a/cranelift/codegen/src/isa/x64/inst/mod.rs b/cranelift/codegen/src/isa/x64/inst/mod.rs
index 6bc7089bb..08680166e 100644
--- a/cranelift/codegen/src/isa/x64/inst/mod.rs
+++ b/cranelift/codegen/src/isa/x64/inst/mod.rs
@@ -240,8 +240,8 @@ pub enum Inst {
     },
 
     /// XMM (vector) unary op (to move a constant value into an xmm register): movups
-    XmmLoadConstSeq {
-        val: Vec<u8>,
+    XmmLoadConst {
+        src: VCodeConstant,
         dst: Writable<Reg>,
         ty: Type,
     },
@@ -553,7 +553,7 @@ impl Inst {
             | Inst::VirtualSPOffsetAdj { .. }
             | Inst::XmmCmove { .. }
             | Inst::XmmCmpRmR { .. }
-            | Inst::XmmLoadConstSeq { .. }
+            | Inst::XmmLoadConst { .. }
             | Inst::XmmMinMaxSeq { .. }
             | Inst::XmmUninitializedValue { .. } => None,
 
@@ -695,11 +695,10 @@ impl Inst {
         }
     }
 
-    pub(crate) fn xmm_load_const_seq(val: Vec<u8>, dst: Writable<Reg>, ty: Type) -> Inst {
-        debug_assert!(val.len() == 16);
+    pub(crate) fn xmm_load_const(src: VCodeConstant, dst: Writable<Reg>, ty: Type) -> Inst {
         debug_assert!(dst.to_reg().get_class() == RegClass::V128);
         debug_assert!(ty.is_vector() && ty.bits() == 128);
-        Inst::XmmLoadConstSeq { val, dst, ty }
+        Inst::XmmLoadConst { src, dst, ty }
     }
 
     /// Convenient helper for unary float operations.
@@ -1506,8 +1505,8 @@ impl PrettyPrint for Inst {
                 dst.show_rru(mb_rru),
             ),
 
-            Inst::XmmLoadConstSeq { val, dst, .. } => {
-                format!("load_const ${:?}, {}", val, dst.show_rru(mb_rru),)
+            Inst::XmmLoadConst { src, dst, .. } => {
+                format!("load_const {:?}, {}", src, dst.show_rru(mb_rru),)
             }
 
             Inst::XmmToGpr {
@@ -1937,7 +1936,7 @@ fn x64_get_regs(inst: &Inst, collector: &mut RegUsageCollector) {
             }
         }
         Inst::XmmUninitializedValue { dst } => collector.add_def(*dst),
-        Inst::XmmLoadConstSeq { dst, .. } => collector.add_def(*dst),
+        Inst::XmmLoadConst { dst, .. } => collector.add_def(*dst),
         Inst::XmmMinMaxSeq { lhs, rhs_dst, .. } => {
             collector.add_use(*lhs);
             collector.add_mod(*rhs_dst);
@@ -2274,7 +2273,7 @@ fn x64_map_regs<RUM: RegUsageMapper>(inst: &mut Inst, mapper: &RUM) {
         Inst::XmmUninitializedValue { ref mut dst, .. } => {
             map_def(mapper, dst);
         }
-        Inst::XmmLoadConstSeq { ref mut dst, .. } => {
+        Inst::XmmLoadConst { ref mut dst, .. } => {
             map_def(mapper, dst);
         }
         Inst::XmmMinMaxSeq {
@@ -2685,7 +2684,7 @@ impl MachInst for Inst {
             } else {
                 ret.push(Inst::imm(
                     OperandSize::from_bytes(ty.bytes()),
-                    value,
+                    value.into(),
                     to_reg,
                 ));
             }
diff --git a/cranelift/codegen/src/isa/x64/inst/unwind.rs b/cranelift/codegen/src/isa/x64/inst/unwind.rs
index 75107f058..022b2e65f 100644
--- a/cranelift/codegen/src/isa/x64/inst/unwind.rs
+++ b/cranelift/codegen/src/isa/x64/inst/unwind.rs
@@ -1,36 +1,125 @@
-use super::Inst;
-use crate::isa::unwind::UnwindInfo;
-use crate::machinst::{UnwindInfoContext, UnwindInfoGenerator, UnwindInfoKind};
+use crate::isa::unwind::input::UnwindInfo;
+use crate::isa::x64::inst::{
+    args::{AluRmiROpcode, Amode, RegMemImm, SyntheticAmode},
+    regs, Inst,
+};
+use crate::machinst::{UnwindInfoContext, UnwindInfoGenerator};
 use crate::result::CodegenResult;
+use alloc::vec::Vec;
+use regalloc::Reg;
 
 #[cfg(feature = "unwind")]
-pub use self::systemv::create_cie;
-
-#[cfg(feature = "unwind")]
-mod systemv;
+pub(crate) mod systemv;
 
 pub struct X64UnwindInfo;
 
 impl UnwindInfoGenerator<Inst> for X64UnwindInfo {
-    #[allow(unused_variables)]
     fn create_unwind_info(
         context: UnwindInfoContext<Inst>,
-        kind: UnwindInfoKind,
-    ) -> CodegenResult<Option<UnwindInfo>> {
-        // Assumption: RBP is being used as the frame pointer for both calling conventions
-        // In the future, we should be omitting frame pointer as an optimization, so this will change
-        Ok(match kind {
-            #[cfg(feature = "unwind")]
-            UnwindInfoKind::SystemV => {
-                const WORD_SIZE: u8 = 8;
-                systemv::create_unwind_info(context, WORD_SIZE)?.map(UnwindInfo::SystemV)
-            }
-            #[cfg(feature = "unwind")]
-            UnwindInfoKind::Windows => {
-                //TODO winx64::create_unwind_info(context)?.map(|u| UnwindInfo::WindowsX64(u))
-                panic!();
+    ) -> CodegenResult<Option<UnwindInfo<Reg>>> {
+        use crate::isa::unwind::input::{self, UnwindCode};
+        let mut codes = Vec::new();
+        const WORD_SIZE: u8 = 8;
+
+        for i in context.prologue.clone() {
+            let i = i as usize;
+            let inst = &context.insts[i];
+            let offset = context.insts_layout[i];
+
+            match inst {
+                Inst::Push64 {
+                    src: RegMemImm::Reg { reg },
+                } => {
+                    codes.push((
+                        offset,
+                        UnwindCode::StackAlloc {
+                            size: WORD_SIZE.into(),
+                        },
+                    ));
+                    codes.push((
+                        offset,
+                        UnwindCode::SaveRegister {
+                            reg: *reg,
+                            stack_offset: 0,
+                        },
+                    ));
+                }
+                Inst::MovRR { src, dst, .. } => {
+                    if *src == regs::rsp() {
+                        codes.push((offset, UnwindCode::SetFramePointer { reg: dst.to_reg() }));
+                    }
+                }
+                Inst::AluRmiR {
+                    is_64: true,
+                    op: AluRmiROpcode::Sub,
+                    src: RegMemImm::Imm { simm32 },
+                    dst,
+                    ..
+                } if dst.to_reg() == regs::rsp() => {
+                    let imm = *simm32;
+                    codes.push((offset, UnwindCode::StackAlloc { size: imm }));
+                }
+                Inst::MovRM {
+                    src,
+                    dst: SyntheticAmode::Real(Amode::ImmReg { simm32, base }),
+                    ..
+                } if *base == regs::rsp() => {
+                    // `mov reg, imm(rsp)`
+                    let imm = *simm32;
+                    codes.push((
+                        offset,
+                        UnwindCode::SaveRegister {
+                            reg: *src,
+                            stack_offset: imm,
+                        },
+                    ));
+                }
+                Inst::AluRmiR {
+                    is_64: true,
+                    op: AluRmiROpcode::Add,
+                    src: RegMemImm::Imm { simm32 },
+                    dst,
+                    ..
+                } if dst.to_reg() == regs::rsp() => {
+                    let imm = *simm32;
+                    codes.push((offset, UnwindCode::StackDealloc { size: imm }));
+                }
+                _ => {}
             }
-            UnwindInfoKind::None => None,
-        })
+        }
+
+        let last_epilogue_end = context.len;
+        let epilogues_unwind_codes = context
+            .epilogues
+            .iter()
+            .map(|epilogue| {
+                // TODO add logic to process epilogue instruction instead of
+                // returning empty array.
+                let end = epilogue.end as usize - 1;
+                let end_offset = context.insts_layout[end];
+                if end_offset == last_epilogue_end {
+                    // Do not remember/restore for very last epilogue.
+                    return vec![];
+                }
+
+                let start = epilogue.start as usize;
+                let offset = context.insts_layout[start];
+                vec![
+                    (offset, UnwindCode::RememberState),
+                    // TODO epilogue instructions
+                    (end_offset, UnwindCode::RestoreState),
+                ]
+            })
+            .collect();
+
+        let prologue_size = context.insts_layout[context.prologue.end as usize];
+        Ok(Some(input::UnwindInfo {
+            prologue_size,
+            prologue_unwind_codes: codes,
+            epilogues_unwind_codes,
+            function_size: context.len,
+            word_size: WORD_SIZE,
+            initial_sp_offset: WORD_SIZE,
+        }))
     }
 }
diff --git a/cranelift/codegen/src/isa/x64/inst/unwind/systemv.rs b/cranelift/codegen/src/isa/x64/inst/unwind/systemv.rs
index 8f940753d..68473a8af 100644
--- a/cranelift/codegen/src/isa/x64/inst/unwind/systemv.rs
+++ b/cranelift/codegen/src/isa/x64/inst/unwind/systemv.rs
@@ -1,13 +1,8 @@
 //! Unwind information for System V ABI (x86-64).
 
+use crate::isa::unwind::input;
 use crate::isa::unwind::systemv::{RegisterMappingError, UnwindInfo};
-use crate::isa::x64::inst::{
-    args::{AluRmiROpcode, Amode, RegMemImm, SyntheticAmode},
-    regs, Inst,
-};
-use crate::machinst::UnwindInfoContext;
 use crate::result::CodegenResult;
-use alloc::vec::Vec;
 use gimli::{write::CommonInformationEntry, Encoding, Format, Register, X86_64};
 use regalloc::{Reg, RegClass};
 
@@ -88,113 +83,15 @@ pub fn map_reg(reg: Reg) -> Result<Register, RegisterMappingError> {
 }
 
 pub(crate) fn create_unwind_info(
-    context: UnwindInfoContext<Inst>,
-    word_size: u8,
+    unwind: input::UnwindInfo<Reg>,
 ) -> CodegenResult<Option<UnwindInfo>> {
-    use crate::isa::unwind::input::{self, UnwindCode};
-    let mut codes = Vec::new();
-
-    for i in context.prologue.clone() {
-        let i = i as usize;
-        let inst = &context.insts[i];
-        let offset = context.insts_layout[i];
-
-        match inst {
-            Inst::Push64 {
-                src: RegMemImm::Reg { reg },
-            } => {
-                codes.push(UnwindCode::StackAlloc {
-                    offset,
-                    size: word_size.into(),
-                });
-                codes.push(UnwindCode::SaveRegister {
-                    offset,
-                    reg: *reg,
-                    stack_offset: 0,
-                });
-            }
-            Inst::MovRR { src, dst, .. } => {
-                if *src == regs::rsp() {
-                    codes.push(UnwindCode::SetFramePointer {
-                        offset,
-                        reg: dst.to_reg(),
-                    });
-                }
-            }
-            Inst::AluRmiR {
-                is_64: true,
-                op: AluRmiROpcode::Sub,
-                src: RegMemImm::Imm { simm32 },
-                dst,
-                ..
-            } if dst.to_reg() == regs::rsp() => {
-                let imm = *simm32;
-                codes.push(UnwindCode::StackAlloc { offset, size: imm });
-            }
-            Inst::MovRM {
-                src,
-                dst: SyntheticAmode::Real(Amode::ImmReg { simm32, base }),
-                ..
-            } if *base == regs::rsp() => {
-                // `mov reg, imm(rsp)`
-                let imm = *simm32;
-                codes.push(UnwindCode::SaveRegister {
-                    offset,
-                    reg: *src,
-                    stack_offset: imm,
-                });
-            }
-            Inst::AluRmiR {
-                is_64: true,
-                op: AluRmiROpcode::Add,
-                src: RegMemImm::Imm { simm32 },
-                dst,
-                ..
-            } if dst.to_reg() == regs::rsp() => {
-                let imm = *simm32;
-                codes.push(UnwindCode::StackDealloc { offset, size: imm });
-            }
-            _ => {}
-        }
-    }
-
-    let last_epilogue_end = context.len;
-    let epilogues_unwind_codes = context
-        .epilogues
-        .iter()
-        .map(|epilogue| {
-            let end = epilogue.end as usize - 1;
-            let end_offset = context.insts_layout[end];
-            if end_offset == last_epilogue_end {
-                // Do not remember/restore for very last epilogue.
-                return vec![];
-            }
-
-            let start = epilogue.start as usize;
-            let offset = context.insts_layout[start];
-            vec![
-                UnwindCode::RememberState { offset },
-                UnwindCode::RestoreState { offset: end_offset },
-            ]
-        })
-        .collect();
-
-    let prologue_size = context.insts_layout[context.prologue.end as usize];
-    let unwind = input::UnwindInfo {
-        prologue_size,
-        prologue_unwind_codes: codes,
-        epilogues_unwind_codes,
-        function_size: context.len,
-        word_size,
-    };
-
     struct RegisterMapper;
     impl crate::isa::unwind::systemv::RegisterMapper<Reg> for RegisterMapper {
         fn map(&self, reg: Reg) -> Result<u16, RegisterMappingError> {
             Ok(map_reg(reg)?.0)
         }
-        fn rsp(&self) -> u16 {
-            map_reg(regs::rsp()).unwrap().0
+        fn sp(&self) -> u16 {
+            X86_64::RSP.0
         }
     }
     let map = RegisterMapper;
diff --git a/cranelift/codegen/src/isa/x64/lower.rs b/cranelift/codegen/src/isa/x64/lower.rs
index 977011ec5..7e1c2d51a 100644
--- a/cranelift/codegen/src/isa/x64/lower.rs
+++ b/cranelift/codegen/src/isa/x64/lower.rs
@@ -3345,17 +3345,21 @@ fn lower_insn_to_regs<C: LowerCtx<I = Inst>>(
         }
 
         Opcode::Vconst => {
-            let val = if let &InstructionData::UnaryConst {
+            let used_constant = if let &InstructionData::UnaryConst {
                 constant_handle, ..
             } = ctx.data(insn)
             {
-                ctx.get_constant_data(constant_handle).clone().into_vec()
+                ctx.use_constant(VCodeConstantData::Pool(
+                    constant_handle,
+                    ctx.get_constant_data(constant_handle).clone(),
+                ))
             } else {
                 unreachable!("vconst should always have unary_const format")
             };
+            // TODO use Inst::gen_constant() instead.
             let dst = get_output_reg(ctx, outputs[0]);
             let ty = ty.unwrap();
-            ctx.emit(Inst::xmm_load_const_seq(val, dst, ty));
+            ctx.emit(Inst::xmm_load_const(used_constant, dst, ty));
         }
 
         Opcode::RawBitcast => {
@@ -3396,8 +3400,9 @@ fn lower_insn_to_regs<C: LowerCtx<I = Inst>>(
                     .map(|&b| if b > 15 { b.wrapping_sub(16) } else { b })
                     .map(zero_unknown_lane_index)
                     .collect();
+                let constant = ctx.use_constant(VCodeConstantData::Generated(constructed_mask));
                 let tmp = ctx.alloc_tmp(RegClass::V128, types::I8X16);
-                ctx.emit(Inst::xmm_load_const_seq(constructed_mask, tmp, ty));
+                ctx.emit(Inst::xmm_load_const(constant, tmp, ty));
                 // After loading the constructed mask in a temporary register, we use this to
                 // shuffle the `dst` register (remember that, in this case, it is the same as
                 // `src` so we disregard this register).
@@ -3416,8 +3421,9 @@ fn lower_insn_to_regs<C: LowerCtx<I = Inst>>(
                 let tmp0 = ctx.alloc_tmp(RegClass::V128, lhs_ty);
                 ctx.emit(Inst::gen_move(tmp0, lhs, lhs_ty));
                 let constructed_mask = mask.iter().cloned().map(zero_unknown_lane_index).collect();
+                let constant = ctx.use_constant(VCodeConstantData::Generated(constructed_mask));
                 let tmp1 = ctx.alloc_tmp(RegClass::V128, types::I8X16);
-                ctx.emit(Inst::xmm_load_const_seq(constructed_mask, tmp1, ty));
+                ctx.emit(Inst::xmm_load_const(constant, tmp1, ty));
                 ctx.emit(Inst::xmm_rm_r(
                     SseOpcode::Pshufb,
                     RegMem::from(tmp1),
@@ -3431,8 +3437,9 @@ fn lower_insn_to_regs<C: LowerCtx<I = Inst>>(
                     .map(|b| b.wrapping_sub(16))
                     .map(zero_unknown_lane_index)
                     .collect();
+                let constant = ctx.use_constant(VCodeConstantData::Generated(constructed_mask));
                 let tmp2 = ctx.alloc_tmp(RegClass::V128, types::I8X16);
-                ctx.emit(Inst::xmm_load_const_seq(constructed_mask, tmp2, ty));
+                ctx.emit(Inst::xmm_load_const(constant, tmp2, ty));
                 ctx.emit(Inst::xmm_rm_r(
                     SseOpcode::Pshufb,
                     RegMem::from(tmp2),
@@ -3469,11 +3476,12 @@ fn lower_insn_to_regs<C: LowerCtx<I = Inst>>(
 
             // Create a mask for zeroing out-of-bounds lanes of the swizzle mask.
             let zero_mask = ctx.alloc_tmp(RegClass::V128, types::I8X16);
-            let zero_mask_value = vec![
+            static ZERO_MASK_VALUE: [u8; 16] = [
                 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70,
                 0x70, 0x70,
             ];
-            ctx.emit(Inst::xmm_load_const_seq(zero_mask_value, zero_mask, ty));
+            let constant = ctx.use_constant(VCodeConstantData::WellKnown(&ZERO_MASK_VALUE));
+            ctx.emit(Inst::xmm_load_const(constant, zero_mask, ty));
 
             // Use the `zero_mask` on a writable `swizzle_mask`.
             let swizzle_mask = Writable::from_reg(swizzle_mask);
diff --git a/cranelift/codegen/src/isa/x64/mod.rs b/cranelift/codegen/src/isa/x64/mod.rs
index 969447e92..fd4444498 100644
--- a/cranelift/codegen/src/isa/x64/mod.rs
+++ b/cranelift/codegen/src/isa/x64/mod.rs
@@ -103,10 +103,29 @@ impl MachBackend for X64Backend {
         IntCC::UnsignedGreaterThanOrEqual
     }
 
+    #[cfg(feature = "unwind")]
+    fn emit_unwind_info(
+        &self,
+        result: &MachCompileResult,
+        kind: crate::machinst::UnwindInfoKind,
+    ) -> CodegenResult<Option<crate::isa::unwind::UnwindInfo>> {
+        use crate::isa::unwind::UnwindInfo;
+        use crate::machinst::UnwindInfoKind;
+        Ok(match (result.unwind_info.as_ref(), kind) {
+            (Some(info), UnwindInfoKind::SystemV) => {
+                inst::unwind::systemv::create_unwind_info(info.clone())?.map(UnwindInfo::SystemV)
+            }
+            (Some(_info), UnwindInfoKind::Windows) => {
+                //TODO inst::unwind::winx64::create_unwind_info(info.clone())?.map(|u| UnwindInfo::WindowsX64(u))
+                None
+            }
+            _ => None,
+        })
+    }
+
     #[cfg(feature = "unwind")]
     fn create_systemv_cie(&self) -> Option<gimli::write::CommonInformationEntry> {
-        // By default, an ISA cannot create a System V CIE
-        Some(inst::unwind::create_cie())
+        Some(inst::unwind::systemv::create_cie())
     }
 }
 
diff --git a/cranelift/codegen/src/isa/x86/unwind.rs b/cranelift/codegen/src/isa/x86/unwind.rs
index 3168cc49b..2d6b29f04 100644
--- a/cranelift/codegen/src/isa/x86/unwind.rs
+++ b/cranelift/codegen/src/isa/x86/unwind.rs
@@ -81,7 +81,7 @@ pub(crate) fn create_unwind_info(
                 unwind_codes = epilogues_unwind_codes.last_mut().unwrap();
 
                 if !is_last_block {
-                    unwind_codes.push(UnwindCode::RememberState { offset });
+                    unwind_codes.push((offset, UnwindCode::RememberState));
                 }
             } else if in_epilogue {
                 unwind_codes = epilogues_unwind_codes.last_mut().unwrap();
@@ -95,15 +95,19 @@ pub(crate) fn create_unwind_info(
                     match opcode {
                         Opcode::X86Push => {
                             let reg = func.locations[arg].unwrap_reg();
-                            unwind_codes.push(UnwindCode::StackAlloc {
+                            unwind_codes.push((
                                 offset,
-                                size: word_size.into(),
-                            });
-                            unwind_codes.push(UnwindCode::SaveRegister {
+                                UnwindCode::StackAlloc {
+                                    size: word_size.into(),
+                                },
+                            ));
+                            unwind_codes.push((
                                 offset,
-                                reg,
-                                stack_offset: 0,
-                            });
+                                UnwindCode::SaveRegister {
+                                    reg,
+                                    stack_offset: 0,
+                                },
+                            ));
                         }
                         Opcode::AdjustSpDown => {
                             let stack_size =
@@ -111,10 +115,8 @@ pub(crate) fn create_unwind_info(
 
                             // This is used when calling a stack check function
                             // We need to track the assignment to RAX which has the size of the stack
-                            unwind_codes.push(UnwindCode::StackAlloc {
-                                offset,
-                                size: stack_size,
-                            });
+                            unwind_codes
+                                .push((offset, UnwindCode::StackAlloc { size: stack_size }));
                         }
                         _ => {}
                     }
@@ -138,10 +140,8 @@ pub(crate) fn create_unwind_info(
 
                             stack_size = Some(imm as u32);
 
-                            unwind_codes.push(UnwindCode::StackAlloc {
-                                offset,
-                                size: imm as u32,
-                            });
+                            unwind_codes
+                                .push((offset, UnwindCode::StackAlloc { size: imm as u32 }));
                         }
                         Opcode::AdjustSpUpImm => {
                             let imm: i64 = imm.into();
@@ -149,10 +149,8 @@ pub(crate) fn create_unwind_info(
 
                             stack_size = Some(imm as u32);
 
-                            unwind_codes.push(UnwindCode::StackDealloc {
-                                offset,
-                                size: imm as u32,
-                            });
+                            unwind_codes
+                                .push((offset, UnwindCode::StackDealloc { size: imm as u32 }));
                         }
                         _ => {}
                     }
@@ -170,18 +168,20 @@ pub(crate) fn create_unwind_info(
                         // Note: the stack_offset here is relative to an adjusted SP
                         if dst == (RU::rsp as RegUnit) && FPR.contains(src) {
                             let stack_offset: i32 = stack_offset.into();
-                            unwind_codes.push(UnwindCode::SaveRegister {
+                            unwind_codes.push((
                                 offset,
-                                reg: src,
-                                stack_offset: stack_offset as u32,
-                            });
+                                UnwindCode::SaveRegister {
+                                    reg: src,
+                                    stack_offset: stack_offset as u32,
+                                },
+                            ));
                         }
                     }
                 }
                 InstructionData::CopySpecial { src, dst, .. } if frame_register.is_none() => {
                     // Check for change in CFA register (RSP is always the starting CFA)
                     if src == (RU::rsp as RegUnit) {
-                        unwind_codes.push(UnwindCode::SetFramePointer { offset, reg: dst });
+                        unwind_codes.push((offset, UnwindCode::SetFramePointer { reg: dst }));
                         frame_register = Some(dst);
                     }
                 }
@@ -203,18 +203,25 @@ pub(crate) fn create_unwind_info(
                             let offset = epilogue_pop_offsets[i];
 
                             let reg = func.locations[*arg].unwrap_reg();
-                            unwind_codes.push(UnwindCode::RestoreRegister { offset, reg });
-                            unwind_codes.push(UnwindCode::StackDealloc {
+                            unwind_codes.push((offset, UnwindCode::RestoreRegister { reg }));
+                            unwind_codes.push((
                                 offset,
-                                size: word_size.into(),
-                            });
+                                UnwindCode::StackDealloc {
+                                    size: word_size.into(),
+                                },
+                            ));
+
+                            if Some(reg) == frame_register {
+                                unwind_codes.push((offset, UnwindCode::RestoreFramePointer));
+                                // Keep frame_register assigned for next epilogue.
+                            }
                         }
                         epilogue_pop_offsets.clear();
 
                         // TODO ensure unwind codes sorted by offsets ?
 
                         if !is_last_block {
-                            unwind_codes.push(UnwindCode::RestoreState { offset });
+                            unwind_codes.push((offset, UnwindCode::RestoreState));
                         }
 
                         in_epilogue = false;
@@ -232,6 +239,7 @@ pub(crate) fn create_unwind_info(
         epilogues_unwind_codes,
         function_size,
         word_size,
+        initial_sp_offset: word_size,
     }))
 }
 
@@ -271,37 +279,36 @@ mod tests {
             UnwindInfo {
                 prologue_size: 9,
                 prologue_unwind_codes: vec![
-                    UnwindCode::StackAlloc { offset: 2, size: 8 },
-                    UnwindCode::SaveRegister {
-                        offset: 2,
-                        reg: RU::rbp.into(),
-                        stack_offset: 0,
-                    },
-                    UnwindCode::SetFramePointer {
-                        offset: 5,
-                        reg: RU::rbp.into(),
-                    },
-                    UnwindCode::StackAlloc {
-                        offset: 9,
-                        size: 64
-                    }
+                    (2, UnwindCode::StackAlloc { size: 8 }),
+                    (
+                        2,
+                        UnwindCode::SaveRegister {
+                            reg: RU::rbp.into(),
+                            stack_offset: 0,
+                        }
+                    ),
+                    (
+                        5,
+                        UnwindCode::SetFramePointer {
+                            reg: RU::rbp.into(),
+                        }
+                    ),
+                    (9, UnwindCode::StackAlloc { size: 64 })
                 ],
                 epilogues_unwind_codes: vec![vec![
-                    UnwindCode::StackDealloc {
-                        offset: 13,
-                        size: 64
-                    },
-                    UnwindCode::RestoreRegister {
-                        offset: 15,
-                        reg: RU::rbp.into()
-                    },
-                    UnwindCode::StackDealloc {
-                        offset: 15,
-                        size: 8
-                    }
+                    (13, UnwindCode::StackDealloc { size: 64 }),
+                    (
+                        15,
+                        UnwindCode::RestoreRegister {
+                            reg: RU::rbp.into()
+                        }
+                    ),
+                    (15, UnwindCode::StackDealloc { size: 8 }),
+                    (15, UnwindCode::RestoreFramePointer)
                 ]],
                 function_size: 16,
                 word_size: 8,
+                initial_sp_offset: 8,
             }
         );
     }
@@ -329,37 +336,36 @@ mod tests {
             UnwindInfo {
                 prologue_size: 27,
                 prologue_unwind_codes: vec![
-                    UnwindCode::StackAlloc { offset: 2, size: 8 },
-                    UnwindCode::SaveRegister {
-                        offset: 2,
-                        reg: RU::rbp.into(),
-                        stack_offset: 0,
-                    },
-                    UnwindCode::SetFramePointer {
-                        offset: 5,
-                        reg: RU::rbp.into(),
-                    },
-                    UnwindCode::StackAlloc {
-                        offset: 27,
-                        size: 10000
-                    }
+                    (2, UnwindCode::StackAlloc { size: 8 }),
+                    (
+                        2,
+                        UnwindCode::SaveRegister {
+                            reg: RU::rbp.into(),
+                            stack_offset: 0,
+                        }
+                    ),
+                    (
+                        5,
+                        UnwindCode::SetFramePointer {
+                            reg: RU::rbp.into(),
+                        }
+                    ),
+                    (27, UnwindCode::StackAlloc { size: 10000 })
                 ],
                 epilogues_unwind_codes: vec![vec![
-                    UnwindCode::StackDealloc {
-                        offset: 34,
-                        size: 10000
-                    },
-                    UnwindCode::RestoreRegister {
-                        offset: 36,
-                        reg: RU::rbp.into()
-                    },
-                    UnwindCode::StackDealloc {
-                        offset: 36,
-                        size: 8
-                    }
+                    (34, UnwindCode::StackDealloc { size: 10000 }),
+                    (
+                        36,
+                        UnwindCode::RestoreRegister {
+                            reg: RU::rbp.into()
+                        }
+                    ),
+                    (36, UnwindCode::StackDealloc { size: 8 }),
+                    (36, UnwindCode::RestoreFramePointer)
                 ]],
                 function_size: 37,
                 word_size: 8,
+                initial_sp_offset: 8,
             }
         );
     }
@@ -387,37 +393,36 @@ mod tests {
             UnwindInfo {
                 prologue_size: 27,
                 prologue_unwind_codes: vec![
-                    UnwindCode::StackAlloc { offset: 2, size: 8 },
-                    UnwindCode::SaveRegister {
-                        offset: 2,
-                        reg: RU::rbp.into(),
-                        stack_offset: 0,
-                    },
-                    UnwindCode::SetFramePointer {
-                        offset: 5,
-                        reg: RU::rbp.into(),
-                    },
-                    UnwindCode::StackAlloc {
-                        offset: 27,
-                        size: 1000000
-                    }
+                    (2, UnwindCode::StackAlloc { size: 8 }),
+                    (
+                        2,
+                        UnwindCode::SaveRegister {
+                            reg: RU::rbp.into(),
+                            stack_offset: 0,
+                        }
+                    ),
+                    (
+                        5,
+                        UnwindCode::SetFramePointer {
+                            reg: RU::rbp.into(),
+                        }
+                    ),
+                    (27, UnwindCode::StackAlloc { size: 1000000 })
                 ],
                 epilogues_unwind_codes: vec![vec![
-                    UnwindCode::StackDealloc {
-                        offset: 34,
-                        size: 1000000
-                    },
-                    UnwindCode::RestoreRegister {
-                        offset: 36,
-                        reg: RU::rbp.into()
-                    },
-                    UnwindCode::StackDealloc {
-                        offset: 36,
-                        size: 8
-                    }
+                    (34, UnwindCode::StackDealloc { size: 1000000 }),
+                    (
+                        36,
+                        UnwindCode::RestoreRegister {
+                            reg: RU::rbp.into()
+                        }
+                    ),
+                    (36, UnwindCode::StackDealloc { size: 8 }),
+                    (36, UnwindCode::RestoreFramePointer)
                 ]],
                 function_size: 37,
                 word_size: 8,
+                initial_sp_offset: 8,
             }
         );
     }
@@ -458,43 +463,48 @@ mod tests {
             UnwindInfo {
                 prologue_size: 5,
                 prologue_unwind_codes: vec![
-                    UnwindCode::StackAlloc { offset: 2, size: 8 },
-                    UnwindCode::SaveRegister {
-                        offset: 2,
-                        reg: RU::rbp.into(),
-                        stack_offset: 0,
-                    },
-                    UnwindCode::SetFramePointer {
-                        offset: 5,
-                        reg: RU::rbp.into()
-                    }
+                    (2, UnwindCode::StackAlloc { size: 8 }),
+                    (
+                        2,
+                        UnwindCode::SaveRegister {
+                            reg: RU::rbp.into(),
+                            stack_offset: 0,
+                        }
+                    ),
+                    (
+                        5,
+                        UnwindCode::SetFramePointer {
+                            reg: RU::rbp.into()
+                        }
+                    )
                 ],
                 epilogues_unwind_codes: vec![
                     vec![
-                        UnwindCode::RememberState { offset: 12 },
-                        UnwindCode::RestoreRegister {
-                            offset: 12,
-                            reg: RU::rbp.into()
-                        },
-                        UnwindCode::StackDealloc {
-                            offset: 12,
-                            size: 8
-                        },
-                        UnwindCode::RestoreState { offset: 13 }
+                        (12, UnwindCode::RememberState),
+                        (
+                            12,
+                            UnwindCode::RestoreRegister {
+                                reg: RU::rbp.into()
+                            }
+                        ),
+                        (12, UnwindCode::StackDealloc { size: 8 }),
+                        (12, UnwindCode::RestoreFramePointer),
+                        (13, UnwindCode::RestoreState)
                     ],
                     vec![
-                        UnwindCode::RestoreRegister {
-                            offset: 15,
-                            reg: RU::rbp.into()
-                        },
-                        UnwindCode::StackDealloc {
-                            offset: 15,
-                            size: 8
-                        }
+                        (
+                            15,
+                            UnwindCode::RestoreRegister {
+                                reg: RU::rbp.into()
+                            }
+                        ),
+                        (15, UnwindCode::StackDealloc { size: 8 }),
+                        (15, UnwindCode::RestoreFramePointer)
                     ]
                 ],
                 function_size: 16,
                 word_size: 8,
+                initial_sp_offset: 8,
             }
         );
     }
diff --git a/cranelift/codegen/src/isa/x86/unwind/systemv.rs b/cranelift/codegen/src/isa/x86/unwind/systemv.rs
index 3b1266e72..f6333f5af 100644
--- a/cranelift/codegen/src/isa/x86/unwind/systemv.rs
+++ b/cranelift/codegen/src/isa/x86/unwind/systemv.rs
@@ -118,7 +118,7 @@ pub(crate) fn create_unwind_info(
         fn map(&self, reg: RegUnit) -> Result<u16, RegisterMappingError> {
             Ok(map_reg(self.0, reg)?.0)
         }
-        fn rsp(&self) -> u16 {
+        fn sp(&self) -> u16 {
             X86_64::RSP.0
         }
     }
@@ -165,7 +165,7 @@ mod tests {
             _ => panic!("expected unwind information"),
         };
 
-        assert_eq!(format!("{:?}", fde), "FrameDescriptionEntry { address: Constant(1234), length: 16, lsda: None, instructions: [(2, CfaOffset(16)), (2, Offset(Register(6), -16)), (5, CfaRegister(Register(6))), (15, Cfa(Register(7), 8)), (15, SameValue(Register(6)))] }");
+        assert_eq!(format!("{:?}", fde), "FrameDescriptionEntry { address: Constant(1234), length: 16, lsda: None, instructions: [(2, CfaOffset(16)), (2, Offset(Register(6), -16)), (5, CfaRegister(Register(6))), (15, SameValue(Register(6))), (15, Cfa(Register(7), 8))] }");
     }
 
     fn create_function(call_conv: CallConv, stack_slot: Option<StackSlotData>) -> Function {
@@ -205,7 +205,7 @@ mod tests {
             _ => panic!("expected unwind information"),
         };
 
-        assert_eq!(format!("{:?}", fde), "FrameDescriptionEntry { address: Constant(4321), length: 16, lsda: None, instructions: [(2, CfaOffset(16)), (2, Offset(Register(6), -16)), (5, CfaRegister(Register(6))), (12, RememberState), (12, Cfa(Register(7), 8)), (12, SameValue(Register(6))), (13, RestoreState), (15, Cfa(Register(7), 8)), (15, SameValue(Register(6)))] }");
+        assert_eq!(format!("{:?}", fde), "FrameDescriptionEntry { address: Constant(4321), length: 16, lsda: None, instructions: [(2, CfaOffset(16)), (2, Offset(Register(6), -16)), (5, CfaRegister(Register(6))), (12, RememberState), (12, SameValue(Register(6))), (12, Cfa(Register(7), 8)), (13, RestoreState), (15, SameValue(Register(6))), (15, Cfa(Register(7), 8))] }");
     }
 
     fn create_multi_return_function(call_conv: CallConv) -> Function {
diff --git a/cranelift/codegen/src/machinst/adapter.rs b/cranelift/codegen/src/machinst/adapter.rs
index 43ff9e51a..c312f76d4 100644
--- a/cranelift/codegen/src/machinst/adapter.rs
+++ b/cranelift/codegen/src/machinst/adapter.rs
@@ -129,7 +129,7 @@ impl TargetIsa for TargetIsaAdapter {
         self.backend.unsigned_sub_overflow_condition()
     }
 
-    #[cfg(feature = "unwind")]
+    #[cfg(all(feature = "unwind", feature = "x64"))]
     fn create_systemv_cie(&self) -> Option<gimli::write::CommonInformationEntry> {
         self.backend.create_systemv_cie()
     }
diff --git a/cranelift/codegen/src/machinst/buffer.rs b/cranelift/codegen/src/machinst/buffer.rs
index ddf051576..0cc9d240b 100644
--- a/cranelift/codegen/src/machinst/buffer.rs
+++ b/cranelift/codegen/src/machinst/buffer.rs
@@ -142,8 +142,9 @@
 
 use crate::binemit::{Addend, CodeOffset, CodeSink, Reloc, StackMap};
 use crate::ir::{ExternalName, Opcode, SourceLoc, TrapCode};
-use crate::machinst::{BlockIndex, MachInstLabelUse, VCodeInst};
+use crate::machinst::{BlockIndex, MachInstLabelUse, VCodeConstant, VCodeConstants, VCodeInst};
 use crate::timing;
+use cranelift_entity::{entity_impl, SecondaryMap};
 
 use log::trace;
 use smallvec::SmallVec;
@@ -218,6 +219,8 @@ pub struct MachBuffer<I: VCodeInst> {
     /// when the offset has grown past this (`labels_at_tail_off`) point.
     /// Always <= `cur_offset()`.
     labels_at_tail_off: CodeOffset,
+    /// Map used constants to their [MachLabel].
+    constant_labels: SecondaryMap<VCodeConstant, MachLabel>,
 }
 
 /// A `MachBuffer` once emission is completed: holds generated code and records,
@@ -248,6 +251,7 @@ static UNKNOWN_LABEL: MachLabel = MachLabel(0xffff_ffff);
 /// appropriately when the label's location is eventually known.
 #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
 pub struct MachLabel(u32);
+entity_impl!(MachLabel);
 
 impl MachLabel {
     /// Get a label for a block. (The first N MachLabels are always reseved for
@@ -267,6 +271,12 @@ impl MachLabel {
     }
 }
 
+impl Default for MachLabel {
+    fn default() -> Self {
+        UNKNOWN_LABEL
+    }
+}
+
 /// A stack map extent, when creating a stack map.
 pub enum StackMapExtent {
     /// The stack map starts at this instruction, and ends after the number of upcoming bytes
@@ -299,6 +309,7 @@ impl<I: VCodeInst> MachBuffer<I> {
             latest_branches: SmallVec::new(),
             labels_at_tail: SmallVec::new(),
             labels_at_tail_off: 0,
+            constant_labels: SecondaryMap::new(),
         }
     }
 
@@ -468,6 +479,24 @@ impl<I: VCodeInst> MachBuffer<I> {
         // Post-invariant: as for `get_label()`.
     }
 
+    /// Reserve the next N MachLabels for constants.
+    pub fn reserve_labels_for_constants(&mut self, constants: &VCodeConstants) {
+        trace!(
+            "MachBuffer: next {} labels are for constants",
+            constants.len()
+        );
+        for c in constants.keys() {
+            self.constant_labels[c] = self.get_label();
+        }
+
+        // Post-invariant: as for `get_label()`.
+    }
+
+    /// Retrieve the reserved label for a constant.
+    pub fn get_label_for_constant(&self, constant: VCodeConstant) -> MachLabel {
+        self.constant_labels[constant]
+    }
+
     /// Bind a label to the current offset. A label can only be bound once.
     pub fn bind_label(&mut self, label: MachLabel) {
         trace!(
@@ -998,9 +1027,16 @@ impl<I: VCodeInst> MachBuffer<I> {
         data: &[u8],
         max_distance: CodeOffset,
     ) {
-        let deadline = self.cur_offset() + max_distance;
+        trace!(
+            "defer_constant: eventually emit {} bytes aligned to {} at label {:?}",
+            data.len(),
+            align,
+            label
+        );
+        let deadline = self.cur_offset().saturating_add(max_distance);
         self.island_worst_case_size += data.len() as CodeOffset;
-        self.island_worst_case_size &= !(I::LabelUse::ALIGN - 1);
+        self.island_worst_case_size =
+            (self.island_worst_case_size + I::LabelUse::ALIGN - 1) & !(I::LabelUse::ALIGN - 1);
         self.pending_constants.push(MachLabelConstant {
             label,
             align,
@@ -1136,14 +1172,6 @@ impl<I: VCodeInst> MachBuffer<I> {
     pub fn finish(mut self) -> MachBufferFinalized {
         let _tt = timing::vcode_emit_finish();
 
-        // Ensure that all labels are defined. This is a full (release-mode)
-        // assert because we must avoid looping indefinitely below; an
-        // unresolved label will prevent the fixup_records vec from emptying.
-        assert!(self
-            .label_offsets
-            .iter()
-            .all(|&off| off != UNKNOWN_LABEL_OFFSET));
-
         while !self.pending_constants.is_empty() || !self.fixup_records.is_empty() {
             // `emit_island()` will emit any pending veneers and constants, and
             // as a side-effect, will also take care of any fixups with resolved
@@ -1151,6 +1179,11 @@ impl<I: VCodeInst> MachBuffer<I> {
             self.emit_island();
         }
 
+        // Ensure that all labels have been fixed up after the last island is emitted. This is a
+        // full (release-mode) assert because an unresolved label means the emitted code is
+        // incorrect.
+        assert!(self.fixup_records.is_empty());
+
         MachBufferFinalized {
             data: self.data,
             relocs: self.relocs,
diff --git a/cranelift/codegen/src/machinst/lower.rs b/cranelift/codegen/src/machinst/lower.rs
index 01e54e2b8..531085ae4 100644
--- a/cranelift/codegen/src/machinst/lower.rs
+++ b/cranelift/codegen/src/machinst/lower.rs
@@ -13,7 +13,7 @@ use crate::ir::{
 };
 use crate::machinst::{
     ABICallee, BlockIndex, BlockLoweringOrder, LoweredBlock, MachLabel, VCode, VCodeBuilder,
-    VCodeInst,
+    VCodeConstant, VCodeConstantData, VCodeConstants, VCodeInst,
 };
 use crate::CodegenResult;
 
@@ -162,6 +162,8 @@ pub trait LowerCtx {
     fn is_reg_needed(&self, ir_inst: Inst, reg: Reg) -> bool;
     /// Retrieve constant data given a handle.
     fn get_constant_data(&self, constant_handle: Constant) -> &ConstantData;
+    /// Indicate that a constant should be emitted.
+    fn use_constant(&mut self, constant: VCodeConstantData) -> VCodeConstant;
     /// Retrieve the value immediate from an instruction. This will perform necessary lookups on the
     /// `DataFlowGraph` to retrieve even large immediates.
     fn get_immediate(&self, ir_inst: Inst) -> Option<DataValue>;
@@ -318,7 +320,8 @@ impl<'func, I: VCodeInst> Lower<'func, I> {
         emit_info: I::Info,
         block_order: BlockLoweringOrder,
     ) -> CodegenResult<Lower<'func, I>> {
-        let mut vcode = VCodeBuilder::new(abi, emit_info, block_order);
+        let constants = VCodeConstants::with_capacity(f.dfg.constants.len());
+        let mut vcode = VCodeBuilder::new(abi, emit_info, block_order, constants);
 
         let mut next_vreg: u32 = 0;
 
@@ -1010,6 +1013,10 @@ impl<'func, I: VCodeInst> LowerCtx for Lower<'func, I> {
         self.f.dfg.constants.get(constant_handle)
     }
 
+    fn use_constant(&mut self, constant: VCodeConstantData) -> VCodeConstant {
+        self.vcode.constants().insert(constant)
+    }
+
     fn get_immediate(&self, ir_inst: Inst) -> Option<DataValue> {
         let inst_data = self.data(ir_inst);
         match inst_data {
diff --git a/cranelift/codegen/src/machinst/mod.rs b/cranelift/codegen/src/machinst/mod.rs
index 8d36ed651..83b3c6f83 100644
--- a/cranelift/codegen/src/machinst/mod.rs
+++ b/cranelift/codegen/src/machinst/mod.rs
@@ -99,7 +99,7 @@
 use crate::binemit::{CodeInfo, CodeOffset, StackMap};
 use crate::ir::condcodes::IntCC;
 use crate::ir::{Function, Type};
-use crate::isa::unwind;
+use crate::isa::unwind::input as unwind_input;
 use crate::result::CodegenResult;
 use crate::settings::Flags;
 
@@ -314,7 +314,7 @@ pub struct MachCompileResult {
     /// Disassembly, if requested.
     pub disasm: Option<String>,
     /// Unwind info.
-    pub unwind_info: Option<unwind::UnwindInfo>,
+    pub unwind_info: Option<unwind_input::UnwindInfo<Reg>>,
 }
 
 impl MachCompileResult {
@@ -360,6 +360,17 @@ pub trait MachBackend {
     /// Condition that will be true when an IsubIfcout overflows.
     fn unsigned_sub_overflow_condition(&self) -> IntCC;
 
+    /// Produces unwind info based on backend results.
+    #[cfg(feature = "unwind")]
+    fn emit_unwind_info(
+        &self,
+        _result: &MachCompileResult,
+        _kind: UnwindInfoKind,
+    ) -> CodegenResult<Option<crate::isa::unwind::UnwindInfo>> {
+        // By default, an backend cannot produce unwind info.
+        Ok(None)
+    }
+
     /// Machine-specific condcode info needed by TargetIsa.
     /// Creates a new System V Common Information Entry for the ISA.
     #[cfg(feature = "unwind")]
@@ -403,6 +414,5 @@ pub trait UnwindInfoGenerator<I: MachInstEmit> {
     /// emitted instructions.
     fn create_unwind_info(
         context: UnwindInfoContext<I>,
-        kind: UnwindInfoKind,
-    ) -> CodegenResult<Option<unwind::UnwindInfo>>;
+    ) -> CodegenResult<Option<unwind_input::UnwindInfo<Reg>>>;
 }
diff --git a/cranelift/codegen/src/machinst/vcode.rs b/cranelift/codegen/src/machinst/vcode.rs
index df156a2d8..1a34ae988 100644
--- a/cranelift/codegen/src/machinst/vcode.rs
+++ b/cranelift/codegen/src/machinst/vcode.rs
@@ -17,7 +17,7 @@
 //! See the main module comment in `mod.rs` for more details on the VCode-based
 //! backend pipeline.
 
-use crate::ir::{self, types, SourceLoc};
+use crate::ir::{self, types, Constant, ConstantData, SourceLoc};
 use crate::machinst::*;
 use crate::settings;
 use crate::timing;
@@ -31,7 +31,9 @@ use regalloc::{
 
 use alloc::boxed::Box;
 use alloc::{borrow::Cow, vec::Vec};
+use cranelift_entity::{entity_impl, Keys, PrimaryMap};
 use std::cell::RefCell;
+use std::collections::HashMap;
 use std::fmt;
 use std::iter;
 use std::string::String;
@@ -110,6 +112,9 @@ pub struct VCode<I: VCodeInst> {
 
     /// Instruction end offsets
     insts_layout: RefCell<(Vec<u32>, u32)>,
+
+    /// Constants.
+    constants: VCodeConstants,
 }
 
 /// A builder for a VCode function body. This builder is designed for the
@@ -149,9 +154,10 @@ impl<I: VCodeInst> VCodeBuilder<I> {
         abi: Box<dyn ABICallee<I = I>>,
         emit_info: I::Info,
         block_order: BlockLoweringOrder,
+        constants: VCodeConstants,
     ) -> VCodeBuilder<I> {
         let reftype_class = I::ref_type_regclass(abi.flags());
-        let vcode = VCode::new(abi, emit_info, block_order);
+        let vcode = VCode::new(abi, emit_info, block_order, constants);
         let stack_map_info = StackmapRequestInfo {
             reftype_class,
             reftyped_vregs: vec![],
@@ -255,6 +261,11 @@ impl<I: VCodeInst> VCodeBuilder<I> {
         self.cur_srcloc = srcloc;
     }
 
+    /// Access the constants.
+    pub fn constants(&mut self) -> &mut VCodeConstants {
+        &mut self.vcode.constants
+    }
+
     /// Build the final VCode, returning the vcode itself as well as auxiliary
     /// information, such as the stack map request information.
     pub fn build(self) -> (VCode<I>, StackmapRequestInfo) {
@@ -284,6 +295,7 @@ impl<I: VCodeInst> VCode<I> {
         abi: Box<dyn ABICallee<I = I>>,
         emit_info: I::Info,
         block_order: BlockLoweringOrder,
+        constants: VCodeConstants,
     ) -> VCode<I> {
         VCode {
             liveins: abi.liveins(),
@@ -303,6 +315,7 @@ impl<I: VCodeInst> VCode<I> {
             safepoint_slots: vec![],
             prologue_epilogue_ranges: None,
             insts_layout: RefCell::new((vec![], 0)),
+            constants,
         }
     }
 
@@ -466,7 +479,10 @@ impl<I: VCodeInst> VCode<I> {
         let mut buffer = MachBuffer::new();
         let mut state = I::State::new(&*self.abi);
 
-        buffer.reserve_labels_for_blocks(self.num_blocks() as BlockIndex); // first N MachLabels are simply block indices.
+        // The first M MachLabels are reserved for block indices, the next N MachLabels for
+        // constants.
+        buffer.reserve_labels_for_blocks(self.num_blocks() as BlockIndex);
+        buffer.reserve_labels_for_constants(&self.constants);
 
         let mut insts_layout = vec![0; self.insts.len()];
 
@@ -530,6 +546,12 @@ impl<I: VCodeInst> VCode<I> {
             }
         }
 
+        // Emit the constants used by the function.
+        for (constant, data) in self.constants.iter() {
+            let label = buffer.get_label_for_constant(constant);
+            buffer.defer_constant(label, data.alignment(), data.as_slice(), u32::max_value());
+        }
+
         *self.insts_layout.borrow_mut() = (insts_layout, buffer.cur_offset());
 
         buffer
@@ -538,7 +560,7 @@ impl<I: VCodeInst> VCode<I> {
     /// Generates unwind info.
     pub fn unwind_info(
         &self,
-    ) -> crate::result::CodegenResult<Option<crate::isa::unwind::UnwindInfo>> {
+    ) -> crate::result::CodegenResult<Option<crate::isa::unwind::input::UnwindInfo<Reg>>> {
         let layout = &self.insts_layout.borrow();
         let (prologue, epilogues) = self.prologue_epilogue_ranges.as_ref().unwrap();
         let context = UnwindInfoContext {
@@ -548,7 +570,7 @@ impl<I: VCodeInst> VCode<I> {
             prologue: prologue.clone(),
             epilogues,
         };
-        I::UnwindInfo::create_unwind_info(context, self.abi.unwind_info_kind())
+        I::UnwindInfo::create_unwind_info(context)
     }
 
     /// Get the IR block for a BlockIndex, if one exists.
@@ -735,3 +757,141 @@ impl<I: VCodeInst> PrettyPrint for VCode<I> {
         s
     }
 }
+
+/// This structure tracks the large constants used in VCode that will be emitted separately by the
+/// [MachBuffer].
+///
+/// First, during the lowering phase, constants are inserted using
+/// [VCodeConstants.insert]; an intermediate handle, [VCodeConstant], tracks what constants are
+/// used in this phase. Some deduplication is performed, when possible, as constant
+/// values are inserted.
+///
+/// Secondly, during the emission phase, the [MachBuffer] assigns [MachLabel]s for each of the
+/// constants so that instructions can refer to the value's memory location. The [MachBuffer]
+/// then writes the constant values to the buffer.
+#[derive(Default)]
+pub struct VCodeConstants {
+    constants: PrimaryMap<VCodeConstant, VCodeConstantData>,
+    pool_uses: HashMap<Constant, VCodeConstant>,
+    well_known_uses: HashMap<*const [u8], VCodeConstant>,
+}
+impl VCodeConstants {
+    /// Initialize the structure with the expected number of constants.
+    pub fn with_capacity(expected_num_constants: usize) -> Self {
+        Self {
+            constants: PrimaryMap::with_capacity(expected_num_constants),
+            pool_uses: HashMap::with_capacity(expected_num_constants),
+            well_known_uses: HashMap::new(),
+        }
+    }
+
+    /// Insert a constant; using this method indicates that a constant value will be used and thus
+    /// will be emitted to the `MachBuffer`. The current implementation can deduplicate constants
+    /// that are [VCodeConstantData::Pool] or [VCodeConstantData::WellKnown] but not
+    /// [VCodeConstantData::Generated].
+    pub fn insert(&mut self, data: VCodeConstantData) -> VCodeConstant {
+        match data {
+            VCodeConstantData::Generated(_) => self.constants.push(data),
+            VCodeConstantData::Pool(constant, _) => match self.pool_uses.get(&constant) {
+                None => {
+                    let vcode_constant = self.constants.push(data);
+                    self.pool_uses.insert(constant, vcode_constant);
+                    vcode_constant
+                }
+                Some(&vcode_constant) => vcode_constant,
+            },
+            VCodeConstantData::WellKnown(data_ref) => {
+                match self.well_known_uses.get(&(data_ref as *const [u8])) {
+                    None => {
+                        let vcode_constant = self.constants.push(data);
+                        self.well_known_uses
+                            .insert(data_ref as *const [u8], vcode_constant);
+                        vcode_constant
+                    }
+                    Some(&vcode_constant) => vcode_constant,
+                }
+            }
+        }
+    }
+
+    /// Retrieve a byte slice for the given [VCodeConstant], if available.
+    pub fn get(&self, constant: VCodeConstant) -> Option<&[u8]> {
+        self.constants.get(constant).map(|d| d.as_slice())
+    }
+
+    /// Return the number of constants inserted.
+    pub fn len(&self) -> usize {
+        self.constants.len()
+    }
+
+    /// Iterate over the [VCodeConstant] keys inserted in this structure.
+    pub fn keys(&self) -> Keys<VCodeConstant> {
+        self.constants.keys()
+    }
+
+    /// Iterate over the [VCodeConstant] keys and the data (as a byte slice) inserted in this
+    /// structure.
+    pub fn iter(&self) -> impl Iterator<Item = (VCodeConstant, &VCodeConstantData)> {
+        self.constants.iter()
+    }
+}
+
+/// A use of a constant by one or more VCode instructions; see [VCodeConstants].
+#[derive(Clone, Copy, Debug, PartialEq, Eq)]
+pub struct VCodeConstant(u32);
+entity_impl!(VCodeConstant);
+
+/// Identify the different types of constant that can be inserted into [VCodeConstants]. Tracking
+/// these separately instead of as raw byte buffers allows us to avoid some duplication.
+pub enum VCodeConstantData {
+    /// A constant already present in the Cranelift IR
+    /// [ConstantPool](crate::ir::constant::ConstantPool).
+    Pool(Constant, ConstantData),
+    /// A reference to a well-known constant value that is statically encoded within the compiler.
+    WellKnown(&'static [u8]),
+    /// A constant value generated during lowering; the value may depend on the instruction context
+    /// which makes it difficult to de-duplicate--if possible, use other variants.
+    Generated(ConstantData),
+}
+impl VCodeConstantData {
+    /// Retrieve the constant data as a byte slice.
+    pub fn as_slice(&self) -> &[u8] {
+        match self {
+            VCodeConstantData::Pool(_, d) | VCodeConstantData::Generated(d) => d.as_slice(),
+            VCodeConstantData::WellKnown(d) => d,
+        }
+    }
+
+    /// Calculate the alignment of the constant data.
+    pub fn alignment(&self) -> u32 {
+        if self.as_slice().len() <= 8 {
+            8
+        } else {
+            16
+        }
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use super::*;
+    use std::mem::{size_of, size_of_val};
+
+    #[test]
+    fn size_of_constant_structs() {
+        assert_eq!(size_of::<Constant>(), 4);
+        assert_eq!(size_of::<VCodeConstant>(), 4);
+        assert_eq!(size_of::<ConstantData>(), 24);
+        assert_eq!(size_of::<VCodeConstantData>(), 32);
+        assert_eq!(
+            size_of::<PrimaryMap<VCodeConstant, VCodeConstantData>>(),
+            24
+        );
+        assert_eq!(size_of::<HashMap<Constant, VCodeConstant>>(), 48);
+        assert_eq!(size_of::<HashMap<*const [u8], VCodeConstant>>(), 48);
+        assert_eq!(size_of::<VCodeConstants>(), 120);
+        assert_eq!(size_of_val(&VCodeConstants::with_capacity(0)), 120);
+        // TODO This structure could use some significant memory-size optimization. The use of
+        // HashMap to deduplicate both pool and well-known constants is clearly an issue.
+    }
+}
diff --git a/cranelift/entity/Cargo.toml b/cranelift/entity/Cargo.toml
index 6be7f62e1..90776e1cf 100644
--- a/cranelift/entity/Cargo.toml
+++ b/cranelift/entity/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["The Cranelift Project Developers"]
 name = "cranelift-entity"
-version = "0.67.0"
+version = "0.68.0"
 description = "Data structures using entity references as mapping keys"
 license = "Apache-2.0 WITH LLVM-exception"
 documentation = "https://docs.rs/cranelift-entity"
diff --git a/cranelift/frontend/Cargo.toml b/cranelift/frontend/Cargo.toml
index 4a17cc1e0..d92665fc8 100644
--- a/cranelift/frontend/Cargo.toml
+++ b/cranelift/frontend/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["The Cranelift Project Developers"]
 name = "cranelift-frontend"
-version = "0.67.0"
+version = "0.68.0"
 description = "Cranelift IR builder helper"
 license = "Apache-2.0 WITH LLVM-exception"
 documentation = "https://docs.rs/cranelift-frontend"
@@ -11,7 +11,7 @@ readme = "README.md"
 edition = "2018"
 
 [dependencies]
-cranelift-codegen = { path = "../codegen", version = "0.67.0", default-features = false }
+cranelift-codegen = { path = "../codegen", version = "0.68.0", default-features = false }
 target-lexicon = "0.11"
 log = { version = "0.4.6", default-features = false }
 hashbrown = { version = "0.9.1", optional = true }
diff --git a/cranelift/interpreter/Cargo.toml b/cranelift/interpreter/Cargo.toml
index 64f49f903..1a95e4b74 100644
--- a/cranelift/interpreter/Cargo.toml
+++ b/cranelift/interpreter/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "cranelift-interpreter"
-version = "0.67.0"
+version = "0.68.0"
 authors = ["The Cranelift Project Developers"]
 description = "Interpret Cranelift IR"
 repository = "https://github.com/bytecodealliance/wasmtime"
@@ -11,15 +11,15 @@ readme = "README.md"
 edition = "2018"
 
 [dependencies]
-cranelift-codegen = { path = "../codegen", version = "0.67.0", features = ["all-arch"] }
-cranelift-entity = { path = "../entity", version = "0.67.0" }
-cranelift-reader = { path = "../reader", version = "0.67.0" }
+cranelift-codegen = { path = "../codegen", version = "0.68.0", features = ["all-arch"] }
+cranelift-entity = { path = "../entity", version = "0.68.0" }
+cranelift-reader = { path = "../reader", version = "0.68.0" }
 log = { version = "0.4.8", default-features = false }
 smallvec = "1.4.2"
 thiserror = "1.0.15"
 
 [dev-dependencies]
-cranelift-frontend = { path = "../frontend", version = "0.67.0" }
+cranelift-frontend = { path = "../frontend", version = "0.68.0" }
 
 [badges]
 maintenance = { status = "experimental" }
diff --git a/cranelift/module/Cargo.toml b/cranelift/module/Cargo.toml
index afa146da0..2a77b61d6 100644
--- a/cranelift/module/Cargo.toml
+++ b/cranelift/module/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "cranelift-module"
-version = "0.67.0"
+version = "0.68.0"
 authors = ["The Cranelift Project Developers"]
 description = "Support for linking functions and data with Cranelift"
 repository = "https://github.com/bytecodealliance/wasmtime"
@@ -11,8 +11,8 @@ readme = "README.md"
 edition = "2018"
 
 [dependencies]
-cranelift-codegen = { path = "../codegen", version = "0.67.0", default-features = false }
-cranelift-entity = { path = "../entity", version = "0.67.0" }
+cranelift-codegen = { path = "../codegen", version = "0.68.0", default-features = false }
+cranelift-entity = { path = "../entity", version = "0.68.0" }
 hashbrown = { version = "0.9.1", optional = true }
 log = { version = "0.4.6", default-features = false }
 thiserror = "1.0.4"
diff --git a/cranelift/native/Cargo.toml b/cranelift/native/Cargo.toml
index d4a69e760..338cd05a3 100644
--- a/cranelift/native/Cargo.toml
+++ b/cranelift/native/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "cranelift-native"
-version = "0.67.0"
+version = "0.68.0"
 authors = ["The Cranelift Project Developers"]
 description = "Support for targeting the host with Cranelift"
 documentation = "https://docs.rs/cranelift-native"
@@ -11,11 +11,11 @@ readme = "README.md"
 edition = "2018"
 
 [dependencies]
-cranelift-codegen = { path = "../codegen", version = "0.67.0", default-features = false }
+cranelift-codegen = { path = "../codegen", version = "0.68.0", default-features = false }
 target-lexicon = "0.11"
 
 [target.'cfg(any(target_arch = "x86", target_arch = "x86_64"))'.dependencies]
-raw-cpuid = "7.0.3"
+raw-cpuid = "8.1.2"
 
 [features]
 default = ["std"]
diff --git a/cranelift/object/Cargo.toml b/cranelift/object/Cargo.toml
index 7257652a4..2b1bb0598 100644
--- a/cranelift/object/Cargo.toml
+++ b/cranelift/object/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "cranelift-object"
-version = "0.67.0"
+version = "0.68.0"
 authors = ["The Cranelift Project Developers"]
 description = "Emit Cranelift output to native object files with `object`"
 repository = "https://github.com/bytecodealliance/wasmtime"
@@ -10,9 +10,9 @@ readme = "README.md"
 edition = "2018"
 
 [dependencies]
-cranelift-module = { path = "../module", version = "0.67.0" }
-cranelift-codegen = { path = "../codegen", version = "0.67.0", default-features = false, features = ["std"] }
-object = { version = "0.21.1", default-features = false, features = ["write"] }
+cranelift-module = { path = "../module", version = "0.68.0" }
+cranelift-codegen = { path = "../codegen", version = "0.68.0", default-features = false, features = ["std"] }
+object = { version = "0.22.0", default-features = false, features = ["write"] }
 target-lexicon = "0.11"
 anyhow = "1.0"
 log = { version = "0.4.6", default-features = false }
diff --git a/cranelift/peepmatic/Cargo.toml b/cranelift/peepmatic/Cargo.toml
index 30e1e9b91..4a4f87235 100644
--- a/cranelift/peepmatic/Cargo.toml
+++ b/cranelift/peepmatic/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "peepmatic"
-version = "0.67.0"
+version = "0.68.0"
 authors = ["Nick Fitzgerald <fitzgen@gmail.com>"]
 edition = "2018"
 license = "Apache-2.0 WITH LLVM-exception"
@@ -10,13 +10,13 @@ description = "DSL and compiler for generating peephole optimizers"
 
 [dependencies]
 anyhow = "1.0.27"
-peepmatic-automata = { version = "0.67.0", path = "crates/automata", features = ["dot"] }
-peepmatic-macro = { version = "0.67.0", path = "crates/macro" }
-peepmatic-runtime = { version = "0.67.0", path = "crates/runtime", features = ["construct"] }
-peepmatic-traits = { version = "0.67.0", path = "crates/traits" }
+peepmatic-automata = { version = "0.68.0", path = "crates/automata", features = ["dot"] }
+peepmatic-macro = { version = "0.68.0", path = "crates/macro" }
+peepmatic-runtime = { version = "0.68.0", path = "crates/runtime", features = ["construct"] }
+peepmatic-traits = { version = "0.68.0", path = "crates/traits" }
 serde = { version = "1.0.105", features = ["derive"] }
 wast = "26.0.1"
 z3 = { version = "0.7.1", features = ["static-link-z3"] }
 
 [dev-dependencies]
-peepmatic-test-operator = { version = "0.67.0", path = "crates/test-operator" }
+peepmatic-test-operator = { version = "0.68.0", path = "crates/test-operator" }
diff --git a/cranelift/peepmatic/crates/automata/Cargo.toml b/cranelift/peepmatic/crates/automata/Cargo.toml
index c24a624ab..ca5e67c59 100644
--- a/cranelift/peepmatic/crates/automata/Cargo.toml
+++ b/cranelift/peepmatic/crates/automata/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "peepmatic-automata"
-version = "0.67.0"
+version = "0.68.0"
 authors = ["Nick Fitzgerald <fitzgen@gmail.com>"]
 edition = "2018"
 license = "Apache-2.0 WITH LLVM-exception"
diff --git a/cranelift/peepmatic/crates/fuzzing/Cargo.toml b/cranelift/peepmatic/crates/fuzzing/Cargo.toml
index 606d0ac73..b5b3739a7 100644
--- a/cranelift/peepmatic/crates/fuzzing/Cargo.toml
+++ b/cranelift/peepmatic/crates/fuzzing/Cargo.toml
@@ -10,7 +10,7 @@ publish = false
 [dependencies]
 arbitrary = { version = "0.4.1", features = ["derive"] }
 bincode = "1.2.1"
-env_logger = "0.7.1"
+env_logger = "0.8.1"
 fst = "0.4.1"
 log = "0.4.8"
 peepmatic = { path = "../.." }
diff --git a/cranelift/peepmatic/crates/macro/Cargo.toml b/cranelift/peepmatic/crates/macro/Cargo.toml
index 30b45842c..cd8760e7e 100644
--- a/cranelift/peepmatic/crates/macro/Cargo.toml
+++ b/cranelift/peepmatic/crates/macro/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "peepmatic-macro"
-version = "0.67.0"
+version = "0.68.0"
 authors = ["Nick Fitzgerald <fitzgen@gmail.com>"]
 edition = "2018"
 license = "Apache-2.0 WITH LLVM-exception"
diff --git a/cranelift/peepmatic/crates/runtime/Cargo.toml b/cranelift/peepmatic/crates/runtime/Cargo.toml
index 4145e2add..cbf29962e 100644
--- a/cranelift/peepmatic/crates/runtime/Cargo.toml
+++ b/cranelift/peepmatic/crates/runtime/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "peepmatic-runtime"
-version = "0.67.0"
+version = "0.68.0"
 authors = ["Nick Fitzgerald <fitzgen@gmail.com>"]
 edition = "2018"
 license = "Apache-2.0 WITH LLVM-exception"
@@ -12,14 +12,14 @@ description = "Runtime support for peepmatic peephole optimizers"
 bincode = "1.2.1"
 bumpalo = "3.2.0"
 log = "0.4.8"
-peepmatic-automata = { version = "0.67.0", path = "../automata", features = ["serde"] }
-peepmatic-traits = { version = "0.67.0", path = "../traits" }
+peepmatic-automata = { version = "0.68.0", path = "../automata", features = ["serde"] }
+peepmatic-traits = { version = "0.68.0", path = "../traits" }
 serde = { version = "1.0.105", features = ["derive"] }
 thiserror = "1.0.15"
 wast = { version = "26.0.1", optional = true }
 
 [dev-dependencies]
-peepmatic-test-operator = { version = "0.67.0", path = "../test-operator" }
+peepmatic-test-operator = { version = "0.68.0", path = "../test-operator" }
 serde_test = "1.0.114"
 
 [features]
diff --git a/cranelift/peepmatic/crates/souper/Cargo.toml b/cranelift/peepmatic/crates/souper/Cargo.toml
index 5bb36cb0d..d018abe85 100644
--- a/cranelift/peepmatic/crates/souper/Cargo.toml
+++ b/cranelift/peepmatic/crates/souper/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "peepmatic-souper"
-version = "0.67.0"
+version = "0.68.0"
 authors = ["Nick Fitzgerald <fitzgen@gmail.com>"]
 edition = "2018"
 license = "Apache-2.0 WITH LLVM-exception"
@@ -14,6 +14,6 @@ souper-ir = { version = "1", features = ["parse"] }
 log = "0.4.8"
 
 [dev-dependencies]
-peepmatic = { path = "../..", version = "0.67.0" }
-peepmatic-test-operator = { version = "0.67.0", path = "../test-operator" }
+peepmatic = { path = "../..", version = "0.68.0" }
+peepmatic-test-operator = { version = "0.68.0", path = "../test-operator" }
 wast = "26.0.1"
diff --git a/cranelift/peepmatic/crates/traits/Cargo.toml b/cranelift/peepmatic/crates/traits/Cargo.toml
index 187d03081..0b2330baf 100644
--- a/cranelift/peepmatic/crates/traits/Cargo.toml
+++ b/cranelift/peepmatic/crates/traits/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "peepmatic-traits"
-version = "0.67.0"
+version = "0.68.0"
 authors = ["Nick Fitzgerald <fitzgen@gmail.com>"]
 edition = "2018"
 license = "Apache-2.0 WITH LLVM-exception"
diff --git a/cranelift/preopt/Cargo.toml b/cranelift/preopt/Cargo.toml
index c71e9d9b0..a91d2e1d5 100644
--- a/cranelift/preopt/Cargo.toml
+++ b/cranelift/preopt/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["The Cranelift Project Developers"]
 name = "cranelift-preopt"
-version = "0.67.0"
+version = "0.68.0"
 description = "Support for optimizations in Cranelift"
 license = "Apache-2.0 WITH LLVM-exception"
 documentation = "https://docs.rs/cranelift-preopt"
@@ -12,8 +12,8 @@ keywords = ["optimize", "compile", "compiler", "jit"]
 edition = "2018"
 
 [dependencies]
-cranelift-codegen = { path = "../codegen", version = "0.67.0", default-features = false }
-cranelift-entity = { path = "../entity", version = "0.67.0" }
+cranelift-codegen = { path = "../codegen", version = "0.68.0", default-features = false }
+cranelift-entity = { path = "../entity", version = "0.68.0" }
 # This is commented out because it doesn't build on Rust 1.25.0, which
 # cranelift currently supports.
 # rustc_apfloat = { version = "0.1.2", default-features = false }
diff --git a/cranelift/reader/Cargo.toml b/cranelift/reader/Cargo.toml
index 2b75bb32b..2681b9b8c 100644
--- a/cranelift/reader/Cargo.toml
+++ b/cranelift/reader/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["The Cranelift Project Developers"]
 name = "cranelift-reader"
-version = "0.67.0"
+version = "0.68.0"
 description = "Cranelift textual IR reader"
 license = "Apache-2.0 WITH LLVM-exception"
 documentation = "https://docs.rs/cranelift-reader"
@@ -10,7 +10,7 @@ readme = "README.md"
 edition = "2018"
 
 [dependencies]
-cranelift-codegen = { path = "../codegen", version = "0.67.0" }
+cranelift-codegen = { path = "../codegen", version = "0.68.0" }
 smallvec = "1.0.0"
 target-lexicon = "0.11"
 thiserror = "1.0.15"
diff --git a/cranelift/serde/Cargo.toml b/cranelift/serde/Cargo.toml
index cf1032a8e..6e1c06cb6 100644
--- a/cranelift/serde/Cargo.toml
+++ b/cranelift/serde/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "cranelift-serde"
-version = "0.67.0"
+version = "0.68.0"
 authors = ["The Cranelift Project Developers"]
 description = "Serializer/Deserializer for Cranelift IR"
 repository = "https://github.com/bytecodealliance/wasmtime"
@@ -18,8 +18,8 @@ clap = "2.32.0"
 serde = "1.0.8"
 serde_derive = "1.0.75"
 serde_json = "1.0.26"
-cranelift-codegen = { path = "../codegen", version = "0.67.0" }
-cranelift-reader = { path = "../reader", version = "0.67.0" }
+cranelift-codegen = { path = "../codegen", version = "0.68.0" }
+cranelift-reader = { path = "../reader", version = "0.68.0" }
 
 [badges]
 maintenance = { status = "experimental" }
diff --git a/cranelift/simplejit/Cargo.toml b/cranelift/simplejit/Cargo.toml
index 623a56add..9c7bea2c3 100644
--- a/cranelift/simplejit/Cargo.toml
+++ b/cranelift/simplejit/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "cranelift-simplejit"
-version = "0.67.0"
+version = "0.68.0"
 authors = ["The Cranelift Project Developers"]
 description = "A simple JIT library backed by Cranelift"
 repository = "https://github.com/bytecodealliance/wasmtime"
@@ -10,10 +10,10 @@ readme = "README.md"
 edition = "2018"
 
 [dependencies]
-cranelift-module = { path = "../module", version = "0.67.0" }
-cranelift-native = { path = "../native", version = "0.67.0" }
-cranelift-codegen = { path = "../codegen", version = "0.67.0", default-features = false, features = ["std"] }
-cranelift-entity = { path = "../entity", version = "0.67.0" }
+cranelift-module = { path = "../module", version = "0.68.0" }
+cranelift-native = { path = "../native", version = "0.68.0" }
+cranelift-codegen = { path = "../codegen", version = "0.68.0", default-features = false, features = ["std"] }
+cranelift-entity = { path = "../entity", version = "0.68.0" }
 region = "2.2.0"
 libc = { version = "0.2.42" }
 errno = "0.2.4"
@@ -29,9 +29,9 @@ selinux-fix = ['memmap']
 default = []
 
 [dev-dependencies]
-cranelift = { path = "../umbrella", version = "0.67.0" }
-cranelift-frontend = { path = "../frontend", version = "0.67.0" }
-cranelift-entity = { path = "../entity", version = "0.67.0" }
+cranelift = { path = "../umbrella", version = "0.68.0" }
+cranelift-frontend = { path = "../frontend", version = "0.68.0" }
+cranelift-entity = { path = "../entity", version = "0.68.0" }
 
 [badges]
 maintenance = { status = "experimental" }
diff --git a/cranelift/umbrella/Cargo.toml b/cranelift/umbrella/Cargo.toml
index bafe45104..4af4b7819 100644
--- a/cranelift/umbrella/Cargo.toml
+++ b/cranelift/umbrella/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 authors = ["The Cranelift Project Developers"]
 name = "cranelift"
-version = "0.67.0"
+version = "0.68.0"
 description = "Umbrella for commonly-used cranelift crates"
 license = "Apache-2.0 WITH LLVM-exception"
 documentation = "https://docs.rs/cranelift"
@@ -12,8 +12,8 @@ keywords = ["compile", "compiler", "jit"]
 edition = "2018"
 
 [dependencies]
-cranelift-codegen = { path = "../codegen", version = "0.67.0", default-features = false }
-cranelift-frontend = { path = "../frontend", version = "0.67.0", default-features = false }
+cranelift-codegen = { path = "../codegen", version = "0.68.0", default-features = false }
+cranelift-frontend = { path = "../frontend", version = "0.68.0", default-features = false }
 
 [features]
 default = ["std"]
diff --git a/cranelift/wasm/Cargo.toml b/cranelift/wasm/Cargo.toml
index 43b499384..e15cb4d5b 100644
--- a/cranelift/wasm/Cargo.toml
+++ b/cranelift/wasm/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "cranelift-wasm"
-version = "0.67.0"
+version = "0.68.0"
 authors = ["The Cranelift Project Developers"]
 description = "Translator from WebAssembly to Cranelift IR"
 documentation = "https://docs.rs/cranelift-wasm"
@@ -13,9 +13,9 @@ edition = "2018"
 
 [dependencies]
 wasmparser = { version = "0.65.0", default-features = false }
-cranelift-codegen = { path = "../codegen", version = "0.67.0", default-features = false }
-cranelift-entity = { path = "../entity", version = "0.67.0" }
-cranelift-frontend = { path = "../frontend", version = "0.67.0", default-features = false }
+cranelift-codegen = { path = "../codegen", version = "0.68.0", default-features = false }
+cranelift-entity = { path = "../entity", version = "0.68.0" }
+cranelift-frontend = { path = "../frontend", version = "0.68.0", default-features = false }
 hashbrown = { version = "0.9.1", optional = true }
 itertools = "0.9.0"
 log = { version = "0.4.6", default-features = false }
@@ -27,7 +27,7 @@ thiserror = "1.0.4"
 wat = "1.0.23"
 target-lexicon = "0.11"
 # Enable the riscv feature for cranelift-codegen, as some tests require it
-cranelift-codegen = { path = "../codegen", version = "0.67.0", default-features = false, features = ["riscv"] }
+cranelift-codegen = { path = "../codegen", version = "0.68.0", default-features = false, features = ["riscv"] }
 
 [features]
 default = ["std"]
diff --git a/crates/c-api/Cargo.toml b/crates/c-api/Cargo.toml
index 1e0dd86b1..14324ca0e 100644
--- a/crates/c-api/Cargo.toml
+++ b/crates/c-api/Cargo.toml
@@ -17,7 +17,7 @@ test = false
 doctest = false
 
 [dependencies]
-env_logger = "0.7"
+env_logger = "0.8"
 anyhow = "1.0"
 once_cell = "1.3"
 wasmtime = { path = "../wasmtime", default-features = false }
diff --git a/crates/c-api/src/types/func.rs b/crates/c-api/src/types/func.rs
index 0417e3ac3..1b4ca752f 100644
--- a/crates/c-api/src/types/func.rs
+++ b/crates/c-api/src/types/func.rs
@@ -54,17 +54,9 @@ pub extern "C" fn wasm_functype_new(
     params: &mut wasm_valtype_vec_t,
     results: &mut wasm_valtype_vec_t,
 ) -> Box<wasm_functype_t> {
-    let params = params
-        .take()
-        .into_iter()
-        .map(|vt| vt.unwrap().ty.clone())
-        .collect::<Vec<_>>();
-    let results = results
-        .take()
-        .into_iter()
-        .map(|vt| vt.unwrap().ty.clone())
-        .collect::<Vec<_>>();
-    let functype = FuncType::new(params.into_boxed_slice(), results.into_boxed_slice());
+    let params = params.take().into_iter().map(|vt| vt.unwrap().ty.clone());
+    let results = results.take().into_iter().map(|vt| vt.unwrap().ty.clone());
+    let functype = FuncType::new(params, results);
     Box::new(wasm_functype_t::new(functype))
 }
 
@@ -74,7 +66,6 @@ pub extern "C" fn wasm_functype_params(ft: &wasm_functype_t) -> &wasm_valtype_ve
     ft.params_cache.get_or_init(|| {
         ft.ty
             .params()
-            .iter()
             .map(|p| Some(Box::new(wasm_valtype_t { ty: p.clone() })))
             .collect::<Vec<_>>()
             .into()
@@ -87,7 +78,6 @@ pub extern "C" fn wasm_functype_results(ft: &wasm_functype_t) -> &wasm_valtype_v
     ft.returns_cache.get_or_init(|| {
         ft.ty
             .results()
-            .iter()
             .map(|p| Some(Box::new(wasm_valtype_t { ty: p.clone() })))
             .collect::<Vec<_>>()
             .into()
diff --git a/crates/cache/Cargo.toml b/crates/cache/Cargo.toml
index cc3798857..98247d170 100644
--- a/crates/cache/Cargo.toml
+++ b/crates/cache/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasmtime-cache"
-version = "0.20.0"
+version = "0.21.0"
 authors = ["The Wasmtime Project Developers"]
 description = "Support for automatic module caching with Wasmtime"
 license = "Apache-2.0 WITH LLVM-exception"
@@ -10,13 +10,13 @@ edition = "2018"
 
 [dependencies]
 anyhow = "1.0"
-base64 = "0.12.0"
+base64 = "0.13.0"
 bincode = "1.1.4"
-directories-next = "1.0"
+directories-next = "2.0"
 file-per-thread-logger = "0.1.1"
 log = { version = "0.4.8", default-features = false }
 serde = { version = "1.0.94", features = ["derive"] }
-sha2 = "0.8.0"
+sha2 = "0.9.0"
 toml = "0.5.5"
 zstd = "0.5"
 
diff --git a/crates/cache/src/lib.rs b/crates/cache/src/lib.rs
index e1186ce28..9fe69c5ba 100644
--- a/crates/cache/src/lib.rs
+++ b/crates/cache/src/lib.rs
@@ -50,7 +50,7 @@ impl<'config> ModuleCacheEntry<'config> {
     {
         let mut hasher = Sha256Hasher(Sha256::new());
         state.hash(&mut hasher);
-        let hash: [u8; 32] = hasher.0.result().into();
+        let hash: [u8; 32] = hasher.0.finalize().into();
         // standard encoding uses '/' which can't be used for filename
         let hash = base64::encode_config(&hash, base64::URL_SAFE_NO_PAD);
 
@@ -181,7 +181,7 @@ impl Hasher for Sha256Hasher {
     }
 
     fn write(&mut self, bytes: &[u8]) {
-        self.0.input(bytes);
+        self.0.update(bytes);
     }
 }
 
diff --git a/crates/cranelift/Cargo.toml b/crates/cranelift/Cargo.toml
index e73b9f727..7bd2ee1f7 100644
--- a/crates/cranelift/Cargo.toml
+++ b/crates/cranelift/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasmtime-cranelift"
-version = "0.20.0"
+version = "0.21.0"
 authors = ["The Wasmtime Project Developers"]
 description = "Integration between Cranelift and Wasmtime"
 license = "Apache-2.0 WITH LLVM-exception"
@@ -12,8 +12,8 @@ readme = "README.md"
 edition = "2018"
 
 [dependencies]
-wasmtime-environ = { path = "../environ", version = "0.20.0" }
-cranelift-wasm = { path = "../../cranelift/wasm", version = "0.67.0" }
-cranelift-codegen = { path = "../../cranelift/codegen", version = "0.67.0" }
-cranelift-frontend = { path = "../../cranelift/frontend", version = "0.67.0" }
-cranelift-entity = { path = "../../cranelift/entity", version = "0.67.0" }
+wasmtime-environ = { path = "../environ", version = "0.21.0" }
+cranelift-wasm = { path = "../../cranelift/wasm", version = "0.68.0" }
+cranelift-codegen = { path = "../../cranelift/codegen", version = "0.68.0" }
+cranelift-frontend = { path = "../../cranelift/frontend", version = "0.68.0" }
+cranelift-entity = { path = "../../cranelift/entity", version = "0.68.0" }
diff --git a/crates/debug/Cargo.toml b/crates/debug/Cargo.toml
index 6aef209cf..ced86dd08 100644
--- a/crates/debug/Cargo.toml
+++ b/crates/debug/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasmtime-debug"
-version = "0.20.0"
+version = "0.21.0"
 authors = ["The Wasmtime Project Developers"]
 description = "Debug utils for WebAsssembly code in Cranelift"
 license = "Apache-2.0 WITH LLVM-exception"
@@ -12,10 +12,10 @@ readme = "README.md"
 edition = "2018"
 
 [dependencies]
-gimli = "0.22.0"
+gimli = "0.23.0"
 wasmparser = "0.65.0"
-object = { version = "0.21.1", default-features = false, features = ["read", "write"] }
-wasmtime-environ = { path = "../environ", version = "0.20.0" }
+object = { version = "0.22.0", default-features = false, features = ["read", "write"] }
+wasmtime-environ = { path = "../environ", version = "0.21.0" }
 target-lexicon = { version = "0.11.0", default-features = false }
 anyhow = "1.0"
 thiserror = "1.0.4"
diff --git a/crates/debug/src/gc.rs b/crates/debug/src/gc.rs
index 2df29c625..491d58579 100644
--- a/crates/debug/src/gc.rs
+++ b/crates/debug/src/gc.rs
@@ -78,7 +78,7 @@ pub fn build_dependencies<R: Reader<Offset = usize>>(
 }
 
 fn build_unit_dependencies<R: Reader<Offset = usize>>(
-    header: read::CompilationUnitHeader<R>,
+    header: read::UnitHeader<R>,
     dwarf: &read::Dwarf<R>,
     at: &AddressTransform,
     deps: &mut Dependencies,
diff --git a/crates/debug/src/lib.rs b/crates/debug/src/lib.rs
index 259c86975..597ab2e25 100644
--- a/crates/debug/src/lib.rs
+++ b/crates/debug/src/lib.rs
@@ -37,16 +37,16 @@ fn relocate_dwarf_sections(
     defined_funcs_offset: usize,
     funcs: &[*const u8],
 ) -> Result<(), Error> {
-    use object::read::{File, Object, ObjectSection, RelocationTarget};
+    use object::read::{File, Object, ObjectSection, ObjectSymbol, RelocationTarget};
 
     let obj = File::parse(bytes)?;
     let mut func_symbols = HashMap::new();
-    for (id, sym) in obj.symbols() {
+    for sym in obj.symbols() {
         match (sym.name(), sym.section_index()) {
-            (Some(name), Some(_section_index)) if name.starts_with("_wasm_function_") => {
+            (Ok(name), Some(_section_index)) if name.starts_with("_wasm_function_") => {
                 let index = name["_wasm_function_".len()..].parse::<usize>()?;
                 let data = funcs[index - defined_funcs_offset];
-                func_symbols.insert(id, data);
+                func_symbols.insert(sym.index(), data);
             }
             _ => (),
         }
diff --git a/crates/debug/src/transform/refs.rs b/crates/debug/src/transform/refs.rs
index 4fa0ce99d..027c82147 100644
--- a/crates/debug/src/transform/refs.rs
+++ b/crates/debug/src/transform/refs.rs
@@ -1,7 +1,7 @@
 //! Helper utils for tracking and patching intra unit or section references.
 
 use gimli::write;
-use gimli::{CompilationUnitHeader, DebugInfoOffset, Reader, UnitOffset};
+use gimli::{DebugInfoOffset, Reader, UnitHeader, UnitOffset};
 use std::collections::HashMap;
 
 /// Stores compiled unit references: UnitEntryId+DwAt denotes a patch location
@@ -76,17 +76,15 @@ impl DebugInfoRefsMap {
             map: HashMap::new(),
         }
     }
-    pub fn insert<R>(
-        &mut self,
-        unit: &CompilationUnitHeader<R>,
-        unit_id: write::UnitId,
-        unit_map: UnitRefsMap,
-    ) where
+    pub fn insert<R>(&mut self, unit: &UnitHeader<R>, unit_id: write::UnitId, unit_map: UnitRefsMap)
+    where
         R: Reader<Offset = usize>,
     {
         self.map
             .extend(unit_map.map.into_iter().map(|(off, entry_id)| {
-                let off = off.to_debug_info_offset(unit);
+                let off = off
+                    .to_debug_info_offset(unit)
+                    .expect("should be in debug_info section");
                 (off, (unit_id, entry_id))
             }));
     }
diff --git a/crates/environ/Cargo.toml b/crates/environ/Cargo.toml
index 3342e5b60..b2638909f 100644
--- a/crates/environ/Cargo.toml
+++ b/crates/environ/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasmtime-environ"
-version = "0.20.0"
+version = "0.21.0"
 authors = ["The Wasmtime Project Developers"]
 description = "Standalone environment support for WebAsssembly code in Cranelift"
 license = "Apache-2.0 WITH LLVM-exception"
@@ -13,9 +13,9 @@ edition = "2018"
 
 [dependencies]
 anyhow = "1.0"
-cranelift-codegen = { path = "../../cranelift/codegen", version = "0.67.0", features = ["enable-serde"] }
-cranelift-entity = { path = "../../cranelift/entity", version = "0.67.0", features = ["enable-serde"] }
-cranelift-wasm = { path = "../../cranelift/wasm", version = "0.67.0", features = ["enable-serde"] }
+cranelift-codegen = { path = "../../cranelift/codegen", version = "0.68.0", features = ["enable-serde"] }
+cranelift-entity = { path = "../../cranelift/entity", version = "0.68.0", features = ["enable-serde"] }
+cranelift-wasm = { path = "../../cranelift/wasm", version = "0.68.0", features = ["enable-serde"] }
 wasmparser = "0.65.0"
 indexmap = { version = "1.0.2", features = ["serde-1"] }
 thiserror = "1.0.4"
@@ -23,7 +23,7 @@ serde = { version = "1.0.94", features = ["derive"] }
 log = { version = "0.4.8", default-features = false }
 more-asserts = "0.2.1"
 cfg-if = "1.0"
-gimli = "0.22"
+gimli = "0.23"
 
 [badges]
 maintenance = { status = "actively-developed" }
diff --git a/crates/fuzzing/Cargo.toml b/crates/fuzzing/Cargo.toml
index 5ae91938c..bac97cad1 100644
--- a/crates/fuzzing/Cargo.toml
+++ b/crates/fuzzing/Cargo.toml
@@ -9,7 +9,7 @@ version = "0.19.0"
 [dependencies]
 anyhow = "1.0.22"
 arbitrary = { version = "0.4.1", features = ["derive"] }
-env_logger = "0.7.1"
+env_logger = "0.8.1"
 log = "0.4.8"
 rayon = "1.2.1"
 wasmparser = "0.65.0"
diff --git a/crates/fuzzing/src/oracles/dummy.rs b/crates/fuzzing/src/oracles/dummy.rs
index 1dc35ed3a..e58dc371d 100644
--- a/crates/fuzzing/src/oracles/dummy.rs
+++ b/crates/fuzzing/src/oracles/dummy.rs
@@ -25,7 +25,7 @@ pub fn dummy_imports<'module>(
 /// Construct a dummy function for the given function type
 pub fn dummy_func(store: &Store, ty: FuncType) -> Func {
     Func::new(store, ty.clone(), move |_, _, results| {
-        for (ret_ty, result) in ty.results().iter().zip(results) {
+        for (ret_ty, result) in ty.results().zip(results) {
             *result = dummy_value(ret_ty)?;
         }
         Ok(())
@@ -33,7 +33,7 @@ pub fn dummy_func(store: &Store, ty: FuncType) -> Func {
 }
 
 /// Construct a dummy value for the given value type.
-pub fn dummy_value(val_ty: &ValType) -> Result<Val, Trap> {
+pub fn dummy_value(val_ty: ValType) -> Result<Val, Trap> {
     Ok(match val_ty {
         ValType::I32 => Val::I32(0),
         ValType::I64 => Val::I64(0),
@@ -58,19 +58,19 @@ pub fn dummy_value(val_ty: &ValType) -> Result<Val, Trap> {
 }
 
 /// Construct a sequence of dummy values for the given types.
-pub fn dummy_values(val_tys: &[ValType]) -> Result<Vec<Val>, Trap> {
-    val_tys.iter().map(dummy_value).collect()
+pub fn dummy_values(val_tys: impl IntoIterator<Item = ValType>) -> Result<Vec<Val>, Trap> {
+    val_tys.into_iter().map(dummy_value).collect()
 }
 
 /// Construct a dummy global for the given global type.
 pub fn dummy_global(store: &Store, ty: GlobalType) -> Result<Global, Trap> {
-    let val = dummy_value(ty.content())?;
+    let val = dummy_value(ty.content().clone())?;
     Ok(Global::new(store, ty, val).unwrap())
 }
 
 /// Construct a dummy table for the given table type.
 pub fn dummy_table(store: &Store, ty: TableType) -> Result<Table, Trap> {
-    let init_val = dummy_value(&ty.element())?;
+    let init_val = dummy_value(ty.element().clone())?;
     Ok(Table::new(store, ty, init_val).unwrap())
 }
 
diff --git a/crates/jit/Cargo.toml b/crates/jit/Cargo.toml
index 18ae5a2c7..0996132ad 100644
--- a/crates/jit/Cargo.toml
+++ b/crates/jit/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasmtime-jit"
-version = "0.20.0"
+version = "0.21.0"
 authors = ["The Wasmtime Project Developers"]
 description = "JIT-style execution for WebAsssembly code in Cranelift"
 documentation = "https://docs.rs/wasmtime-jit"
@@ -12,18 +12,18 @@ readme = "README.md"
 edition = "2018"
 
 [dependencies]
-cranelift-codegen = { path = "../../cranelift/codegen", version = "0.67.0", features = ["enable-serde"] }
-cranelift-entity = { path = "../../cranelift/entity", version = "0.67.0", features = ["enable-serde"] }
-cranelift-wasm = { path = "../../cranelift/wasm", version = "0.67.0", features = ["enable-serde"] }
-cranelift-native = { path = "../../cranelift/native", version = "0.67.0" }
-cranelift-frontend = { path = "../../cranelift/frontend", version = "0.67.0" }
-wasmtime-environ = { path = "../environ", version = "0.20.0" }
-wasmtime-runtime = { path = "../runtime", version = "0.20.0" }
-wasmtime-cranelift = { path = "../cranelift", version = "0.20.0" }
-wasmtime-lightbeam = { path = "../lightbeam/wasmtime", version = "0.20.0", optional = true }
-wasmtime-debug = { path = "../debug", version = "0.20.0" }
-wasmtime-profiling = { path = "../profiling", version = "0.20.0" }
-wasmtime-obj = { path = "../obj", version = "0.20.0" }
+cranelift-codegen = { path = "../../cranelift/codegen", version = "0.68.0", features = ["enable-serde"] }
+cranelift-entity = { path = "../../cranelift/entity", version = "0.68.0", features = ["enable-serde"] }
+cranelift-wasm = { path = "../../cranelift/wasm", version = "0.68.0", features = ["enable-serde"] }
+cranelift-native = { path = "../../cranelift/native", version = "0.68.0" }
+cranelift-frontend = { path = "../../cranelift/frontend", version = "0.68.0" }
+wasmtime-environ = { path = "../environ", version = "0.21.0" }
+wasmtime-runtime = { path = "../runtime", version = "0.21.0" }
+wasmtime-cranelift = { path = "../cranelift", version = "0.21.0" }
+wasmtime-lightbeam = { path = "../lightbeam/wasmtime", version = "0.21.0", optional = true }
+wasmtime-debug = { path = "../debug", version = "0.21.0" }
+wasmtime-profiling = { path = "../profiling", version = "0.21.0" }
+wasmtime-obj = { path = "../obj", version = "0.21.0" }
 rayon = { version = "1.0", optional = true }
 region = "2.1.0"
 thiserror = "1.0.4"
@@ -33,8 +33,8 @@ more-asserts = "0.2.1"
 anyhow = "1.0"
 cfg-if = "1.0"
 log = "0.4"
-gimli = { version = "0.22.0", default-features = false, features = ["write"] }
-object = { version = "0.21.1", default-features = false, features = ["write"] }
+gimli = { version = "0.23.0", default-features = false, features = ["write"] }
+object = { version = "0.22.0", default-features = false, features = ["write"] }
 serde = { version = "1.0.94", features = ["derive"] }
 
 [target.'cfg(target_os = "windows")'.dependencies]
diff --git a/crates/jit/src/code_memory.rs b/crates/jit/src/code_memory.rs
index a540e3b31..f4ba5c301 100644
--- a/crates/jit/src/code_memory.rs
+++ b/crates/jit/src/code_memory.rs
@@ -5,7 +5,7 @@ use crate::object::{
     ObjectUnwindInfo,
 };
 use crate::unwind::UnwindRegistry;
-use object::read::{File as ObjectFile, Object, ObjectSection};
+use object::read::{File as ObjectFile, Object, ObjectSection, ObjectSymbol};
 use region;
 use std::collections::BTreeMap;
 use std::mem::ManuallyDrop;
@@ -292,9 +292,9 @@ impl CodeMemory {
         // Track locations of all defined functions and trampolines.
         let mut funcs = BTreeMap::new();
         let mut trampolines = BTreeMap::new();
-        for (_id, sym) in obj.symbols() {
+        for sym in obj.symbols() {
             match sym.name() {
-                Some(name) => {
+                Ok(name) => {
                     if let Some(index) = try_parse_func_name(name) {
                         let is_import = sym.section_index().is_none();
                         if !is_import {
@@ -308,7 +308,7 @@ impl CodeMemory {
                             .insert(index, (start + sym.address() as usize, sym.size() as usize));
                     }
                 }
-                None => (),
+                Err(_) => (),
             }
         }
 
diff --git a/crates/jit/src/link.rs b/crates/jit/src/link.rs
index 13cb25479..9c58a138a 100644
--- a/crates/jit/src/link.rs
+++ b/crates/jit/src/link.rs
@@ -2,7 +2,7 @@
 
 use crate::object::utils::try_parse_func_name;
 use object::read::{Object, ObjectSection, Relocation, RelocationTarget};
-use object::{elf, File, RelocationEncoding, RelocationKind};
+use object::{elf, File, ObjectSymbol, RelocationEncoding, RelocationKind};
 use std::ptr::{read_unaligned, write_unaligned};
 use wasmtime_environ::entity::PrimaryMap;
 use wasmtime_environ::wasm::DefinedFuncIndex;
@@ -47,7 +47,7 @@ fn apply_reloc(
             // wasm function or runtime libcall.
             let sym = obj.symbol_by_index(i).unwrap();
             match sym.name() {
-                Some(name) => {
+                Ok(name) => {
                     if let Some(index) = try_parse_func_name(name) {
                         match module.defined_func_index(index) {
                             Some(f) => {
@@ -62,7 +62,7 @@ fn apply_reloc(
                         panic!("unknown function to link: {}", name);
                     }
                 }
-                None => panic!("unexpected relocation target: not a symbol"),
+                Err(_) => panic!("unexpected relocation target: not a symbol"),
             }
         }
         _ => panic!("unexpected relocation target"),
diff --git a/crates/lightbeam/Cargo.toml b/crates/lightbeam/Cargo.toml
index 96b1ddd63..2811cd21b 100644
--- a/crates/lightbeam/Cargo.toml
+++ b/crates/lightbeam/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "lightbeam"
-version = "0.20.0"
+version = "0.21.0"
 authors = ["The Lightbeam Project Developers"]
 description = "An optimising one-pass streaming compiler for WebAssembly"
 license = "Apache-2.0 WITH LLVM-exception"
@@ -12,13 +12,13 @@ edition = "2018"
 
 [dependencies]
 capstone = "0.6.0"
-cranelift-codegen = { path = "../../cranelift/codegen", version = "0.67.0" }
+cranelift-codegen = { path = "../../cranelift/codegen", version = "0.68.0" }
 derive_more = "0.99"
 dynasm = "0.5.2"
 dynasmrt = "0.5.2"
 iter-enum = "0.2"
-itertools = "0.8.2"
-memoffset = "0.5.3"
+itertools = "0.9.0"
+memoffset = "0.6.0"
 more-asserts = "0.2.1"
 smallvec = "1.0.0"
 staticvec = "0.10"
diff --git a/crates/lightbeam/wasmtime/Cargo.toml b/crates/lightbeam/wasmtime/Cargo.toml
index 02fa8c34c..fda0ab37b 100644
--- a/crates/lightbeam/wasmtime/Cargo.toml
+++ b/crates/lightbeam/wasmtime/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasmtime-lightbeam"
-version = "0.20.0"
+version = "0.21.0"
 authors = ["The Wasmtime Project Developers"]
 description = "Integration between Lightbeam and Wasmtime"
 license = "Apache-2.0 WITH LLVM-exception"
@@ -12,7 +12,7 @@ readme = "README.md"
 edition = "2018"
 
 [dependencies]
-lightbeam = { path = "..", version = "0.20.0" }
+lightbeam = { path = "..", version = "0.21.0" }
 wasmparser = "0.65"
-cranelift-codegen = { path = "../../../cranelift/codegen", version = "0.67.0" }
-wasmtime-environ = { path = "../../environ", version = "0.20.0" }
+cranelift-codegen = { path = "../../../cranelift/codegen", version = "0.68.0" }
+wasmtime-environ = { path = "../../environ", version = "0.21.0" }
diff --git a/crates/misc/rust/Cargo.toml b/crates/misc/rust/Cargo.toml
index 62578db7b..0eb8513e4 100644
--- a/crates/misc/rust/Cargo.toml
+++ b/crates/misc/rust/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasmtime-rust"
-version = "0.20.0"
+version = "0.21.0"
 authors = ["Alex Crichton <alex@alexcrichton.com>"]
 description = "Rust extension for Wasmtime"
 license = "Apache-2.0 WITH LLVM-exception"
@@ -15,9 +15,9 @@ test = false
 doctest = false
 
 [dependencies]
-wasmtime-rust-macro = { path = "./macro", version = "0.20.0" }
-wasmtime-wasi = { path = "../../wasi", version = "0.20.0" }
-wasmtime = { path = "../../wasmtime", version = "0.20.0" }
+wasmtime-rust-macro = { path = "./macro", version = "0.21.0" }
+wasmtime-wasi = { path = "../../wasi", version = "0.21.0" }
+wasmtime = { path = "../../wasmtime", version = "0.21.0" }
 anyhow = "1.0.19"
 
 [badges]
diff --git a/crates/misc/rust/macro/Cargo.toml b/crates/misc/rust/macro/Cargo.toml
index 598d94823..0be9b8eaf 100644
--- a/crates/misc/rust/macro/Cargo.toml
+++ b/crates/misc/rust/macro/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasmtime-rust-macro"
-version = "0.20.0"
+version = "0.21.0"
 authors = ["Alex Crichton <alex@alexcrichton.com>"]
 description = "Macro support crate for wasmtime-rust"
 license = "Apache-2.0 WITH LLVM-exception"
diff --git a/crates/obj/Cargo.toml b/crates/obj/Cargo.toml
index ebea6f51f..b68d9be3a 100644
--- a/crates/obj/Cargo.toml
+++ b/crates/obj/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasmtime-obj"
-version = "0.20.0"
+version = "0.21.0"
 authors = ["The Wasmtime Project Developers"]
 description = "Native object file output for WebAsssembly code in Wasmtime"
 license = "Apache-2.0 WITH LLVM-exception"
@@ -12,11 +12,11 @@ edition = "2018"
 
 [dependencies]
 anyhow = "1.0"
-wasmtime-environ = { path = "../environ", version = "0.20.0" }
-object = { version = "0.21.1", default-features = false, features = ["write"] }
+wasmtime-environ = { path = "../environ", version = "0.21.0" }
+object = { version = "0.22.0", default-features = false, features = ["write"] }
 more-asserts = "0.2.1"
 target-lexicon = { version = "0.11.0", default-features = false }
-wasmtime-debug = { path = "../debug", version = "0.20.0" }
+wasmtime-debug = { path = "../debug", version = "0.21.0" }
 
 [badges]
 maintenance = { status = "experimental" }
diff --git a/crates/profiling/Cargo.toml b/crates/profiling/Cargo.toml
index 7bfa9fa9a..4f18152f6 100644
--- a/crates/profiling/Cargo.toml
+++ b/crates/profiling/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasmtime-profiling"
-version = "0.20.0"
+version = "0.21.0"
 authors = ["The Wasmtime Project Developers"]
 description = "Runtime library support for Wasmtime"
 license = "Apache-2.0 WITH LLVM-exception"
@@ -13,18 +13,18 @@ edition = "2018"
 [dependencies]
 anyhow = "1.0"
 cfg-if = "1.0"
-gimli = { version = "0.22.0", optional = true }
+gimli = { version = "0.23.0", optional = true }
 lazy_static = "1.4"
 libc = { version = "0.2.60", default-features = false }
 scroll = { version = "0.10.1", features = ["derive"], optional = true }
 serde = { version = "1.0.99", features = ["derive"] }
 target-lexicon = "0.11.0"
-wasmtime-environ = { path = "../environ", version = "0.20.0" }
-wasmtime-runtime = { path = "../runtime", version = "0.20.0" }
+wasmtime-environ = { path = "../environ", version = "0.21.0" }
+wasmtime-runtime = { path = "../runtime", version = "0.21.0" }
 ittapi-rs = { version = "0.1.5", optional = true }
 
 [dependencies.object]
-version = "0.21.1"
+version = "0.22.0"
 optional = true
 default-features = false
 features = ['read_core', 'elf', 'std']
diff --git a/crates/runtime/Cargo.toml b/crates/runtime/Cargo.toml
index aa787917f..7fd868ad4 100644
--- a/crates/runtime/Cargo.toml
+++ b/crates/runtime/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasmtime-runtime"
-version = "0.20.0"
+version = "0.21.0"
 authors = ["The Wasmtime Project Developers"]
 description = "Runtime library support for Wasmtime"
 documentation = "https://docs.rs/wasmtime-runtime"
@@ -12,11 +12,11 @@ readme = "README.md"
 edition = "2018"
 
 [dependencies]
-wasmtime-environ = { path = "../environ", version = "0.20.0" }
+wasmtime-environ = { path = "../environ", version = "0.21.0" }
 region = "2.1.0"
 libc = { version = "0.2.70", default-features = false }
 log = "0.4.8"
-memoffset = "0.5.3"
+memoffset = "0.6.0"
 indexmap = "1.0.2"
 thiserror = "1.0.4"
 more-asserts = "0.2.1"
diff --git a/crates/wasi-common/Cargo.toml b/crates/wasi-common/Cargo.toml
index b07cd91e0..6187e7a9c 100644
--- a/crates/wasi-common/Cargo.toml
+++ b/crates/wasi-common/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasi-common"
-version = "0.20.0"
+version = "0.21.0"
 authors = ["The Wasmtime Project Developers"]
 description = "WASI implementation in Rust"
 license = "Apache-2.0 WITH LLVM-exception"
@@ -20,19 +20,19 @@ links = "wasi-common-19"
 anyhow = "1.0"
 thiserror = "1.0"
 libc = "0.2"
-getrandom = { version = "0.1.14", features = ["std"] }
+getrandom = { version = "0.2.0", features = ["std"] }
 cfg-if = "1.0"
 filetime = "0.2.7"
 lazy_static = "1.4.0"
-wig = { path = "wig", version = "0.20.0" }
-wiggle = { path = "../wiggle", default-features = false, version = "0.20.0" }
+wig = { path = "wig", version = "0.21.0" }
+wiggle = { path = "../wiggle", default-features = false, version = "0.21.0" }
 tracing = "0.1.19"
 
 [target.'cfg(unix)'.dependencies]
-yanix = { path = "yanix", version = "0.20.0" }
+yanix = { path = "yanix", version = "0.21.0" }
 
 [target.'cfg(windows)'.dependencies]
-winx = { path = "winx", version = "0.20.0" }
+winx = { path = "winx", version = "0.21.0" }
 winapi = "0.3"
 cpu-time = "1.0"
 
diff --git a/crates/wasi-common/wig/Cargo.toml b/crates/wasi-common/wig/Cargo.toml
index 71b3acef7..2d30e5440 100644
--- a/crates/wasi-common/wig/Cargo.toml
+++ b/crates/wasi-common/wig/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wig"
-version = "0.20.0"
+version = "0.21.0"
 authors = ["Dan Gohman <sunfish@mozilla.com>"]
 description = "WebAssembly Interface Generator"
 license = "Apache-2.0 WITH LLVM-exception"
diff --git a/crates/wasi-common/winx/Cargo.toml b/crates/wasi-common/winx/Cargo.toml
index 4f3f99eef..96f78230e 100644
--- a/crates/wasi-common/winx/Cargo.toml
+++ b/crates/wasi-common/winx/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "winx"
-version = "0.20.0"
+version = "0.21.0"
 authors = ["Jakub Konka <kubkon@jakubkonka.com>"]
 description = "Windows API helper library"
 documentation = "https://docs.rs/winx"
diff --git a/crates/wasi-common/yanix/Cargo.toml b/crates/wasi-common/yanix/Cargo.toml
index e8e134ab3..222ada91f 100644
--- a/crates/wasi-common/yanix/Cargo.toml
+++ b/crates/wasi-common/yanix/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "yanix"
-version = "0.20.0"
+version = "0.21.0"
 authors = ["The Wasmtime Project Developers"]
 description = "Yet Another Nix crate: a Unix API helper library"
 documentation = "https://docs.rs/yanix"
diff --git a/crates/wasi/Cargo.toml b/crates/wasi/Cargo.toml
index 07cb69103..2ddad35e4 100644
--- a/crates/wasi/Cargo.toml
+++ b/crates/wasi/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasmtime-wasi"
-version = "0.20.0"
+version = "0.21.0"
 authors = ["The Cranelift Project Developers"]
 description = "WASI API support for Wasmtime"
 documentation = "https://docs.rs/wasmtime-wasi"
@@ -14,12 +14,12 @@ edition = "2018"
 [dependencies]
 anyhow = "1.0"
 tracing = "0.1.15"
-wasi-common = { path = "../wasi-common", version = "0.20.0" }
-wasmtime = { path = "../wasmtime", version = "0.20.0", default-features = false }
-wasmtime-runtime = { path = "../runtime", version = "0.20.0" }
-wig = { path = "../wasi-common/wig", version = "0.20.0" }
-wiggle = { path = "../wiggle", version = "0.20.0" }
-wasmtime-wiggle = { path = "../wiggle/wasmtime", version = "0.20.0" }
+wasi-common = { path = "../wasi-common", version = "0.21.0" }
+wasmtime = { path = "../wasmtime", version = "0.21.0", default-features = false }
+wasmtime-runtime = { path = "../runtime", version = "0.21.0" }
+wig = { path = "../wasi-common/wig", version = "0.21.0" }
+wiggle = { path = "../wiggle", version = "0.21.0" }
+wasmtime-wiggle = { path = "../wiggle/wasmtime", version = "0.21.0" }
 
 [badges]
 maintenance = { status = "actively-developed" }
diff --git a/crates/wasmtime/Cargo.toml b/crates/wasmtime/Cargo.toml
index 5ea29e2e2..f6e7b1f10 100644
--- a/crates/wasmtime/Cargo.toml
+++ b/crates/wasmtime/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasmtime"
-version = "0.20.0"
+version = "0.21.0"
 authors = ["The Wasmtime Project Developers"]
 description = "High-level API to expose the Wasmtime runtime"
 documentation = "https://docs.rs/wasmtime"
@@ -10,11 +10,11 @@ readme = "README.md"
 edition = "2018"
 
 [dependencies]
-wasmtime-runtime = { path = "../runtime", version = "0.20.0" }
-wasmtime-environ = { path = "../environ", version = "0.20.0" }
-wasmtime-jit = { path = "../jit", version = "0.20.0" }
-wasmtime-cache = { path = "../cache", version = "0.20.0", optional = true }
-wasmtime-profiling = { path = "../profiling", version = "0.20.0" }
+wasmtime-runtime = { path = "../runtime", version = "0.21.0" }
+wasmtime-environ = { path = "../environ", version = "0.21.0" }
+wasmtime-jit = { path = "../jit", version = "0.21.0" }
+wasmtime-cache = { path = "../cache", version = "0.21.0", optional = true }
+wasmtime-profiling = { path = "../profiling", version = "0.21.0" }
 target-lexicon = { version = "0.11.0", default-features = false }
 wasmparser = "0.65.0"
 anyhow = "1.0.19"
diff --git a/crates/wasmtime/src/func.rs b/crates/wasmtime/src/func.rs
index 7b7153002..c053432a3 100644
--- a/crates/wasmtime/src/func.rs
+++ b/crates/wasmtime/src/func.rs
@@ -113,8 +113,8 @@ use wasmtime_runtime::{
 /// // Here we need to define the type signature of our `Double` function and
 /// // then wrap it up in a `Func`
 /// let double_type = wasmtime::FuncType::new(
-///     Box::new([wasmtime::ValType::I32]),
-///     Box::new([wasmtime::ValType::I32])
+///     [wasmtime::ValType::I32].iter().cloned(),
+///     [wasmtime::ValType::I32].iter().cloned(),
 /// );
 /// let double = Func::new(&store, double_type, |_, params, results| {
 ///     let mut value = params[0].unwrap_i32();
@@ -163,7 +163,7 @@ macro_rules! getters {
             // Verify all the paramers match the expected parameters, and that
             // there are no extra parameters...
             let ty = self.ty();
-            let mut params = ty.params().iter().cloned();
+            let mut params = ty.params();
             let n = 0;
             $(
                 let n = n + 1;
@@ -173,7 +173,7 @@ macro_rules! getters {
             ensure!(params.next().is_none(), "Type mismatch: too many arguments (expected {})", n);
 
             // ... then do the same for the results...
-            let mut results = ty.results().iter().cloned();
+            let mut results = ty.results();
             R::matches(&mut results)
                 .context("Type mismatch in return type")?;
             ensure!(results.next().is_none(), "Type mismatch: too many return values (expected 1)");
@@ -274,7 +274,7 @@ impl Func {
             let mut args: SmallVec<[Val; STACK_ARGS]> =
                 SmallVec::with_capacity(ty_clone.params().len());
             let store = Store::upgrade(&store_weak).unwrap();
-            for (i, ty) in ty_clone.params().iter().enumerate() {
+            for (i, ty) in ty_clone.params().enumerate() {
                 unsafe {
                     let val = Val::read_value_from(&store, values_vec.add(i), ty);
                     args.push(val);
@@ -298,7 +298,7 @@ impl Func {
             // produces the wrong number or wrong types of values, and we need
             // to catch that here.
             for (i, (ret, ty)) in returns.into_iter().zip(ty_clone.results()).enumerate() {
-                if ret.ty() != *ty {
+                if ret.ty() != ty {
                     return Err(Trap::new(
                         "function attempted to return an incompatible value",
                     ));
@@ -596,9 +596,9 @@ impl Func {
         let mut values_vec = vec![0; max(params.len(), my_ty.results().len())];
 
         // Store the argument values into `values_vec`.
-        let param_tys = my_ty.params().iter();
+        let param_tys = my_ty.params();
         for ((arg, slot), ty) in params.iter().cloned().zip(&mut values_vec).zip(param_tys) {
-            if arg.ty() != *ty {
+            if arg.ty() != ty {
                 bail!(
                     "argument type mismatch: found {} but expected {}",
                     arg.ty(),
@@ -628,7 +628,7 @@ impl Func {
 
         // Load the return values out of `values_vec`.
         let mut results = Vec::with_capacity(my_ty.results().len());
-        for (index, ty) in my_ty.results().iter().enumerate() {
+        for (index, ty) in my_ty.results().enumerate() {
             unsafe {
                 let ptr = values_vec.as_ptr().add(index);
                 results.push(Val::read_value_from(&self.instance.store, ptr, ty));
@@ -876,7 +876,7 @@ pub unsafe trait WasmTy {
 
     // Add this type to the given vec of expected valtypes.
     #[doc(hidden)]
-    fn push(dst: &mut Vec<ValType>);
+    fn valtype() -> Option<ValType>;
 
     // Does the next valtype(s) match this type?
     #[doc(hidden)]
@@ -923,7 +923,7 @@ pub unsafe trait WasmRet {
 
     // Same as `WasmTy::push`.
     #[doc(hidden)]
-    fn push(dst: &mut Vec<ValType>);
+    fn valtype() -> Option<ValType>;
 
     // Same as `WasmTy::matches`.
     #[doc(hidden)]
@@ -952,7 +952,9 @@ unsafe impl WasmTy for () {
     #[inline]
     unsafe fn from_abi<'a>(_abi: Self::Abi, _store: WeakStore<'a>) -> Self {}
 
-    fn push(_dst: &mut Vec<ValType>) {}
+    fn valtype() -> Option<ValType> {
+        None
+    }
 
     fn matches(_tys: impl Iterator<Item = ValType>) -> anyhow::Result<()> {
         Ok(())
@@ -983,8 +985,8 @@ unsafe impl WasmTy for i32 {
         abi
     }
 
-    fn push(dst: &mut Vec<ValType>) {
-        dst.push(ValType::I32);
+    fn valtype() -> Option<ValType> {
+        Some(ValType::I32)
     }
 
     fn matches(mut tys: impl Iterator<Item = ValType>) -> anyhow::Result<()> {
@@ -1028,8 +1030,8 @@ unsafe impl WasmTy for u32 {
         abi as Self
     }
 
-    fn push(dst: &mut Vec<ValType>) {
-        <i32 as WasmTy>::push(dst)
+    fn valtype() -> Option<ValType> {
+        <i32 as WasmTy>::valtype()
     }
 
     fn matches(tys: impl Iterator<Item = ValType>) -> anyhow::Result<()> {
@@ -1065,8 +1067,8 @@ unsafe impl WasmTy for i64 {
         abi
     }
 
-    fn push(dst: &mut Vec<ValType>) {
-        dst.push(ValType::I64);
+    fn valtype() -> Option<ValType> {
+        Some(ValType::I64)
     }
 
     fn matches(mut tys: impl Iterator<Item = ValType>) -> anyhow::Result<()> {
@@ -1110,8 +1112,8 @@ unsafe impl WasmTy for u64 {
         abi as Self
     }
 
-    fn push(dst: &mut Vec<ValType>) {
-        <i64 as WasmTy>::push(dst)
+    fn valtype() -> Option<ValType> {
+        <i64 as WasmTy>::valtype()
     }
 
     fn matches(tys: impl Iterator<Item = ValType>) -> anyhow::Result<()> {
@@ -1147,8 +1149,8 @@ unsafe impl WasmTy for f32 {
         abi
     }
 
-    fn push(dst: &mut Vec<ValType>) {
-        dst.push(ValType::F32);
+    fn valtype() -> Option<ValType> {
+        Some(ValType::F32)
     }
 
     fn matches(mut tys: impl Iterator<Item = ValType>) -> anyhow::Result<()> {
@@ -1192,8 +1194,8 @@ unsafe impl WasmTy for f64 {
         abi
     }
 
-    fn push(dst: &mut Vec<ValType>) {
-        dst.push(ValType::F64);
+    fn valtype() -> Option<ValType> {
+        Some(ValType::F64)
     }
 
     fn matches(mut tys: impl Iterator<Item = ValType>) -> anyhow::Result<()> {
@@ -1254,8 +1256,8 @@ unsafe impl WasmTy for Option<ExternRef> {
         }
     }
 
-    fn push(dst: &mut Vec<ValType>) {
-        dst.push(ValType::ExternRef);
+    fn valtype() -> Option<ValType> {
+        Some(ValType::ExternRef)
     }
 
     fn matches(mut tys: impl Iterator<Item = ValType>) -> anyhow::Result<()> {
@@ -1307,8 +1309,8 @@ unsafe impl WasmTy for Option<Func> {
         Func::from_caller_checked_anyfunc(&store, abi)
     }
 
-    fn push(dst: &mut Vec<ValType>) {
-        dst.push(ValType::FuncRef);
+    fn valtype() -> Option<ValType> {
+        Some(ValType::FuncRef)
     }
 
     fn matches(mut tys: impl Iterator<Item = ValType>) -> anyhow::Result<()> {
@@ -1353,9 +1355,8 @@ where
         <Self as WasmTy>::from_abi(abi, store)
     }
 
-    #[inline]
-    fn push(dst: &mut Vec<ValType>) {
-        <Self as WasmTy>::push(dst)
+    fn valtype() -> Option<ValType> {
+        <Self as WasmTy>::valtype()
     }
 
     #[inline]
@@ -1405,8 +1406,8 @@ where
         Ok(<T as WasmTy>::from_abi(abi, store))
     }
 
-    fn push(dst: &mut Vec<ValType>) {
-        <T as WasmTy>::push(dst)
+    fn valtype() -> Option<ValType> {
+        <T as WasmTy>::valtype()
     }
 
     fn matches(tys: impl Iterator<Item = ValType>) -> anyhow::Result<()> {
@@ -1657,11 +1658,12 @@ macro_rules! impl_into_func {
                     R::store_to_args(ret, args);
                 }
 
-                let mut _args = Vec::new();
-                $($args::push(&mut _args);)*
-                let mut ret = Vec::new();
-                R::push(&mut ret);
-                let ty = FuncType::new(_args.into(), ret.into());
+                let ty = FuncType::new(
+                    None::<ValType>.into_iter()
+                        $(.chain($args::valtype()))*
+                    ,
+                    R::valtype(),
+                );
 
                 let store_weak = store.weak();
                 let trampoline = host_trampoline::<$($args,)* R>;
diff --git a/crates/wasmtime/src/linker.rs b/crates/wasmtime/src/linker.rs
index c22b89bf4..1fb4b6263 100644
--- a/crates/wasmtime/src/linker.rs
+++ b/crates/wasmtime/src/linker.rs
@@ -716,7 +716,7 @@ impl Linker {
         // Otherwise return a no-op function.
         Ok(Func::new(
             &self.store,
-            FuncType::new(Vec::new().into_boxed_slice(), Vec::new().into_boxed_slice()),
+            FuncType::new(None, None),
             move |_, _, _| Ok(()),
         ))
     }
diff --git a/crates/wasmtime/src/trampoline/func.rs b/crates/wasmtime/src/trampoline/func.rs
index 25a433385..04a62db37 100644
--- a/crates/wasmtime/src/trampoline/func.rs
+++ b/crates/wasmtime/src/trampoline/func.rs
@@ -214,7 +214,7 @@ pub fn create_handle_with_function(
 
     let pointer_type = isa.pointer_type();
     let sig = ft.get_wasmtime_signature(pointer_type);
-    let wft = ft.to_wasm_func_type();
+    let wft = ft.as_wasm_func_type();
 
     let mut fn_builder_ctx = FunctionBuilderContext::new();
     let mut module = Module::new();
@@ -241,7 +241,7 @@ pub fn create_handle_with_function(
         &sig,
         mem::size_of::<u128>(),
     )?;
-    store.signatures().borrow_mut().register(&wft, trampoline);
+    store.signatures().borrow_mut().register(wft, trampoline);
 
     // Next up we wrap everything up into an `InstanceHandle` by publishing our
     // code memory (makes it executable) and ensuring all our various bits of
@@ -265,7 +265,7 @@ pub unsafe fn create_handle_with_raw_function(
     store: &Store,
     state: Box<dyn Any>,
 ) -> Result<StoreInstanceHandle> {
-    let wft = ft.to_wasm_func_type();
+    let wft = ft.as_wasm_func_type();
 
     let mut module = Module::new();
     let mut finished_functions = PrimaryMap::new();
@@ -276,7 +276,7 @@ pub unsafe fn create_handle_with_raw_function(
         .exports
         .insert(String::new(), EntityIndex::Function(func_id));
     finished_functions.push(func);
-    store.signatures().borrow_mut().register(&wft, trampoline);
+    store.signatures().borrow_mut().register(wft, trampoline);
 
     create_handle(module, store, finished_functions, state, &[])
 }
diff --git a/crates/wasmtime/src/types.rs b/crates/wasmtime/src/types.rs
index d8a3ad27b..d859dd588 100644
--- a/crates/wasmtime/src/types.rs
+++ b/crates/wasmtime/src/types.rs
@@ -1,4 +1,5 @@
 use std::fmt;
+use wasmtime_environ::wasm::WasmFuncType;
 use wasmtime_environ::{ir, wasm, EntityIndex};
 
 // Type Representations
@@ -217,8 +218,7 @@ impl From<TableType> for ExternType {
 /// WebAssembly functions can have 0 or more parameters and results.
 #[derive(Debug, Clone, Hash, Eq, PartialEq)]
 pub struct FuncType {
-    params: Box<[ValType]>,
-    results: Box<[ValType]>,
+    sig: WasmFuncType,
 }
 
 impl FuncType {
@@ -226,25 +226,30 @@ impl FuncType {
     ///
     /// The function descriptor returned will represent a function which takes
     /// `params` as arguments and returns `results` when it is finished.
-    pub fn new(params: Box<[ValType]>, results: Box<[ValType]>) -> FuncType {
-        FuncType { params, results }
+    pub fn new(
+        params: impl IntoIterator<Item = ValType>,
+        results: impl IntoIterator<Item = ValType>,
+    ) -> FuncType {
+        FuncType {
+            sig: WasmFuncType {
+                params: params.into_iter().map(|t| t.to_wasm_type()).collect(),
+                returns: results.into_iter().map(|t| t.to_wasm_type()).collect(),
+            },
+        }
     }
 
     /// Returns the list of parameter types for this function.
-    pub fn params(&self) -> &[ValType] {
-        &self.params
+    pub fn params(&self) -> impl ExactSizeIterator<Item = ValType> + '_ {
+        self.sig.params.iter().map(ValType::from_wasm_type)
     }
 
     /// Returns the list of result types for this function.
-    pub fn results(&self) -> &[ValType] {
-        &self.results
+    pub fn results(&self) -> impl ExactSizeIterator<Item = ValType> + '_ {
+        self.sig.returns.iter().map(ValType::from_wasm_type)
     }
 
-    pub(crate) fn to_wasm_func_type(&self) -> wasm::WasmFuncType {
-        wasm::WasmFuncType {
-            params: self.params.iter().map(|p| p.to_wasm_type()).collect(),
-            returns: self.results.iter().map(|r| r.to_wasm_type()).collect(),
-        }
+    pub(crate) fn as_wasm_func_type(&self) -> &wasm::WasmFuncType {
+        &self.sig
     }
 
     /// Get the Cranelift-compatible function signature.
@@ -256,14 +261,9 @@ impl FuncType {
             AbiParam::special(pointer_type, ArgumentPurpose::VMContext),
             AbiParam::new(pointer_type),
         ];
-        params.extend(
-            self.params
-                .iter()
-                .map(|p| AbiParam::new(p.get_wasmtime_type())),
-        );
+        params.extend(self.params().map(|p| AbiParam::new(p.get_wasmtime_type())));
         let returns = self
-            .results
-            .iter()
+            .results()
             .map(|p| AbiParam::new(p.get_wasmtime_type()))
             .collect::<Vec<_>>();
 
@@ -274,24 +274,8 @@ impl FuncType {
         }
     }
 
-    /// Returns `None` if any types in the signature can't be converted to the
-    /// types in this crate, but that should very rarely happen and largely only
-    /// indicate a bug in our cranelift integration.
-    pub(crate) fn from_wasm_func_type(signature: &wasm::WasmFuncType) -> FuncType {
-        let params = signature
-            .params
-            .iter()
-            .map(|p| ValType::from_wasm_type(p))
-            .collect::<Vec<_>>();
-        let results = signature
-            .returns
-            .iter()
-            .map(|r| ValType::from_wasm_type(r))
-            .collect::<Vec<_>>();
-        FuncType {
-            params: params.into_boxed_slice(),
-            results: results.into_boxed_slice(),
-        }
+    pub(crate) fn from_wasm_func_type(sig: &wasm::WasmFuncType) -> FuncType {
+        FuncType { sig: sig.clone() }
     }
 }
 
diff --git a/crates/wasmtime/src/values.rs b/crates/wasmtime/src/values.rs
index 2ec507a03..4dc647451 100644
--- a/crates/wasmtime/src/values.rs
+++ b/crates/wasmtime/src/values.rs
@@ -112,7 +112,7 @@ impl Val {
         }
     }
 
-    pub(crate) unsafe fn read_value_from(store: &Store, p: *const u128, ty: &ValType) -> Val {
+    pub(crate) unsafe fn read_value_from(store: &Store, p: *const u128, ty: ValType) -> Val {
         match ty {
             ValType::I32 => Val::I32(ptr::read(p as *const i32)),
             ValType::I64 => Val::I64(ptr::read(p as *const i64)),
diff --git a/crates/wast/Cargo.toml b/crates/wast/Cargo.toml
index b9ccbddb4..e149e2327 100644
--- a/crates/wast/Cargo.toml
+++ b/crates/wast/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasmtime-wast"
-version = "0.20.0"
+version = "0.21.0"
 authors = ["The Wasmtime Project Developers"]
 description = "wast testing support for wasmtime"
 license = "Apache-2.0 WITH LLVM-exception"
@@ -12,7 +12,7 @@ edition = "2018"
 
 [dependencies]
 anyhow = "1.0.19"
-wasmtime = { path = "../wasmtime", version = "0.20.0", default-features = false }
+wasmtime = { path = "../wasmtime", version = "0.21.0", default-features = false }
 wast = "26.0.1"
 
 [badges]
diff --git a/crates/wiggle/Cargo.toml b/crates/wiggle/Cargo.toml
index 5891ad623..13a734ab8 100644
--- a/crates/wiggle/Cargo.toml
+++ b/crates/wiggle/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wiggle"
-version = "0.20.0"
+version = "0.21.0"
 authors = ["Pat Hickey <phickey@fastly.com>", "Jakub Konka <kubkonk@jakubkonka.com>", "Alex Crichton <alex@alexcrichton.com>"]
 edition = "2018"
 license = "Apache-2.0 WITH LLVM-exception"
@@ -13,7 +13,7 @@ include = ["src/**/*", "LICENSE"]
 [dependencies]
 thiserror = "1"
 witx = { path = "../wasi-common/WASI/tools/witx", version = "0.8.7", optional = true }
-wiggle-macro = { path = "macro", version = "0.20.0" }
+wiggle-macro = { path = "macro", version = "0.21.0" }
 tracing = "0.1.15"
 
 [badges]
@@ -21,7 +21,7 @@ maintenance = { status = "actively-developed" }
 
 [dev-dependencies]
 wiggle-test = { path = "test-helpers" }
-proptest = "0.9"
+proptest = "0.10"
 
 [features]
 # The wiggle proc-macro emits some code (inside `pub mod metadata`) guarded
diff --git a/crates/wiggle/generate/Cargo.toml b/crates/wiggle/generate/Cargo.toml
index ff9fda805..e449509b4 100644
--- a/crates/wiggle/generate/Cargo.toml
+++ b/crates/wiggle/generate/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wiggle-generate"
-version = "0.20.0"
+version = "0.21.0"
 authors = ["Pat Hickey <phickey@fastly.com>", "Jakub Konka <kubkon@jakubkonka.com>", "Alex Crichton <alex@alexcrichton.com>"]
 license = "Apache-2.0 WITH LLVM-exception"
 edition = "2018"
diff --git a/crates/wiggle/macro/Cargo.toml b/crates/wiggle/macro/Cargo.toml
index bbbb0f429..ec88c66e1 100644
--- a/crates/wiggle/macro/Cargo.toml
+++ b/crates/wiggle/macro/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wiggle-macro"
-version = "0.20.0"
+version = "0.21.0"
 authors = ["Pat Hickey <phickey@fastly.com>", "Jakub Konka <kubkon@jakubkonka.com>", "Alex Crichton <alex@alexcrichton.com>"]
 edition = "2018"
 license = "Apache-2.0 WITH LLVM-exception"
@@ -21,7 +21,7 @@ test = false
 doctest = false
 
 [dependencies]
-wiggle-generate = { path = "../generate", version = "0.20.0" }
+wiggle-generate = { path = "../generate", version = "0.21.0" }
 witx = { path = "../../wasi-common/WASI/tools/witx", version = "0.8.7" }
 quote = "1.0"
 syn = { version = "1.0", features = ["full"] }
diff --git a/crates/wiggle/wasmtime/Cargo.toml b/crates/wiggle/wasmtime/Cargo.toml
index f936898d8..89a85970c 100644
--- a/crates/wiggle/wasmtime/Cargo.toml
+++ b/crates/wiggle/wasmtime/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasmtime-wiggle"
-version = "0.20.0"
+version = "0.21.0"
 authors = ["Pat Hickey <phickey@fastly.com>", "Jakub Konka <kubkonk@jakubkonka.com>", "Alex Crichton <alex@alexcrichton.com>"]
 edition = "2018"
 license = "Apache-2.0 WITH LLVM-exception"
@@ -11,10 +11,10 @@ repository = "https://github.com/bytecodealliance/wasmtime"
 include = ["src/**/*", "LICENSE"]
 
 [dependencies]
-wasmtime = { path = "../../wasmtime", version = "0.20.0", default-features = false }
-wasmtime-wiggle-macro = { path = "./macro", version = "0.20.0" }
+wasmtime = { path = "../../wasmtime", version = "0.21.0", default-features = false }
+wasmtime-wiggle-macro = { path = "./macro", version = "0.21.0" }
 witx = { path = "../../wasi-common/WASI/tools/witx", version = "0.8.7", optional = true }
-wiggle = { path = "..", version = "0.20.0" }
+wiggle = { path = "..", version = "0.21.0" }
 
 [badges]
 maintenance = { status = "actively-developed" }
diff --git a/crates/wiggle/wasmtime/macro/Cargo.toml b/crates/wiggle/wasmtime/macro/Cargo.toml
index ed2a61232..94e108787 100644
--- a/crates/wiggle/wasmtime/macro/Cargo.toml
+++ b/crates/wiggle/wasmtime/macro/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasmtime-wiggle-macro"
-version = "0.20.0"
+version = "0.21.0"
 authors = ["Pat Hickey <phickey@fastly.com>", "Jakub Konka <kubkonk@jakubkonka.com>", "Alex Crichton <alex@alexcrichton.com>"]
 edition = "2018"
 license = "Apache-2.0 WITH LLVM-exception"
@@ -16,7 +16,7 @@ test = false
 
 [dependencies]
 witx = { path = "../../../wasi-common/WASI/tools/witx", version = "0.8.7" }
-wiggle-generate = { path = "../../generate", version = "0.20.0" }
+wiggle-generate = { path = "../../generate", version = "0.21.0" }
 quote = "1.0"
 syn = { version = "1.0", features = ["full", "extra-traits"]  }
 proc-macro2 = "1.0"
diff --git a/examples/multi.rs b/examples/multi.rs
index f39fd2798..67f1c4b6e 100644
--- a/examples/multi.rs
+++ b/examples/multi.rs
@@ -22,8 +22,8 @@ fn main() -> Result<()> {
     // Create external print functions.
     println!("Creating callback...");
     let callback_type = FuncType::new(
-        Box::new([ValType::I32, ValType::I64]),
-        Box::new([ValType::I64, ValType::I32]),
+        [ValType::I32, ValType::I64].iter().cloned(),
+        [ValType::I64, ValType::I32].iter().cloned(),
     );
     let callback_func = Func::new(&store, callback_type, |_, args, results| {
         println!("Calling back...");
diff --git a/examples/threads.rs b/examples/threads.rs
index 3d3ffe8e5..5bef1f954 100644
--- a/examples/threads.rs
+++ b/examples/threads.rs
@@ -8,18 +8,14 @@ use wasmtime::*;
 const N_THREADS: i32 = 10;
 const N_REPS: i32 = 3;
 
-fn print_message(_: Caller<'_>, args: &[Val], _: &mut [Val]) -> Result<(), Trap> {
-    println!("> Thread {} is running", args[0].unwrap_i32());
-    Ok(())
-}
-
 fn run(engine: &Engine, module: Module, id: i32) -> Result<()> {
     let store = Store::new(&engine);
 
     // Create external print functions.
     println!("Creating callback...");
-    let callback_type = FuncType::new(Box::new([ValType::I32]), Box::new([]));
-    let callback_func = Func::new(&store, callback_type, print_message);
+    let callback_func = Func::wrap(&store, |arg: i32| {
+        println!("> Thread {} is running", arg);
+    });
 
     let id_type = GlobalType::new(ValType::I32, Mutability::Const);
     let id_global = Global::new(&store, id_type, Val::I32(id))?;


Test patch:
diff --git a/cranelift/filetests/Cargo.toml b/cranelift/filetests/Cargo.toml
index 19e339062..6d7ec9fb7 100644
--- a/cranelift/filetests/Cargo.toml
+++ b/cranelift/filetests/Cargo.toml
@@ -10,16 +10,16 @@ publish = false
 edition = "2018"
 
 [dependencies]
-cranelift-codegen = { path = "../codegen", version = "0.67.0", features = ["testing_hooks"] }
-cranelift-frontend = { path = "../frontend", version = "0.67.0" }
-cranelift-interpreter = { path = "../interpreter", version = "0.67.0" }
-cranelift-native = { path = "../native", version = "0.67.0" }
-cranelift-reader = { path = "../reader", version = "0.67.0" }
-cranelift-preopt = { path = "../preopt", version = "0.67.0" }
+cranelift-codegen = { path = "../codegen", version = "0.68.0", features = ["testing_hooks"] }
+cranelift-frontend = { path = "../frontend", version = "0.68.0" }
+cranelift-interpreter = { path = "../interpreter", version = "0.68.0" }
+cranelift-native = { path = "../native", version = "0.68.0" }
+cranelift-reader = { path = "../reader", version = "0.68.0" }
+cranelift-preopt = { path = "../preopt", version = "0.68.0" }
 byteorder = { version = "1.3.2", default-features = false }
 file-per-thread-logger = "0.1.2"
 filecheck = "0.5.0"
-gimli = { version = "0.22.0", default-features = false, features = ["read"] }
+gimli = { version = "0.23.0", default-features = false, features = ["read"] }
 log = "0.4.6"
 memmap = "0.7.0"
 num_cpus = "1.8.0"
diff --git a/cranelift/filetests/filetests/isa/x64/simd-lane-access-compile.clif b/cranelift/filetests/filetests/isa/x64/simd-lane-access-compile.clif
index c6860433e..c9188a951 100644
--- a/cranelift/filetests/filetests/isa/x64/simd-lane-access-compile.clif
+++ b/cranelift/filetests/filetests/isa/x64/simd-lane-access-compile.clif
@@ -12,11 +12,11 @@ block0:
     v2 = shuffle v0, v1, 0x11000000000000000000000000000000     ; pick the second lane of v1, the rest use the first lane of v0
     return v2
 }
-; check:  load_const $$[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], %xmm1
-; nextln: load_const $$[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], %xmm0
-; nextln: load_const $$[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128], %xmm2
+; check:  load_const VCodeConstant(3), %xmm1
+; nextln: load_const VCodeConstant(2), %xmm0
+; nextln: load_const VCodeConstant(0), %xmm2
 ; nextln: pshufb  %xmm2, %xmm1
-; nextln: load_const $$[128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 1], %xmm2
+; nextln: load_const VCodeConstant(1), %xmm2
 ; nextln: pshufb  %xmm2, %xmm0
 ; nextln: orps    %xmm1, %xmm0
 
@@ -27,8 +27,8 @@ block0:
     v2 = shuffle v1, v1, 0x13000000000000000000000000000000     ; pick the fourth lane of v1 and the rest from the first lane of v1
     return v2
 }
-; check:  load_const $$[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], %xmm0
-; nextln: load_const $$[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3], %xmm1
+; check:  load_const VCodeConstant(1), %xmm0
+; nextln: load_const VCodeConstant(0), %xmm1
 ; nextln: pshufb  %xmm1, %xmm0
 
 
@@ -42,9 +42,9 @@ block0:
     v2 = swizzle.i8x16 v0, v1
     return v2
 }
-; check:  load_const $$[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], %xmm1
-; nextln: load_const $$[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], %xmm0
-; nextln: load_const $$[112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112], %xmm2
+; check:  load_const VCodeConstant(1), %xmm1
+; nextln: load_const VCodeConstant(1), %xmm0
+; nextln: load_const VCodeConstant(0), %xmm2
 ; nextln: paddusb %xmm2, %xmm0
 ; nextln: pshufb  %xmm0, %xmm1
 ; nextln: movdqa  %xmm1, %xmm0
diff --git a/cranelift/filetests/filetests/isa/x86/systemv_x64_unwind.clif b/cranelift/filetests/filetests/isa/x86/systemv_x64_unwind.clif
index cf0da2f4d..9d4053aee 100644
--- a/cranelift/filetests/filetests/isa/x86/systemv_x64_unwind.clif
+++ b/cranelift/filetests/filetests/isa/x86/systemv_x64_unwind.clif
@@ -37,8 +37,8 @@ block0:
 ; nextln:                 DW_CFA_advance_loc (3)
 ; nextln:                 DW_CFA_def_cfa_register (r6)
 ; nextln:                 DW_CFA_advance_loc (1)
-; nextln:                 DW_CFA_def_cfa (r7, 8)
 ; nextln:                 DW_CFA_same_value (r6)
+; nextln:                 DW_CFA_def_cfa (r7, 8)
 ; nextln:                 DW_CFA_nop
 
 ; check a function with medium-sized stack alloc
@@ -76,8 +76,8 @@ block0:
 ; nextln:                 DW_CFA_advance_loc (3)
 ; nextln:                 DW_CFA_def_cfa_register (r6)
 ; nextln:                 DW_CFA_advance_loc (21)
-; nextln:                 DW_CFA_def_cfa (r7, 8)
 ; nextln:                 DW_CFA_same_value (r6)
+; nextln:                 DW_CFA_def_cfa (r7, 8)
 ; nextln:                 DW_CFA_nop
 
 ; check a function with large-sized stack alloc
@@ -115,8 +115,8 @@ block0:
 ; nextln:                 DW_CFA_advance_loc (3)
 ; nextln:                 DW_CFA_def_cfa_register (r6)
 ; nextln:                 DW_CFA_advance_loc (21)
-; nextln:                 DW_CFA_def_cfa (r7, 8)
 ; nextln:                 DW_CFA_same_value (r6)
+; nextln:                 DW_CFA_def_cfa (r7, 8)
 ; nextln:                 DW_CFA_nop
 ; nextln: 
 
@@ -200,7 +200,6 @@ block0(v0: i64, v1: i64):
 ; nextln:                 DW_CFA_advance_loc (1)
 ; nextln:                 DW_CFA_same_value (r3)
 ; nextln:                 DW_CFA_advance_loc (1)
-; nextln:                 DW_CFA_def_cfa (r7, 8)
 ; nextln:                 DW_CFA_same_value (r6)
-; nextln:                 DW_CFA_nop
+; nextln:                 DW_CFA_def_cfa (r7, 8)
 ; nextln:                 DW_CFA_nop
diff --git a/cranelift/peepmatic/crates/test-operator/Cargo.toml b/cranelift/peepmatic/crates/test-operator/Cargo.toml
index 137dbc505..2407d228f 100644
--- a/cranelift/peepmatic/crates/test-operator/Cargo.toml
+++ b/cranelift/peepmatic/crates/test-operator/Cargo.toml
@@ -1,12 +1,12 @@
 [package]
 name = "peepmatic-test-operator"
-version = "0.67.0"
+version = "0.68.0"
 authors = ["Nick Fitzgerald <fitzgen@gmail.com>"]
 edition = "2018"
 
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-peepmatic-traits = { version = "0.67.0", path = "../traits" }
+peepmatic-traits = { version = "0.68.0", path = "../traits" }
 serde = { version = "1.0.105", features = ["derive"] }
 wast = "26.0.1"
diff --git a/cranelift/peepmatic/crates/test/Cargo.toml b/cranelift/peepmatic/crates/test/Cargo.toml
index 3f4799ffd..c9db81514 100644
--- a/cranelift/peepmatic/crates/test/Cargo.toml
+++ b/cranelift/peepmatic/crates/test/Cargo.toml
@@ -8,7 +8,7 @@ publish = false
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-env_logger = "0.7.1"
+env_logger = "0.8.1"
 log = "0.4.8"
 peepmatic = { path = "../.." }
 peepmatic-runtime = { path = "../runtime" }
diff --git a/crates/test-programs/Cargo.toml b/crates/test-programs/Cargo.toml
index ef039567f..0ba992501 100644
--- a/crates/test-programs/Cargo.toml
+++ b/crates/test-programs/Cargo.toml
@@ -10,9 +10,9 @@ publish = false
 cfg-if = "1.0"
 
 [dev-dependencies]
-wasi-common = { path = "../wasi-common", version = "0.20.0" }
-wasmtime-wasi = { path = "../wasi", version = "0.20.0" }
-wasmtime = { path = "../wasmtime", version = "0.20.0" }
+wasi-common = { path = "../wasi-common", version = "0.21.0" }
+wasmtime-wasi = { path = "../wasi", version = "0.21.0" }
+wasmtime = { path = "../wasmtime", version = "0.21.0" }
 target-lexicon = "0.11.0"
 pretty_env_logger = "0.4.0"
 tempfile = "3.1.0"
diff --git a/crates/wiggle/test-helpers/Cargo.toml b/crates/wiggle/test-helpers/Cargo.toml
index 3effeb706..ea49cf6af 100644
--- a/crates/wiggle/test-helpers/Cargo.toml
+++ b/crates/wiggle/test-helpers/Cargo.toml
@@ -12,15 +12,14 @@ include = ["src/**/*", "LICENSE"]
 publish = false
 
 [dependencies]
-proptest = "0.9"
+proptest = "0.10"
 wiggle = { path = "..", features = ["tracing_log"] }
 
 [dev-dependencies]
 thiserror = "1.0"
 tracing = "0.1.14"
 tracing-subscriber = "0.2.4"
-env_logger = "0.7"
-
+env_logger = "0.8"
 
 [badges]
 maintenance = { status = "actively-developed" }
diff --git a/tests/all/func.rs b/tests/all/func.rs
index 953976e1e..fca6aed81 100644
--- a/tests/all/func.rs
+++ b/tests/all/func.rs
@@ -78,26 +78,26 @@ fn signatures_match() {
     let store = Store::default();
 
     let f = Func::wrap(&store, || {});
-    assert_eq!(f.ty().params(), &[]);
+    assert_eq!(f.ty().params().collect::<Vec<_>>(), &[]);
     assert_eq!(f.param_arity(), 0);
-    assert_eq!(f.ty().results(), &[]);
+    assert_eq!(f.ty().results().collect::<Vec<_>>(), &[]);
     assert_eq!(f.result_arity(), 0);
 
     let f = Func::wrap(&store, || -> i32 { loop {} });
-    assert_eq!(f.ty().params(), &[]);
-    assert_eq!(f.ty().results(), &[ValType::I32]);
+    assert_eq!(f.ty().params().collect::<Vec<_>>(), &[]);
+    assert_eq!(f.ty().results().collect::<Vec<_>>(), &[ValType::I32]);
 
     let f = Func::wrap(&store, || -> i64 { loop {} });
-    assert_eq!(f.ty().params(), &[]);
-    assert_eq!(f.ty().results(), &[ValType::I64]);
+    assert_eq!(f.ty().params().collect::<Vec<_>>(), &[]);
+    assert_eq!(f.ty().results().collect::<Vec<_>>(), &[ValType::I64]);
 
     let f = Func::wrap(&store, || -> f32 { loop {} });
-    assert_eq!(f.ty().params(), &[]);
-    assert_eq!(f.ty().results(), &[ValType::F32]);
+    assert_eq!(f.ty().params().collect::<Vec<_>>(), &[]);
+    assert_eq!(f.ty().results().collect::<Vec<_>>(), &[ValType::F32]);
 
     let f = Func::wrap(&store, || -> f64 { loop {} });
-    assert_eq!(f.ty().params(), &[]);
-    assert_eq!(f.ty().results(), &[ValType::F64]);
+    assert_eq!(f.ty().params().collect::<Vec<_>>(), &[]);
+    assert_eq!(f.ty().results().collect::<Vec<_>>(), &[ValType::F64]);
 
     let f = Func::wrap(
         &store,
@@ -106,7 +106,7 @@ fn signatures_match() {
         },
     );
     assert_eq!(
-        f.ty().params(),
+        f.ty().params().collect::<Vec<_>>(),
         &[
             ValType::F32,
             ValType::F64,
@@ -117,7 +117,7 @@ fn signatures_match() {
             ValType::FuncRef,
         ]
     );
-    assert_eq!(f.ty().results(), &[ValType::F64]);
+    assert_eq!(f.ty().results().collect::<Vec<_>>(), &[ValType::F64]);
 }
 
 #[test]
@@ -283,13 +283,13 @@ fn get_from_wrapper() {
 #[test]
 fn get_from_signature() {
     let store = Store::default();
-    let ty = FuncType::new(Box::new([]), Box::new([]));
+    let ty = FuncType::new(None, None);
     let f = Func::new(&store, ty, |_, _, _| panic!());
     assert!(f.get0::<()>().is_ok());
     assert!(f.get0::<i32>().is_err());
     assert!(f.get1::<i32, ()>().is_err());
 
-    let ty = FuncType::new(Box::new([ValType::I32]), Box::new([ValType::F64]));
+    let ty = FuncType::new(Some(ValType::I32), Some(ValType::F64));
     let f = Func::new(&store, ty, |_, _, _| panic!());
     assert!(f.get0::<()>().is_err());
     assert!(f.get0::<i32>().is_err());
@@ -434,7 +434,7 @@ fn caller_memory() -> anyhow::Result<()> {
 #[test]
 fn func_write_nothing() -> anyhow::Result<()> {
     let store = Store::default();
-    let ty = FuncType::new(Box::new([]), Box::new([ValType::I32]));
+    let ty = FuncType::new(None, Some(ValType::I32));
     let f = Func::new(&store, ty, |_, _, _| Ok(()));
     let err = f.call(&[]).unwrap_err().downcast::<Trap>()?;
     assert!(err
@@ -515,8 +515,8 @@ fn externref_signature_no_reference_types() -> anyhow::Result<()> {
     Func::new(
         &store,
         FuncType::new(
-            Box::new([ValType::FuncRef, ValType::ExternRef]),
-            Box::new([ValType::FuncRef, ValType::ExternRef]),
+            [ValType::FuncRef, ValType::ExternRef].iter().cloned(),
+            [ValType::FuncRef, ValType::ExternRef].iter().cloned(),
         ),
         |_, _, _| Ok(()),
     );
diff --git a/tests/all/import_calling_export.rs b/tests/all/import_calling_export.rs
index 09eb80979..3fc87e2d4 100644
--- a/tests/all/import_calling_export.rs
+++ b/tests/all/import_calling_export.rs
@@ -22,21 +22,17 @@ fn test_import_calling_export() {
     let other = Rc::new(RefCell::new(None::<Func>));
     let other2 = Rc::downgrade(&other);
 
-    let callback_func = Func::new(
-        &store,
-        FuncType::new(Box::new([]), Box::new([])),
-        move |_, _, _| {
-            other2
-                .upgrade()
-                .unwrap()
-                .borrow()
-                .as_ref()
-                .expect("expected a function ref")
-                .call(&[])
-                .expect("expected function not to trap");
-            Ok(())
-        },
-    );
+    let callback_func = Func::new(&store, FuncType::new(None, None), move |_, _, _| {
+        other2
+            .upgrade()
+            .unwrap()
+            .borrow()
+            .as_ref()
+            .expect("expected a function ref")
+            .call(&[])
+            .expect("expected function not to trap");
+        Ok(())
+    });
 
     let imports = vec![callback_func.into()];
     let instance =
@@ -71,7 +67,7 @@ fn test_returns_incorrect_type() -> Result<()> {
 
     let callback_func = Func::new(
         &store,
-        FuncType::new(Box::new([]), Box::new([ValType::I32])),
+        FuncType::new(None, Some(ValType::I32)),
         |_, _, results| {
             // Evil! Returns I64 here instead of promised in the signature I32.
             results[0] = Val::I64(228);
diff --git a/tests/all/import_indexes.rs b/tests/all/import_indexes.rs
index d9cd06cd6..3577467c3 100644
--- a/tests/all/import_indexes.rs
+++ b/tests/all/import_indexes.rs
@@ -20,7 +20,7 @@ fn same_import_names_still_distinct() -> anyhow::Result<()> {
     let imports = [
         Func::new(
             &store,
-            FuncType::new(Box::new([]), Box::new([ValType::I32])),
+            FuncType::new(None, Some(ValType::I32)),
             |_, params, results| {
                 assert!(params.is_empty());
                 assert_eq!(results.len(), 1);
@@ -31,7 +31,7 @@ fn same_import_names_still_distinct() -> anyhow::Result<()> {
         .into(),
         Func::new(
             &store,
-            FuncType::new(Box::new([]), Box::new([ValType::F32])),
+            FuncType::new(None, Some(ValType::F32)),
             |_, params, results| {
                 assert!(params.is_empty());
                 assert_eq!(results.len(), 1);
diff --git a/tests/all/traps.rs b/tests/all/traps.rs
index 8919bd123..0a8196a0d 100644
--- a/tests/all/traps.rs
+++ b/tests/all/traps.rs
@@ -13,7 +13,7 @@ fn test_trap_return() -> Result<()> {
     "#;
 
     let module = Module::new(store.engine(), wat)?;
-    let hello_type = FuncType::new(Box::new([]), Box::new([]));
+    let hello_type = FuncType::new(None, None);
     let hello_func = Func::new(&store, hello_type, |_, _, _| Err(Trap::new("test 123")));
 
     let instance = Instance::new(&store, &module, &[hello_func.into()])?;
@@ -86,7 +86,7 @@ fn test_trap_trace_cb() -> Result<()> {
         )
     "#;
 
-    let fn_type = FuncType::new(Box::new([]), Box::new([]));
+    let fn_type = FuncType::new(None, None);
     let fn_func = Func::new(&store, fn_type, |_, _, _| Err(Trap::new("cb throw")));
 
     let module = Module::new(store.engine(), wat)?;
@@ -237,7 +237,7 @@ fn trap_start_function_import() -> Result<()> {
     )?;
 
     let module = Module::new(store.engine(), &binary)?;
-    let sig = FuncType::new(Box::new([]), Box::new([]));
+    let sig = FuncType::new(None, None);
     let func = Func::new(&store, sig, |_, _, _| Err(Trap::new("user trap")));
     let err = Instance::new(&store, &module, &[func.into()])
         .err()
@@ -267,7 +267,7 @@ fn rust_panic_import() -> Result<()> {
     )?;
 
     let module = Module::new(store.engine(), &binary)?;
-    let sig = FuncType::new(Box::new([]), Box::new([]));
+    let sig = FuncType::new(None, None);
     let func = Func::new(&store, sig, |_, _, _| panic!("this is a panic"));
     let instance = Instance::new(
         &store,
@@ -311,7 +311,7 @@ fn rust_panic_start_function() -> Result<()> {
     )?;
 
     let module = Module::new(store.engine(), &binary)?;
-    let sig = FuncType::new(Box::new([]), Box::new([]));
+    let sig = FuncType::new(None, None);
     let func = Func::new(&store, sig, |_, _, _| panic!("this is a panic"));
     let err = panic::catch_unwind(AssertUnwindSafe(|| {
         drop(Instance::new(&store, &module, &[func.into()]));