Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Validate modules at creation time #467

Merged
merged 6 commits into from
Aug 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 5 additions & 73 deletions aot/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -154,79 +154,11 @@
<wast>utf8-import-module.wast</wast>
<wast>utf8-invalid-encoding.wast</wast>
</includedWasts>
<excludedTests>
<test>SpecV1ElemTest.test29</test>
<test>SpecV1LinkingTest.test83</test>
<test>SpecV1LinkingTest.test86</test>
<test>SpecV1LinkingTest.test94</test>
<test>SpecV1LinkingTest.test97</test>
<test>SpecV1LinkingTest.test115</test>
<test>SpecV1LinkingTest.test116</test>
<test>SpecV1LinkingTest.test118</test>
<test>SpecV1LinkingTest.test121</test>
<test>SpecV1LinkingTest.test122</test>
</excludedTests>
<excludedMalformedWasts>
<wast>binary-leb128.wast</wast>
<wast>binary.wast</wast>
</excludedMalformedWasts>
<excludedInvalidWasts>
<wast>block.wast</wast>
<wast>br.wast</wast>
<wast>br_if.wast</wast>
<wast>br_table.wast</wast>
<wast>call.wast</wast>
<wast>call_indirect.wast</wast>
<wast>conversions.wast</wast>
<wast>data.wast</wast>
<wast>elem.wast</wast>
<wast>f32.wast</wast>
<wast>f32_bitwise.wast</wast>
<wast>f32_cmp.wast</wast>
<wast>f64.wast</wast>
<wast>f64_bitwise.wast</wast>
<wast>f64_cmp.wast</wast>
<wast>func.wast</wast>
<wast>func_ptrs.wast</wast>
<wast>global.wast</wast>
<wast>i32.wast</wast>
<wast>i64.wast</wast>
<wast>if.wast</wast>
<wast>labels.wast</wast>
<wast>load.wast</wast>
<wast>local_get.wast</wast>
<wast>local_set.wast</wast>
<wast>local_tee.wast</wast>
<wast>loop.wast</wast>
<wast>memory.wast</wast>
<wast>memory_copy.wast</wast>
<wast>memory_fill.wast</wast>
<wast>memory_grow.wast</wast>
<wast>memory_init.wast</wast>
<wast>memory_size.wast</wast>
<wast>nop.wast</wast>
<wast>ref_func.wast</wast>
<wast>ref_is_null.wast</wast>
<wast>return.wast</wast>
<wast>select.wast</wast>
<wast>start.wast</wast>
<wast>store.wast</wast>
<wast>table-sub.wast</wast>
<wast>table_fill.wast</wast>
<wast>table_get.wast</wast>
<wast>table_grow.wast</wast>
<wast>table_init.wast</wast>
<wast>table_set.wast</wast>
<wast>table_size.wast</wast>
<wast>unreached-invalid.wast</wast>
</excludedInvalidWasts>
<excludedUnlinkableWasts>
<wast>imports.wast</wast>
<wast>linking.wast</wast>
</excludedUnlinkableWasts>
<excludedUninstantiableWasts>
<wast>linking.wast</wast>
</excludedUninstantiableWasts>
<excludedTests/>
<excludedMalformedWasts/>
<excludedInvalidWasts/>
<excludedUnlinkableWasts/>
<excludedUninstantiableWasts/>
<excludedWasts>
<wast>simd_address.wast</wast>
<wast>simd_align.wast</wast>
Expand Down
26 changes: 22 additions & 4 deletions aot/src/test/java/com/dylibso/chicory/approvals/ApprovalTest.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package com.dylibso.chicory.approvals;

