aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-16 22:29:21 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-16 22:29:21 +0100
commitfa21920d943f199609712461cb700418d6d4ead0 (patch)
treecf70d787596850167bd76cdd91c5a544a1f36574 /src/main/java
parentd59ca34fcdf767e86985cedd881784d7b8bb05a2 (diff)
Adjust naming of top level entities
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java14
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerStrings.java2
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerTopLevelEntitySpace.java16
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmGlobalDefinitionBuilder.java4
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/NameAllocator.java18
5 files changed, 39 insertions, 15 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java
index 3ebf7b98..e1925e24 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java
@@ -103,14 +103,12 @@ public record LlvmCompilerContext(
).toResult(globalDefinition);
}
- private String generateTopLevelEntityName(String prefix) {
- var name = prefix;
- var nextSuffix = 1;
- while (topLevelEntitiesByName().containsKey(name)) {
- name = prefix + "_" + nextSuffix;
- nextSuffix++;
- }
- return name;
+ private String generateTopLevelEntityName(LlvmCompilerTopLevelEntitySpace space) {
+ return NameAllocator.generateName(
+ topLevelEntitiesByName::containsKey,
+ "shed__" + space,
+ Optional.empty()
+ );
}
public Collection<LlvmTopLevelEntity> topLevelEntities() {
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerStrings.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerStrings.java
index 8390893e..b5f94002 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerStrings.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerStrings.java
@@ -51,7 +51,7 @@ public class LlvmCompilerStrings {
));
var globalDefinitionBuilder = LlvmGlobalDefinitionBuilder.builder()
- .namePrefix("string")
+ .namePrefix(LlvmCompilerTopLevelEntitySpace.STRING)
.type(typeStringStruct(codeUnits.length))
.value(llvmValue)
.isPrivate(true)
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerTopLevelEntitySpace.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerTopLevelEntitySpace.java
new file mode 100644
index 00000000..7ca7a06b
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerTopLevelEntitySpace.java
@@ -0,0 +1,16 @@
+package org.shedlang.compiler.backends.llvm;
+
+public enum LlvmCompilerTopLevelEntitySpace {
+ STRING("string");
+
+ private final String name;
+
+ LlvmCompilerTopLevelEntitySpace(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+}
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmGlobalDefinitionBuilder.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmGlobalDefinitionBuilder.java
index a965bda6..42c692c6 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmGlobalDefinitionBuilder.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmGlobalDefinitionBuilder.java
@@ -6,7 +6,7 @@ import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmType;
import java.util.Optional;
public record LlvmGlobalDefinitionBuilder(
- Optional<String> namePrefix,
+ Optional<LlvmCompilerTopLevelEntitySpace> namePrefix,
Optional<LlvmType> type,
Optional<LlvmOperand> value,
boolean constant,
@@ -24,7 +24,7 @@ public record LlvmGlobalDefinitionBuilder(
);
}
- public LlvmGlobalDefinitionBuilder namePrefix(String namePrefix) {
+ public LlvmGlobalDefinitionBuilder namePrefix(LlvmCompilerTopLevelEntitySpace namePrefix) {
return new LlvmGlobalDefinitionBuilder(
Optional.of(namePrefix),
this.type,
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/NameAllocator.java b/src/main/java/org/shedlang/compiler/backends/llvm/NameAllocator.java
index d8e37d48..845397a9 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/NameAllocator.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/NameAllocator.java
@@ -4,8 +4,9 @@ import org.pcollections.Empty;
import org.pcollections.PSet;
import java.util.Optional;
+import java.util.function.Predicate;
-public record NameAllocator<TPrefix>(PSet<String> localVariableNames) {
+public record NameAllocator<TPrefix>(PSet<String> existingNames) {
public static <TPrefix> NameAllocator<TPrefix> empty() {
return new NameAllocator<>(Empty.set());
}
@@ -14,6 +15,16 @@ public record NameAllocator<TPrefix>(PSet<String> localVariableNames) {
TPrefix prefix,
Optional<String> name
) {
+ var fullName = generateName(existingNames::contains, prefix, name);
+ var newAllocator = new NameAllocator<TPrefix>(existingNames.plus(fullName));
+ return new Result<>(fullName, newAllocator);
+ }
+
+ public static <TPrefix> String generateName(
+ Predicate<String> isUsed,
+ TPrefix prefix,
+ Optional<String> name
+ ) {
var fullPrefix = prefix.toString();
if (name.isPresent()) {
fullPrefix += "__" + name.get();
@@ -22,11 +33,10 @@ public record NameAllocator<TPrefix>(PSet<String> localVariableNames) {
var index = 0;
while (true) {
var fullName = fullPrefix + "__" + index;
- if (localVariableNames.contains(fullName)) {
+ if (isUsed.test(fullName)) {
index++;
} else {
- var newAllocator = new NameAllocator<TPrefix>(localVariableNames.plus(fullName));
- return new Result<>(fullName, newAllocator);
+ return fullName;
}
}
}