diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-11 22:51:40 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-11 22:51:40 +0100 |
| commit | f1fcbace22b971efe9234152ae677081b127e7cc (patch) | |
| tree | e437847584cb6c42be241bf0d2ca2fb6f4bf4058 /src/main/java | |
| parent | ba2b92bef0ae6beca79e0db6f89cd7471b82e0cb (diff) | |
Add stubbed LLVM compiler
Diffstat (limited to 'src/main/java')
22 files changed, 275 insertions, 0 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 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<Instruction> 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<String> label, + List<LlvmInstruction> 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<LlvmParam> params, + List<LlvmBasicBlock> 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<LlvmTopLevelEntity> 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"); +} |
