From e89651789b217efbb060e07c022caf1573d567ba Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 26 Dec 2023 21:26:50 +0000 Subject: Support 64-bit memories --- .../compiler/backends/wasm/PatioToWasm.java | 5 +- .../compiler/backends/wasm/WasmBackend.java | 10 ++- .../compiler/backends/wasm/WasmMemoryBuilder.java | 17 ++++- .../compiler/backends/wasm/WasmTarget.java | 25 ++++++- .../wasm/structure/ast/types/WasmIndexType.java | 6 ++ .../wasm/structure/ast/types/WasmLimits.java | 18 +++-- .../structure/binary/WasmBinaryFormatTypes.java | 10 ++- .../compiler/backends/wasm/PatioToWasmTests.java | 4 +- .../backends/wasm/structure/WasmObjdump.java | 3 +- .../binary/WasmBinaryFormatInstructionsTests.java | 8 +-- .../binary/WasmBinaryFormatModulesTests.java | 83 +++++++++++++++------- .../structure/binary/WasmBinaryFormatTesting.java | 26 +++++-- 12 files changed, 161 insertions(+), 54 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/types/WasmIndexType.java (limited to 'src') diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java b/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java index e1204eb6..31c44cae 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java @@ -25,7 +25,8 @@ public class PatioToWasm { public static final String STACK_ALLOC_NAME = "malloc"; public static WasmModule generateCompilationUnit( - PatioCompilationUnit patioCompilationUnit + PatioCompilationUnit patioCompilationUnit, + WasmTarget target ) { var module = WasmModule.EMPTY.addImport(new WasmImport( "env", @@ -51,7 +52,7 @@ public class PatioToWasm { ) )); - var wasmMemoryBuilder = WasmMemoryBuilder.EMPTY; + var wasmMemoryBuilder = WasmMemoryBuilder.empty(target.indexType()); for (var patioCompilationUnitElement : patioCompilationUnit.elements()) { switch (patioCompilationUnitElement) { diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java index cf30d1c7..7d6f38bf 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java @@ -58,7 +58,10 @@ public class WasmBackend implements Backend { ShidToPatioContext.forTypeInfos(typeInfos) ); - var wasmModule = PatioToWasm.generateCompilationUnit(patioCompilationUnit); + var wasmModule = PatioToWasm.generateCompilationUnit( + patioCompilationUnit, + this.target + ); var objectPath = writeObjectFile( wasmModule, @@ -112,7 +115,10 @@ public class WasmBackend implements Backend { var patioCompilationUnit = context.toCompilationUnit(source); - var wasmModule = PatioToWasm.generateCompilationUnit(patioCompilationUnit); + var wasmModule = PatioToWasm.generateCompilationUnit( + patioCompilationUnit, + this.target + ); wasmModule = generateNativeRuntime(wasmModule); diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmMemoryBuilder.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmMemoryBuilder.java index 1f55af6c..821c203b 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmMemoryBuilder.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmMemoryBuilder.java @@ -5,20 +5,29 @@ import org.shedlang.compiler.backends.wasm.structure.ast.instructions.WasmExpres import org.shedlang.compiler.backends.wasm.structure.ast.instructions.WasmI32Const; import org.shedlang.compiler.backends.wasm.structure.ast.linking.WasmMemoryAddress; import org.shedlang.compiler.backends.wasm.structure.ast.modules.*; +import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmIndexType; import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmLimits; import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmMemoryType; import java.util.List; public class WasmMemoryBuilder { - public static final WasmMemoryBuilder EMPTY = new WasmMemoryBuilder(OrderedPMap.empty(), 0); + public static WasmMemoryBuilder empty(WasmIndexType indexType) { + return new WasmMemoryBuilder(indexType, OrderedPMap.empty(), 0); + } private static final int PAGE_SIZE = 65536; + private final WasmIndexType indexType; private final OrderedPMap entities; private final int size; - private WasmMemoryBuilder(OrderedPMap entities, int size) { + private WasmMemoryBuilder( + WasmIndexType indexType, + OrderedPMap entities, + int size + ) { + this.indexType = indexType; this.entities = entities; this.size = size; } @@ -32,11 +41,12 @@ public class WasmMemoryBuilder { public WasmModule toModule(WasmModule module) { var pageCount = (size + PAGE_SIZE - 1) / PAGE_SIZE; + var memoryType = new WasmMemoryType(WasmLimits.min(indexType, pageCount)); module = module .addImport(new WasmImport( "env", "__linear_memory", - new WasmImportDescriptor.Memory(new WasmMemoryType(WasmLimits.min(pageCount))) + new WasmImportDescriptor.Memory(memoryType) )); for (var entity : entities.values()) { @@ -73,6 +83,7 @@ public class WasmMemoryBuilder { } var builder = new WasmMemoryBuilder( + indexType, entities.plus(name, new Entity(name, offset, data, alignment)), offset + data.length ); diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmTarget.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmTarget.java index ac094c92..d1951297 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmTarget.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmTarget.java @@ -1,17 +1,28 @@ package org.shedlang.compiler.backends.wasm; +import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmIndexType; + import java.util.List; public enum WasmTarget { - WASM32("wasm32", List.of()), - WASM64("wasm64", List.of("-mwasm64")); + WASM32("wasm32", WasmIndexType.I32, List.of(), List.of()), + WASM64("wasm64", WasmIndexType.I64, List.of("-mwasm64"), List.of("--enable-memory64")); private final String targetName; + private final WasmIndexType indexType; private final List linkerFlags; + private final List wabtFlags; - WasmTarget(String name, List linkerFlags) { + WasmTarget( + String name, + WasmIndexType indexType, + List linkerFlags, + List wabtFlags + ) { this.targetName = name; + this.indexType = indexType; this.linkerFlags = linkerFlags; + this.wabtFlags = wabtFlags; } public String targetName() { @@ -21,4 +32,12 @@ public enum WasmTarget { public List linkerFlags() { return linkerFlags; } + + public WasmIndexType indexType() { + return indexType; + } + + public List wabtFlags() { + return wabtFlags; + } } diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/types/WasmIndexType.java b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/types/WasmIndexType.java new file mode 100644 index 00000000..9de7683e --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/types/WasmIndexType.java @@ -0,0 +1,6 @@ +package org.shedlang.compiler.backends.wasm.structure.ast.types; + +public enum WasmIndexType { + I32, + I64, +} diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/types/WasmLimits.java b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/types/WasmLimits.java index 722299b9..f0d74bfe 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/types/WasmLimits.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/types/WasmLimits.java @@ -2,12 +2,20 @@ package org.shedlang.compiler.backends.wasm.structure.ast.types; import java.util.OptionalInt; -public record WasmLimits(int min, OptionalInt max) { - public static WasmLimits min(int min) { - return new WasmLimits(min, OptionalInt.empty()); +public record WasmLimits(WasmIndexType indexType, int min, OptionalInt max) { + public static WasmLimits min(WasmIndexType indexType, int min) { + return new WasmLimits(indexType, min, OptionalInt.empty()); } - public static WasmLimits range(int min, int max) { - return new WasmLimits(min, OptionalInt.of(max)); + public static WasmLimits min32(int min) { + return min(WasmIndexType.I32, min); + } + + public static WasmLimits range(WasmIndexType indexType, int min, int max) { + return new WasmLimits(indexType, min, OptionalInt.of(max)); + } + + public static WasmLimits range32(int min, int max) { + return range(WasmIndexType.I32, min, max); } } diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatTypes.java b/src/main/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatTypes.java index 2ec737f5..cd21300a 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatTypes.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatTypes.java @@ -62,11 +62,17 @@ public class WasmBinaryFormatTypes { static void writeLimits(WasmLimits limits, WasmBinaryWriter writer) { if (limits.max().isPresent()) { - writer.writeByte(0x01); + writer.writeByte(switch (limits.indexType()) { + case I32 -> 0x01; + case I64 -> 0x05; + }); writer.writeUnsignedInt32(limits.min()); writer.writeUnsignedInt32(limits.max().getAsInt()); } else { - writer.writeByte(0x00); + writer.writeByte(switch (limits.indexType()) { + case I32 -> 0x00; + case I64 -> 0x04; + }); writer.writeUnsignedInt32(limits.min()); } } diff --git a/src/test/java/org/shedlang/compiler/backends/wasm/PatioToWasmTests.java b/src/test/java/org/shedlang/compiler/backends/wasm/PatioToWasmTests.java index b8b7f531..59c24bf7 100644 --- a/src/test/java/org/shedlang/compiler/backends/wasm/PatioToWasmTests.java +++ b/src/test/java/org/shedlang/compiler/backends/wasm/PatioToWasmTests.java @@ -25,7 +25,7 @@ import java.util.List; public class PatioToWasmTests extends PatioExampleTests { @Override protected ExecutionResult run(PatioCompilationUnit patio) throws IOException, InterruptedException { - var wasmModule = PatioToWasm.generateCompilationUnit(patio); + var wasmModule = PatioToWasm.generateCompilationUnit(patio, WasmTarget.WASM32); wasmModule = WasmBackend.generateNativeRuntime(wasmModule); @@ -64,7 +64,7 @@ public class PatioToWasmTests extends PatioExampleTests { executablePath ); - WasmBinaryFormatTesting.validate(executablePath); + WasmBinaryFormatTesting.validate(executablePath, WasmTarget.WASM32); return TestProcessRunner.runCaptureOutput(Lists.concat( WasmTesting.BINARY_RUNNER, diff --git a/src/test/java/org/shedlang/compiler/backends/wasm/structure/WasmObjdump.java b/src/test/java/org/shedlang/compiler/backends/wasm/structure/WasmObjdump.java index 60133124..761a2dba 100644 --- a/src/test/java/org/shedlang/compiler/backends/wasm/structure/WasmObjdump.java +++ b/src/test/java/org/shedlang/compiler/backends/wasm/structure/WasmObjdump.java @@ -23,6 +23,7 @@ public class WasmObjdump { } public static String objdump(Path path) throws IOException, InterruptedException { - return TestProcessRunner.runCaptureOutput(List.of("wasm-objdump", "-dx", path.toString())).throwOnError().stdout(); + var command = List.of("wasm-objdump", "-dx", path.toString()); + return TestProcessRunner.runCaptureOutput(command).throwOnError().stdout(); } } diff --git a/src/test/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatInstructionsTests.java b/src/test/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatInstructionsTests.java index e70a5348..a0541da0 100644 --- a/src/test/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatInstructionsTests.java +++ b/src/test/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatInstructionsTests.java @@ -11,7 +11,7 @@ import org.shedlang.compiler.testing.snapshots.Snapshotter; import java.io.IOException; import java.util.List; -import static org.shedlang.compiler.backends.wasm.structure.binary.WasmBinaryFormatTesting.serializeModule; +import static org.shedlang.compiler.backends.wasm.structure.binary.WasmBinaryFormatTesting.serializeModuleWasm32; @ExtendWith({SnapshotResolver.class}) public class WasmBinaryFormatInstructionsTests { @@ -40,7 +40,7 @@ public class WasmBinaryFormatInstructionsTests { )) )); - var result = serializeModule(module); + var result = serializeModuleWasm32(module); snapshotter.assertSnapshot(result); } @@ -65,7 +65,7 @@ public class WasmBinaryFormatInstructionsTests { )) )); - var result = serializeModule(module); + var result = serializeModuleWasm32(module); snapshotter.assertSnapshot(result); } @@ -113,7 +113,7 @@ public class WasmBinaryFormatInstructionsTests { )) )); - var result = serializeModule(module); + var result = serializeModuleWasm32(module); snapshotter.assertSnapshot(result); } diff --git a/src/test/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatModulesTests.java b/src/test/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatModulesTests.java index e4b304b8..7054c4cf 100644 --- a/src/test/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatModulesTests.java +++ b/src/test/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatModulesTests.java @@ -14,7 +14,8 @@ import org.shedlang.compiler.testing.snapshots.Snapshotter; import java.io.IOException; import java.util.List; -import static org.shedlang.compiler.backends.wasm.structure.binary.WasmBinaryFormatTesting.serializeModule; +import static org.shedlang.compiler.backends.wasm.structure.binary.WasmBinaryFormatTesting.serializeModuleWasm32; +import static org.shedlang.compiler.backends.wasm.structure.binary.WasmBinaryFormatTesting.serializeModuleWasm64; @ExtendWith({SnapshotResolver.class}) public class WasmBinaryFormatModulesTests { @@ -22,7 +23,7 @@ public class WasmBinaryFormatModulesTests { public void canSerializeEmptyModule(Snapshotter snapshotter) throws IOException, InterruptedException { var module = WasmModule.EMPTY; - var result = serializeModule(module); + var result = serializeModuleWasm32(module); snapshotter.assertSnapshot(result); } @@ -36,7 +37,7 @@ public class WasmBinaryFormatModulesTests { List.of(WasmValueType.F32, WasmValueType.F64) )); - var result = serializeModule(module); + var result = serializeModuleWasm32(module); snapshotter.assertSnapshot(result); } @@ -69,7 +70,7 @@ public class WasmBinaryFormatModulesTests { new WasmExpression(List.of(new WasmI64Const(0))) )); - var result = serializeModule(module); + var result = serializeModuleWasm32(module); snapshotter.assertSnapshot(result); } @@ -88,7 +89,7 @@ public class WasmBinaryFormatModulesTests { new WasmImportDescriptor.Func("Identifier2", new WasmFuncType(List.of(WasmValueType.I32), List.of())) )); - var result = serializeModule(module); + var result = serializeModuleWasm32(module); snapshotter.assertSnapshot(result); } @@ -111,20 +112,22 @@ public class WasmBinaryFormatModulesTests { new WasmImportDescriptor.Func("Identifier1", new WasmFuncType(List.of(), List.of())) )); - var result = serializeModule(module); + var result = serializeModuleWasm32(module); snapshotter.assertSnapshot(result); } @Test public void canSerializeModuleWithTableImports(Snapshotter snapshotter) throws IOException, InterruptedException { + // Import tables with limits both with and without a maximum. + // 64-bit indices are not supported for tables, even in wasm64. var module = WasmModule.EMPTY .addImport(new WasmImport( "ModuleName1", "EntityName1", new WasmImportDescriptor.Table(new WasmTableType( WasmReferenceType.EXTERN_REF, - WasmLimits.min(1) + WasmLimits.min32(1) )) )) .addImport(new WasmImport( @@ -132,27 +135,43 @@ public class WasmBinaryFormatModulesTests { "EntityName2", new WasmImportDescriptor.Table(new WasmTableType( WasmReferenceType.FUNC_REF, - WasmLimits.range(2, 5) + WasmLimits.range32(2, 5) )) )); - var result = serializeModule(module); + var result = serializeModuleWasm32(module); snapshotter.assertSnapshot(result); } @Test - public void canSerializeModuleWithMemoryImports(Snapshotter snapshotter) throws IOException, InterruptedException { + public void canSerializeModuleWith32BitMemoryImports(Snapshotter snapshotter) throws IOException, InterruptedException { var module = WasmModule.EMPTY .addImport(new WasmImport( "ModuleName1", "EntityName1", new WasmImportDescriptor.Memory(new WasmMemoryType( - WasmLimits.min(1) + WasmLimits.min(WasmIndexType.I32, 1) )) )); - var result = serializeModule(module); + var result = serializeModuleWasm32(module); + + snapshotter.assertSnapshot(result); + } + + @Test + public void canSerializeModuleWith64BitMemoryImports(Snapshotter snapshotter) throws IOException, InterruptedException { + var module = WasmModule.EMPTY + .addImport(new WasmImport( + "ModuleName1", + "EntityName1", + new WasmImportDescriptor.Memory(new WasmMemoryType( + WasmLimits.min(WasmIndexType.I64, 1) + )) + )); + + var result = serializeModuleWasm64(module); snapshotter.assertSnapshot(result); } @@ -177,7 +196,7 @@ public class WasmBinaryFormatModulesTests { ) )); - var result = serializeModule(module); + var result = serializeModuleWasm32(module); snapshotter.assertSnapshot(result); } @@ -187,26 +206,38 @@ public class WasmBinaryFormatModulesTests { var module = WasmModule.EMPTY .addTable(new WasmTable(new WasmTableType( WasmReferenceType.FUNC_REF, - WasmLimits.min(1) + WasmLimits.min32(1) ))) .addTable(new WasmTable(new WasmTableType( WasmReferenceType.EXTERN_REF, - WasmLimits.range(2, 3) + WasmLimits.range32(2, 3) + ))); + + var result = serializeModuleWasm32(module); + + snapshotter.assertSnapshot(result); + } + + @Test + public void canSerializeModuleWith32BitMemories(Snapshotter snapshotter) throws IOException, InterruptedException { + var module = WasmModule.EMPTY + .addMemory(new WasmMemory(new WasmMemoryType( + WasmLimits.min(WasmIndexType.I32, 1) ))); - var result = serializeModule(module); + var result = serializeModuleWasm32(module); snapshotter.assertSnapshot(result); } @Test - public void canSerializeModuleWithMemories(Snapshotter snapshotter) throws IOException, InterruptedException { + public void canSerializeModuleWith64BitMemories(Snapshotter snapshotter) throws IOException, InterruptedException { var module = WasmModule.EMPTY .addMemory(new WasmMemory(new WasmMemoryType( - WasmLimits.min(1) + WasmLimits.min(WasmIndexType.I64, 1) ))); - var result = serializeModule(module); + var result = serializeModuleWasm64(module); snapshotter.assertSnapshot(result); } @@ -225,7 +256,7 @@ public class WasmBinaryFormatModulesTests { new WasmExpression(List.of(new WasmI64Const(9))) )); - var result = serializeModule(module); + var result = serializeModuleWasm32(module); snapshotter.assertSnapshot(result); } @@ -256,14 +287,14 @@ public class WasmBinaryFormatModulesTests { )) .addTable(new WasmTable(new WasmTableType( WasmReferenceType.FUNC_REF, - WasmLimits.min(1) + WasmLimits.min32(1) ))) .addElementSegment(WasmElementSegment.funcIndicesActive(List.of( new WasmFuncIndex(0), new WasmFuncIndex(2) ))); - var result = serializeModule(module); + var result = serializeModuleWasm32(module); snapshotter.assertSnapshot(result); } @@ -271,7 +302,7 @@ public class WasmBinaryFormatModulesTests { @Test public void canSerializeModuleWithDataSegments(Snapshotter snapshotter) throws IOException, InterruptedException { var module = WasmModule.EMPTY - .addMemory(new WasmMemory(new WasmMemoryType(WasmLimits.min(10)))) + .addMemory(new WasmMemory(new WasmMemoryType(WasmLimits.min32(10)))) .addDataSegment(new WasmDataSegment( ".data", new byte[] { 1, 2, 3, 4 }, @@ -304,7 +335,7 @@ public class WasmBinaryFormatModulesTests { ) )); - var result = serializeModule(module); + var result = serializeModuleWasm32(module); snapshotter.assertSnapshot(result); } @@ -336,7 +367,7 @@ public class WasmBinaryFormatModulesTests { .addInitFunc(new WasmInitFunc(0, new WasmFuncName("f3"))) .addInitFunc(new WasmInitFunc(4, new WasmFuncName("f1"))); - var result = serializeModule(module); + var result = serializeModuleWasm32(module); snapshotter.assertSnapshot(result); } @@ -360,7 +391,7 @@ public class WasmBinaryFormatModulesTests { List.of(WasmValueType.I32, WasmValueType.I64) )); - var result = serializeModule(module); + var result = serializeModuleWasm32(module); snapshotter.assertSnapshot(result); } diff --git a/src/test/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatTesting.java b/src/test/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatTesting.java index cc9fd5fa..69a03800 100644 --- a/src/test/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatTesting.java +++ b/src/test/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatTesting.java @@ -1,12 +1,15 @@ package org.shedlang.compiler.backends.wasm.structure.binary; +import org.shedlang.compiler.backends.wasm.WasmTarget; import org.shedlang.compiler.backends.wasm.structure.ast.modules.WasmModule; import org.shedlang.compiler.testing.TestProcessRunner; +import org.shedlang.compiler.util.P; import java.io.FileOutputStream; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.ArrayList; import java.util.List; import static org.shedlang.compiler.backends.wasm.structure.WasmObjdump.objdump; @@ -15,7 +18,18 @@ public class WasmBinaryFormatTesting { private WasmBinaryFormatTesting() { } - static String serializeModule(WasmModule module) throws IOException, InterruptedException { + static String serializeModuleWasm32(WasmModule module) throws IOException, InterruptedException { + return serializeModule(module, WasmTarget.WASM32); + } + + static String serializeModuleWasm64(WasmModule module) throws IOException, InterruptedException { + return serializeModule(module, WasmTarget.WASM64); + } + + private static String serializeModule( + WasmModule module, + WasmTarget target + ) throws IOException, InterruptedException { Files.createDirectories(Path.of("tests-tmp")); var temporaryDirectory = Files.createTempDirectory(Path.of("tests-tmp"), "WasmBinaryFormat"); var modulePath = temporaryDirectory.resolve("module.wasm"); @@ -25,13 +39,17 @@ public class WasmBinaryFormatTesting { WasmBinaryFormatModules.serializeModule(module, outputStream); } - validate(modulePath); + validate(modulePath, target); return objdump(modulePath); } - public static void validate(Path path) throws IOException, InterruptedException { - TestProcessRunner.runCaptureOutput(List.of("wasm-validate", "--enable-exceptions", path.toString())) + public static void validate(Path path, WasmTarget target) throws IOException, InterruptedException { + var command = P.vector("wasm-validate", "--enable-exceptions") + .plusAll(target.wabtFlags()) + .plus(path.toString()); + + TestProcessRunner.runCaptureOutput(command) .throwOnError(); } } -- cgit v1.2.3