aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-17 11:51:05 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-17 11:51:05 +0100
commit1dc6302f5fa6fc4fb00d478d245e6e28ee97c89b (patch)
tree7297ca25e2626a40216dadb53752d4fae73877ae /src/main/java
parent6a3eb6a781f232614d96e60336893b5b51b75715 (diff)
Convert closure to int
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java2
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java23
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerLocalVariableSpace.java1
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"),