diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-18 18:59:55 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-18 18:59:55 +0100 |
| commit | b1768b7d309921ac82bd5abd8327839f8d594b10 (patch) | |
| tree | 47692048f82dce96fc83828092f601f116f13350 /src/main/java | |
| parent | a725099e58119c19bb862558b3fee6fd3c47e0ce (diff) | |
Only initialize namespaces once
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerNamespaces.java | 47 |
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 |
