diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-14 19:09:14 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-14 19:09:14 +0100 |
| commit | 8a0add6981fef214b910a5fce4f79561b85e3d0d (patch) | |
| tree | 6948f23e250e512c2dd66cb4dccd26f6fac127b1 /src/main/java | |
| parent | 49242673624952d4c6f7a01123f4c762c6efb385 (diff) | |
Compile zero-arg calls
Diffstat (limited to 'src/main/java')
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; |
