diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-17 11:51:05 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-17 11:51:05 +0100 |
| commit | 1dc6302f5fa6fc4fb00d478d245e6e28ee97c89b (patch) | |
| tree | 7297ca25e2626a40216dadb53752d4fae73877ae /src/main/java | |
| parent | 6a3eb6a781f232614d96e60336893b5b51b75715 (diff) | |
Convert closure to int
Diffstat (limited to 'src/main/java')
3 files changed, 19 insertions, 7 deletions
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"), |
