From b1768b7d309921ac82bd5abd8327839f8d594b10 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 18 Jun 2023 18:59:55 +0100 Subject: Only initialize namespaces once --- .../backends/llvm/LlvmCompilerNamespaces.java | 47 ++++++++++++++++------ 1 file changed, 34 insertions(+), 13 deletions(-) (limited to 'src/main/java') 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 -- cgit v1.2.3