From d198788e4d4da184bf6a931ce2cceb19288659d5 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 30 Jun 2023 18:56:13 +0100 Subject: Replace WasmDataSymbol with WasmDataElement --- .../compiler/backends/wasm/WasmMemoryBuilder.java | 37 ++++++++-------------- .../wasm/structure/ast/linking/WasmDataSymbol.java | 9 ------ .../structure/ast/modules/WasmDataElement.java | 8 +++++ .../structure/ast/modules/WasmDataSegment.java | 3 +- .../structure/binary/WasmBinaryFormatLinking.java | 30 +++++++++++++----- 5 files changed, 45 insertions(+), 42 deletions(-) delete mode 100644 src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/linking/WasmDataSymbol.java create mode 100644 src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmDataElement.java (limited to 'src/main/java') 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 df72afc4..d2a13ee6 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmMemoryBuilder.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmMemoryBuilder.java @@ -3,8 +3,6 @@ package org.shedlang.compiler.backends.wasm; import org.pcollections.OrderedPMap; import org.shedlang.compiler.backends.wasm.structure.ast.instructions.WasmExpression; import org.shedlang.compiler.backends.wasm.structure.ast.instructions.WasmI32Const; -import org.shedlang.compiler.backends.wasm.structure.ast.linking.WasmDataSegmentIndex; -import org.shedlang.compiler.backends.wasm.structure.ast.linking.WasmDataSymbol; 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.WasmLimits; @@ -37,28 +35,21 @@ public class WasmMemoryBuilder { new WasmImportDescriptor.Memory(new WasmMemoryType(WasmLimits.min(pageCount))) )); - if (entities.size() > 0) { - var dataSegmentIndex = module.dataSegments().size(); - for (var entity : entities.values()) { - module = module - .addDataSegment(new WasmDataSegment( - ".data." + entity.name, - entity.data, - new WasmExpression(List.of(new WasmI32Const(0))), - WasmAlignment.ALIGN_32_BIT, - List.of( - new WasmDataSymbol( - entity.name, - // TODO: remove the data segment index from data symbol (its redundant) - new WasmDataSegmentIndex(dataSegmentIndex), - 0, - entity.data.length - ) + for (var entity : entities.values()) { + module = module + .addDataSegment(new WasmDataSegment( + ".data." + entity.name, + entity.data, + new WasmExpression(List.of(new WasmI32Const(0))), + WasmAlignment.ALIGN_32_BIT, + List.of( + new WasmDataElement( + entity.name, + 0, + entity.data.length ) - )); - - dataSegmentIndex++; - } + ) + )); } return module; diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/linking/WasmDataSymbol.java b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/linking/WasmDataSymbol.java deleted file mode 100644 index 864d46e9..00000000 --- a/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/linking/WasmDataSymbol.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.shedlang.compiler.backends.wasm.structure.ast.linking; - -public record WasmDataSymbol( - String name, - WasmDataSegmentIndex dataSegmentIndex, - int offset, - int size -) { -} diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmDataElement.java b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmDataElement.java new file mode 100644 index 00000000..6448e9dd --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmDataElement.java @@ -0,0 +1,8 @@ +package org.shedlang.compiler.backends.wasm.structure.ast.modules; + +public record WasmDataElement( + String name, + int offset, + int size +) { +} diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmDataSegment.java b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmDataSegment.java index 911a6a01..7d3351c7 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmDataSegment.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/modules/WasmDataSegment.java @@ -1,7 +1,6 @@ package org.shedlang.compiler.backends.wasm.structure.ast.modules; import org.shedlang.compiler.backends.wasm.structure.ast.instructions.WasmExpression; -import org.shedlang.compiler.backends.wasm.structure.ast.linking.WasmDataSymbol; import java.util.List; @@ -10,6 +9,6 @@ public record WasmDataSegment( byte[] init, WasmExpression offset, WasmAlignment alignment, - List symbols + List elements ) { } 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 de46dd3f..fa64106a 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 @@ -201,10 +201,10 @@ public class WasmBinaryFormatLinking { case SymbolInfo.Data data -> { writer.writeByte(SymbolType.DATA.id); writeFlags(data.flags, writer); - writer.writeString(data.dataSymbol.name()); - writeDataSegmentIndex(data.dataSymbol.dataSegmentIndex(), writer); - writer.writeUnsignedInt32(data.dataSymbol.offset()); - writer.writeUnsignedInt32(data.dataSymbol.size()); + writer.writeString(data.name()); + writeDataSegmentIndex(data.dataSegmentIndex(), writer); + writer.writeUnsignedInt32(data.offset()); + writer.writeUnsignedInt32(data.size()); } case SymbolInfo.Global global -> { writer.writeByte(SymbolType.GLOBAL.id); @@ -315,16 +315,24 @@ public class WasmBinaryFormatLinking { } var memoryAddressToSymbolIndex = new HashMap(); + var dataSegmentIndex = 0; for (var dataSegment : module.dataSegments()) { - for (var dataSymbol : dataSegment.symbols()) { - var symbolInfo = new SymbolInfo.Data(List.of(), dataSymbol); + for (var dataElement : dataSegment.elements()) { + var symbolInfo = new SymbolInfo.Data( + List.of(), + dataElement.name(), + new WasmDataSegmentIndex(dataSegmentIndex), + dataElement.offset(), + dataElement.size() + ); var symbolIndex = new WasmSymbolIndex(symbolInfos.size()); symbolInfos.add(symbolInfo); memoryAddressToSymbolIndex.put( - new WasmMemoryAddress(dataSymbol.name()), + new WasmMemoryAddress(dataElement.name()), symbolIndex ); } + dataSegmentIndex++; } var globalNameToSymbolIndex = new HashMap(); @@ -373,7 +381,13 @@ public class WasmBinaryFormatLinking { record Global(List flags, WasmGlobalIndex globalIndex, String name) implements SymbolInfo { } - record Data(List flags, WasmDataSymbol dataSymbol) implements SymbolInfo { + record Data( + List flags, + String name, + WasmDataSegmentIndex dataSegmentIndex, + int offset, + int size + ) implements SymbolInfo { } } -- cgit v1.2.3