From fa21920d943f199609712461cb700418d6d4ead0 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 16 Jun 2023 22:29:21 +0100 Subject: Adjust naming of top level entities --- .../compiler/backends/llvm/LlvmCompilerContext.java | 14 ++++++-------- .../compiler/backends/llvm/LlvmCompilerStrings.java | 2 +- .../backends/llvm/LlvmCompilerTopLevelEntitySpace.java | 16 ++++++++++++++++ .../backends/llvm/LlvmGlobalDefinitionBuilder.java | 4 ++-- .../shedlang/compiler/backends/llvm/NameAllocator.java | 18 ++++++++++++++---- 5 files changed, 39 insertions(+), 15 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerTopLevelEntitySpace.java (limited to 'src/main/java') 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 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 namePrefix, + Optional namePrefix, Optional type, Optional 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(PSet localVariableNames) { +public record NameAllocator(PSet existingNames) { public static NameAllocator empty() { return new NameAllocator<>(Empty.set()); } @@ -13,6 +14,16 @@ public record NameAllocator(PSet localVariableNames) { public Result generateName( TPrefix prefix, Optional name + ) { + var fullName = generateName(existingNames::contains, prefix, name); + var newAllocator = new NameAllocator(existingNames.plus(fullName)); + return new Result<>(fullName, newAllocator); + } + + public static String generateName( + Predicate isUsed, + TPrefix prefix, + Optional name ) { var fullPrefix = prefix.toString(); if (name.isPresent()) { @@ -22,11 +33,10 @@ public record NameAllocator(PSet localVariableNames) { var index = 0; while (true) { var fullName = fullPrefix + "__" + index; - if (localVariableNames.contains(fullName)) { + if (isUsed.test(fullName)) { index++; } else { - var newAllocator = new NameAllocator(localVariableNames.plus(fullName)); - return new Result<>(fullName, newAllocator); + return fullName; } } } -- cgit v1.2.3