aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-14 19:09:14 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-14 19:09:14 +0100
commit8a0add6981fef214b910a5fce4f79561b85e3d0d (patch)
tree6948f23e250e512c2dd66cb4dccd26f6fac127b1 /src/main/java
parent49242673624952d4c6f7a01123f4c762c6efb385 (diff)
Compile zero-arg calls
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java20
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java21
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerLocalVariableSpace.java3
3 files changed, 40 insertions, 4 deletions
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 8aabbd5b..0cd282cf 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java
@@ -1,5 +1,6 @@
package org.shedlang.compiler.backends.llvm;
+import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmCall;
import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmOperandInt;
import org.shedlang.compiler.stackir.instructions.*;
import org.shedlang.compiler.types.NamespaceName;
@@ -13,8 +14,23 @@ public class LlvmCompiler {
public static LlvmCompilerContext compileInstruction(Instruction instruction, LlvmCompilerContext context) {
return switch (instruction) {
- case CallInstruction callInstruction -> {
- throw new UnsupportedOperationException("TODO");
+ case CallInstruction call -> {
+ var receiverResult = context.pop();
+ var receiver = receiverResult.value();
+ context = receiverResult.context();
+
+ var temporaryResult = context.generateVariableLocal(
+ LlvmCompilerLocalVariableSpace.TEMPORARY
+ );
+ var temporary = temporaryResult.value();
+ context = temporaryResult.context();
+
+ yield context.addInstruction(new LlvmCall(
+ temporary,
+ LlvmCompilerTypes.VALUE_TYPE,
+ receiver,
+ List.of()
+ )).push(temporary);
}
case DefineFunctionInstruction defineFunctionInstruction -> {
throw new UnsupportedOperationException("TODO");
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java
index c72bed0a..f6f4c9c6 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java
@@ -10,6 +10,7 @@ import org.shedlang.compiler.typechecker.TypeInfo;
import org.shedlang.compiler.util.POrderedMap;
import java.util.Collection;
+import java.util.Optional;
public record LlvmCompilerContext(
TypeInfo typeInfo,
@@ -117,12 +118,30 @@ public record LlvmCompilerContext(
}
public LlvmCompilerResult<LlvmVariableLocal> generateVariableLocal(
+ LlvmCompilerLocalVariableSpace space
+ ) {
+ return generateVariableLocal(space, Optional.empty());
+ }
+
+ public LlvmCompilerResult<LlvmVariableLocal> generateVariableLocal(
LlvmCompilerLocalVariableSpace space,
String name
) {
+ return generateVariableLocal(space, Optional.of(name));
+ }
+
+ private LlvmCompilerResult<LlvmVariableLocal> generateVariableLocal(
+ LlvmCompilerLocalVariableSpace space,
+ Optional<String> name
+ ) {
+ var prefix = space.toString();
+ if (name.isPresent()) {
+ prefix += "__" + name.get();
+ }
+
var index = 0;
while (true) {
- var fullName = space + "__" + name + "__" + index;
+ var fullName = prefix + "__" + index;
if (localVariableNames.contains(fullName)) {
index++;
} else {
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 a7bb515a..756e139b 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerLocalVariableSpace.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerLocalVariableSpace.java
@@ -1,7 +1,8 @@
package org.shedlang.compiler.backends.llvm;
public enum LlvmCompilerLocalVariableSpace {
- FIELD_POINTER("fieldPointer");
+ FIELD_POINTER("fieldPointer"),
+ TEMPORARY("tmp");
private final String name;