aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-12-22 17:22:23 +0000
committerMichael Williamson <mike@zwobble.org>2024-12-22 17:22:23 +0000
commite6462d8438d7eccd9c3c812a65036b210cf7ae33 (patch)
tree8357a8d304aac8b619f7632cd63a354757739efb /src/main/java
parentc8edd213b029e9c9a97182ee9da8f149152fe383 (diff)
Add symbols for tables
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmImportDescriptor.java2
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmModule.java37
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmTable.java2
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatLinking.java27
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatModules.java4
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(