aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-18 13:07:44 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-18 13:07:44 +0100
commit2f2bd1a3e89ae3652481f7964747ecd4c9c76976 (patch)
tree2a5bdef21d009b0f7f7993d0bad52f329d303823 /src/main/java
parent16968c511418dcc4e5e145feb3dd8cf2a952e7e3 (diff)
Extract LlvmCompilerNamespaces.importValue()
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java13
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerNamespaces.java29
2 files changed, 25 insertions, 17 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 a126fda1..2089f545 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java
@@ -2,7 +2,6 @@ package org.shedlang.compiler.backends.llvm;
import org.shedlang.compiler.ast.typed.FreeVariables;
import org.shedlang.compiler.backends.llvm.ir.ast.*;
-import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmCall;
import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmReturn;
import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmOperand;
import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmOperandInt;
@@ -30,20 +29,10 @@ public class LlvmCompiler {
var mainContext = context.enterFunction();
- var namespaceResult = mainContext.generateVariableLocal(
- LlvmCompilerLocalVariableSpace.NAMESPACE,
- String.join("_", main.parts())
- );
+ var namespaceResult = LlvmCompilerNamespaces.importValue(main, mainContext);
var namespace = namespaceResult.value();
mainContext = namespaceResult.context();
- mainContext = mainContext.addInstruction(new LlvmCall(
- namespace,
- LlvmCompilerTypes.VALUE_TYPE,
- new LlvmVariableGlobal(LlvmCompilerNamespaces.globalNameNamespaceImport(main)),
- List.of()
- ));
-
var fieldResult = LlvmCompilerNamespaces.fieldLoad(
main,
namespace,
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 7694c66a..96c7d3b4 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerNamespaces.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerNamespaces.java
@@ -34,7 +34,7 @@ public class LlvmCompilerNamespaces {
private static LlvmOperand operandNamespaceValue(NamespaceName namespaceName) {
return new LlvmOperandPtrToInt(
- LlvmCompilerNamespaces.operandNamespaceStruct(namespaceName),
+ operandNamespaceStruct(namespaceName),
LlvmCompilerTypes.VALUE_TYPE
);
}
@@ -59,6 +59,25 @@ public class LlvmCompilerNamespaces {
return String.join("_", namespaceName.parts());
}
+ public static LlvmCompilerResult<LlvmOperand> importValue(
+ NamespaceName namespaceName,
+ LlvmCompilerContext context
+ ) {
+ var namespaceResult = context.generateVariableLocal(
+ LlvmCompilerLocalVariableSpace.NAMESPACE,
+ namespaceNameToLlvmIdentifier(namespaceName)
+ );
+ var namespace = namespaceResult.value();
+ context = namespaceResult.context();
+
+ return context.addInstruction(new LlvmCall(
+ namespace,
+ LlvmCompilerTypes.VALUE_TYPE,
+ new LlvmVariableGlobal(globalNameNamespaceImport(namespaceName)),
+ List.of()
+ )).toResult(namespace);
+ }
+
public static LlvmCompilerContext define(
NamespaceName namespaceName,
LlvmCompilerContext context
@@ -66,7 +85,7 @@ public class LlvmCompilerNamespaces {
context = context.addTerminatorInstruction(new LlvmReturnVoid());
var basicBlocks = context.basicBlocks();
var namespaceInitFunction = new LlvmFunctionDefinition(
- LlvmCompilerNamespaces.globalNameNamespaceInit(namespaceName),
+ globalNameNamespaceInit(namespaceName),
LlvmTypes.VOID,
List.of(),
basicBlocks
@@ -89,13 +108,13 @@ public class LlvmCompilerNamespaces {
),
new LlvmReturn(
LlvmCompilerTypes.VALUE_TYPE,
- LlvmCompilerNamespaces.operandNamespaceValue(namespaceName)
+ operandNamespaceValue(namespaceName)
)
))
);
return context
- .addTopLevelEntity(LlvmCompilerNamespaces.defineGlobal(
+ .addTopLevelEntity(defineGlobal(
namespaceName,
context.typeInfo().namespaceTypeInfo(namespaceName)
))
@@ -103,7 +122,7 @@ public class LlvmCompilerNamespaces {
.addTopLevelEntity(namespaceImportFunction);
}
- public static LlvmGlobalDefinition defineGlobal(
+ private static LlvmGlobalDefinition defineGlobal(
NamespaceName namespaceName,
NamespaceTypeInfo namespaceTypeInfo
) {