From f1fcbace22b971efe9234152ae677081b127e7cc Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 11 Jun 2023 22:51:40 +0100 Subject: Add stubbed LLVM compiler --- .../compiler/backends/llvm/LlvmCompiler.java | 37 +++++++ .../backends/llvm/LlvmCompilerContext.java | 4 + .../backends/llvm/ir/LlvmIrSerializer.java | 111 +++++++++++++++++++++ .../backends/llvm/ir/ast/LlvmBasicBlock.java | 14 +++ .../llvm/ir/ast/LlvmFunctionDefinition.java | 13 +++ .../compiler/backends/llvm/ir/ast/LlvmModule.java | 11 ++ .../compiler/backends/llvm/ir/ast/LlvmParam.java | 6 ++ .../backends/llvm/ir/ast/LlvmTopLevelEntity.java | 4 + .../backends/llvm/ir/ast/instructions/LlvmAdd.java | 13 +++ .../llvm/ir/ast/instructions/LlvmCall.java | 6 ++ .../llvm/ir/ast/instructions/LlvmInstruction.java | 4 + .../llvm/ir/ast/instructions/LlvmReturn.java | 7 ++ .../llvm/ir/ast/instructions/LlvmReturnVoid.java | 4 + .../instructions/LlvmTerminatorInstruction.java | 4 + .../backends/llvm/ir/ast/operands/LlvmOperand.java | 4 + .../llvm/ir/ast/operands/LlvmOperandInt.java | 4 + .../llvm/ir/ast/operands/LlvmVariable.java | 4 + .../llvm/ir/ast/operands/LlvmVariableGlobal.java | 4 + .../llvm/ir/ast/operands/LlvmVariableLocal.java | 4 + .../backends/llvm/ir/ast/types/LlvmType.java | 4 + .../backends/llvm/ir/ast/types/LlvmTypeScalar.java | 4 + .../backends/llvm/ir/ast/types/LlvmTypes.java | 9 ++ 22 files changed, 275 insertions(+) create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmBasicBlock.java create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmFunctionDefinition.java create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmModule.java create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmParam.java create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmTopLevelEntity.java create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmAdd.java create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmCall.java create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmInstruction.java create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmReturn.java create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmReturnVoid.java create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmTerminatorInstruction.java create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/operands/LlvmOperand.java create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/operands/LlvmOperandInt.java create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/operands/LlvmVariable.java create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/operands/LlvmVariableGlobal.java create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/operands/LlvmVariableLocal.java create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmType.java create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmTypeScalar.java create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmTypes.java (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java new file mode 100644 index 00000000..8921ad8d --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java @@ -0,0 +1,37 @@ +package org.shedlang.compiler.backends.llvm; + +import org.shedlang.compiler.stackir.instructions.*; +import org.shedlang.compiler.types.NamespaceName; + +import java.util.List; + +public class LlvmCompiler { + public void compileNamespace(NamespaceName namespaceName, List instructions) { + + } + + public void compileInstruction(Instruction instruction) { + switch (instruction) { + case CallInstruction callInstruction -> { + } + case DefineFunctionInstruction defineFunctionInstruction -> { + } + case DiscardInstruction discardInstruction -> { + } + case LocalLoadInstruction localLoadInstruction -> { + } + case LocalStoreInstruction localStoreInstruction -> { + } + case ModuleExportInstruction moduleExportInstruction -> { + } + case PushBoolInstruction pushBoolInstruction -> { + } + case PushIntInstruction pushIntInstruction -> { + } + case PushStringInstruction pushStringInstruction -> { + } + case PushUnitInstruction pushUnitInstruction -> { + } + } + } +} diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java new file mode 100644 index 00000000..924b9091 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java @@ -0,0 +1,4 @@ +package org.shedlang.compiler.backends.llvm; + +public class LlvmCompilerContext { +} diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java new file mode 100644 index 00000000..9c6ecc55 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java @@ -0,0 +1,111 @@ +package org.shedlang.compiler.backends.llvm.ir; + +import org.shedlang.compiler.backends.llvm.ir.ast.LlvmBasicBlock; +import org.shedlang.compiler.backends.llvm.ir.ast.LlvmParam; +import org.shedlang.compiler.backends.llvm.ir.ast.LlvmTopLevelEntity; +import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmAdd; +import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmCall; +import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmInstruction; +import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmReturn; +import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmReturnVoid; +import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmTerminatorInstruction; +import org.shedlang.compiler.backends.llvm.ir.ast.operands.*; +import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmType; +import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmTypeScalar; + +public class LlvmIrSerializer { + private LlvmIrSerializer() { + } + + public static void serializeBasicBlock(LlvmBasicBlock basicBlock, StringBuilder builder) { + if (basicBlock.label().isPresent()) { + builder.append(basicBlock.label().get()); + builder.append(":\n"); + } + + for (var instruction : basicBlock.instructions()) { + builder.append(" "); + serializeInstruction(instruction, builder); + builder.append("\n"); + } + + builder.append(" "); + serializeTerminatorInstruction(basicBlock.terminator(), builder); + builder.append("\n"); + } + + public static void serializeInstruction(LlvmInstruction instruction, StringBuilder builder) { + switch (instruction) { + case LlvmAdd add -> { + serializeVariable(add.target(), builder); + builder.append(" = add "); + serializeType(add.type(), builder); + builder.append(" "); + serializeOperand(add.left(), builder); + builder.append(", "); + serializeOperand(add.right(), builder); + } + case LlvmCall call -> { + } + } + } + + public static void serializeOperand(LlvmOperand operand, StringBuilder builder) { + switch (operand) { + case LlvmOperandInt operandInt -> { + builder.append(operandInt.value()); + } + case LlvmVariable variable -> { + serializeVariable(variable, builder); + } + } + } + + public static void serializeParam(LlvmParam param, StringBuilder builder) { + serializeType(param.type(), builder); + builder.append(" %"); + builder.append(param.name()); + } + + public static void serializeTerminatorInstruction( + LlvmTerminatorInstruction instruction, + StringBuilder builder + ) { + switch (instruction) { + case LlvmReturn returnValue -> { + builder.append("ret "); + serializeType(returnValue.type(), builder); + builder.append(" "); + serializeOperand(returnValue.value(), builder); + } + case LlvmReturnVoid returnVoid -> { + builder.append("ret void"); + } + } + } + + public static void serializeTopLevelEntity(LlvmTopLevelEntity entity, StringBuilder builder) { + + } + + public static void serializeType(LlvmType type, StringBuilder builder) { + switch (type) { + case LlvmTypeScalar scalar -> { + builder.append(scalar.name()); + } + } + } + + public static void serializeVariable(LlvmVariable variable, StringBuilder builder) { + switch (variable) { + case LlvmVariableGlobal global -> { + builder.append("@"); + builder.append(global.name()); + } + case LlvmVariableLocal local -> { + builder.append("$"); + builder.append(local.name()); + } + } + } +} diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmBasicBlock.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmBasicBlock.java new file mode 100644 index 00000000..8a230705 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmBasicBlock.java @@ -0,0 +1,14 @@ +package org.shedlang.compiler.backends.llvm.ir.ast; + +import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmInstruction; +import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmTerminatorInstruction; + +import java.util.List; +import java.util.Optional; + +public record LlvmBasicBlock( + Optional label, + List instructions, + LlvmTerminatorInstruction terminator +) { +} diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmFunctionDefinition.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmFunctionDefinition.java new file mode 100644 index 00000000..3b74c22b --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmFunctionDefinition.java @@ -0,0 +1,13 @@ +package org.shedlang.compiler.backends.llvm.ir.ast; + +import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmType; + +import java.util.List; + +public record LlvmFunctionDefinition( + String name, + LlvmType returnType, + List params, + List body +) implements LlvmTopLevelEntity { +} diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmModule.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmModule.java new file mode 100644 index 00000000..917537da --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmModule.java @@ -0,0 +1,11 @@ +package org.shedlang.compiler.backends.llvm.ir.ast; + +import org.shedlang.compiler.sources.Source; + +import java.util.List; + +public record LlvmModule( + List body, + Source source +) { +} diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmParam.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmParam.java new file mode 100644 index 00000000..788c768e --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmParam.java @@ -0,0 +1,6 @@ +package org.shedlang.compiler.backends.llvm.ir.ast; + +import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmType; + +public record LlvmParam(LlvmType type, String name) { +} diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmTopLevelEntity.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmTopLevelEntity.java new file mode 100644 index 00000000..96287920 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmTopLevelEntity.java @@ -0,0 +1,4 @@ +package org.shedlang.compiler.backends.llvm.ir.ast; + +public sealed interface LlvmTopLevelEntity permits LlvmFunctionDefinition { +} diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmAdd.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmAdd.java new file mode 100644 index 00000000..fbd6d0ef --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmAdd.java @@ -0,0 +1,13 @@ +package org.shedlang.compiler.backends.llvm.ir.ast.instructions; + +import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmOperand; +import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmVariable; +import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmType; + +public record LlvmAdd( + LlvmVariable target, + LlvmType type, + LlvmOperand left, + LlvmOperand right +) implements LlvmInstruction { +} diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmCall.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmCall.java new file mode 100644 index 00000000..38e9ccb2 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmCall.java @@ -0,0 +1,6 @@ +package org.shedlang.compiler.backends.llvm.ir.ast.instructions; + +public record LlvmCall( + +) implements LlvmInstruction { +} diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmInstruction.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmInstruction.java new file mode 100644 index 00000000..2e0ffb23 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmInstruction.java @@ -0,0 +1,4 @@ +package org.shedlang.compiler.backends.llvm.ir.ast.instructions; + +public sealed interface LlvmInstruction permits LlvmAdd, LlvmCall { +} diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmReturn.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmReturn.java new file mode 100644 index 00000000..af8cf728 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmReturn.java @@ -0,0 +1,7 @@ +package org.shedlang.compiler.backends.llvm.ir.ast.instructions; + +import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmOperand; +import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmType; + +public record LlvmReturn(LlvmType type, LlvmOperand value) implements LlvmTerminatorInstruction { +} diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmReturnVoid.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmReturnVoid.java new file mode 100644 index 00000000..7407bae7 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmReturnVoid.java @@ -0,0 +1,4 @@ +package org.shedlang.compiler.backends.llvm.ir.ast.instructions; + +public record LlvmReturnVoid() implements LlvmTerminatorInstruction { +} diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmTerminatorInstruction.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmTerminatorInstruction.java new file mode 100644 index 00000000..80030e10 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmTerminatorInstruction.java @@ -0,0 +1,4 @@ +package org.shedlang.compiler.backends.llvm.ir.ast.instructions; + +public sealed interface LlvmTerminatorInstruction permits LlvmReturn, LlvmReturnVoid { +} diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/operands/LlvmOperand.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/operands/LlvmOperand.java new file mode 100644 index 00000000..bf86b833 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/operands/LlvmOperand.java @@ -0,0 +1,4 @@ +package org.shedlang.compiler.backends.llvm.ir.ast.operands; + +public sealed interface LlvmOperand permits LlvmOperandInt, LlvmVariable { +} diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/operands/LlvmOperandInt.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/operands/LlvmOperandInt.java new file mode 100644 index 00000000..f6f5afb2 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/operands/LlvmOperandInt.java @@ -0,0 +1,4 @@ +package org.shedlang.compiler.backends.llvm.ir.ast.operands; + +public record LlvmOperandInt(long value) implements LlvmOperand { +} diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/operands/LlvmVariable.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/operands/LlvmVariable.java new file mode 100644 index 00000000..3d8d406c --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/operands/LlvmVariable.java @@ -0,0 +1,4 @@ +package org.shedlang.compiler.backends.llvm.ir.ast.operands; + +public sealed interface LlvmVariable extends LlvmOperand permits LlvmVariableGlobal, LlvmVariableLocal { +} diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/operands/LlvmVariableGlobal.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/operands/LlvmVariableGlobal.java new file mode 100644 index 00000000..751a2434 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/operands/LlvmVariableGlobal.java @@ -0,0 +1,4 @@ +package org.shedlang.compiler.backends.llvm.ir.ast.operands; + +public record LlvmVariableGlobal(String name) implements LlvmVariable { +} diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/operands/LlvmVariableLocal.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/operands/LlvmVariableLocal.java new file mode 100644 index 00000000..2edd72b0 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/operands/LlvmVariableLocal.java @@ -0,0 +1,4 @@ +package org.shedlang.compiler.backends.llvm.ir.ast.operands; + +public record LlvmVariableLocal(String name) implements LlvmVariable { +} diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmType.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmType.java new file mode 100644 index 00000000..55540f2c --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmType.java @@ -0,0 +1,4 @@ +package org.shedlang.compiler.backends.llvm.ir.ast.types; + +public sealed interface LlvmType permits LlvmTypeScalar { +} diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmTypeScalar.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmTypeScalar.java new file mode 100644 index 00000000..909fd64b --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmTypeScalar.java @@ -0,0 +1,4 @@ +package org.shedlang.compiler.backends.llvm.ir.ast.types; + +public record LlvmTypeScalar(String name) implements LlvmType { +} diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmTypes.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmTypes.java new file mode 100644 index 00000000..322167e0 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmTypes.java @@ -0,0 +1,9 @@ +package org.shedlang.compiler.backends.llvm.ir.ast.types; + +public class LlvmTypes { + private LlvmTypes() { + } + + public static final LlvmType INT_64 = new LlvmTypeScalar("i64"); + public static final LlvmType VOID = new LlvmTypeScalar("void"); +} -- cgit v1.2.3