diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-18 13:09:50 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-18 13:09:50 +0100 |
| commit | fa873842dc5a63beba99d9eae9da9bf060be8ab3 (patch) | |
| tree | b5365513bf8a7662a9184681fc2835910f5fd823 /src/main/java | |
| parent | 2f2bd1a3e89ae3652481f7964747ecd4c9c76976 (diff) | |
Move declaration of import function into importValue()
Diffstat (limited to 'src/main/java')
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); } |
