aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-18 13:09:50 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-18 13:09:50 +0100
commitfa873842dc5a63beba99d9eae9da9bf060be8ab3 (patch)
treeb5365513bf8a7662a9184681fc2835910f5fd823 /src/main/java
parent2f2bd1a3e89ae3652481f7964747ecd4c9c76976 (diff)
Move declaration of import function into importValue()
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java7
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java4
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerNamespaces.java13
3 files changed, 16 insertions, 8 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java
index 2089f545..4098bd7a 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java
@@ -20,13 +20,6 @@ public class LlvmCompiler {
public static LlvmModule compileMain(NamespaceName main, TypeInfo typeInfo) {
var context = LlvmCompilerContext.fromTypeInfo(typeInfo);
- // TODO: remove duplication of definition/declaration
- context = context.addTopLevelEntity(new LlvmFunctionDeclaration(
- LlvmCompilerNamespaces.globalNameNamespaceImport(main),
- LlvmCompilerTypes.VALUE_TYPE,
- List.of()
- ));
-
var mainContext = context.enterFunction();
var namespaceResult = LlvmCompilerNamespaces.importValue(main, mainContext);
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 980249e2..32b96e25 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java
@@ -163,6 +163,10 @@ public record LlvmCompilerContext(
);
}
+ public boolean hasTopLevelEntity(String name) {
+ return topLevelEntitiesByName.containsKey(name);
+ }
+
public Collection<LlvmTopLevelEntity> topLevelEntities() {
return topLevelEntitiesByName.values();
}
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerNamespaces.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerNamespaces.java
index 96c7d3b4..fef63530 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerNamespaces.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerNamespaces.java
@@ -1,6 +1,7 @@
package org.shedlang.compiler.backends.llvm;
import org.shedlang.compiler.backends.llvm.ir.ast.LlvmBasicBlock;
+import org.shedlang.compiler.backends.llvm.ir.ast.LlvmFunctionDeclaration;
import org.shedlang.compiler.backends.llvm.ir.ast.LlvmFunctionDefinition;
import org.shedlang.compiler.backends.llvm.ir.ast.LlvmGlobalDefinition;
import org.shedlang.compiler.backends.llvm.ir.ast.instructions.*;
@@ -63,6 +64,16 @@ public class LlvmCompilerNamespaces {
NamespaceName namespaceName,
LlvmCompilerContext context
) {
+ var importName = globalNameNamespaceImport(namespaceName);
+
+ if (!context.hasTopLevelEntity(importName)) {
+ context = context.addTopLevelEntity(new LlvmFunctionDeclaration(
+ importName,
+ LlvmCompilerTypes.VALUE_TYPE,
+ List.of()
+ ));
+ }
+
var namespaceResult = context.generateVariableLocal(
LlvmCompilerLocalVariableSpace.NAMESPACE,
namespaceNameToLlvmIdentifier(namespaceName)
@@ -73,7 +84,7 @@ public class LlvmCompilerNamespaces {
return context.addInstruction(new LlvmCall(
namespace,
LlvmCompilerTypes.VALUE_TYPE,
- new LlvmVariableGlobal(globalNameNamespaceImport(namespaceName)),
+ new LlvmVariableGlobal(importName),
List.of()
)).toResult(namespace);
}