aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-27 23:30:32 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-27 23:30:32 +0100
commit83fcac31c97820f2a29ba7766161a4baf1746b8e (patch)
tree1421d94146043a79e3f1252ad1fe57f5f2f200c6 /src/main/java
parent765a15478963dd0ba9657c20bf78140bdd3a11f4 (diff)
Generate string data symbol names using common mechanism
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGenContext.java20
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGenStrings.java2
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/WasmMemoryBuilder.java26
3 files changed, 23 insertions, 25 deletions
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<String> name) {
return NameAllocator.generateName(
symbolNames::contains,
"shed__" + space,
- Optional.of(name)
+ name
);
}
public Result<WasmMemoryAddress> 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<WasmMemoryAddress> 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<String, Entity> entities;
+ // TODO: rename to elements?
+ private final PVector<Entity> entities;
private final int size;
- private WasmMemoryBuilder(OrderedPMap<String, Entity> entities, int size) {
+ private WasmMemoryBuilder(PVector<Entity> 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);