From 83fcac31c97820f2a29ba7766161a4baf1746b8e Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 27 Jun 2023 23:30:32 +0100 Subject: Generate string data symbol names using common mechanism --- .../compiler/backends/wasm/WasmCodeGenContext.java | 20 ++++++++++------- .../compiler/backends/wasm/WasmCodeGenStrings.java | 2 +- .../compiler/backends/wasm/WasmMemoryBuilder.java | 26 +++++++++------------- 3 files changed, 23 insertions(+), 25 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGenContext.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGenContext.java index 82263a13..bee0bc98 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGenContext.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGenContext.java @@ -64,26 +64,26 @@ public record WasmCodeGenContext( ); } - public String generateSymbolName(WasmCodeGenGlobalSpace space, String name) { + public String generateSymbolName(WasmCodeGenGlobalSpace space, Optional name) { return NameAllocator.generateName( symbolNames::contains, "shed__" + space, - Optional.of(name) + name ); } public Result addData( - WasmCodeGenGlobalSpace space, + String name, byte[] data, WasmAlignment alignment ) { - var result = memory.add(space, data, alignment); + var result = memory.add(name, data, alignment); return new ModuleContext( this.types, this.imports, this.functions, - this.symbolNames, + this.symbolNames.plus(name), result.memory() ).toResult(result.offset()); } @@ -225,7 +225,11 @@ public record WasmCodeGenContext( } public String generateFunctionName(WasmCodeGenGlobalSpace space, String name) { - return moduleContext.generateSymbolName(space, name); + return moduleContext.generateSymbolName(space, Optional.of(name)); + } + + public String generateGlobalName(WasmCodeGenGlobalSpace space) { + return moduleContext.generateSymbolName(space, Optional.empty()); } public WasmCodeGenContext addFunction(WasmFunction function) { @@ -236,11 +240,11 @@ public record WasmCodeGenContext( } public WasmCodeGenResult addData( - WasmCodeGenGlobalSpace space, + String name, byte[] data, WasmAlignment alignment ) { - var result = this.moduleContext.addData(space, data, alignment); + var result = this.moduleContext.addData(name, data, alignment); return new WasmCodeGenContext( result.context, diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGenStrings.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGenStrings.java index 3cd51098..29fda47d 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGenStrings.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGenStrings.java @@ -20,7 +20,7 @@ public class WasmCodeGenStrings { data.put(codeUnits); return context.addData( - WasmCodeGenGlobalSpace.DATA_STRING, + context.generateGlobalName(WasmCodeGenGlobalSpace.DATA_STRING), data.array(), WasmAlignment.ALIGN_32_BIT ); 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 21568dfc..c963e732 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmMemoryBuilder.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmMemoryBuilder.java @@ -1,7 +1,7 @@ package org.shedlang.compiler.backends.wasm; -import org.pcollections.OrderedPMap; -import org.shedlang.compiler.backends.llvm.NameAllocator; +import org.pcollections.Empty; +import org.pcollections.PVector; 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; @@ -13,17 +13,17 @@ import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmMemoryType; import java.nio.ByteBuffer; import java.util.List; -import java.util.Optional; public class WasmMemoryBuilder { - public static final WasmMemoryBuilder EMPTY = new WasmMemoryBuilder(OrderedPMap.empty(), 0); + public static final WasmMemoryBuilder EMPTY = new WasmMemoryBuilder(Empty.vector(), 0); private static final WasmDataSegmentIndex DATA_SEGMENT_INDEX = new WasmDataSegmentIndex(0); - private final OrderedPMap entities; + // TODO: rename to elements? + private final PVector entities; private final int size; - private WasmMemoryBuilder(OrderedPMap entities, int size) { + private WasmMemoryBuilder(PVector entities, int size) { this.entities = entities; this.size = size; } @@ -39,7 +39,7 @@ public class WasmMemoryBuilder { if (entities.size() > 0) { var data = ByteBuffer.allocate(size); - for (var entity : entities.values()) { + for (var entity : entities) { data.put(entity.offset, entity.data); } @@ -51,7 +51,7 @@ public class WasmMemoryBuilder { data.array(), new WasmExpression(List.of(new WasmI32Const(0))), WasmAlignment.ALIGN_32_BIT, - entities.values().stream() + entities.stream() .map(entity -> new WasmDataSymbol( entity.name, DATA_SEGMENT_INDEX, @@ -69,23 +69,17 @@ public class WasmMemoryBuilder { } public Result add( - WasmCodeGenGlobalSpace space, + String name, byte[] data, WasmAlignment alignment ) { - var fullName = NameAllocator.generateName( - x -> entities.containsKey(x), - space, - Optional.empty() - ); - var offset = size; if (offset % alignment.bytes() != 0) { offset += alignment.bytes() - (offset % alignment.bytes()); } var builder = new WasmMemoryBuilder( - entities.plus(fullName, new Entity(fullName, offset, data, alignment)), + entities.plus(new Entity(name, offset, data, alignment)), offset + data.length ); return new Result(new WasmMemoryAddress(DATA_SEGMENT_INDEX, offset), builder); -- cgit v1.2.3