mirror of
https://github.com/pezkuwichain/wasm-instrument.git
synced 2026-06-11 04:51:10 +00:00
Replace wabt with rust tools (#5)
This commit is contained in:
committed by
GitHub
parent
8291876394
commit
374afe5700
+3
-1
@@ -27,7 +27,9 @@ binaryen = "0.12"
|
||||
criterion = "0.3"
|
||||
diff = "0.1"
|
||||
rand = "0.8"
|
||||
wabt = "0.10"
|
||||
wat = "1"
|
||||
wasmparser = "0.82"
|
||||
wasmprinter = "0.2"
|
||||
|
||||
[features]
|
||||
default = ["std"]
|
||||
|
||||
+15
-5
@@ -71,10 +71,8 @@ mod tests {
|
||||
use parity_wasm::elements;
|
||||
|
||||
fn parse_wat(source: &str) -> elements::Module {
|
||||
let module_bytes = wabt::Wat2Wasm::new()
|
||||
.validate(true)
|
||||
.convert(source)
|
||||
.expect("failed to parse module");
|
||||
let module_bytes = wat::parse_str(source).unwrap();
|
||||
wasmparser::validate(&module_bytes).unwrap();
|
||||
elements::deserialize_buffer(module_bytes.as_ref()).expect("failed to parse module")
|
||||
}
|
||||
|
||||
@@ -93,7 +91,19 @@ mod tests {
|
||||
let expected_bytes = elements::serialize(expected_module)
|
||||
.expect("injected module must have a function body");
|
||||
|
||||
assert_eq!(actual_bytes, expected_bytes);
|
||||
let actual_wat = wasmprinter::print_bytes(actual_bytes).unwrap();
|
||||
let expected_wat = wasmprinter::print_bytes(expected_bytes).unwrap();
|
||||
|
||||
if actual_wat != expected_wat {
|
||||
for diff in diff::lines(&expected_wat, &actual_wat) {
|
||||
match diff {
|
||||
diff::Result::Left(l) => println!("-{}", l),
|
||||
diff::Result::Both(l, _) => println!(" {}", l),
|
||||
diff::Result::Right(r) => println!("+{}", r),
|
||||
}
|
||||
}
|
||||
panic!()
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
+22
-37
@@ -613,21 +613,15 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn simple_grow() {
|
||||
let module = builder::module()
|
||||
.global()
|
||||
.value_type()
|
||||
.i32()
|
||||
.build()
|
||||
.function()
|
||||
.signature()
|
||||
.param()
|
||||
.i32()
|
||||
.build()
|
||||
.body()
|
||||
.with_instructions(elements::Instructions::new(vec![GetGlobal(0), GrowMemory(0), End]))
|
||||
.build()
|
||||
.build()
|
||||
.build();
|
||||
let module = parse_wat(
|
||||
r#"(module
|
||||
(func (result i32)
|
||||
global.get 0
|
||||
memory.grow)
|
||||
(global i32 (i32.const 42))
|
||||
(memory 0 1)
|
||||
)"#,
|
||||
);
|
||||
|
||||
let injected_module = inject(module, &ConstantCostRules::new(1, 10_000), "env").unwrap();
|
||||
|
||||
@@ -642,26 +636,20 @@ mod tests {
|
||||
);
|
||||
|
||||
let binary = serialize(injected_module).expect("serialization failed");
|
||||
wabt::wasm2wat(&binary).unwrap();
|
||||
wasmparser::validate(&binary).unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn grow_no_gas_no_track() {
|
||||
let module = builder::module()
|
||||
.global()
|
||||
.value_type()
|
||||
.i32()
|
||||
.build()
|
||||
.function()
|
||||
.signature()
|
||||
.param()
|
||||
.i32()
|
||||
.build()
|
||||
.body()
|
||||
.with_instructions(elements::Instructions::new(vec![GetGlobal(0), GrowMemory(0), End]))
|
||||
.build()
|
||||
.build()
|
||||
.build();
|
||||
let module = parse_wat(
|
||||
r"(module
|
||||
(func (result i32)
|
||||
global.get 0
|
||||
memory.grow)
|
||||
(global i32 (i32.const 42))
|
||||
(memory 0 1)
|
||||
)",
|
||||
);
|
||||
|
||||
let injected_module = inject(module, &ConstantCostRules::default(), "env").unwrap();
|
||||
|
||||
@@ -673,7 +661,7 @@ mod tests {
|
||||
assert_eq!(injected_module.functions_space(), 2);
|
||||
|
||||
let binary = serialize(injected_module).expect("serialization failed");
|
||||
wabt::wasm2wat(&binary).unwrap();
|
||||
wasmparser::validate(&binary).unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -741,11 +729,8 @@ mod tests {
|
||||
}
|
||||
|
||||
fn parse_wat(source: &str) -> elements::Module {
|
||||
let module_bytes = wabt::Wat2Wasm::new()
|
||||
.validate(false)
|
||||
.convert(source)
|
||||
.expect("failed to parse module");
|
||||
elements::deserialize_buffer(module_bytes.as_ref()).expect("failed to parse module")
|
||||
let module_bytes = wat::parse_str(source).unwrap();
|
||||
elements::deserialize_buffer(module_bytes.as_ref()).unwrap()
|
||||
}
|
||||
|
||||
macro_rules! test_gas_counter_injection {
|
||||
|
||||
@@ -415,7 +415,7 @@ mod tests {
|
||||
use parity_wasm::elements;
|
||||
|
||||
fn parse_wat(source: &str) -> elements::Module {
|
||||
elements::deserialize_buffer(&wabt::wat2wasm(source).expect("Failed to wat2wasm"))
|
||||
elements::deserialize_buffer(&wat::parse_str(source).expect("Failed to wat2wasm"))
|
||||
.expect("Failed to deserialize the module")
|
||||
}
|
||||
|
||||
@@ -477,7 +477,8 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn yet_another_test() {
|
||||
const SOURCE: &str = r#"
|
||||
let module = parse_wat(
|
||||
r#"
|
||||
(module
|
||||
(memory 0)
|
||||
(func
|
||||
@@ -496,15 +497,8 @@ mod tests {
|
||||
i32.const 2
|
||||
)
|
||||
)
|
||||
"#;
|
||||
let module = elements::deserialize_buffer(
|
||||
wabt::Wat2Wasm::new()
|
||||
.validate(false)
|
||||
.convert(SOURCE)
|
||||
.expect("Failed to wat2wasm")
|
||||
.as_ref(),
|
||||
)
|
||||
.expect("Failed to deserialize the module");
|
||||
"#,
|
||||
);
|
||||
|
||||
let height = compute(0, &module).unwrap();
|
||||
assert_eq!(height, 2 + ACTIVATION_FRAME_COST);
|
||||
|
||||
@@ -351,16 +351,13 @@ mod tests {
|
||||
use parity_wasm::elements;
|
||||
|
||||
fn parse_wat(source: &str) -> elements::Module {
|
||||
elements::deserialize_buffer(&wabt::wat2wasm(source).expect("Failed to wat2wasm"))
|
||||
elements::deserialize_buffer(&wat::parse_str(source).expect("Failed to wat2wasm"))
|
||||
.expect("Failed to deserialize the module")
|
||||
}
|
||||
|
||||
fn validate_module(module: elements::Module) {
|
||||
let binary = elements::serialize(module).expect("Failed to serialize");
|
||||
wabt::Module::read_binary(&binary, &Default::default())
|
||||
.expect("Wabt failed to read final binary")
|
||||
.validate()
|
||||
.expect("Invalid module");
|
||||
wasmparser::validate(&binary).expect("Invalid module");
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
+6
-10
@@ -5,6 +5,7 @@ use std::{
|
||||
path::{Path, PathBuf},
|
||||
};
|
||||
use wasm_instrument as instrument;
|
||||
use wasmparser::validate;
|
||||
|
||||
fn slurp<P: AsRef<Path>>(path: P) -> io::Result<Vec<u8>> {
|
||||
let mut f = fs::File::open(path)?;
|
||||
@@ -19,11 +20,6 @@ fn dump<P: AsRef<Path>>(path: P, buf: &[u8]) -> io::Result<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn validate_wasm(binary: &[u8]) -> Result<(), wabt::Error> {
|
||||
wabt::Module::read_binary(&binary, &Default::default())?.validate()?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn run_diff_test<F: FnOnce(&[u8]) -> Vec<u8>>(test_dir: &str, name: &str, test: F) {
|
||||
// FIXME: not going to work on windows?
|
||||
let mut fixture_path = PathBuf::from(concat!(env!("CARGO_MANIFEST_DIR"), "/tests/fixtures/",));
|
||||
@@ -36,17 +32,17 @@ fn run_diff_test<F: FnOnce(&[u8]) -> Vec<u8>>(test_dir: &str, name: &str, test:
|
||||
expected_path.push(test_dir);
|
||||
expected_path.push(name);
|
||||
|
||||
let fixture_wat = slurp(&fixture_path).expect("Failed to read fixture");
|
||||
let fixture_wasm = wabt::wat2wasm(fixture_wat).expect("Failed to read fixture");
|
||||
validate_wasm(&fixture_wasm).expect("Fixture is invalid");
|
||||
let fixture_wasm = wat::parse_file(&fixture_path).expect("Failed to read fixture");
|
||||
validate(&fixture_wasm).expect("Fixture is invalid");
|
||||
|
||||
let expected_wat = slurp(&expected_path).unwrap_or_default();
|
||||
let expected_wat = std::str::from_utf8(&expected_wat).expect("Failed to decode expected wat");
|
||||
|
||||
let actual_wasm = test(fixture_wasm.as_ref());
|
||||
validate_wasm(&actual_wasm).expect("Result module is invalid");
|
||||
validate(&actual_wasm).expect("Result module is invalid");
|
||||
|
||||
let actual_wat = wabt::wasm2wat(&actual_wasm).expect("Failed to convert result wasm to wat");
|
||||
let actual_wat =
|
||||
wasmprinter::print_bytes(&actual_wasm).expect("Failed to convert result wasm to wat");
|
||||
|
||||
if actual_wat != expected_wat {
|
||||
println!("difference!");
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
(module
|
||||
(type (;0;) (func (result i32)))
|
||||
(type (;1;) (func (param i32)))
|
||||
(import "env" "gas" (func (;0;) (type 1)))
|
||||
(import "env" "gas" (func $fibonacci_with_break (type 1)))
|
||||
(func (;1;) (type 0) (result i32)
|
||||
(local i32 i32)
|
||||
i32.const 13
|
||||
call 0
|
||||
call $fibonacci_with_break
|
||||
block ;; label = @1
|
||||
i32.const 0
|
||||
local.set 0
|
||||
@@ -19,11 +19,11 @@
|
||||
i32.const 1
|
||||
br_if 0 (;@1;)
|
||||
i32.const 5
|
||||
call 0
|
||||
call $fibonacci_with_break
|
||||
local.get 0
|
||||
local.get 1
|
||||
local.tee 0
|
||||
i32.add
|
||||
local.set 1
|
||||
end
|
||||
local.get 1))
|
||||
local.get 1))
|
||||
@@ -1,19 +1,19 @@
|
||||
(module
|
||||
(type (;0;) (func (param i32 i32) (result i32)))
|
||||
(type (;1;) (func (param i32)))
|
||||
(import "env" "gas" (func (;0;) (type 1)))
|
||||
(func (;1;) (type 0) (param i32 i32) (result i32)
|
||||
(import "env" "gas" (func $add_locals (type 1)))
|
||||
(func $add (type 0) (param $x i32) (param $y i32) (result i32)
|
||||
(local i32)
|
||||
i32.const 5
|
||||
call 0
|
||||
local.get 0
|
||||
local.get 1
|
||||
call $add_locals
|
||||
local.get $x
|
||||
local.get $y
|
||||
call 2
|
||||
local.set 2
|
||||
local.get 2)
|
||||
(func (;2;) (type 0) (param i32 i32) (result i32)
|
||||
i32.const 3
|
||||
call 0
|
||||
call $add_locals
|
||||
local.get 0
|
||||
local.get 1
|
||||
i32.add))
|
||||
i32.add))
|
||||
@@ -17,4 +17,4 @@
|
||||
call 0
|
||||
local.get 0
|
||||
i32.popcnt
|
||||
end))
|
||||
end))
|
||||
@@ -21,4 +21,4 @@
|
||||
call 0
|
||||
block ;; label = @1
|
||||
end)
|
||||
(export "simple" (func 1)))
|
||||
(export "simple" (func 1)))
|
||||
@@ -2,17 +2,17 @@
|
||||
(type (;0;) (func (param i32 i32)))
|
||||
(type (;1;) (func))
|
||||
(type (;2;) (func (param i32)))
|
||||
(import "env" "ext_return" (func (;0;) (type 0)))
|
||||
(import "env" "ext_return" (func $ext_return (type 0)))
|
||||
(import "env" "memory" (memory (;0;) 1 1))
|
||||
(import "env" "gas" (func (;1;) (type 2)))
|
||||
(import "env" "gas" (func $start (type 2)))
|
||||
(func (;2;) (type 1)
|
||||
i32.const 4
|
||||
call 1
|
||||
call $start
|
||||
i32.const 8
|
||||
i32.const 4
|
||||
call 0
|
||||
call $ext_return
|
||||
unreachable)
|
||||
(func (;3;) (type 1))
|
||||
(export "call" (func 3))
|
||||
(start 2)
|
||||
(data (;0;) (i32.const 8) "\01\02\03\04"))
|
||||
(data (;0;) (i32.const 8) "\01\02\03\04"))
|
||||
@@ -48,5 +48,5 @@
|
||||
i32.const 2
|
||||
i32.sub
|
||||
global.set 0)
|
||||
(global (;0;) (mut i32) (i32.const 0))
|
||||
(export "main" (func 2)))
|
||||
(global (;0;) (mut i32) i32.const 0)
|
||||
(export "main" (func 2)))
|
||||
@@ -2,20 +2,20 @@
|
||||
(type (;0;) (func))
|
||||
(type (;1;) (func (param i32 i32) (result i32)))
|
||||
(type (;2;) (func (param i32)))
|
||||
(import "env" "foo" (func (;0;) (type 0)))
|
||||
(func (;1;) (type 1) (param i32 i32) (result i32)
|
||||
(import "env" "foo" (func $foo (type 0)))
|
||||
(func $i32.add (type 1) (param i32 i32) (result i32)
|
||||
local.get 0
|
||||
local.get 1
|
||||
i32.add)
|
||||
(func (;2;) (type 2) (param i32)
|
||||
(local i32)
|
||||
global.get 0
|
||||
(func (;2;) (type 2) (param $arg i32)
|
||||
(local $tmp i32)
|
||||
global.get $counter
|
||||
i32.const 1
|
||||
i32.add
|
||||
local.tee 1
|
||||
global.set 0
|
||||
local.get 1
|
||||
local.get 0
|
||||
local.tee $tmp
|
||||
global.set $counter
|
||||
local.get $tmp
|
||||
local.get $arg
|
||||
global.get 1
|
||||
i32.const 4
|
||||
i32.add
|
||||
@@ -26,7 +26,7 @@
|
||||
if ;; label = @1
|
||||
unreachable
|
||||
end
|
||||
call 1
|
||||
call $i32.add
|
||||
global.get 1
|
||||
i32.const 4
|
||||
i32.sub
|
||||
@@ -45,11 +45,11 @@
|
||||
if ;; label = @1
|
||||
unreachable
|
||||
end
|
||||
call 1
|
||||
call $i32.add
|
||||
global.get 1
|
||||
i32.const 4
|
||||
i32.sub
|
||||
global.set 1)
|
||||
(global (;0;) (mut i32) (i32.const 1))
|
||||
(global (;1;) (mut i32) (i32.const 0))
|
||||
(export "i32.add" (func 3)))
|
||||
(global $counter (mut i32) i32.const 1)
|
||||
(global (;1;) (mut i32) i32.const 0)
|
||||
(export "i32.add" (func 3)))
|
||||
@@ -1,11 +1,11 @@
|
||||
(module
|
||||
(type (;0;) (func))
|
||||
(type (;1;) (func (param i32 i32) (result i32)))
|
||||
(import "env" "foo" (func (;0;) (type 0)))
|
||||
(import "env" "boo" (func (;1;) (type 0)))
|
||||
(import "env" "foo" (func $foo (type 0)))
|
||||
(import "env" "boo" (func $boo (type 0)))
|
||||
(func (;2;) (type 1) (param i32 i32) (result i32)
|
||||
call 0
|
||||
call 1
|
||||
call $foo
|
||||
call $boo
|
||||
local.get 0
|
||||
local.get 1
|
||||
i32.add)
|
||||
@@ -27,5 +27,5 @@
|
||||
i32.const 4
|
||||
i32.sub
|
||||
global.set 0)
|
||||
(global (;0;) (mut i32) (i32.const 0))
|
||||
(export "i32.add" (func 3)))
|
||||
(global (;0;) (mut i32) i32.const 0)
|
||||
(export "i32.add" (func 3)))
|
||||
@@ -1,8 +1,8 @@
|
||||
(module
|
||||
(type (;0;) (func))
|
||||
(func (;0;) (type 0)
|
||||
(func $one-group-many-locals (type 0)
|
||||
(local i64 i64 i32))
|
||||
(func (;1;) (type 0)
|
||||
(func $main (type 0)
|
||||
global.get 0
|
||||
i32.const 5
|
||||
i32.add
|
||||
@@ -13,9 +13,9 @@
|
||||
if ;; label = @1
|
||||
unreachable
|
||||
end
|
||||
call 0
|
||||
call $one-group-many-locals
|
||||
global.get 0
|
||||
i32.const 5
|
||||
i32.sub
|
||||
global.set 0)
|
||||
(global (;0;) (mut i32) (i32.const 0)))
|
||||
(global (;0;) (mut i32) i32.const 0))
|
||||
@@ -19,5 +19,5 @@
|
||||
i32.const 3
|
||||
i32.sub
|
||||
global.set 0)
|
||||
(global (;0;) (mut i32) (i32.const 0))
|
||||
(export "simple" (func 1)))
|
||||
(global (;0;) (mut i32) i32.const 0)
|
||||
(export "simple" (func 1)))
|
||||
@@ -1,9 +1,9 @@
|
||||
(module
|
||||
(type (;0;) (func (param i32 i32)))
|
||||
(type (;1;) (func))
|
||||
(import "env" "ext_return" (func (;0;) (type 0)))
|
||||
(import "env" "ext_return" (func $ext_return (type 0)))
|
||||
(import "env" "memory" (memory (;0;) 1 1))
|
||||
(func (;1;) (type 1)
|
||||
(func $start (type 1)
|
||||
(local i32))
|
||||
(func (;2;) (type 1))
|
||||
(func (;3;) (type 1)
|
||||
@@ -17,7 +17,7 @@
|
||||
if ;; label = @1
|
||||
unreachable
|
||||
end
|
||||
call 1
|
||||
call $start
|
||||
global.get 0
|
||||
i32.const 3
|
||||
i32.sub
|
||||
@@ -38,6 +38,6 @@
|
||||
i32.const 2
|
||||
i32.sub
|
||||
global.set 0)
|
||||
(global (;0;) (mut i32) (i32.const 0))
|
||||
(global (;0;) (mut i32) i32.const 0)
|
||||
(export "call" (func 4))
|
||||
(start 3))
|
||||
(start 3))
|
||||
@@ -2,7 +2,7 @@
|
||||
(type (;0;) (func))
|
||||
(type (;1;) (func (param i32)))
|
||||
(type (;2;) (func (param i32 i32) (result i32)))
|
||||
(import "env" "foo" (func (;0;) (type 0)))
|
||||
(import "env" "foo" (func $foo (type 0)))
|
||||
(func (;1;) (type 1) (param i32)
|
||||
local.get 0
|
||||
i32.const 0
|
||||
@@ -16,13 +16,13 @@
|
||||
if ;; label = @1
|
||||
unreachable
|
||||
end
|
||||
call 2
|
||||
call $i32.add
|
||||
global.get 0
|
||||
i32.const 4
|
||||
i32.sub
|
||||
global.set 0
|
||||
drop)
|
||||
(func (;2;) (type 2) (param i32 i32) (result i32)
|
||||
(func $i32.add (type 2) (param i32 i32) (result i32)
|
||||
local.get 0
|
||||
local.get 1
|
||||
i32.add)
|
||||
@@ -56,12 +56,12 @@
|
||||
if ;; label = @1
|
||||
unreachable
|
||||
end
|
||||
call 2
|
||||
call $i32.add
|
||||
global.get 0
|
||||
i32.const 4
|
||||
i32.sub
|
||||
global.set 0)
|
||||
(table (;0;) 10 funcref)
|
||||
(global (;0;) (mut i32) (i32.const 0))
|
||||
(global (;0;) (mut i32) i32.const 0)
|
||||
(export "i32.add" (func 4))
|
||||
(elem (;0;) (i32.const 0) func 0 3 4))
|
||||
(elem (;0;) (i32.const 0) func $foo 3 4))
|
||||
Reference in New Issue
Block a user