Refactor usage of SecondaryMap impls (serde, PartialEq)
This commit is contained in:
@@ -11,10 +11,10 @@ edition = "2018"
|
|||||||
default-run = "wasmtime"
|
default-run = "wasmtime"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
cranelift-codegen = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-codegen = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
cranelift-native = "0.40.0"
|
cranelift-entity = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
cranelift-entity = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-wasm = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
cranelift-wasm = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-native = "0.41.0"
|
||||||
wasmtime-api = { path = "wasmtime-api" }
|
wasmtime-api = { path = "wasmtime-api" }
|
||||||
wasmtime-debug = { path = "wasmtime-debug" }
|
wasmtime-debug = { path = "wasmtime-debug" }
|
||||||
wasmtime-environ = { path = "wasmtime-environ" }
|
wasmtime-environ = { path = "wasmtime-environ" }
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ topdir=$(dirname "$0")
|
|||||||
cd "$topdir"
|
cd "$topdir"
|
||||||
|
|
||||||
# All the cranelift-* crates have the same version number
|
# All the cranelift-* crates have the same version number
|
||||||
version="0.38.0"
|
version="0.41.0"
|
||||||
|
|
||||||
# Update all of the Cargo.toml files.
|
# Update all of the Cargo.toml files.
|
||||||
echo "Updating crate versions to $version"
|
echo "Updating crate versions to $version"
|
||||||
|
|||||||
@@ -11,9 +11,9 @@ cargo-fuzz = true
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
wasmtime-environ = { path = "../wasmtime-environ" }
|
wasmtime-environ = { path = "../wasmtime-environ" }
|
||||||
wasmtime-jit = { path = "../wasmtime-jit" }
|
wasmtime-jit = { path = "../wasmtime-jit" }
|
||||||
cranelift-codegen = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-codegen = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
cranelift-wasm = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-wasm = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
cranelift-native = "0.40.0"
|
cranelift-native = "0.41.0"
|
||||||
libfuzzer-sys = { git = "https://github.com/rust-fuzz/libfuzzer-sys.git" }
|
libfuzzer-sys = { git = "https://github.com/rust-fuzz/libfuzzer-sys.git" }
|
||||||
wasmparser = { version = "0.36.0", default-features = false }
|
wasmparser = { version = "0.36.0", default-features = false }
|
||||||
binaryen = "0.5.0"
|
binaryen = "0.5.0"
|
||||||
|
|||||||
@@ -12,11 +12,11 @@ name = "_wasmtime"
|
|||||||
crate-type = ["cdylib"]
|
crate-type = ["cdylib"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
cranelift-codegen = "0.40.0"
|
cranelift-codegen = "0.41.0"
|
||||||
cranelift-native = "0.40.0"
|
cranelift-native = "0.41.0"
|
||||||
cranelift-entity = "0.40.0"
|
cranelift-entity = "0.41.0"
|
||||||
cranelift-wasm = "0.40.0"
|
cranelift-wasm = "0.41.0"
|
||||||
cranelift-frontend = "0.40.0"
|
cranelift-frontend = "0.41.0"
|
||||||
wasmtime-environ = { path = "../../wasmtime-environ" }
|
wasmtime-environ = { path = "../../wasmtime-environ" }
|
||||||
wasmtime-interface-types = { path = "../../wasmtime-interface-types" }
|
wasmtime-interface-types = { path = "../../wasmtime-interface-types" }
|
||||||
wasmtime-jit = { path = "../../wasmtime-jit" }
|
wasmtime-jit = { path = "../../wasmtime-jit" }
|
||||||
|
|||||||
@@ -12,8 +12,8 @@ test = false
|
|||||||
doctest = false
|
doctest = false
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
cranelift-codegen = "0.40.0"
|
cranelift-codegen = "0.41.0"
|
||||||
cranelift-native = "0.40.0"
|
cranelift-native = "0.41.0"
|
||||||
failure = "0.1.5"
|
failure = "0.1.5"
|
||||||
wasmtime-interface-types = { path = "../../wasmtime-interface-types" }
|
wasmtime-interface-types = { path = "../../wasmtime-interface-types" }
|
||||||
wasmtime-jit = { path = "../../wasmtime-jit" }
|
wasmtime-jit = { path = "../../wasmtime-jit" }
|
||||||
|
|||||||
@@ -12,11 +12,11 @@ name = "wasmtime_api"
|
|||||||
crate-type = ["lib", "staticlib", "cdylib"]
|
crate-type = ["lib", "staticlib", "cdylib"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
cranelift-codegen = "0.40.0"
|
cranelift-codegen = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
cranelift-native = "0.40.0"
|
cranelift-native = "0.41.0"
|
||||||
cranelift-entity = "0.40.0"
|
cranelift-entity = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
cranelift-wasm = "0.40.0"
|
cranelift-wasm = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
cranelift-frontend = "0.40.0"
|
cranelift-frontend = "0.41.0"
|
||||||
wasmtime-runtime = { path="../wasmtime-runtime" }
|
wasmtime-runtime = { path="../wasmtime-runtime" }
|
||||||
wasmtime-environ = { path="../wasmtime-environ" }
|
wasmtime-environ = { path="../wasmtime-environ" }
|
||||||
wasmtime-jit = { path="../wasmtime-jit" }
|
wasmtime-jit = { path="../wasmtime-jit" }
|
||||||
|
|||||||
@@ -254,6 +254,14 @@ impl binemit::RelocSink for RelocSink {
|
|||||||
) {
|
) {
|
||||||
panic!("trampoline compilation should not produce external symbol relocs");
|
panic!("trampoline compilation should not produce external symbol relocs");
|
||||||
}
|
}
|
||||||
|
fn reloc_constant(
|
||||||
|
&mut self,
|
||||||
|
_code_offset: binemit::CodeOffset,
|
||||||
|
_reloc: binemit::Reloc,
|
||||||
|
_constant_offset: ir::ConstantOffset,
|
||||||
|
) {
|
||||||
|
panic!("trampoline compilation should not produce constant relocs");
|
||||||
|
}
|
||||||
fn reloc_jt(
|
fn reloc_jt(
|
||||||
&mut self,
|
&mut self,
|
||||||
_offset: binemit::CodeOffset,
|
_offset: binemit::CodeOffset,
|
||||||
|
|||||||
@@ -14,9 +14,9 @@ edition = "2018"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
gimli = "0.19.0"
|
gimli = "0.19.0"
|
||||||
wasmparser = { version = "0.36.0" }
|
wasmparser = { version = "0.36.0" }
|
||||||
cranelift-codegen = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-codegen = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
cranelift-entity = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-entity = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
cranelift-wasm = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-wasm = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
faerie = "0.10.1"
|
faerie = "0.10.1"
|
||||||
wasmtime-environ = { path = "../wasmtime-environ", default-features = false }
|
wasmtime-environ = { path = "../wasmtime-environ", default-features = false }
|
||||||
target-lexicon = { version = "0.4.0", default-features = false }
|
target-lexicon = { version = "0.4.0", default-features = false }
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ readme = "README.md"
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
cranelift-codegen = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-codegen = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
cranelift-entity = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-entity = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
cranelift-wasm = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-wasm = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
lightbeam = { path = "../lightbeam", optional = true }
|
lightbeam = { path = "../lightbeam", optional = true }
|
||||||
failure = { version = "0.1.3", default-features = false }
|
failure = { version = "0.1.3", default-features = false }
|
||||||
failure_derive = { version = "0.1.3", default-features = false }
|
failure_derive = { version = "0.1.3", default-features = false }
|
||||||
@@ -35,6 +35,7 @@ tempfile = "3"
|
|||||||
target-lexicon = { version = "0.4.0", default-features = false }
|
target-lexicon = { version = "0.4.0", default-features = false }
|
||||||
pretty_env_logger = "0.3.0"
|
pretty_env_logger = "0.3.0"
|
||||||
rand = { version = "0.7.0", features = ["small_rng"] }
|
rand = { version = "0.7.0", features = ["small_rng"] }
|
||||||
|
cranelift-codegen = { version = "0.41.0", features = ["enable-serde", "all-arch"] }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["std"]
|
default = ["std"]
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
use crate::address_map::{ModuleAddressMap, ValueLabelsRanges};
|
use crate::address_map::{ModuleAddressMap, ValueLabelsRanges};
|
||||||
use crate::compilation::{CodeAndJTOffsets, Compilation, Relocations};
|
use crate::compilation::{Compilation, Relocations};
|
||||||
use crate::module::Module;
|
use crate::module::Module;
|
||||||
use crate::module_environ::FunctionBodyData;
|
use crate::module_environ::FunctionBodyData;
|
||||||
use core::hash::Hasher;
|
use core::hash::Hasher;
|
||||||
@@ -8,10 +8,8 @@ use cranelift_entity::PrimaryMap;
|
|||||||
use cranelift_wasm::DefinedFuncIndex;
|
use cranelift_wasm::DefinedFuncIndex;
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
use log::{debug, warn};
|
use log::{debug, warn};
|
||||||
use serde::de::{self, Deserialize, Deserializer, MapAccess, SeqAccess, Visitor};
|
use serde::{Deserialize, Serialize};
|
||||||
use serde::ser::{self, Serialize, SerializeSeq, SerializeStruct, Serializer};
|
|
||||||
use sha2::{Digest, Sha256};
|
use sha2::{Digest, Sha256};
|
||||||
use std::fmt;
|
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
@@ -181,7 +179,7 @@ pub struct ModuleCacheEntry {
|
|||||||
mod_cache_path: Option<PathBuf>,
|
mod_cache_path: Option<PathBuf>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(serde::Serialize, serde::Deserialize, Debug)]
|
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
|
||||||
pub struct ModuleCacheData {
|
pub struct ModuleCacheData {
|
||||||
compilation: Compilation,
|
compilation: Compilation,
|
||||||
relocations: Relocations,
|
relocations: Relocations,
|
||||||
@@ -239,7 +237,7 @@ impl ModuleCacheEntry {
|
|||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
ModuleCacheEntry { mod_cache_path }
|
Self { mod_cache_path }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_data(&self) -> Option<ModuleCacheData> {
|
pub fn get_data(&self) -> Option<ModuleCacheData> {
|
||||||
@@ -370,175 +368,5 @@ impl Hasher for Sha256Hasher {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//-////////////////////////////////////////////////////////////////////
|
|
||||||
// Serialization and deserialization of type containing SecondaryMap //
|
|
||||||
//-////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
enum JtOffsetsWrapper<'a> {
|
|
||||||
Ref(&'a ir::JumpTableOffsets), // for serialization
|
|
||||||
Data(ir::JumpTableOffsets), // for deserialization
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Serialize for CodeAndJTOffsets {
|
|
||||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
|
||||||
where
|
|
||||||
S: Serializer,
|
|
||||||
{
|
|
||||||
let mut cajto = serializer.serialize_struct("CodeAndJTOffsets", 2)?;
|
|
||||||
cajto.serialize_field("body", &self.body)?;
|
|
||||||
cajto.serialize_field("jt_offsets", &JtOffsetsWrapper::Ref(&self.jt_offsets))?;
|
|
||||||
cajto.end()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'de> Deserialize<'de> for CodeAndJTOffsets {
|
|
||||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
|
||||||
where
|
|
||||||
D: Deserializer<'de>,
|
|
||||||
{
|
|
||||||
#[derive(serde::Deserialize)]
|
|
||||||
#[serde(field_identifier, rename_all = "lowercase")]
|
|
||||||
enum Field {
|
|
||||||
Body,
|
|
||||||
JtOffsets,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CodeAndJTOffsetsVisitor;
|
|
||||||
|
|
||||||
impl<'de> Visitor<'de> for CodeAndJTOffsetsVisitor {
|
|
||||||
type Value = CodeAndJTOffsets;
|
|
||||||
|
|
||||||
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
formatter.write_str("struct CodeAndJTOffsets")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_seq<V>(self, mut seq: V) -> Result<Self::Value, V::Error>
|
|
||||||
where
|
|
||||||
V: SeqAccess<'de>,
|
|
||||||
{
|
|
||||||
let body = seq
|
|
||||||
.next_element()?
|
|
||||||
.ok_or_else(|| de::Error::invalid_length(0, &self))?;
|
|
||||||
let jt_offsets = seq
|
|
||||||
.next_element()?
|
|
||||||
.ok_or_else(|| de::Error::invalid_length(1, &self))?;
|
|
||||||
match jt_offsets {
|
|
||||||
JtOffsetsWrapper::Data(jt_offsets) => Ok(CodeAndJTOffsets { body, jt_offsets }),
|
|
||||||
JtOffsetsWrapper::Ref(_) => Err(de::Error::custom(
|
|
||||||
"Received invalid variant of JtOffsetsWrapper",
|
|
||||||
)),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_map<V>(self, mut map: V) -> Result<Self::Value, V::Error>
|
|
||||||
where
|
|
||||||
V: MapAccess<'de>,
|
|
||||||
{
|
|
||||||
let mut body = None;
|
|
||||||
let mut jt_offsets = None;
|
|
||||||
while let Some(key) = map.next_key()? {
|
|
||||||
match key {
|
|
||||||
Field::Body => {
|
|
||||||
if body.is_some() {
|
|
||||||
return Err(de::Error::duplicate_field("body"));
|
|
||||||
}
|
|
||||||
body = Some(map.next_value()?);
|
|
||||||
}
|
|
||||||
Field::JtOffsets => {
|
|
||||||
if jt_offsets.is_some() {
|
|
||||||
return Err(de::Error::duplicate_field("jt_offsets"));
|
|
||||||
}
|
|
||||||
jt_offsets = Some(map.next_value()?);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let body = body.ok_or_else(|| de::Error::missing_field("body"))?;
|
|
||||||
let jt_offsets =
|
|
||||||
jt_offsets.ok_or_else(|| de::Error::missing_field("jt_offsets"))?;
|
|
||||||
match jt_offsets {
|
|
||||||
JtOffsetsWrapper::Data(jt_offsets) => Ok(CodeAndJTOffsets { body, jt_offsets }),
|
|
||||||
JtOffsetsWrapper::Ref(_) => Err(de::Error::custom(
|
|
||||||
"Received invalid variant of JtOffsetsWrapper",
|
|
||||||
)),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const FIELDS: &'static [&'static str] = &["body", "jt_offsets"];
|
|
||||||
deserializer.deserialize_struct("CodeAndJTOffsets", FIELDS, CodeAndJTOffsetsVisitor)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Serialize for JtOffsetsWrapper<'_> {
|
|
||||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
|
||||||
where
|
|
||||||
S: Serializer,
|
|
||||||
{
|
|
||||||
match self {
|
|
||||||
JtOffsetsWrapper::Ref(data) => {
|
|
||||||
// TODO: bincode encodes option as "byte for Some/None" and then optionally the content
|
|
||||||
// TODO: we can actually optimize it by encoding manually bitmask, then elements
|
|
||||||
let default_val = data.get_default();
|
|
||||||
let mut seq = serializer.serialize_seq(Some(1 + data.len()))?;
|
|
||||||
seq.serialize_element(&Some(default_val))?;
|
|
||||||
for e in data.values() {
|
|
||||||
let some_e = Some(e);
|
|
||||||
seq.serialize_element(if e == default_val { &None } else { &some_e })?;
|
|
||||||
}
|
|
||||||
seq.end()
|
|
||||||
}
|
|
||||||
JtOffsetsWrapper::Data(_) => Err(ser::Error::custom(
|
|
||||||
"Received invalid variant of JtOffsetsWrapper",
|
|
||||||
)),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'de> Deserialize<'de> for JtOffsetsWrapper<'_> {
|
|
||||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
|
||||||
where
|
|
||||||
D: Deserializer<'de>,
|
|
||||||
{
|
|
||||||
struct JtOffsetsWrapperVisitor;
|
|
||||||
|
|
||||||
impl<'de> Visitor<'de> for JtOffsetsWrapperVisitor {
|
|
||||||
type Value = JtOffsetsWrapper<'static>;
|
|
||||||
|
|
||||||
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
formatter.write_str("struct JtOffsetsWrapper")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
|
|
||||||
where
|
|
||||||
A: SeqAccess<'de>,
|
|
||||||
{
|
|
||||||
match seq.next_element()? {
|
|
||||||
Some(Some(default_val)) => {
|
|
||||||
let mut m = cranelift_entity::SecondaryMap::with_default(default_val);
|
|
||||||
let mut idx = 0;
|
|
||||||
while let Some(val) = seq.next_element()? {
|
|
||||||
let val: Option<_> = val; // compiler can't infer the type, and this line is needed
|
|
||||||
match ir::JumpTable::with_number(idx) {
|
|
||||||
Some(jt_idx) => m[jt_idx] = val.unwrap_or(default_val),
|
|
||||||
None => {
|
|
||||||
return Err(serde::de::Error::custom(
|
|
||||||
"Invalid JumpTable reference",
|
|
||||||
))
|
|
||||||
}
|
|
||||||
};
|
|
||||||
idx += 1;
|
|
||||||
}
|
|
||||||
Ok(JtOffsetsWrapper::Data(m))
|
|
||||||
}
|
|
||||||
_ => Err(serde::de::Error::custom("Default value required")),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
deserializer.deserialize_seq(JtOffsetsWrapperVisitor {})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests;
|
mod tests;
|
||||||
|
|||||||
68
wasmtime-environ/src/cache/tests.rs
vendored
68
wasmtime-environ/src/cache/tests.rs
vendored
@@ -1,8 +1,7 @@
|
|||||||
use super::*;
|
use super::*;
|
||||||
use crate::address_map::{FunctionAddressMap, InstructionAddressMap};
|
use crate::address_map::{FunctionAddressMap, InstructionAddressMap};
|
||||||
use crate::compilation::{Relocation, RelocationTarget};
|
use crate::compilation::{CodeAndJTOffsets, Relocation, RelocationTarget};
|
||||||
use crate::module::{MemoryPlan, MemoryStyle, Module};
|
use crate::module::{MemoryPlan, MemoryStyle, Module};
|
||||||
use cranelift_codegen::ir::entities::JumpTable;
|
|
||||||
use cranelift_codegen::{binemit, ir, isa, settings, ValueLocRange};
|
use cranelift_codegen::{binemit, ir, isa, settings, ValueLocRange};
|
||||||
use cranelift_entity::EntityRef;
|
use cranelift_entity::EntityRef;
|
||||||
use cranelift_entity::{PrimaryMap, SecondaryMap};
|
use cranelift_entity::{PrimaryMap, SecondaryMap};
|
||||||
@@ -10,7 +9,7 @@ use cranelift_wasm::{DefinedFuncIndex, FuncIndex, Global, GlobalInit, Memory, Si
|
|||||||
use rand::rngs::SmallRng;
|
use rand::rngs::SmallRng;
|
||||||
use rand::{Rng, SeedableRng};
|
use rand::{Rng, SeedableRng};
|
||||||
use std::boxed::Box;
|
use std::boxed::Box;
|
||||||
use std::cmp::{max, min};
|
use std::cmp::min;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use std::vec::Vec;
|
use std::vec::Vec;
|
||||||
@@ -45,7 +44,7 @@ fn test_write_read_cache() {
|
|||||||
code_container.resize(0x4000, 0);
|
code_container.resize(0x4000, 0);
|
||||||
rng.fill(&mut code_container[..]);
|
rng.fill(&mut code_container[..]);
|
||||||
|
|
||||||
let isa1 = new_isa("riscv64");
|
let isa1 = new_isa("riscv64-unknown-unknown");
|
||||||
let isa2 = new_isa("i386");
|
let isa2 = new_isa("i386");
|
||||||
let module1 = new_module(&mut rng);
|
let module1 = new_module(&mut rng);
|
||||||
let module2 = new_module(&mut rng);
|
let module2 = new_module(&mut rng);
|
||||||
@@ -264,64 +263,3 @@ impl ModuleCacheEntry {
|
|||||||
&self.mod_cache_path
|
&self.mod_cache_path
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// cranelift's types (including SecondaryMap) doesn't implement PartialEq
|
|
||||||
impl PartialEq for ModuleCacheData {
|
|
||||||
fn eq(&self, other: &Self) -> bool {
|
|
||||||
// compilation field
|
|
||||||
if self.compilation.len() != other.compilation.len() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for i in (0..self.compilation.len()).map(DefinedFuncIndex::new) {
|
|
||||||
let lhs = self.compilation.get(i);
|
|
||||||
let rhs = other.compilation.get(i);
|
|
||||||
if lhs.body != rhs.body || lhs.jt_offsets.get_default() != rhs.jt_offsets.get_default()
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for j in (0..max(lhs.jt_offsets.len(), rhs.jt_offsets.len())).map(JumpTable::new) {
|
|
||||||
if lhs.jt_offsets.get(j) != rhs.jt_offsets.get(j) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// relocs
|
|
||||||
{
|
|
||||||
if self.relocations.len() != other.relocations.len() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
let it_lhs = self.relocations.iter();
|
|
||||||
let it_rhs = other.relocations.iter();
|
|
||||||
if it_lhs.zip(it_rhs).any(|(lhs, rhs)| lhs != rhs) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// debug symbols
|
|
||||||
{
|
|
||||||
if self.address_transforms.len() != other.address_transforms.len() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
let it_lhs = self.address_transforms.iter();
|
|
||||||
let it_rhs = other.address_transforms.iter();
|
|
||||||
if it_lhs.zip(it_rhs).any(|(lhs, rhs)| lhs != rhs) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// binemit::Reloc doesn't implement PartialEq
|
|
||||||
impl PartialEq for Relocation {
|
|
||||||
fn eq(&self, other: &Self) -> bool {
|
|
||||||
self.reloc as u64 == other.reloc as u64
|
|
||||||
&& self.reloc_target == other.reloc_target
|
|
||||||
&& self.offset == other.offset
|
|
||||||
&& self.addend == other.addend
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ use std::ops::Range;
|
|||||||
use std::vec::Vec;
|
use std::vec::Vec;
|
||||||
|
|
||||||
/// Compiled machine code: body and jump table offsets.
|
/// Compiled machine code: body and jump table offsets.
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct CodeAndJTOffsets {
|
pub struct CodeAndJTOffsets {
|
||||||
/// The function body.
|
/// The function body.
|
||||||
pub body: Vec<u8>,
|
pub body: Vec<u8>,
|
||||||
@@ -24,7 +24,7 @@ pub struct CodeAndJTOffsets {
|
|||||||
type Functions = PrimaryMap<DefinedFuncIndex, CodeAndJTOffsets>;
|
type Functions = PrimaryMap<DefinedFuncIndex, CodeAndJTOffsets>;
|
||||||
|
|
||||||
/// The result of compiling a WebAssembly module's functions.
|
/// The result of compiling a WebAssembly module's functions.
|
||||||
#[derive(Deserialize, Serialize, Debug)]
|
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq)]
|
||||||
pub struct Compilation {
|
pub struct Compilation {
|
||||||
/// Compiled machine code for the function bodies.
|
/// Compiled machine code for the function bodies.
|
||||||
functions: Functions,
|
functions: Functions,
|
||||||
@@ -95,7 +95,7 @@ impl<'a> Iterator for Iter<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// A record of a relocation to perform.
|
/// A record of a relocation to perform.
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone)]
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct Relocation {
|
pub struct Relocation {
|
||||||
/// The relocation code.
|
/// The relocation code.
|
||||||
pub reloc: binemit::Reloc,
|
pub reloc: binemit::Reloc,
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ readme = "README.md"
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
cranelift-codegen = "0.40.0"
|
cranelift-codegen = "0.41.0"
|
||||||
failure = "0.1"
|
failure = "0.1"
|
||||||
walrus = "0.11.0"
|
walrus = "0.11.0"
|
||||||
wasmparser = "0.36.0"
|
wasmparser = "0.36.0"
|
||||||
|
|||||||
@@ -11,10 +11,10 @@ readme = "README.md"
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
cranelift-codegen = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-codegen = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
cranelift-entity = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-entity = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
cranelift-wasm = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-wasm = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
cranelift-frontend = "0.40.0"
|
cranelift-frontend = "0.41.0"
|
||||||
wasmtime-environ = { path = "../wasmtime-environ", default-features = false }
|
wasmtime-environ = { path = "../wasmtime-environ", default-features = false }
|
||||||
wasmtime-runtime = { path = "../wasmtime-runtime", default-features = false }
|
wasmtime-runtime = { path = "../wasmtime-runtime", default-features = false }
|
||||||
wasmtime-debug = { path = "../wasmtime-debug", default-features = false }
|
wasmtime-debug = { path = "../wasmtime-debug", default-features = false }
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ readme = "README.md"
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
cranelift-codegen = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-codegen = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
cranelift-entity = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-entity = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
cranelift-wasm = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-wasm = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
wasmtime-environ = { path = "../wasmtime-environ" }
|
wasmtime-environ = { path = "../wasmtime-environ" }
|
||||||
faerie = "0.10.1"
|
faerie = "0.10.1"
|
||||||
|
|||||||
@@ -11,9 +11,9 @@ readme = "README.md"
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
cranelift-codegen = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-codegen = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
cranelift-entity = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-entity = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
cranelift-wasm = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-wasm = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
wasmtime-environ = { path = "../wasmtime-environ", default-features = false }
|
wasmtime-environ = { path = "../wasmtime-environ", default-features = false }
|
||||||
region = "2.0.0"
|
region = "2.0.0"
|
||||||
lazy_static = "1.2.0"
|
lazy_static = "1.2.0"
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ readme = "README.md"
|
|||||||
wasmtime-runtime = { path = "../wasmtime-runtime" }
|
wasmtime-runtime = { path = "../wasmtime-runtime" }
|
||||||
wasmtime-environ = { path = "../wasmtime-environ" }
|
wasmtime-environ = { path = "../wasmtime-environ" }
|
||||||
wasmtime-jit = { path = "../wasmtime-jit" }
|
wasmtime-jit = { path = "../wasmtime-jit" }
|
||||||
cranelift-codegen = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-codegen = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
cranelift-entity = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-entity = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
cranelift-wasm = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-wasm = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
target-lexicon = "0.4.0"
|
target-lexicon = "0.4.0"
|
||||||
log = { version = "0.4.8", default-features = false }
|
log = { version = "0.4.8", default-features = false }
|
||||||
libc = "0.2.60"
|
libc = "0.2.60"
|
||||||
|
|||||||
@@ -13,9 +13,9 @@ wasmtime-runtime = { path = "../wasmtime-runtime" }
|
|||||||
wasmtime-environ = { path = "../wasmtime-environ" }
|
wasmtime-environ = { path = "../wasmtime-environ" }
|
||||||
wasmtime-jit = { path = "../wasmtime-jit" }
|
wasmtime-jit = { path = "../wasmtime-jit" }
|
||||||
wasi-common = { git = "https://github.com/CraneStation/wasi-common", rev = "8ea7a983d8b1364e5f62d2adf0e74b3b8db1c9b3"}
|
wasi-common = { git = "https://github.com/CraneStation/wasi-common", rev = "8ea7a983d8b1364e5f62d2adf0e74b3b8db1c9b3"}
|
||||||
cranelift-codegen = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-codegen = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
cranelift-entity = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-entity = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
cranelift-wasm = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-wasm = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
target-lexicon = "0.4.0"
|
target-lexicon = "0.4.0"
|
||||||
log = { version = "0.4.8", default-features = false }
|
log = { version = "0.4.8", default-features = false }
|
||||||
|
|
||||||
|
|||||||
@@ -11,9 +11,9 @@ readme = "README.md"
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
cranelift-codegen = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-codegen = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
cranelift-wasm = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-entity = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
cranelift-entity = { version = "0.40.0", features = ["enable-serde"] }
|
cranelift-wasm = { version = "0.41.0", features = ["enable-serde"] }
|
||||||
wasmtime-jit = { path = "../wasmtime-jit" }
|
wasmtime-jit = { path = "../wasmtime-jit" }
|
||||||
wasmtime-runtime = { path = "../wasmtime-runtime" }
|
wasmtime-runtime = { path = "../wasmtime-runtime" }
|
||||||
wasmtime-environ = { path = "../wasmtime-environ" }
|
wasmtime-environ = { path = "../wasmtime-environ" }
|
||||||
|
|||||||
Reference in New Issue
Block a user