From 4ea7fb648b0c6f95e6383c34912aad411a43cdbf Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 24 Jun 2023 19:45:54 +0100 Subject: WASM binary format: support tables --- .../backends/wasm/structure/WasmBinaryFormat.java | 2 +- .../backends/wasm/structure/ast/WasmModule.java | 30 ---------------- .../wasm/structure/ast/imports/WasmImport.java | 8 ----- .../ast/imports/WasmImportDescriptor.java | 13 ------- .../wasm/structure/ast/modules/WasmImport.java | 8 +++++ .../ast/modules/WasmImportDescriptor.java | 13 +++++++ .../wasm/structure/ast/modules/WasmModule.java | 41 ++++++++++++++++++++++ .../wasm/structure/ast/modules/WasmTable.java | 6 ++++ .../structure/binary/WasmBinaryFormatModules.java | 29 +++++++++++++-- .../binary/WasmBinaryFormatNameSection.java | 4 +-- 10 files changed, 97 insertions(+), 57 deletions(-) delete mode 100644 src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/WasmModule.java delete mode 100644 src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/imports/WasmImport.java delete mode 100644 src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/imports/WasmImportDescriptor.java create mode 100644 src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmImport.java create mode 100644 src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmImportDescriptor.java create mode 100644 src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmModule.java create mode 100644 src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmTable.java (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/structure/WasmBinaryFormat.java b/src/main/java/org/shedlang/compiler/backends/wasm/structure/WasmBinaryFormat.java index 761c9ea5..ed10ef2d 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/structure/WasmBinaryFormat.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/structure/WasmBinaryFormat.java @@ -1,6 +1,6 @@ package org.shedlang.compiler.backends.wasm.structure; -import org.shedlang.compiler.backends.wasm.structure.ast.WasmModule; +import org.shedlang.compiler.backends.wasm.structure.ast.modules.WasmModule; import org.shedlang.compiler.backends.wasm.structure.binary.WasmBinaryFormatModules; import java.io.IOException; diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/WasmModule.java b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/WasmModule.java deleted file mode 100644 index 7bffd4c6..00000000 --- a/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/WasmModule.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.shedlang.compiler.backends.wasm.structure.ast; - -import org.pcollections.PVector; -import org.shedlang.compiler.backends.wasm.structure.ast.imports.WasmImport; -import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmFuncType; -import org.shedlang.compiler.util.P; - -public record WasmModule( - PVector types, - PVector imports -) { - public static final WasmModule EMPTY = new WasmModule( - P.vector(), - P.vector() - ); - - public WasmModule addType(WasmFuncType type) { - return new WasmModule( - types.plus(type), - imports - ); - } - - public WasmModule addImport(WasmImport import_) { - return new WasmModule( - types, - imports.plus(import_) - ); - } -} diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/imports/WasmImport.java b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/imports/WasmImport.java deleted file mode 100644 index bc576758..00000000 --- a/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/imports/WasmImport.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.shedlang.compiler.backends.wasm.structure.ast.imports; - -public record WasmImport( - String moduleName, - String entityName, - WasmImportDescriptor descriptor -) { -} diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/imports/WasmImportDescriptor.java b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/imports/WasmImportDescriptor.java deleted file mode 100644 index c9e6ba5f..00000000 --- a/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/imports/WasmImportDescriptor.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.shedlang.compiler.backends.wasm.structure.ast.imports; - -import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmFuncType; -import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmGlobalType; -import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmMemoryType; -import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmTableType; - -public sealed interface WasmImportDescriptor { - record Func(String identifier, WasmFuncType type) implements WasmImportDescriptor {} - record Table(WasmTableType type) implements WasmImportDescriptor {} - record Memory(WasmMemoryType type) implements WasmImportDescriptor {} - record Global(WasmGlobalType type) implements WasmImportDescriptor {} -} diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmImport.java b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmImport.java new file mode 100644 index 00000000..1e38505e --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmImport.java @@ -0,0 +1,8 @@ +package org.shedlang.compiler.backends.wasm.structure.ast.modules; + +public record WasmImport( + String moduleName, + String entityName, + WasmImportDescriptor descriptor +) { +} diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmImportDescriptor.java b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmImportDescriptor.java new file mode 100644 index 00000000..95e9c8cb --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmImportDescriptor.java @@ -0,0 +1,13 @@ +package org.shedlang.compiler.backends.wasm.structure.ast.modules; + +import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmFuncType; +import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmGlobalType; +import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmMemoryType; +import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmTableType; + +public sealed interface WasmImportDescriptor { + record Func(String identifier, WasmFuncType type) implements WasmImportDescriptor {} + record Table(WasmTableType type) implements WasmImportDescriptor {} + record Memory(WasmMemoryType type) implements WasmImportDescriptor {} + record Global(WasmGlobalType type) implements WasmImportDescriptor {} +} diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmModule.java b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmModule.java new file mode 100644 index 00000000..e37c4641 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmModule.java @@ -0,0 +1,41 @@ +package org.shedlang.compiler.backends.wasm.structure.ast.modules; + +import org.pcollections.PVector; +import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmFuncType; +import org.shedlang.compiler.util.P; + +public record WasmModule( + PVector types, + PVector tables, + PVector imports +) { + public static final WasmModule EMPTY = new WasmModule( + P.vector(), + P.vector(), + P.vector() + ); + + public WasmModule addType(WasmFuncType type) { + return new WasmModule( + types.plus(type), + tables, + imports + ); + } + + public WasmModule addTable(WasmTable table) { + return new WasmModule( + types, + tables.plus(table), + imports + ); + } + + public WasmModule addImport(WasmImport import_) { + return new WasmModule( + types, + tables, + imports.plus(import_) + ); + } +} diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmTable.java b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmTable.java new file mode 100644 index 00000000..88178528 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmTable.java @@ -0,0 +1,6 @@ +package org.shedlang.compiler.backends.wasm.structure.ast.modules; + +import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmTableType; + +public record WasmTable(WasmTableType type) { +} diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatModules.java b/src/main/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatModules.java index 919149aa..bd4525af 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatModules.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatModules.java @@ -2,9 +2,10 @@ package org.shedlang.compiler.backends.wasm.structure.binary; import org.pcollections.PVector; import org.shedlang.compiler.backends.wasm.structure.BinaryWriter; -import org.shedlang.compiler.backends.wasm.structure.ast.WasmModule; -import org.shedlang.compiler.backends.wasm.structure.ast.imports.WasmImport; -import org.shedlang.compiler.backends.wasm.structure.ast.imports.WasmImportDescriptor; +import org.shedlang.compiler.backends.wasm.structure.ast.modules.WasmModule; +import org.shedlang.compiler.backends.wasm.structure.ast.modules.WasmImport; +import org.shedlang.compiler.backends.wasm.structure.ast.modules.WasmImportDescriptor; +import org.shedlang.compiler.backends.wasm.structure.ast.modules.WasmTable; import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmFuncType; import java.io.IOException; @@ -164,6 +165,27 @@ public class WasmBinaryFormatModules { } } + // == Table Section == + + private static void writeTableSection( + WasmModule module, + BinaryWriter writer + ) throws IOException { + if (module.tables().size() > 0) { + writeSection(SectionId.TABLE, writer, () -> { + writeVec( + module.tables(), + table -> writeTable(table, writer), + writer + ); + }); + } + } + + private static void writeTable(WasmTable table, BinaryWriter writer) { + writeTableType(table.type(), writer); + } + // == Modules == private static final byte[] WASM_MAGIC = HexFormat.of().parseHex("0061736D"); @@ -175,6 +197,7 @@ public class WasmBinaryFormatModules { writer.writeBytes(WASM_VERSION); writeTypeSection(module.types(), writer); writeImportSection(module, writer); + writeTableSection(module, writer); writeNameSection(module, writer); outputStream.write(writer.toBytes()); diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatNameSection.java b/src/main/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatNameSection.java index 31b5a9ab..efa2d055 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatNameSection.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatNameSection.java @@ -1,8 +1,8 @@ package org.shedlang.compiler.backends.wasm.structure.binary; import org.shedlang.compiler.backends.wasm.structure.BinaryWriter; -import org.shedlang.compiler.backends.wasm.structure.ast.WasmModule; -import org.shedlang.compiler.backends.wasm.structure.ast.imports.WasmImportDescriptor; +import org.shedlang.compiler.backends.wasm.structure.ast.modules.WasmModule; +import org.shedlang.compiler.backends.wasm.structure.ast.modules.WasmImportDescriptor; import org.shedlang.compiler.backends.wasm.structure.binary.WasmBinaryFormatModules.SectionId; import java.io.IOException; -- cgit v1.2.3