From af30cfaef7e34136b3f2e01f5cc30b3590587add Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 8 Jul 2023 12:31:44 +0100 Subject: Generate WASM for string add --- .../compiler/backends/wasm/WasmCodeGen.java | 2 +- .../compiler/backends/wasm/WasmCodeGenAlloc.java | 2 +- .../compiler/backends/wasm/WasmCodeGenStrings.java | 24 ++++++++++++++++++++++ .../compiler/backends/wasm/WasmCodeGenTypes.java | 1 + .../backends/wasm/WasmCodeGenStringAddTests.java | 24 ++++++++++++++++++++++ 5 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenStringAddTests.java (limited to 'src') diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGen.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGen.java index dbf667c2..a9ee98ac 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGen.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGen.java @@ -243,7 +243,7 @@ public class WasmCodeGen { context.addInstruction(new WasmReturn()); case StringAddInstruction stringAdd -> - throw new UnsupportedOperationException("TODO"); + WasmCodeGenStrings.add(context); }; } } diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGenAlloc.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGenAlloc.java index 9d74e60c..96363570 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGenAlloc.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGenAlloc.java @@ -20,7 +20,7 @@ public class WasmCodeGenAlloc { return context .addImport(new WasmImport( "env", - "shed__runtime__alloc", + allocName, new WasmImportDescriptor.Func( allocName, new WasmFuncType(List.of(WasmValueType.I32), List.of(WasmValueType.I32)) diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGenStrings.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGenStrings.java index a7266091..d596c53c 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGenStrings.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGenStrings.java @@ -1,11 +1,17 @@ package org.shedlang.compiler.backends.wasm; +import org.shedlang.compiler.backends.wasm.structure.ast.instructions.WasmCall; import org.shedlang.compiler.backends.wasm.structure.ast.linking.WasmMemoryAddress; import org.shedlang.compiler.backends.wasm.structure.ast.modules.WasmAlignment; +import org.shedlang.compiler.backends.wasm.structure.ast.modules.WasmFuncName; +import org.shedlang.compiler.backends.wasm.structure.ast.modules.WasmImport; +import org.shedlang.compiler.backends.wasm.structure.ast.modules.WasmImportDescriptor; +import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmFuncType; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.charset.StandardCharsets; +import java.util.List; public class WasmCodeGenStrings { private WasmCodeGenStrings() { @@ -27,4 +33,22 @@ public class WasmCodeGenStrings { WasmAlignment.ALIGN_32_BIT ); } + + public static WasmCodeGenContext add(WasmCodeGenContext context) { + var runtimeAddName = "shed__runtime__string_add"; + + return context + .addImport(new WasmImport( + "env", + runtimeAddName, + new WasmImportDescriptor.Func( + runtimeAddName, + new WasmFuncType( + List.of(WasmCodeGenTypes.STRING_TYPE, WasmCodeGenTypes.STRING_TYPE), + List.of(WasmCodeGenTypes.STRING_TYPE) + ) + ) + )) + .addInstruction(new WasmCall(new WasmFuncName(runtimeAddName))); + } } diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGenTypes.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGenTypes.java index 5822f1b6..27010de9 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGenTypes.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGenTypes.java @@ -7,4 +7,5 @@ public class WasmCodeGenTypes { } public static final WasmValueType VALUE_TYPE = WasmValueType.I32; + public static final WasmValueType STRING_TYPE = VALUE_TYPE; } diff --git a/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenStringAddTests.java b/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenStringAddTests.java new file mode 100644 index 00000000..2e4d9ed6 --- /dev/null +++ b/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenStringAddTests.java @@ -0,0 +1,24 @@ +package org.shedlang.compiler.backends.wasm; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.shedlang.compiler.stackir.instructions.Instructions; +import org.shedlang.compiler.testing.snapshots.SnapshotResolver; +import org.shedlang.compiler.testing.snapshots.Snapshotter; + +import java.io.IOException; + +import static org.shedlang.compiler.backends.wasm.WasmCodeGenTesting.objdumpContext; + +@ExtendWith({SnapshotResolver.class}) +public class WasmCodeGenStringAddTests { + @Test + public void stringAddIsCompiledToCallToRuntimeStringAdd(Snapshotter snapshotter) throws IOException, InterruptedException { + var instruction = Instructions.stringAdd(); + var context = WasmCodeGenContext.EMPTY; + + var result = WasmCodeGen.generateInstruction(instruction, context); + + snapshotter.assertSnapshot(objdumpContext(result)); + } +} -- cgit v1.2.3