wasm_interp: report todo! panics with file offset of the missing instruction

This commit is contained in:
Brian Carroll 2022-11-24 20:15:34 +00:00
parent f103801457
commit 9d437fe3fd
No known key found for this signature in database
GPG key ID: 5C7B2EC4101703C0
2 changed files with 162 additions and 459 deletions

View file

@ -115,28 +115,28 @@ impl<'a> ExecutionState<'a> {
pub fn execute_next_instruction(&mut self, module: &WasmModule<'a>) -> Action {
use OpCode::*;
let file_offset = self.program_counter as u32 + module.code.section_offset;
let op_code = OpCode::from(module.code.bytes[self.program_counter]);
self.program_counter += 1;
match op_code {
UNREACHABLE => {
unreachable!("WebAssembly tried to execute an `unreachable` instruction.");
unreachable!(
"WebAssembly `unreachable` instruction at file offset {:#x?}.",
file_offset
);
}
NOP => {}
BLOCK => {
self.block_depth += 1;
todo!("{:?}", op_code);
todo!("{:?} @ {:#x}", op_code, file_offset);
}
LOOP => {
self.block_depth += 1;
todo!("{:?}", op_code);
}
IF => {
todo!("{:?}", op_code);
}
ELSE => {
todo!("{:?}", op_code);
todo!("{:?} @ {:#x}", op_code, file_offset);
}
IF => todo!("{:?} @ {:#x}", op_code, file_offset),
ELSE => todo!("{:?} @ {:#x}", op_code, file_offset),
END => {
if self.block_depth == 0 {
// implicit RETURN at end of function
@ -145,15 +145,9 @@ impl<'a> ExecutionState<'a> {
self.block_depth -= 1;
}
}
BR => {
todo!("{:?}", op_code);
}
BRIF => {
todo!("{:?}", op_code);
}
BRTABLE => {
todo!("{:?}", op_code);
}
BR => todo!("{:?} @ {:#x}", op_code, file_offset),
BRIF => todo!("{:?} @ {:#x}", op_code, file_offset),
BRTABLE => todo!("{:?} @ {:#x}", op_code, file_offset),
RETURN => {
return self.do_return();
}
@ -185,15 +179,11 @@ impl<'a> ExecutionState<'a> {
&mut self.program_counter,
);
}
CALLINDIRECT => {
todo!("{:?}", op_code);
}
CALLINDIRECT => todo!("{:?} @ {:#x}", op_code, file_offset),
DROP => {
self.value_stack.pop();
}
SELECT => {
todo!("{:?}", op_code);
}
SELECT => todo!("{:?} @ {:#x}", op_code, file_offset),
GETLOCAL => {
let index = self.fetch_immediate_u32(module);
let value = self.call_stack.get_local(index);
@ -217,81 +207,31 @@ impl<'a> ExecutionState<'a> {
let index = self.fetch_immediate_u32(module);
self.globals[index as usize] = self.value_stack.pop();
}
I32LOAD => {
todo!("{:?}", op_code);
}
I64LOAD => {
todo!("{:?}", op_code);
}
F32LOAD => {
todo!("{:?}", op_code);
}
F64LOAD => {
todo!("{:?}", op_code);
}
I32LOAD8S => {
todo!("{:?}", op_code);
}
I32LOAD8U => {
todo!("{:?}", op_code);
}
I32LOAD16S => {
todo!("{:?}", op_code);
}
I32LOAD16U => {
todo!("{:?}", op_code);
}
I64LOAD8S => {
todo!("{:?}", op_code);
}
I64LOAD8U => {
todo!("{:?}", op_code);
}
I64LOAD16S => {
todo!("{:?}", op_code);
}
I64LOAD16U => {
todo!("{:?}", op_code);
}
I64LOAD32S => {
todo!("{:?}", op_code);
}
I64LOAD32U => {
todo!("{:?}", op_code);
}
I32STORE => {
todo!("{:?}", op_code);
}
I64STORE => {
todo!("{:?}", op_code);
}
F32STORE => {
todo!("{:?}", op_code);
}
F64STORE => {
todo!("{:?}", op_code);
}
I32STORE8 => {
todo!("{:?}", op_code);
}
I32STORE16 => {
todo!("{:?}", op_code);
}
I64STORE8 => {
todo!("{:?}", op_code);
}
I64STORE16 => {
todo!("{:?}", op_code);
}
I64STORE32 => {
todo!("{:?}", op_code);
}
CURRENTMEMORY => {
todo!("{:?}", op_code);
}
GROWMEMORY => {
todo!("{:?}", op_code);
}
I32LOAD => todo!("{:?} @ {:#x}", op_code, file_offset),
I64LOAD => todo!("{:?} @ {:#x}", op_code, file_offset),
F32LOAD => todo!("{:?} @ {:#x}", op_code, file_offset),
F64LOAD => todo!("{:?} @ {:#x}", op_code, file_offset),
I32LOAD8S => todo!("{:?} @ {:#x}", op_code, file_offset),
I32LOAD8U => todo!("{:?} @ {:#x}", op_code, file_offset),
I32LOAD16S => todo!("{:?} @ {:#x}", op_code, file_offset),
I32LOAD16U => todo!("{:?} @ {:#x}", op_code, file_offset),
I64LOAD8S => todo!("{:?} @ {:#x}", op_code, file_offset),
I64LOAD8U => todo!("{:?} @ {:#x}", op_code, file_offset),
I64LOAD16S => todo!("{:?} @ {:#x}", op_code, file_offset),
I64LOAD16U => todo!("{:?} @ {:#x}", op_code, file_offset),
I64LOAD32S => todo!("{:?} @ {:#x}", op_code, file_offset),
I64LOAD32U => todo!("{:?} @ {:#x}", op_code, file_offset),
I32STORE => todo!("{:?} @ {:#x}", op_code, file_offset),
I64STORE => todo!("{:?} @ {:#x}", op_code, file_offset),
F32STORE => todo!("{:?} @ {:#x}", op_code, file_offset),
F64STORE => todo!("{:?} @ {:#x}", op_code, file_offset),
I32STORE8 => todo!("{:?} @ {:#x}", op_code, file_offset),
I32STORE16 => todo!("{:?} @ {:#x}", op_code, file_offset),
I64STORE8 => todo!("{:?} @ {:#x}", op_code, file_offset),
I64STORE16 => todo!("{:?} @ {:#x}", op_code, file_offset),
I64STORE32 => todo!("{:?} @ {:#x}", op_code, file_offset),
CURRENTMEMORY => todo!("{:?} @ {:#x}", op_code, file_offset),
GROWMEMORY => todo!("{:?} @ {:#x}", op_code, file_offset),
I32CONST => {
let value = i32::parse((), &module.code.bytes, &mut self.program_counter).unwrap();
self.value_stack.push(Value::I32(value));
@ -312,120 +252,46 @@ impl<'a> ExecutionState<'a> {
self.value_stack.push(Value::F64(f64::from_le_bytes(bytes)));
self.program_counter += 8;
}
I32EQZ => {
todo!("{:?}", op_code);
}
I32EQ => {
todo!("{:?}", op_code);
}
I32NE => {
todo!("{:?}", op_code);
}
I32LTS => {
todo!("{:?}", op_code);
}
I32LTU => {
todo!("{:?}", op_code);
}
I32GTS => {
todo!("{:?}", op_code);
}
I32GTU => {
todo!("{:?}", op_code);
}
I32LES => {
todo!("{:?}", op_code);
}
I32LEU => {
todo!("{:?}", op_code);
}
I32GES => {
todo!("{:?}", op_code);
}
I32GEU => {
todo!("{:?}", op_code);
}
I64EQZ => {
todo!("{:?}", op_code);
}
I64EQ => {
todo!("{:?}", op_code);
}
I64NE => {
todo!("{:?}", op_code);
}
I64LTS => {
todo!("{:?}", op_code);
}
I64LTU => {
todo!("{:?}", op_code);
}
I64GTS => {
todo!("{:?}", op_code);
}
I64GTU => {
todo!("{:?}", op_code);
}
I64LES => {
todo!("{:?}", op_code);
}
I64LEU => {
todo!("{:?}", op_code);
}
I64GES => {
todo!("{:?}", op_code);
}
I64GEU => {
todo!("{:?}", op_code);
}
I32EQZ => todo!("{:?} @ {:#x}", op_code, file_offset),
I32EQ => todo!("{:?} @ {:#x}", op_code, file_offset),
I32NE => todo!("{:?} @ {:#x}", op_code, file_offset),
I32LTS => todo!("{:?} @ {:#x}", op_code, file_offset),
I32LTU => todo!("{:?} @ {:#x}", op_code, file_offset),
I32GTS => todo!("{:?} @ {:#x}", op_code, file_offset),
I32GTU => todo!("{:?} @ {:#x}", op_code, file_offset),
I32LES => todo!("{:?} @ {:#x}", op_code, file_offset),
I32LEU => todo!("{:?} @ {:#x}", op_code, file_offset),
I32GES => todo!("{:?} @ {:#x}", op_code, file_offset),
I32GEU => todo!("{:?} @ {:#x}", op_code, file_offset),
I64EQZ => todo!("{:?} @ {:#x}", op_code, file_offset),
I64EQ => todo!("{:?} @ {:#x}", op_code, file_offset),
I64NE => todo!("{:?} @ {:#x}", op_code, file_offset),
I64LTS => todo!("{:?} @ {:#x}", op_code, file_offset),
I64LTU => todo!("{:?} @ {:#x}", op_code, file_offset),
I64GTS => todo!("{:?} @ {:#x}", op_code, file_offset),
I64GTU => todo!("{:?} @ {:#x}", op_code, file_offset),
I64LES => todo!("{:?} @ {:#x}", op_code, file_offset),
I64LEU => todo!("{:?} @ {:#x}", op_code, file_offset),
I64GES => todo!("{:?} @ {:#x}", op_code, file_offset),
I64GEU => todo!("{:?} @ {:#x}", op_code, file_offset),
F32EQ => {
todo!("{:?}", op_code);
}
F32NE => {
todo!("{:?}", op_code);
}
F32LT => {
todo!("{:?}", op_code);
}
F32GT => {
todo!("{:?}", op_code);
}
F32LE => {
todo!("{:?}", op_code);
}
F32GE => {
todo!("{:?}", op_code);
}
F32EQ => todo!("{:?} @ {:#x}", op_code, file_offset),
F32NE => todo!("{:?} @ {:#x}", op_code, file_offset),
F32LT => todo!("{:?} @ {:#x}", op_code, file_offset),
F32GT => todo!("{:?} @ {:#x}", op_code, file_offset),
F32LE => todo!("{:?} @ {:#x}", op_code, file_offset),
F32GE => todo!("{:?} @ {:#x}", op_code, file_offset),
F64EQ => {
todo!("{:?}", op_code);
}
F64NE => {
todo!("{:?}", op_code);
}
F64LT => {
todo!("{:?}", op_code);
}
F64GT => {
todo!("{:?}", op_code);
}
F64LE => {
todo!("{:?}", op_code);
}
F64GE => {
todo!("{:?}", op_code);
}
F64EQ => todo!("{:?} @ {:#x}", op_code, file_offset),
F64NE => todo!("{:?} @ {:#x}", op_code, file_offset),
F64LT => todo!("{:?} @ {:#x}", op_code, file_offset),
F64GT => todo!("{:?} @ {:#x}", op_code, file_offset),
F64LE => todo!("{:?} @ {:#x}", op_code, file_offset),
F64GE => todo!("{:?} @ {:#x}", op_code, file_offset),
I32CLZ => {
todo!("{:?}", op_code);
}
I32CTZ => {
todo!("{:?}", op_code);
}
I32POPCNT => {
todo!("{:?}", op_code);
}
I32CLZ => todo!("{:?} @ {:#x}", op_code, file_offset),
I32CTZ => todo!("{:?} @ {:#x}", op_code, file_offset),
I32POPCNT => todo!("{:?} @ {:#x}", op_code, file_offset),
I32ADD => {
let x = self.value_stack.pop_i32();
let y = self.value_stack.pop_i32();
@ -441,258 +307,92 @@ impl<'a> ExecutionState<'a> {
let y = self.value_stack.pop_i32();
self.value_stack.push(Value::I32(y * x));
}
I32DIVS => {
todo!("{:?}", op_code);
}
I32DIVU => {
todo!("{:?}", op_code);
}
I32REMS => {
todo!("{:?}", op_code);
}
I32REMU => {
todo!("{:?}", op_code);
}
I32AND => {
todo!("{:?}", op_code);
}
I32OR => {
todo!("{:?}", op_code);
}
I32XOR => {
todo!("{:?}", op_code);
}
I32SHL => {
todo!("{:?}", op_code);
}
I32SHRS => {
todo!("{:?}", op_code);
}
I32SHRU => {
todo!("{:?}", op_code);
}
I32ROTL => {
todo!("{:?}", op_code);
}
I32ROTR => {
todo!("{:?}", op_code);
}
I32DIVS => todo!("{:?} @ {:#x}", op_code, file_offset),
I32DIVU => todo!("{:?} @ {:#x}", op_code, file_offset),
I32REMS => todo!("{:?} @ {:#x}", op_code, file_offset),
I32REMU => todo!("{:?} @ {:#x}", op_code, file_offset),
I32AND => todo!("{:?} @ {:#x}", op_code, file_offset),
I32OR => todo!("{:?} @ {:#x}", op_code, file_offset),
I32XOR => todo!("{:?} @ {:#x}", op_code, file_offset),
I32SHL => todo!("{:?} @ {:#x}", op_code, file_offset),
I32SHRS => todo!("{:?} @ {:#x}", op_code, file_offset),
I32SHRU => todo!("{:?} @ {:#x}", op_code, file_offset),
I32ROTL => todo!("{:?} @ {:#x}", op_code, file_offset),
I32ROTR => todo!("{:?} @ {:#x}", op_code, file_offset),
I64CLZ => {
todo!("{:?}", op_code);
}
I64CTZ => {
todo!("{:?}", op_code);
}
I64POPCNT => {
todo!("{:?}", op_code);
}
I64ADD => {
todo!("{:?}", op_code);
}
I64SUB => {
todo!("{:?}", op_code);
}
I64MUL => {
todo!("{:?}", op_code);
}
I64DIVS => {
todo!("{:?}", op_code);
}
I64DIVU => {
todo!("{:?}", op_code);
}
I64REMS => {
todo!("{:?}", op_code);
}
I64REMU => {
todo!("{:?}", op_code);
}
I64AND => {
todo!("{:?}", op_code);
}
I64OR => {
todo!("{:?}", op_code);
}
I64XOR => {
todo!("{:?}", op_code);
}
I64SHL => {
todo!("{:?}", op_code);
}
I64SHRS => {
todo!("{:?}", op_code);
}
I64SHRU => {
todo!("{:?}", op_code);
}
I64ROTL => {
todo!("{:?}", op_code);
}
I64ROTR => {
todo!("{:?}", op_code);
}
F32ABS => {
todo!("{:?}", op_code);
}
F32NEG => {
todo!("{:?}", op_code);
}
F32CEIL => {
todo!("{:?}", op_code);
}
F32FLOOR => {
todo!("{:?}", op_code);
}
F32TRUNC => {
todo!("{:?}", op_code);
}
F32NEAREST => {
todo!("{:?}", op_code);
}
F32SQRT => {
todo!("{:?}", op_code);
}
F32ADD => {
todo!("{:?}", op_code);
}
F32SUB => {
todo!("{:?}", op_code);
}
F32MUL => {
todo!("{:?}", op_code);
}
F32DIV => {
todo!("{:?}", op_code);
}
F32MIN => {
todo!("{:?}", op_code);
}
F32MAX => {
todo!("{:?}", op_code);
}
F32COPYSIGN => {
todo!("{:?}", op_code);
}
F64ABS => {
todo!("{:?}", op_code);
}
F64NEG => {
todo!("{:?}", op_code);
}
F64CEIL => {
todo!("{:?}", op_code);
}
F64FLOOR => {
todo!("{:?}", op_code);
}
F64TRUNC => {
todo!("{:?}", op_code);
}
F64NEAREST => {
todo!("{:?}", op_code);
}
F64SQRT => {
todo!("{:?}", op_code);
}
F64ADD => {
todo!("{:?}", op_code);
}
F64SUB => {
todo!("{:?}", op_code);
}
F64MUL => {
todo!("{:?}", op_code);
}
F64DIV => {
todo!("{:?}", op_code);
}
F64MIN => {
todo!("{:?}", op_code);
}
F64MAX => {
todo!("{:?}", op_code);
}
F64COPYSIGN => {
todo!("{:?}", op_code);
}
I64CLZ => todo!("{:?} @ {:#x}", op_code, file_offset),
I64CTZ => todo!("{:?} @ {:#x}", op_code, file_offset),
I64POPCNT => todo!("{:?} @ {:#x}", op_code, file_offset),
I64ADD => todo!("{:?} @ {:#x}", op_code, file_offset),
I64SUB => todo!("{:?} @ {:#x}", op_code, file_offset),
I64MUL => todo!("{:?} @ {:#x}", op_code, file_offset),
I64DIVS => todo!("{:?} @ {:#x}", op_code, file_offset),
I64DIVU => todo!("{:?} @ {:#x}", op_code, file_offset),
I64REMS => todo!("{:?} @ {:#x}", op_code, file_offset),
I64REMU => todo!("{:?} @ {:#x}", op_code, file_offset),
I64AND => todo!("{:?} @ {:#x}", op_code, file_offset),
I64OR => todo!("{:?} @ {:#x}", op_code, file_offset),
I64XOR => todo!("{:?} @ {:#x}", op_code, file_offset),
I64SHL => todo!("{:?} @ {:#x}", op_code, file_offset),
I64SHRS => todo!("{:?} @ {:#x}", op_code, file_offset),
I64SHRU => todo!("{:?} @ {:#x}", op_code, file_offset),
I64ROTL => todo!("{:?} @ {:#x}", op_code, file_offset),
I64ROTR => todo!("{:?} @ {:#x}", op_code, file_offset),
F32ABS => todo!("{:?} @ {:#x}", op_code, file_offset),
F32NEG => todo!("{:?} @ {:#x}", op_code, file_offset),
F32CEIL => todo!("{:?} @ {:#x}", op_code, file_offset),
F32FLOOR => todo!("{:?} @ {:#x}", op_code, file_offset),
F32TRUNC => todo!("{:?} @ {:#x}", op_code, file_offset),
F32NEAREST => todo!("{:?} @ {:#x}", op_code, file_offset),
F32SQRT => todo!("{:?} @ {:#x}", op_code, file_offset),
F32ADD => todo!("{:?} @ {:#x}", op_code, file_offset),
F32SUB => todo!("{:?} @ {:#x}", op_code, file_offset),
F32MUL => todo!("{:?} @ {:#x}", op_code, file_offset),
F32DIV => todo!("{:?} @ {:#x}", op_code, file_offset),
F32MIN => todo!("{:?} @ {:#x}", op_code, file_offset),
F32MAX => todo!("{:?} @ {:#x}", op_code, file_offset),
F32COPYSIGN => todo!("{:?} @ {:#x}", op_code, file_offset),
F64ABS => todo!("{:?} @ {:#x}", op_code, file_offset),
F64NEG => todo!("{:?} @ {:#x}", op_code, file_offset),
F64CEIL => todo!("{:?} @ {:#x}", op_code, file_offset),
F64FLOOR => todo!("{:?} @ {:#x}", op_code, file_offset),
F64TRUNC => todo!("{:?} @ {:#x}", op_code, file_offset),
F64NEAREST => todo!("{:?} @ {:#x}", op_code, file_offset),
F64SQRT => todo!("{:?} @ {:#x}", op_code, file_offset),
F64ADD => todo!("{:?} @ {:#x}", op_code, file_offset),
F64SUB => todo!("{:?} @ {:#x}", op_code, file_offset),
F64MUL => todo!("{:?} @ {:#x}", op_code, file_offset),
F64DIV => todo!("{:?} @ {:#x}", op_code, file_offset),
F64MIN => todo!("{:?} @ {:#x}", op_code, file_offset),
F64MAX => todo!("{:?} @ {:#x}", op_code, file_offset),
F64COPYSIGN => todo!("{:?} @ {:#x}", op_code, file_offset),
I32WRAPI64 => {
todo!("{:?}", op_code);
}
I32TRUNCSF32 => {
todo!("{:?}", op_code);
}
I32TRUNCUF32 => {
todo!("{:?}", op_code);
}
I32TRUNCSF64 => {
todo!("{:?}", op_code);
}
I32TRUNCUF64 => {
todo!("{:?}", op_code);
}
I64EXTENDSI32 => {
todo!("{:?}", op_code);
}
I64EXTENDUI32 => {
todo!("{:?}", op_code);
}
I64TRUNCSF32 => {
todo!("{:?}", op_code);
}
I64TRUNCUF32 => {
todo!("{:?}", op_code);
}
I64TRUNCSF64 => {
todo!("{:?}", op_code);
}
I64TRUNCUF64 => {
todo!("{:?}", op_code);
}
F32CONVERTSI32 => {
todo!("{:?}", op_code);
}
F32CONVERTUI32 => {
todo!("{:?}", op_code);
}
F32CONVERTSI64 => {
todo!("{:?}", op_code);
}
F32CONVERTUI64 => {
todo!("{:?}", op_code);
}
F32DEMOTEF64 => {
todo!("{:?}", op_code);
}
F64CONVERTSI32 => {
todo!("{:?}", op_code);
}
F64CONVERTUI32 => {
todo!("{:?}", op_code);
}
F64CONVERTSI64 => {
todo!("{:?}", op_code);
}
F64CONVERTUI64 => {
todo!("{:?}", op_code);
}
F64PROMOTEF32 => {
todo!("{:?}", op_code);
}
I32WRAPI64 => todo!("{:?} @ {:#x}", op_code, file_offset),
I32TRUNCSF32 => todo!("{:?} @ {:#x}", op_code, file_offset),
I32TRUNCUF32 => todo!("{:?} @ {:#x}", op_code, file_offset),
I32TRUNCSF64 => todo!("{:?} @ {:#x}", op_code, file_offset),
I32TRUNCUF64 => todo!("{:?} @ {:#x}", op_code, file_offset),
I64EXTENDSI32 => todo!("{:?} @ {:#x}", op_code, file_offset),
I64EXTENDUI32 => todo!("{:?} @ {:#x}", op_code, file_offset),
I64TRUNCSF32 => todo!("{:?} @ {:#x}", op_code, file_offset),
I64TRUNCUF32 => todo!("{:?} @ {:#x}", op_code, file_offset),
I64TRUNCSF64 => todo!("{:?} @ {:#x}", op_code, file_offset),
I64TRUNCUF64 => todo!("{:?} @ {:#x}", op_code, file_offset),
F32CONVERTSI32 => todo!("{:?} @ {:#x}", op_code, file_offset),
F32CONVERTUI32 => todo!("{:?} @ {:#x}", op_code, file_offset),
F32CONVERTSI64 => todo!("{:?} @ {:#x}", op_code, file_offset),
F32CONVERTUI64 => todo!("{:?} @ {:#x}", op_code, file_offset),
F32DEMOTEF64 => todo!("{:?} @ {:#x}", op_code, file_offset),
F64CONVERTSI32 => todo!("{:?} @ {:#x}", op_code, file_offset),
F64CONVERTUI32 => todo!("{:?} @ {:#x}", op_code, file_offset),
F64CONVERTSI64 => todo!("{:?} @ {:#x}", op_code, file_offset),
F64CONVERTUI64 => todo!("{:?} @ {:#x}", op_code, file_offset),
F64PROMOTEF32 => todo!("{:?} @ {:#x}", op_code, file_offset),
I32REINTERPRETF32 => {
todo!("{:?}", op_code);
}
I64REINTERPRETF64 => {
todo!("{:?}", op_code);
}
F32REINTERPRETI32 => {
todo!("{:?}", op_code);
}
F64REINTERPRETI64 => {
todo!("{:?}", op_code);
}
I32REINTERPRETF32 => todo!("{:?} @ {:#x}", op_code, file_offset),
I64REINTERPRETF64 => todo!("{:?} @ {:#x}", op_code, file_offset),
F32REINTERPRETI32 => todo!("{:?} @ {:#x}", op_code, file_offset),
F64REINTERPRETI64 => todo!("{:?} @ {:#x}", op_code, file_offset),
}
Action::Continue
}