diff options
| author | Michael Williamson <mike@zwobble.org> | 2024-12-22 17:22:23 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2024-12-22 17:22:23 +0000 |
| commit | e6462d8438d7eccd9c3c812a65036b210cf7ae33 (patch) | |
| tree | 8357a8d304aac8b619f7632cd63a354757739efb /src/main/java | |
| parent | c8edd213b029e9c9a97182ee9da8f149152fe383 (diff) | |
Add symbols for tables
Diffstat (limited to 'src/main/java')
5 files changed, 70 insertions, 2 deletions
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 index fa7aa10f..af21b320 100644 --- 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 @@ -7,7 +7,7 @@ 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 Table(String identifier, WasmTableType type) implements WasmImportDescriptor {} record Memory(WasmMemoryType type) implements WasmImportDescriptor {} record Global(String identifier, 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 index 5ff4df08..7fc9e9f9 100644 --- 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 @@ -122,6 +122,43 @@ public record WasmModule( return indexedTags; } + public sealed interface IndexedTable { + record Import(WasmTableIndex tableIndex, WasmImportDescriptor.Table descriptor) implements IndexedTable { + @Override + public String name() { + return descriptor.identifier(); + } + } + + record Definition(WasmTableIndex tableIndex, WasmTable table) implements IndexedTable { + @Override + public String name() { + return table.name(); + } + } + + WasmTableIndex tableIndex(); + String name(); + } + + public List<IndexedTable> indexedTables() { + var indexedTables = new ArrayList<IndexedTable>(); + + for (var import_ : imports) { + if (import_.descriptor() instanceof WasmImportDescriptor.Table table) { + var tableIndex = new WasmTableIndex(indexedTables.size()); + indexedTables.add(new IndexedTable.Import(tableIndex, table)); + } + } + + for (var table : tables) { + var tableIndex = new WasmTableIndex(indexedTables.size()); + indexedTables.add(new IndexedTable.Definition(tableIndex, table)); + } + + return indexedTables; + } + public WasmModule addType(WasmFuncType type) { return new WasmModule( types.plus(type), 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 index 88178528..7f957f05 100644 --- 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 @@ -2,5 +2,5 @@ package org.shedlang.compiler.backends.wasm.structure.ast.modules; import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmTableType; -public record WasmTable(WasmTableType type) { +public record WasmTable(String name, WasmTableType type) { } diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatLinking.java b/src/main/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatLinking.java index 97ab5fc2..fed36ed5 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatLinking.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatLinking.java @@ -218,6 +218,12 @@ public class WasmBinaryFormatLinking { writeTagIndex(tag.tagIndex, writer); writer.writeString(tag.name()); } + case SymbolInfo.Table table -> { + writer.writeByte(SymbolType.TABLE.id); + writeFlags(table.flags, writer); + writeTableIndex(table.tableIndex, writer); + writer.writeString(table.name()); + } } } @@ -398,6 +404,24 @@ public class WasmBinaryFormatLinking { tagNameToSymbolIndex.put(tag.name(), symbolIndex); } + for (var table : module.indexedTables()) { + var flags = switch (table) { + case WasmModule.IndexedTable.Definition definition -> + List.<SymbolFlag>of(); + + case WasmModule.IndexedTable.Import import_ -> + List.of(SymbolFlag.UNDEFINED, SymbolFlag.EXPLICIT_NAME); + }; + + var tableSymbolInfo = new SymbolInfo.Table( + flags, + table.tableIndex(), + table.name() + ); + + symbolInfos.add(tableSymbolInfo); + } + return new SymbolTable( symbolInfos, memoryAddressToSymbolIndex, @@ -426,6 +450,9 @@ public class WasmBinaryFormatLinking { record Tag(List<SymbolFlag> flags, WasmTagIndex tagIndex, String name) implements SymbolInfo { } + + record Table(List<SymbolFlag> flags, WasmTableIndex tableIndex, String name) implements SymbolInfo { + } } private enum SymbolFlag { 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 c0d0089e..889aff61 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 @@ -52,6 +52,10 @@ public class WasmBinaryFormatModules { writer.writeUnsignedInt32(tagIndex.value()); } + static void writeTableIndex(WasmTableIndex tableIndex, WasmBinaryWriter writer) { + writer.writeUnsignedInt32(tableIndex.value()); + } + // == Sections == static void writeSection( |
