diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-30 18:56:13 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-30 18:56:13 +0100 |
| commit | d198788e4d4da184bf6a931ce2cceb19288659d5 (patch) | |
| tree | 9497f6a249395ecdf0d8193cc778c25b3e3e746c /src/main/java | |
| parent | a5728591c5341fe8b64060916baf735bc2438eb2 (diff) | |
Replace WasmDataSymbol with WasmDataElement
Diffstat (limited to 'src/main/java')
5 files changed, 45 insertions, 42 deletions
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<WasmDataSymbol> symbols + List<WasmDataElement> 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<WasmMemoryAddress, WasmSymbolIndex>(); + 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<String, WasmSymbolIndex>(); @@ -373,7 +381,13 @@ public class WasmBinaryFormatLinking { record Global(List<SymbolFlag> flags, WasmGlobalIndex globalIndex, String name) implements SymbolInfo { } - record Data(List<SymbolFlag> flags, WasmDataSymbol dataSymbol) implements SymbolInfo { + record Data( + List<SymbolFlag> flags, + String name, + WasmDataSegmentIndex dataSegmentIndex, + int offset, + int size + ) implements SymbolInfo { } } |
