Update wasmparser to 0.83

This commit is contained in:
Amanieu d'Antras
2022-03-31 19:31:33 +01:00
parent 2ec7862982
commit 3ad9552e2e
14 changed files with 189 additions and 102 deletions

16
Cargo.lock generated
View File

@@ -2787,7 +2787,7 @@ dependencies = [
"wasmer-engine-universal",
"wasmer-types",
"wasmer-vm",
"wasmparser 0.78.2",
"wasmparser 0.83.0",
"wat",
"winapi",
]
@@ -2903,7 +2903,7 @@ dependencies = [
"thiserror",
"wasmer-types",
"wasmer-vm",
"wasmparser 0.78.2",
"wasmparser 0.83.0",
]
[[package]]
@@ -3268,18 +3268,18 @@ dependencies = [
"wasmer-wast",
]
[[package]]
name = "wasmparser"
version = "0.78.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "52144d4c78e5cf8b055ceab8e5fa22814ce4315d6002ad32cfd914f37c12fd65"
[[package]]
name = "wasmparser"
version = "0.82.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0559cc0f1779240d6f894933498877ea94f693d84f3ee39c9a9932c6c312bd70"
[[package]]
name = "wasmparser"
version = "0.83.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a"
[[package]]
name = "wasmprinter"
version = "0.2.32"

View File

@@ -62,7 +62,7 @@ wasm-bindgen = "0.2.74"
js-sys = "0.3.51"
wasmer-derive = { path = "../derive", version = "=2.2.1" }
# - Optional dependencies for `js`.
wasmparser = { version = "0.78", default-features = false, optional = true }
wasmparser = { version = "0.83", default-features = false, optional = true }
hashbrown = { version = "0.11", optional = true }
# - Development Dependencies for `js`.
[target.'cfg(target_arch = "wasm32")'.dev-dependencies]

View File

