aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-08 12:31:44 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-08 12:31:44 +0100
commitaf30cfaef7e34136b3f2e01f5cc30b3590587add (patch)
treea19ad7bd6a5b1bf8039a683c84e1ea5a0c51f2e2 /src/main/java
parent1bac5891bdd6db84340c0de650d2c02d3d251207 (diff)
Generate WASM for string add
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGen.java2
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGenAlloc.java2
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGenStrings.java24
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGenTypes.java1
4 files changed, 27 insertions, 2 deletions
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;
}