aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-21 16:22:34 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-21 16:23:14 +0100
commit0fe26c78dd1f7127654cb2dfaef8f5caeebd7e73 (patch)
treebd20bfc0915adecadf585cfedc6f40fabf8b915a /src
parentf12f949dda91f596c8ec401375e48cef584218c2 (diff)
Support wasm-patio backend in CLI
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/Backends.java3
-rw-r--r--src/main/java/org/shedlang/compiler/backends/PatioBackend.java8
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java39
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java13
-rw-r--r--src/test/java/org/shedlang/compiler/backends/wasm/WasmExampleTests.java2
-rw-r--r--src/test/java/org/shedlang/compiler/patio/PatioCodeGenNamespaceTests.java4
6 files changed, 49 insertions, 20 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/Backends.java b/src/main/java/org/shedlang/compiler/backends/Backends.java
index 93801fbc..f0a75510 100644
--- a/src/main/java/org/shedlang/compiler/backends/Backends.java
+++ b/src/main/java/org/shedlang/compiler/backends/Backends.java
@@ -10,5 +10,6 @@ public class Backends {
public static final OrderedPMap<String, Backend> BACKENDS = OrderedPMap.<String, Backend>empty()
.plus("llvm", new LlvmBackend())
- .plus("wasm", new WasmBackend());
+ .plus("wasm", WasmBackend.DIRECT)
+ .plus("wasm-patio", WasmBackend.PATIO);
}
diff --git a/src/main/java/org/shedlang/compiler/backends/PatioBackend.java b/src/main/java/org/shedlang/compiler/backends/PatioBackend.java
index 9e8e5560..682bf79f 100644
--- a/src/main/java/org/shedlang/compiler/backends/PatioBackend.java
+++ b/src/main/java/org/shedlang/compiler/backends/PatioBackend.java
@@ -22,14 +22,10 @@ public class PatioBackend implements Backend {
var context = PatioCodeGenContext.forTypeInfo(typeInfo);
for (var namespace : namespaces) {
- var namespaceName = namespace.namespaceName();
- var instructions = namespace.instructions();
-
- System.out.println(namespaceName);
+ System.out.println(namespace.namespaceName());
var compilationUnit = PatioCodeGen.generateNamespace(
- namespaceName,
- instructions,
+ namespace,
context
);
diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java
index d127525e..65d6068f 100644
--- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java
+++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java
@@ -5,6 +5,8 @@ import org.shedlang.compiler.backends.wasm.structure.WasmBinaryFormat;
import org.shedlang.compiler.backends.wasm.structure.ast.modules.WasmModule;
import org.shedlang.compiler.config.ProjectConfig;
import org.shedlang.compiler.filesystem.ShedCompilerFiles;
+import org.shedlang.compiler.patio.PatioCodeGen;
+import org.shedlang.compiler.patio.PatioCodeGenContext;
import org.shedlang.compiler.stackir.StackIrNamespace;
import org.shedlang.compiler.typechecker.TypeInfo;
@@ -18,6 +20,38 @@ import java.util.List;
import static org.shedlang.compiler.backends.ProcessRunner.runInheritIo;
public class WasmBackend implements Backend {
+ public static final WasmBackend DIRECT = new WasmBackend(new CodeGen() {
+ @Override
+ public WasmModule generateNamespace(StackIrNamespace stackIrNamespace, TypeInfo typeInfo) {
+ return WasmCodeGen.generateNamespace(stackIrNamespace, typeInfo);
+ }
+ });
+
+ public static final WasmBackend PATIO = new WasmBackend(new CodeGen() {
+ @Override
+ public WasmModule generateNamespace(StackIrNamespace stackIrNamespace, TypeInfo typeInfo) {
+ var patioCompilationUnit = PatioCodeGen.generateNamespace(
+ stackIrNamespace,
+ PatioCodeGenContext.forTypeInfo(typeInfo)
+ );
+
+ return WasmPatioCodeGen.generateCompilationUnit(patioCompilationUnit);
+ }
+ });
+
+ interface CodeGen {
+ WasmModule generateNamespace(
+ StackIrNamespace stackIrNamespace,
+ TypeInfo typeInfo
+ );
+ }
+
+ private final CodeGen codeGen;
+
+ private WasmBackend(CodeGen codeGen) {
+ this.codeGen = codeGen;
+ }
+
@Override
public void compile(
ProjectConfig config,
@@ -27,10 +61,7 @@ public class WasmBackend implements Backend {
) throws IOException, InterruptedException {
var objectFilePaths = new ArrayList<Path>();
for (var namespace : namespaces) {
- var wasmModule = WasmCodeGen.generateNamespace(
- namespace,
- typeInfo
- );
+ var wasmModule = this.codeGen.generateNamespace(namespace, typeInfo);
var objectPath = writeObjectFile(
wasmModule,
diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java
index a96f07f4..47e7c496 100644
--- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java
@@ -1,15 +1,15 @@
package org.shedlang.compiler.patio;
import org.shedlang.compiler.patio.ast.PatioCompilationUnit;
+import org.shedlang.compiler.patio.ast.instructions.PatioIntAdd;
import org.shedlang.compiler.patio.ast.instructions.PatioLocalStore;
+import org.shedlang.compiler.patio.ast.instructions.PatioReturn;
import org.shedlang.compiler.patio.ast.operands.PatioInt;
import org.shedlang.compiler.patio.ast.operands.PatioLocalRef;
-import org.shedlang.compiler.patio.ast.instructions.PatioIntAdd;
-import org.shedlang.compiler.patio.ast.instructions.PatioReturn;
import org.shedlang.compiler.sources.Source;
import org.shedlang.compiler.sources.Sources;
+import org.shedlang.compiler.stackir.StackIrNamespace;
import org.shedlang.compiler.stackir.instructions.*;
-import org.shedlang.compiler.types.NamespaceName;
import java.util.ArrayList;
import java.util.Collections;
@@ -22,14 +22,13 @@ public class PatioCodeGen {
private PatioCodeGen() {}
public static PatioCompilationUnit generateNamespace(
- NamespaceName namespaceName,
- List<Instruction> stackIrInstructions,
+ StackIrNamespace stackIrNamespace,
PatioCodeGenContext context
) {
context = PatioCodeGenNamespaces.define(
- namespaceName,
+ stackIrNamespace.namespaceName(),
initContext ->
- generateInstructions(stackIrInstructions, initContext),
+ generateInstructions(stackIrNamespace.instructions(), initContext),
context
);
diff --git a/src/test/java/org/shedlang/compiler/backends/wasm/WasmExampleTests.java b/src/test/java/org/shedlang/compiler/backends/wasm/WasmExampleTests.java
index fdbc7e4f..fe6ef323 100644
--- a/src/test/java/org/shedlang/compiler/backends/wasm/WasmExampleTests.java
+++ b/src/test/java/org/shedlang/compiler/backends/wasm/WasmExampleTests.java
@@ -8,7 +8,7 @@ import java.util.Optional;
public class WasmExampleTests extends ExampleTests {
@Override
protected Backend backend() {
- return new WasmBackend();
+ return WasmBackend.DIRECT;
}
@Override
diff --git a/src/test/java/org/shedlang/compiler/patio/PatioCodeGenNamespaceTests.java b/src/test/java/org/shedlang/compiler/patio/PatioCodeGenNamespaceTests.java
index 60e5d3dd..3b42046c 100644
--- a/src/test/java/org/shedlang/compiler/patio/PatioCodeGenNamespaceTests.java
+++ b/src/test/java/org/shedlang/compiler/patio/PatioCodeGenNamespaceTests.java
@@ -4,6 +4,7 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.shedlang.compiler.ast.typed.FreeVariables;
import org.shedlang.compiler.sources.Sources;
+import org.shedlang.compiler.stackir.StackIrNamespace;
import org.shedlang.compiler.stackir.instructions.DefineFunctionInstruction;
import org.shedlang.compiler.stackir.instructions.Instruction;
import org.shedlang.compiler.stackir.instructions.Instructions;
@@ -44,8 +45,9 @@ public class PatioCodeGenNamespaceTests {
Map.entry("y", Types.STRING)
)))
)));
+ var stackIrNamespace = new StackIrNamespace(namespaceName, instructions);
- var result = PatioCodeGen.generateNamespace(namespaceName, instructions, context);
+ var result = PatioCodeGen.generateNamespace(stackIrNamespace, context);
snapshotter.assertSnapshot(serializeCompilationUnit(result));
}