aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-18 18:59:55 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-18 18:59:55 +0100
commitb1768b7d309921ac82bd5abd8327839f8d594b10 (patch)
tree47692048f82dce96fc83828092f601f116f13350 /src/main/java
parenta725099e58119c19bb862558b3fee6fd3c47e0ce (diff)
Only initialize namespaces once
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerNamespaces.java47
1 files changed, 34 insertions, 13 deletions
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 266672d0..7432ac35 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerNamespaces.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerNamespaces.java
@@ -115,22 +115,43 @@ public class LlvmCompilerNamespaces {
globalNameNamespaceImport(namespaceName),
LlvmCompilerTypes.VALUE_TYPE,
List.of(),
- List.of(new LlvmBasicBlock(
- Optional.empty(),
- List.of(
- // TODO: only call if not yet initialized
- new LlvmCall(
- Optional.empty(),
- LlvmTypes.VOID,
- new LlvmVariableGlobal(globalNameNamespaceInit(namespaceName)),
- List.of()
+ List.of(
+ new LlvmBasicBlock(
+ Optional.empty(),
+ List.of(
+ new LlvmLoad(
+ new LlvmVariableLocal("isInited"),
+ LlvmTypes.INT_1,
+ new LlvmVariableGlobal(globalNameNamespaceIsInited(namespaceName))
+ )
+ ),
+ new LlvmBr(
+ new LlvmVariableLocal("isInited"),
+ "inited",
+ "init"
)
),
- new LlvmReturn(
- LlvmCompilerTypes.VALUE_TYPE,
- operandNamespaceValue(namespaceName)
+ new LlvmBasicBlock(
+ Optional.of("init"),
+ List.of(
+ new LlvmCall(
+ Optional.empty(),
+ LlvmTypes.VOID,
+ new LlvmVariableGlobal(globalNameNamespaceInit(namespaceName)),
+ List.of()
+ )
+ ),
+ new LlvmBrUnconditional("inited")
+ ),
+ new LlvmBasicBlock(
+ Optional.of("inited"),
+ List.of(),
+ new LlvmReturn(
+ LlvmCompilerTypes.VALUE_TYPE,
+ operandNamespaceValue(namespaceName)
+ )
)
- ))
+ )
);
return context