@@ -368,28 +368,31 @@ pub fn parse_import_section<'data>(
field_name.unwrap_or_default(),
)?;
}
ImportSectionEntryType::Module(_)
| ImportSectionEntryType::Instance(_)
| ImportSectionEntryType::Event(_) => {
ImportSectionEntryType::Module(_) | ImportSectionEntryType::Instance(_) => {
unimplemented!("module linking not implemented yet")
}
ImportSectionEntryType::Memory(WPMemoryType::M32 {
limits: ref memlimits,
ImportSectionEntryType::Tag(_) => {
unimplemented!("exception handling not implemented yet")
}
ImportSectionEntryType::Memory(WPMemoryType {
shared,
memory64,
initial,
maximum,
}) => {
if memory64 {
unimplemented!("64bit memory not implemented yet");
}
module_info.declare_memory_import(
MemoryType {
minimum: Pages(memlimits.initial),
maximum: memlimits.maximum.map(Pages),
minimum: Pages(initial as u32),
maximum: maximum.map(|p| Pages(p as u32)),
shared,
},
module_name,
field_name.unwrap_or_default(),
)?;
}
ImportSectionEntryType::Memory(WPMemoryType::M64 { .. }) => {
unimplemented!("64bit memory not implemented yet")
}
ImportSectionEntryType::Global(ref ty) => {
module_info.declare_global_import(
GlobalType {
@@ -404,8 +407,8 @@ pub fn parse_import_section<'data>(
module_info.declare_table_import(
TableType {
ty: wptype_to_type(tab.element_type).unwrap(),
minimum: tab.limits.initial,
maximum: tab.limits.maximum,
minimum: tab.initial,
maximum: tab.maximum,
},
module_name,
field_name.unwrap_or_default(),
@@ -443,8 +446,8 @@ pub fn parse_table_section(
let table = entry.map_err(transform_err)?;
module_info.declare_table(TableType {
ty: wptype_to_type(table.element_type).unwrap(),
minimum: table.limits.initial,
maximum: table.limits.maximum,
minimum: table.initial,
maximum: table.maximum,
})?;
}
@@ -459,18 +462,21 @@ pub fn parse_memory_section(
module_info.reserve_memories(memories.get_count())?;
for entry in memories {
let memory = entry.map_err(transform_err)?;
match memory {
WPMemoryType::M32 { limits, shared } => {
let WPMemoryType {
shared,
memory64,
initial,
maximum,
} = entry.map_err(transform_err)?;
if memory64 {
unimplemented!("64bit memory not implemented yet");
}
module_info.declare_memory(MemoryType {
minimum: Pages(limits.initial),
maximum: limits.maximum.map(Pages),
minimum: Pages(initial as u32),
maximum: maximum.map(|p| Pages(p as u32)),
shared,
})?;
}
WPMemoryType::M64 { .. } => unimplemented!("64bit memory not implemented yet"),
}
}
Ok(())
}
@@ -528,12 +534,12 @@ pub fn parse_export_section<'data>(
ExternalKind::Global => {
module_info.declare_global_export(GlobalIndex::new(index), field)?
}
ExternalKind::Type
| ExternalKind::Module
| ExternalKind::Instance
| ExternalKind::Event => {
ExternalKind::Type | ExternalKind::Module | ExternalKind::Instance => {
unimplemented!("module linking not implemented yet")
}
ExternalKind::Tag => {
unimplemented!("exception handling not implemented yet")
}
}
}
Ok(())
@@ -569,7 +575,14 @@ pub fn parse_name_section<'data>(
}
}
wasmparser::Name::Local(_) => {}
wasmparser::Name::Unknown { .. } => {}
wasmparser::Name::Label(_)
| wasmparser::Name::Type(_)
| wasmparser::Name::Table(_)
| wasmparser::Name::Memory(_)
| wasmparser::Name::Global(_)
| wasmparser::Name::Element(_)
| wasmparser::Name::Data(_)
| wasmparser::Name::Unknown { .. } => {}
};
}
Ok(())

View File

@@ -253,7 +253,13 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
}
Operator::Select => {
// we can ignore metadata because extern ref must use TypedSelect
let ((arg1, _), (arg2, _), (cond, _)) = state.pop3();
let ((mut arg1, _), (mut arg2, _), (cond, _)) = state.pop3();
if builder.func.dfg.value_type(arg1).is_vector() {
arg1 = optionally_bitcast_vector(arg1, I8X16, builder);
}
if builder.func.dfg.value_type(arg2).is_vector() {
arg2 = optionally_bitcast_vector(arg2, I8X16, builder);
}
state.push1(builder.ins().select(cond, arg1, arg2));
}
Operator::TypedSelect { ty } => {
@@ -495,12 +501,12 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
}
Operator::BrIf { relative_depth } => translate_br_if(*relative_depth, builder, state),
Operator::BrTable { table } => {
let mut depths = table.targets().collect::<Result<Vec<_>, _>>()?;
let default = depths.pop().unwrap().0;
let default = table.default();
let mut min_depth = default;
for (depth, _) in depths.iter() {
if *depth < min_depth {
min_depth = *depth;
for depth in table.targets() {
let depth = depth?;
if depth < min_depth {
min_depth = depth;
}
}
let jump_args_count = {
@@ -513,12 +519,13 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
}
};
let (val, _) = state.pop1();
let mut data = JumpTableData::with_capacity(depths.len());
let mut data = JumpTableData::with_capacity(table.len() as usize);
if jump_args_count == 0 {
// No jump arguments
for (depth, _) in depths.iter() {
for depth in table.targets() {
let depth = depth?;
let block = {
let i = state.control_stack.len() - 1 - (*depth as usize);
let i = state.control_stack.len() - 1 - (depth as usize);
let frame = &mut state.control_stack[i];
frame.set_branched_to_exit();
frame.br_destination()
@@ -539,12 +546,13 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
let return_count = jump_args_count;
let mut dest_block_sequence = vec![];
let mut dest_block_map = HashMap::new();
for (depth, _) in depths.iter() {
let branch_block = match dest_block_map.entry(*depth as usize) {
for depth in table.targets() {
let depth = depth?;
let branch_block = match dest_block_map.entry(depth as usize) {
hash_map::Entry::Occupied(entry) => *entry.get(),
hash_map::Entry::Vacant(entry) => {
let block = builder.create_block();
dest_block_sequence.push((*depth as usize, block));
dest_block_sequence.push((depth as usize, block));
*entry.insert(block)
}
};
@@ -608,7 +616,6 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
Operator::Try { .. }
| Operator::Catch { .. }
| Operator::Throw { .. }
| Operator::Unwind
| Operator::Rethrow { .. }
| Operator::Delegate { .. }
| Operator::CatchAll => {
@@ -1967,7 +1974,24 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
| Operator::F64x2ConvertLowI32x4U
| Operator::I32x4TruncSatF64x2SZero
| Operator::I32x4TruncSatF64x2UZero
| Operator::I8x16Popcnt => {
| Operator::I8x16Popcnt
| Operator::I8x16RelaxedSwizzle
| Operator::I32x4RelaxedTruncSatF32x4S
| Operator::I32x4RelaxedTruncSatF32x4U
| Operator::I32x4RelaxedTruncSatF64x2SZero
| Operator::I32x4RelaxedTruncSatF64x2UZero
| Operator::F32x4Fma
| Operator::F32x4Fms
| Operator::F64x2Fma
| Operator::F64x2Fms
| Operator::I8x16LaneSelect
| Operator::I16x8LaneSelect
| Operator::I32x4LaneSelect
| Operator::I64x2LaneSelect
| Operator::F32x4RelaxedMin
| Operator::F32x4RelaxedMax
| Operator::F64x2RelaxedMin
| Operator::F64x2RelaxedMax => {
return Err(wasm_unsupported!("proposed simd operator {:?}", op));
}
Operator::ReturnCall { .. } | Operator::ReturnCallIndirect { .. } => {
@@ -2206,7 +2230,7 @@ fn prepare_load<FE: FuncEnvironment + ?Sized>(
let (base, offset) = get_heap_addr(
heap,
addr32,
memarg.offset,
memarg.offset as u32,
loaded_bytes,
environ.pointer_type(),
builder,
@@ -2258,7 +2282,7 @@ fn translate_store<FE: FuncEnvironment + ?Sized>(
let (base, offset) = get_heap_addr(
heap,
addr32,
memarg.offset,
memarg.offset as u32,
mem_op_size(opcode, val_ty),
environ.pointer_type(),
builder,
@@ -2300,7 +2324,7 @@ fn fold_atomic_mem_addr(
let linear_mem_addr = builder.ins().uextend(I64, linear_mem_addr);
let a = builder
.ins()
.iadd_imm(linear_mem_addr, i64::from(memarg.offset));
.iadd_imm(linear_mem_addr, memarg.offset as i64);
let cflags = builder.ins().ifcmp_imm(a, 0x1_0000_0000i64);
builder.ins().trapif(
IntCC::UnsignedGreaterThanOrEqual,
@@ -2338,7 +2362,7 @@ fn finalise_atomic_mem_addr<FE: FuncEnvironment + ?Sized>(
let access_ty_bytes = access_ty.bytes();
let final_lma = builder
.ins()
.iadd_imm(linear_mem_addr, i64::from(memarg.offset));
.iadd_imm(linear_mem_addr, memarg.offset as i64);
if access_ty_bytes != 1 {
assert!(access_ty_bytes == 2 || access_ty_bytes == 4 || access_ty_bytes == 8);
let final_lma_misalignment = builder

View File

@@ -1592,12 +1592,9 @@ impl<'ctx, 'a> LLVMFunctionCodeGenerator<'ctx, 'a> {
.get_insert_block()
.ok_or_else(|| CompileError::Codegen("not currently in a block".to_string()))?;
let mut label_depths = table.targets().collect::<Result<Vec<_>, _>>()?;
let default_depth = label_depths.pop().unwrap().0;
let index = self.state.pop1()?;
let default_frame = self.state.frame_at_depth(default_depth)?;
let default_frame = self.state.frame_at_depth(table.default())?;
let phis = if default_frame.is_loop() {
default_frame.loop_body_phis()
@@ -1610,10 +1607,11 @@ impl<'ctx, 'a> LLVMFunctionCodeGenerator<'ctx, 'a> {
phi.add_incoming(&[(value, current_block)]);
}
let cases: Vec<_> = label_depths
.iter()
let cases: Vec<_> = table
.targets()
.enumerate()
.map(|(case_index, &(depth, _))| {
.map(|(case_index, depth)| {
let depth = depth?;
let frame_result: Result<&ControlFrame, CompileError> =
self.state.frame_at_depth(depth);
let frame = match frame_result {

View File

@@ -3873,13 +3873,13 @@ impl<'a, M: Machine> FuncGen<'a, M> {
self.machine.emit_label(after);
}
Operator::BrTable { ref table } => {
let mut targets = table
let targets = table
.targets()
.collect::<Result<Vec<_>, _>>()
.map_err(|e| CodegenError {
message: format!("BrTable read_table: {:?}", e),
})?;
let default_target = targets.pop().unwrap().0;
let default_target = table.default();
let cond = self.pop_value_released();
let table_label = self.machine.get_label();
let mut table: Vec<Label> = vec![];
@@ -3893,7 +3893,7 @@ impl<'a, M: Machine> FuncGen<'a, M> {
self.machine.emit_jmp_to_jumptable(table_label, cond);
for (target, _) in targets.iter() {
for target in targets.iter() {
let label = self.machine.get_label();
self.machine.emit_label(label);
table.push(label);

View File

@@ -935,7 +935,7 @@ impl MachineARM64 {
if self.compatible_imm(memarg.offset as _, ImmType::Bits12) {
self.assembler.emit_adds(
Size::S32,
Location::Imm32(memarg.offset),
Location::Imm32(memarg.offset as u32),
Location::GPR(tmp_addr),
Location::GPR(tmp_addr),
);

View File

@@ -500,7 +500,7 @@ impl MachineX86_64 {
if memarg.offset != 0 {
self.assembler.emit_add(
Size::S32,
Location::Imm32(memarg.offset),
Location::Imm32(memarg.offset as u32),
Location::GPR(tmp_addr),
);

View File

@@ -13,7 +13,7 @@ edition = "2018"
[dependencies]
wasmer-vm = { path = "../vm", version = "=2.2.1" }
wasmer-types = { path = "../types", version = "=2.2.1", default-features = false }
wasmparser = { version = "0.78", optional = true, default-features = false }
wasmparser = { version = "0.83", optional = true, default-features = false }
target-lexicon = { version = "0.12.2", default-features = false }
enumset = "1.0"
hashbrown = { version = "0.11", optional = true }

View File

@@ -100,6 +100,11 @@ pub trait Compiler: Send + MemoryUsage {
memory64: features.memory64,
exceptions: features.exceptions,
deterministic_only: false,
extended_const: features.extended_const,
relaxed_simd: features.relaxed_simd,
mutable_global: true,
saturating_float_to_int: true,
sign_extension: true,
};
validator.wasm_features(wasm_features);
validator

View File

@@ -83,12 +83,15 @@ pub fn translate_module<'data>(
Payload::InstanceSection(_)
| Payload::AliasSection(_)
| Payload::EventSection(_)
| Payload::ModuleSectionStart { .. }
| Payload::ModuleSectionEntry { .. } => {
unimplemented!("module linking not implemented yet")
}
Payload::TagSection(_) => {
unimplemented!("exception handling not implemented yet")
}
Payload::CustomSection {
name: "name",
data,

View File

@@ -105,28 +105,31 @@ pub fn parse_import_section<'data>(
field_name.unwrap_or_default(),
)?;
}
ImportSectionEntryType::Module(_)
| ImportSectionEntryType::Instance(_)
| ImportSectionEntryType::Event(_) => {
ImportSectionEntryType::Module(_) | ImportSectionEntryType::Instance(_) => {
unimplemented!("module linking not implemented yet")
}
ImportSectionEntryType::Memory(WPMemoryType::M32 {
limits: ref memlimits,
ImportSectionEntryType::Tag(_) => {
unimplemented!("exception handling not implemented yet")
}
ImportSectionEntryType::Memory(WPMemoryType {
shared,
memory64,
initial,
maximum,
}) => {
if memory64 {
unimplemented!("64bit memory not implemented yet");
}
environ.declare_memory_import(
MemoryType {
minimum: Pages(memlimits.initial),
maximum: memlimits.maximum.map(Pages),
minimum: Pages(initial as u32),
maximum: maximum.map(|p| Pages(p as u32)),
shared,
},
module_name,
field_name.unwrap_or_default(),
)?;
}
ImportSectionEntryType::Memory(WPMemoryType::M64 { .. }) => {
unimplemented!("64bit memory not implemented yet")
}
ImportSectionEntryType::Global(ref ty) => {
environ.declare_global_import(
GlobalType {
@@ -141,8 +144,8 @@ pub fn parse_import_section<'data>(
environ.declare_table_import(
TableType {
ty: wptype_to_type(tab.element_type).unwrap(),
minimum: tab.limits.initial,
maximum: tab.limits.maximum,
minimum: tab.initial,
maximum: tab.maximum,
},
module_name,
field_name.unwrap_or_default(),
@@ -187,8 +190,8 @@ pub fn parse_table_section(
let table = entry?;
environ.declare_table(TableType {
ty: wptype_to_type(table.element_type).unwrap(),
minimum: table.limits.initial,
maximum: table.limits.maximum,
minimum: table.initial,
maximum: table.maximum,
})?;
}
@@ -203,18 +206,21 @@ pub fn parse_memory_section(
environ.reserve_memories(memories.get_count())?;
for entry in memories {
let memory = entry?;
match memory {
WPMemoryType::M32 { limits, shared } => {
let WPMemoryType {
shared,
memory64,
initial,
maximum,
} = entry?;
if memory64 {
unimplemented!("64bit memory not implemented yet");
}
environ.declare_memory(MemoryType {
minimum: Pages(limits.initial),
maximum: limits.maximum.map(Pages),
minimum: Pages(initial as u32),
maximum: maximum.map(|p| Pages(p as u32)),
shared,
})?;
}
WPMemoryType::M64 { .. } => unimplemented!("64bit memory not implemented yet"),
}
}
Ok(())
}
@@ -294,12 +300,12 @@ pub fn parse_export_section<'data>(
ExternalKind::Global => {
environ.declare_global_export(GlobalIndex::new(index), field)?
}
ExternalKind::Type
| ExternalKind::Module
| ExternalKind::Instance
| ExternalKind::Event => {
ExternalKind::Type | ExternalKind::Module | ExternalKind::Instance => {
unimplemented!("module linking not implemented yet")
}
ExternalKind::Tag => {
unimplemented!("exception handling not implemented yet")
}
}
}
@@ -318,7 +324,16 @@ fn read_elems(items: &ElementItems) -> WasmResult<Box<[FunctionIndex]>> {
let mut elems = Vec::with_capacity(usize::try_from(items_reader.get_count()).unwrap());
for item in items_reader {
let elem = match item? {
ElementItem::Null(_ty) => FunctionIndex::reserved_value(),
ElementItem::Expr(init) => match init.get_binary_reader().read_operator()? {
Operator::RefNull { .. } => FunctionIndex::reserved_value(),
Operator::RefFunc { function_index } => FunctionIndex::from_u32(function_index),
s => {
return Err(WasmError::Unsupported(format!(
"unsupported init expr in element section: {:?}",
s
)));
}
},
ElementItem::Func(index) => FunctionIndex::from_u32(index),
};
elems.push(elem);
@@ -334,7 +349,12 @@ pub fn parse_element_section<'data>(
environ.reserve_table_initializers(elements.get_count())?;
for (index, entry) in elements.into_iter().enumerate() {
let Element { kind, items, ty } = entry?;
let Element {
kind,
items,
ty,
range: _,
} = entry?;
if ty != wasmparser::Type::FuncRef {
return Err(wasm_unsupported!(
"unsupported table element type: {:?}",
@@ -385,7 +405,11 @@ pub fn parse_data_section<'data>(
environ.reserve_data_initializers(data.get_count())?;
for (index, entry) in data.into_iter().enumerate() {
let Data { kind, data } = entry?;
let Data {
kind,
data,
range: _,
} = entry?;
match kind {
DataKind::Active {
memory_index,
@@ -445,7 +469,14 @@ pub fn parse_name_section<'data>(
}
}
wasmparser::Name::Local(_) => {}
wasmparser::Name::Unknown { .. } => {}
wasmparser::Name::Label(_)
| wasmparser::Name::Type(_)
| wasmparser::Name::Table(_)
| wasmparser::Name::Memory(_)
| wasmparser::Name::Global(_)
| wasmparser::Name::Element(_)
| wasmparser::Name::Data(_)
| wasmparser::Name::Unknown { .. } => {}
};
}
Ok(())

View File

@@ -35,6 +35,10 @@ pub struct Features {
pub memory64: bool,
/// Wasm exceptions proposal should be enabled
pub exceptions: bool,
/// Relaxed SIMD proposal should be enabled
pub relaxed_simd: bool,
/// Extended constant expressions proposal should be enabled
pub extended_const: bool,
}
impl Features {
@@ -55,6 +59,8 @@ impl Features {
multi_memory: false,
memory64: false,
exceptions: false,
relaxed_simd: false,
extended_const: false,
}
}
@@ -257,6 +263,8 @@ mod test_features {
multi_memory: false,
memory64: false,
exceptions: false,
relaxed_simd: false,
extended_const: false,
}
);
}

View File

@@ -91,6 +91,11 @@ impl Engine for DummyEngine {
memory64: features.memory64,
exceptions: features.exceptions,
deterministic_only: false,
extended_const: features.extended_const,
relaxed_simd: features.relaxed_simd,
mutable_global: true,
saturating_float_to_int: true,
sign_extension: true,
};
validator.wasm_features(wasm_features);
validator