Skip to content

Commit 024fb67

Browse files
authored
Remove mem_byte/table_byte instruction payloads (#1584)
This commit removes a workaround in the `wasmparser` opcode representation. The `mem_byte` field of `MemoryGrow` and `MemorySize` and the `table_byte` field of `CallIndirect` are no longer necessary after #1548 because features can be consulted directly when parsing binaries.
1 parent c8fcb70 commit 024fb67

File tree

8 files changed

+51
-64
lines changed

8 files changed

+51
-64
lines changed

crates/wasm-mutate/src/mutators/peephole/dfg.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -640,11 +640,11 @@ impl<'a> DFGBuilder {
640640
idx,
641641
);
642642
}
643-
Operator::MemoryGrow { mem, mem_byte: _ } => {
643+
Operator::MemoryGrow { mem } => {
644644
let arg = self.pop_operand(idx, false);
645645
self.push_node(Lang::MemoryGrow(*mem, Id::from(arg)), idx);
646646
}
647-
Operator::MemorySize { mem, mem_byte: _ } => {
647+
Operator::MemorySize { mem } => {
648648
self.push_node(Lang::MemorySize(*mem), idx);
649649
}
650650
Operator::TableGrow { table } => {

crates/wasm-mutate/src/mutators/translate.rs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -370,8 +370,6 @@ pub fn op(t: &mut dyn Translator, op: &Operator<'_>) -> Result<Instruction<'stat
370370
.into(),
371371
$arg.default(),
372372
));
373-
(map $arg:ident table_byte) => (());
374-
(map $arg:ident mem_byte) => (());
375373
(map $arg:ident flags) => (());
376374
(map $arg:ident ty) => (t.translate_ty($arg)?);
377375
(map $arg:ident hty) => (t.translate_heapty($arg)?);
@@ -402,22 +400,14 @@ pub fn op(t: &mut dyn Translator, op: &Operator<'_>) -> Result<Instruction<'stat
402400
(build V128Const $arg:ident) => (I::V128Const($arg.i128()));
403401
(build TryTable $table:ident) => (unimplemented_try_table());
404402
(build $op:ident $arg:ident) => (I::$op($arg));
405-
(build CallIndirect $ty:ident $table:ident $_:ident) => (I::CallIndirect {
403+
(build CallIndirect $ty:ident $table:ident) => (I::CallIndirect {
406404
ty: $ty,
407405
table: $table,
408406
});
409407
(build ReturnCallIndirect $ty:ident $table:ident) => (I::ReturnCallIndirect {
410408
ty: $ty,
411409
table: $table,
412410
});
413-
(build MemoryGrow $mem:ident $_:ident) => (I::MemoryGrow($mem));
414-
(build MemorySize $mem:ident $_:ident) => (I::MemorySize($mem));
415-
(build StructNew $type_index:ident) => (I::StructNew($type_index));
416-
(build ArrayGet $type_index:ident) => (I::ArrayGet($type_index));
417-
(build ArrayGetS $type_index:ident) => (I::ArrayGetS($type_index));
418-
(build ArrayGetU $type_index:ident) => (I::ArrayGetU($type_index));
419-
(build ArraySet $type_index:ident) => (I::ArraySet($type_index));
420-
(build ArrayFill $type_index:ident) => (I::ArrayFill($type_index));
421411
(build $op:ident $($arg:ident)*) => (I::$op { $($arg),* });
422412
}
423413

crates/wasmparser/src/binary_reader.rs

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -281,12 +281,6 @@ impl<'a> BinaryReader<'a> {
281281
})
282282
}
283283

284-
fn read_first_byte_and_var_u32(&mut self) -> Result<(u8, u32)> {
285-
let pos = self.position;
286-
let val = self.read_var_u32()?;
287-
Ok((self.buffer[pos], val))
288-
}
289-
290284
fn read_memarg(&mut self, max_align: u8) -> Result<MemArg> {
291285
let flags_pos = self.original_position();
292286
let mut flags = self.read_var_u32()?;
@@ -833,8 +827,8 @@ impl<'a> BinaryReader<'a> {
833827
0x10 => visitor.visit_call(self.read_var_u32()?),
834828
0x11 => {
835829
let index = self.read_var_u32()?;
836-
let (table_byte, table_index) = self.read_first_byte_and_var_u32()?;
837-
visitor.visit_call_indirect(index, table_index, table_byte)
830+
let table = self.read_table_index_or_zero_if_not_reference_types()?;
831+
visitor.visit_call_indirect(index, table)
838832
}
839833
0x12 => visitor.visit_return_call(self.read_var_u32()?),
840834
0x13 => visitor.visit_return_call_indirect(self.read_var_u32()?, self.read_var_u32()?),
@@ -888,12 +882,12 @@ impl<'a> BinaryReader<'a> {
888882
0x3d => visitor.visit_i64_store16(self.read_memarg(1)?),
889883
0x3e => visitor.visit_i64_store32(self.read_memarg(2)?),
890884
0x3f => {
891-
let (mem_byte, mem) = self.read_first_byte_and_var_u32()?;
892-
visitor.visit_memory_size(mem, mem_byte)
885+
let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
886+
visitor.visit_memory_size(mem)
893887
}
894888
0x40 => {
895-
let (mem_byte, mem) = self.read_first_byte_and_var_u32()?;
896-
visitor.visit_memory_grow(mem, mem_byte)
889+
let mem = self.read_memory_index_or_zero_if_not_multi_memory()?;
890+
visitor.visit_memory_grow(mem)
897891
}
898892

899893
0x41 => visitor.visit_i32_const(self.read_var_i32()?),
@@ -1754,6 +1748,32 @@ impl<'a> BinaryReader<'a> {
17541748
}
17551749
}
17561750
}
1751+
1752+
fn read_memory_index_or_zero_if_not_multi_memory(&mut self) -> Result<u32> {
1753+
if self.features.multi_memory() {
1754+
self.read_var_u32()
1755+
} else {
1756+
// Before bulk memory this byte was required to be a single zero
1757+
// byte, not a LEB-encoded zero, so require a precise zero byte.
1758+
match self.read_u8()? {
1759+
0 => Ok(0),
1760+
_ => bail!(self.original_position() - 1, "zero byte expected"),
1761+
}
1762+
}
1763+
}
1764+
1765+
fn read_table_index_or_zero_if_not_reference_types(&mut self) -> Result<u32> {
1766+
if self.features.reference_types() {
1767+
self.read_var_u32()
1768+
} else {
1769+
// Before reference types this byte was required to be a single zero
1770+
// byte, not a LEB-encoded zero, so require a precise zero byte.
1771+
match self.read_u8()? {
1772+
0 => Ok(0),
1773+
_ => bail!(self.original_position() - 1, "zero byte expected"),
1774+
}
1775+
}
1776+
}
17571777
}
17581778

17591779
impl<'a> BrTable<'a> {

crates/wasmparser/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ macro_rules! for_each_operator {
169169
@mvp BrTable { targets: $crate::BrTable<'a> } => visit_br_table
170170
@mvp Return => visit_return
171171
@mvp Call { function_index: u32 } => visit_call
172-
@mvp CallIndirect { type_index: u32, table_index: u32, table_byte: u8 } => visit_call_indirect
172+
@mvp CallIndirect { type_index: u32, table_index: u32 } => visit_call_indirect
173173
@tail_call ReturnCall { function_index: u32 } => visit_return_call
174174
@tail_call ReturnCallIndirect { type_index: u32, table_index: u32 } => visit_return_call_indirect
175175
@mvp Drop => visit_drop
@@ -203,8 +203,8 @@ macro_rules! for_each_operator {
203203
@mvp I64Store8 { memarg: $crate::MemArg } => visit_i64_store8
204204
@mvp I64Store16 { memarg: $crate::MemArg } => visit_i64_store16
205205
@mvp I64Store32 { memarg: $crate::MemArg } => visit_i64_store32
206-
@mvp MemorySize { mem: u32, mem_byte: u8 } => visit_memory_size
207-
@mvp MemoryGrow { mem: u32, mem_byte: u8 } => visit_memory_grow
206+
@mvp MemorySize { mem: u32 } => visit_memory_size
207+
@mvp MemoryGrow { mem: u32 } => visit_memory_grow
208208
@mvp I32Const { value: i32 } => visit_i32_const
209209
@mvp I64Const { value: i64 } => visit_i64_const
210210
@mvp F32Const { value: $crate::Ieee32 } => visit_f32_const

crates/wasmparser/src/validator/operators.rs

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1584,18 +1584,7 @@ where
15841584
self.check_func_type_index_same_results(type_index)?;
15851585
Ok(())
15861586
}
1587-
fn visit_call_indirect(
1588-
&mut self,
1589-
index: u32,
1590-
table_index: u32,
1591-
table_byte: u8,
1592-
) -> Self::Output {
1593-
if table_byte != 0 && !self.features.reference_types() {
1594-
bail!(
1595-
self.offset,
1596-
"reference-types not enabled: zero byte expected"
1597-
);
1598-
}
1587+
fn visit_call_indirect(&mut self, index: u32, table_index: u32) -> Self::Output {
15991588
self.check_call_indirect(index, table_index)?;
16001589
Ok(())
16011590
}
@@ -1928,18 +1917,12 @@ where
19281917
self.pop_operand(Some(ty))?;
19291918
Ok(())
19301919
}
1931-
fn visit_memory_size(&mut self, mem: u32, mem_byte: u8) -> Self::Output {
1932-
if mem_byte != 0 && !self.features.multi_memory() {
1933-
bail!(self.offset, "multi-memory not enabled: zero byte expected");
1934-
}
1920+
fn visit_memory_size(&mut self, mem: u32) -> Self::Output {
19351921
let index_ty = self.check_memory_index(mem)?;
19361922
self.push_operand(index_ty)?;
19371923
Ok(())
19381924
}
1939-
fn visit_memory_grow(&mut self, mem: u32, mem_byte: u8) -> Self::Output {
1940-
if mem_byte != 0 && !self.features.multi_memory() {
1941-
bail!(self.offset, "multi-memory not enabled: zero byte expected");
1942-
}
1925+
fn visit_memory_grow(&mut self, mem: u32) -> Self::Output {
19431926
let index_ty = self.check_memory_index(mem)?;
19441927
self.pop_operand(Some(index_ty))?;
19451928
self.push_operand(index_ty)?;

crates/wasmprinter/src/operator.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -421,13 +421,12 @@ macro_rules! define_visit {
421421
// when an index is 0 or similar. The final case in this list is the
422422
// catch-all which prints each payload individually based on the name of the
423423
// payload field.
424-
(payload $self:ident CallIndirect $ty:ident $table:ident $byte:ident) => (
424+
(payload $self:ident CallIndirect $ty:ident $table:ident) => (
425425
if $table != 0 {
426426
$self.push_str(" ");
427427
$self.table_index($table)?;
428428
}
429429
$self.type_index($ty)?;
430-
let _ = $byte;
431430
);
432431
(payload $self:ident ReturnCallIndirect $ty:ident $table:ident) => (
433432
if $table != 0 {
@@ -469,7 +468,13 @@ macro_rules! define_visit {
469468
$self.table_index($src)?;
470469
}
471470
);
472-
(payload $self:ident $mem_op:ident $mem:ident mem_byte) => (
471+
(payload $self:ident MemoryGrow $mem:ident) => (
472+
if $mem != 0 {
473+
$self.push_str(" ");
474+
$self.memory_index($mem)?;
475+
}
476+
);
477+
(payload $self:ident MemorySize $mem:ident) => (
473478
if $mem != 0 {
474479
$self.push_str(" ");
475480
$self.memory_index($mem)?;

crates/wit-component/src/gc.rs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1033,8 +1033,6 @@ macro_rules! define_visit {
10331033
(mark_live $self:ident $arg:ident lanes) => {};
10341034
(mark_live $self:ident $arg:ident flags) => {};
10351035
(mark_live $self:ident $arg:ident value) => {};
1036-
(mark_live $self:ident $arg:ident mem_byte) => {};
1037-
(mark_live $self:ident $arg:ident table_byte) => {};
10381036
(mark_live $self:ident $arg:ident local_index) => {};
10391037
(mark_live $self:ident $arg:ident relative_depth) => {};
10401038
(mark_live $self:ident $arg:ident tag_index) => {};
@@ -1186,21 +1184,12 @@ macro_rules! define_encode {
11861184
(mk BrTable $arg:ident) => ({
11871185
BrTable($arg.0, $arg.1)
11881186
});
1189-
(mk CallIndirect $ty:ident $table:ident $table_byte:ident) => ({
1190-
let _ = $table_byte;
1187+
(mk CallIndirect $ty:ident $table:ident) => ({
11911188
CallIndirect { ty: $ty, table: $table }
11921189
});
11931190
(mk ReturnCallIndirect $ty:ident $table:ident) => (
11941191
ReturnCallIndirect { ty: $ty, table: $table }
11951192
);
1196-
(mk MemorySize $mem:ident $mem_byte:ident) => ({
1197-
let _ = $mem_byte;
1198-
MemorySize($mem)
1199-
});
1200-
(mk MemoryGrow $mem:ident $mem_byte:ident) => ({
1201-
let _ = $mem_byte;
1202-
MemoryGrow($mem)
1203-
});
12041193
(mk TryTable $try_table:ident) => ({
12051194
let _ = $try_table;
12061195
unimplemented_try_table()

tests/cli/dump-llvm-object.wat.stdout

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@
102102
0xf2 | 20 03 | local_get local_index:3
103103
0xf4 | 24 00 | global_set global_index:0
104104
0xf6 | 20 00 | local_get local_index:0
105-
0xf8 | 11 05 00 | call_indirect type_index:5 table_index:0 table_byte:0
105+
0xf8 | 11 05 00 | call_indirect type_index:5 table_index:0
106106
0xfb | 41 10 | i32_const value:16
107107
0xfd | 21 04 | local_set local_index:4
108108
0xff | 20 03 | local_get local_index:3

0 commit comments

Comments
 (0)