From 1dc6302f5fa6fc4fb00d478d245e6e28ee97c89b Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 17 Jun 2023 11:51:05 +0100 Subject: Convert closure to int --- .../compiler/backends/llvm/LlvmBackend.java | 2 +- .../compiler/backends/llvm/LlvmCompiler.java | 23 ++++++++++++++++------ .../llvm/LlvmCompilerLocalVariableSpace.java | 1 + 3 files changed, 19 insertions(+), 7 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java index 15a8856a..cff18557 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java @@ -42,7 +42,7 @@ public class LlvmBackend implements Backend { ); System.out.println(builder.toString()); run(List.of( - "llc", llvmModulePath.toString(), + "llc-16", llvmModulePath.toString(), "-filetype", "obj", "-relocation-model", "pic", "-o", objectPath.toString() 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 f194d56f..0a3ad3ac 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java @@ -3,10 +3,7 @@ package org.shedlang.compiler.backends.llvm; import org.shedlang.compiler.backends.llvm.ir.ast.LlvmFunctionDefinition; import org.shedlang.compiler.backends.llvm.ir.ast.LlvmModule; import org.shedlang.compiler.backends.llvm.ir.ast.LlvmParam; -import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmCall; -import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmGetElementPtr; -import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmReturn; -import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmStore; +import org.shedlang.compiler.backends.llvm.ir.ast.instructions.*; import org.shedlang.compiler.backends.llvm.ir.ast.operands.*; import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmTypes; import org.shedlang.compiler.stackir.instructions.*; @@ -28,6 +25,7 @@ public class LlvmCompiler { context = compileInstruction(instruction, context); } + context = context.addTerminatorInstruction(new LlvmReturnVoid()); var basicBlocks = context.basicBlocks(); var namespaceInitFunction = new LlvmFunctionDefinition( "shed__namespaceInit__" + String.join("_", namespaceName.parts()), @@ -173,8 +171,21 @@ public class LlvmCompiler { freeVariableIndex++; } - // TODO: ptrtoint - context = context.push(closurePointer); + + var closureValueResult = context.generateVariableLocal( + LlvmCompilerLocalVariableSpace.CLOSURE_VALUE + ); + var closureValue = closureValueResult.value(); + context = closureValueResult.context(); + + context = context.addInstruction(new LlvmPtrToInt( + closureValue, + LlvmCompilerClosures.typeClosurePointer(Optional.of(defineFunction.freeVariables())), + closurePointer, + LlvmCompilerTypes.VALUE_TYPE + )); + + context = context.push(closureValue); yield context; } diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerLocalVariableSpace.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerLocalVariableSpace.java index 27d7a4d0..c6efd5a9 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerLocalVariableSpace.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerLocalVariableSpace.java @@ -1,6 +1,7 @@ package org.shedlang.compiler.backends.llvm; public enum LlvmCompilerLocalVariableSpace { + CLOSURE_VALUE("closureValue"), CLOSURE_POINTER("closurePointer"), CLOSURE_FUNCTION_POINTER("closureFunctionPointer"), CLOSURE_FUNCTION_POINTER_POINTER("closureFunctionPointerPointer"), -- cgit v1.2.3