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 + 4 files changed, 27 insertions(+), 2 deletions(-) (limited to 'src/main/java') 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; } -- cgit v1.2.3