import com.dylibso.chicory.aot.AotMachine;
import com.dylibso.chicory.runtime.HostFunction;
import com.dylibso.chicory.runtime.HostImports;
import com.dylibso.chicory.runtime.Instance;
import com.dylibso.chicory.wasm.Parser;
import com.dylibso.chicory.wasm.types.ValueType;
import java.io.ByteArrayOutputStream;
import java.io.PrintWriter;
import java.util.List;
import org.approvaltests.Approvals;
import org.junit.jupiter.api.Test;
import org.objectweb.asm.ClassReader;
Expand All @@ -29,7 +33,14 @@ public void verifyFloat() {

@Test
public void verifyHelloWasi() {
verifyGeneratedBytecode("hello-wasi.wat.wasm");
verifyGeneratedBytecode(
"hello-wasi.wat.wasm",
new HostFunction(
(instance, args) -> null,
"wasi_snapshot_preview1",
"fd_write",
List.of(ValueType.I32, ValueType.I32, ValueType.I32, ValueType.I32),
List.of(ValueType.I32)));
}

@Test
Expand All @@ -54,21 +65,28 @@ public void verifyMemory() {

@Test
public void verifyStart() {
verifyGeneratedBytecode("start.wat.wasm");
verifyGeneratedBytecode(
"start.wat.wasm",
new HostFunction(
(instance, args) -> null,
"env",
"gotit",
List.of(ValueType.I32),
List.of()));
}

@Test
public void verifyTrap() {
verifyGeneratedBytecode("trap.wat.wasm");
}

private static void verifyGeneratedBytecode(String name) {
private static void verifyGeneratedBytecode(String name, HostFunction... hostFunctions) {
var instance =
Instance.builder(
Parser.parse(
ClassLoader.getSystemClassLoader()
.getResourceAsStream("compiled/" + name)))
.withImportValidation(false)
.withHostImports(new HostImports(hostFunctions))
.withMachineFactory(AotMachine::new)
.withStart(false)
.build();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.dylibso.chicory.imports;

import com.dylibso.chicory.runtime.HostFunction;
import com.dylibso.chicory.runtime.HostImports;
import com.dylibso.chicory.runtime.Instance;
import com.dylibso.chicory.wasm.types.Value;
import com.dylibso.chicory.wasm.types.ValueType;
import java.util.List;

public class SpecV1BinaryLeb128HostFuncs {
public static HostImports fallback() {
return HostImports.builder()
.addFunction(
new HostFunction(
(Instance instance, Value... args) -> {
return null;
},
"spectest",
"print_i32",
List.of(ValueType.I32),
List.of()))
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import com.dylibso.chicory.runtime.HostTable;
import com.dylibso.chicory.runtime.Memory;
import com.dylibso.chicory.wasm.types.MemoryLimits;
import com.dylibso.chicory.wasm.types.MutabilityType;
import com.dylibso.chicory.wasm.types.Value;

public class SpecV1DataHostFuncs {
Expand All @@ -16,7 +17,16 @@ public static HostImports fallback() {
return new HostImports(
new HostFunction[] {},
new HostGlobal[] {
new HostGlobal("spectest", "global_i32", new GlobalInstance(Value.i32(0)))
new HostGlobal("spectest", "global_i32", new GlobalInstance(Value.i32(666))),
new HostGlobal("spectest", "global_i64", new GlobalInstance(Value.i64(666))),
new HostGlobal("test", "global-i32", new GlobalInstance(Value.i32(0))),
new HostGlobal(
"test",
"global-mut-i32",
new GlobalInstance(Value.i32(0)),
MutabilityType.Var),
new HostGlobal(
"test", "g", new GlobalInstance(Value.i32(0)), MutabilityType.Var)
},
new HostMemory[] {
new HostMemory("spectest", "memory", new Memory(new MemoryLimits(1, 1)))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.dylibso.chicory.imports;

import com.dylibso.chicory.runtime.GlobalInstance;
import com.dylibso.chicory.runtime.HostFunction;
import com.dylibso.chicory.runtime.HostGlobal;
import com.dylibso.chicory.runtime.HostImports;
import com.dylibso.chicory.runtime.HostMemory;
import com.dylibso.chicory.runtime.HostTable;
import com.dylibso.chicory.runtime.Instance;
import com.dylibso.chicory.runtime.Memory;
import com.dylibso.chicory.runtime.TableInstance;
import com.dylibso.chicory.wasm.types.Limits;
import com.dylibso.chicory.wasm.types.MemoryLimits;
import com.dylibso.chicory.wasm.types.Table;
import com.dylibso.chicory.wasm.types.Value;
import com.dylibso.chicory.wasm.types.ValueType;
import java.util.List;

public class SpecV1ExportsHostFuncs {
public static HostImports fallback() {
return HostImports.builder()
.addFunction(
new HostFunction(
(Instance instance, Value... args) -> {
return null;
},
"spectest",
"print_i32",
List.of(ValueType.I32),
List.of()))
.addTable(
new HostTable(
"spectest",
"table",
new TableInstance(
new Table(ValueType.FuncRef, new Limits(10, 20)))))
.addMemory(new HostMemory("spectest", "memory", new Memory(new MemoryLimits(1, 2))))
.addGlobal(
new HostGlobal("spectest", "global_i32", new GlobalInstance(Value.i32(0))))
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.dylibso.chicory.runtime.GlobalInstance;
import com.dylibso.chicory.runtime.HostGlobal;
import com.dylibso.chicory.runtime.HostImports;
import com.dylibso.chicory.wasm.types.MutabilityType;
import com.dylibso.chicory.wasm.types.Value;

public class SpecV1GlobalHostFuncs {
Expand All @@ -11,7 +12,14 @@ public static HostImports fallback() {
return new HostImports(
new HostGlobal[] {
new HostGlobal("spectest", "global_i32", new GlobalInstance(Value.i32(666))),
new HostGlobal("spectest", "global_i64", new GlobalInstance(Value.i64(666)))
new HostGlobal("spectest", "global_i64", new GlobalInstance(Value.i64(666))),
new HostGlobal("test", "global-i32", new GlobalInstance(Value.i32(0))),
new HostGlobal(
"test",
"global-mut-i32",
new GlobalInstance(Value.i32(0)),
MutabilityType.Var),
new HostGlobal("", "", new GlobalInstance(Value.externRef(0))),
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,21 @@
public class SpecV1RefFuncHostFuncs {

public static HostImports fallback() {
return new HostImports(
new HostFunction[] {
new HostFunction(
(Instance instance, Value... args) -> args,
"M",
"f",
List.of(ValueType.I32),
List.of(ValueType.I32))
});
return HostImports.builder()
.addFunction(
new HostFunction(
(Instance instance, Value... args) -> args,
"M",
"f",
List.of(ValueType.I32),
List.of(ValueType.I32)))
.addFunction(
new HostFunction(
(Instance instance, Value... args) -> args,
"M",
"g",
List.of(ValueType.I32),
List.of(ValueType.I32)))
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.dylibso.chicory.imports;

import com.dylibso.chicory.runtime.HostImports;
import com.dylibso.chicory.runtime.HostTable;
import com.dylibso.chicory.runtime.TableInstance;
import com.dylibso.chicory.wasm.types.Limits;
import com.dylibso.chicory.wasm.types.Table;
import com.dylibso.chicory.wasm.types.ValueType;

public class SpecV1TableHostFuncs {
public static HostImports fallback() {
return HostImports.builder()
.addTable(
new HostTable(
"spectest",
"table",
new TableInstance(new Table(ValueType.FuncRef, new Limits(10)))))
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.dylibso.chicory.imports;

import com.dylibso.chicory.runtime.HostFunction;
import com.dylibso.chicory.runtime.HostImports;
import com.dylibso.chicory.runtime.Instance;
import com.dylibso.chicory.wasm.types.Value;
import java.util.List;

public class SpecV1TokensHostFuncs {
public static HostImports fallback() {
return HostImports.builder()
.addFunction(
new HostFunction(
(Instance instance, Value... args) -> {
return null;
},
"spectest",
"print",
List.of(),
List.of()))
.build();
}
}
22 changes: 4 additions & 18 deletions aot/src/test/java/com/dylibso/chicory/testing/TestModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,6 @@ public class TestModule {
private Instance instance;

private HostImports imports;
private boolean typeValidation;

public TestModule(Module module) {
this.module = module;
}

public static TestModule of(Module module) {
return new TestModule(module);
Expand Down Expand Up @@ -64,13 +59,13 @@ public static TestModule of(File file) {
return of(Parser.parse(file));
}

public TestModule(Module module) {
this.module = module;
}

public Instance build() {
this.instance =
Instance.builder(module)
// TODO: enable me!
.withTypeValidation(false)
// TODO: enable me!
.withImportValidation(false)
.withHostImports(imports)
.withMachineFactory(AotMachine::new)
.build();
Expand All @@ -81,13 +76,4 @@ public TestModule withHostImports(HostImports imports) {
this.imports = imports;
return this;
}

public TestModule withTypeValidation(boolean v) {
this.typeValidation = v;
return this;
}

public Instance instance() {
return instance;
}
}
Loading
Loading