aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-11 22:51:40 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-11 22:51:40 +0100
commitf1fcbace22b971efe9234152ae677081b127e7cc (patch)
treee437847584cb6c42be241bf0d2ca2fb6f4bf4058 /src/main/java
parentba2b92bef0ae6beca79e0db6f89cd7471b82e0cb (diff)
Add stubbed LLVM compiler
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java37
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java4
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java111
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmBasicBlock.java14
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmFunctionDefinition.java13
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmModule.java11
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmParam.java6
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmTopLevelEntity.java4
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmAdd.java13
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmCall.java6
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmInstruction.java4
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmReturn.java7
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmReturnVoid.java4
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmTerminatorInstruction.java4
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/operands/LlvmOperand.java4
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/operands/LlvmOperandInt.java4
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/operands/LlvmVariable.java4
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/operands/LlvmVariableGlobal.java4
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/operands/LlvmVariableLocal.java4
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmType.java4
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmTypeScalar.java4
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmTypes.java9
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");
+}