From 2f2bd1a3e89ae3652481f7964747ecd4c9c76976 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 18 Jun 2023 13:07:44 +0100 Subject: Extract LlvmCompilerNamespaces.importValue() --- .../compiler/backends/llvm/LlvmCompiler.java | 13 +--------- .../backends/llvm/LlvmCompilerNamespaces.java | 29 ++++++++++++++++++---- 2 files changed, 25 insertions(+), 17 deletions(-) (limited to 'src/main/java') 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 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 ) { -- cgit v1.2.3