From 4b3232ead64d53af2a3d065a940dd1b83266d8cb Mon Sep 17 00:00:00 2001 From: Christoffer Lerno Date: Sun, 19 Dec 2021 12:18:43 +0100 Subject: [PATCH] Some initial wasm support. --- src/compiler/llvm_codegen_c_abi.c | 2 +- src/compiler/llvm_codegen_stmt.c | 2 +- src/compiler/target.c | 2 + test/test_suite/abi/vec2_wasm.c3t | 127 ++++++++++++++++++++++++++++++ 4 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 test/test_suite/abi/vec2_wasm.c3t diff --git a/src/compiler/llvm_codegen_c_abi.c b/src/compiler/llvm_codegen_c_abi.c index e822e4f76..3dc8674fd 100644 --- a/src/compiler/llvm_codegen_c_abi.c +++ b/src/compiler/llvm_codegen_c_abi.c @@ -224,7 +224,7 @@ void c_abi_func_create(FunctionSignature *signature) ABIArgInfo *c_abi_classify_return_type_default(Type *type) { if (type->type_kind == TYPE_VOID) return abi_arg_ignore(); - return c_abi_classify_return_type_default(type); + return c_abi_classify_argument_type_default(type); } ABIArgInfo *c_abi_classify_argument_type_default(Type *type) diff --git a/src/compiler/llvm_codegen_stmt.c b/src/compiler/llvm_codegen_stmt.c index f0285b261..a88975e1a 100644 --- a/src/compiler/llvm_codegen_stmt.c +++ b/src/compiler/llvm_codegen_stmt.c @@ -1140,7 +1140,7 @@ void llvm_emit_debug_output(GenContext *c, const char *message, const char *file expr_index = 0; file_index = 1; line_index = 2; - func_index = 3; + func_index = -1; break; } diff --git a/src/compiler/target.c b/src/compiler/target.c index 13186bc07..cf0a75088 100644 --- a/src/compiler/target.c +++ b/src/compiler/target.c @@ -483,6 +483,8 @@ static bool arch_is_supported(ArchType arch) { switch (arch) { + case ARCH_TYPE_WASM32: + case ARCH_TYPE_WASM64: case ARCH_TYPE_X86_64: case ARCH_TYPE_AARCH64: return true; diff --git a/test/test_suite/abi/vec2_wasm.c3t b/test/test_suite/abi/vec2_wasm.c3t new file mode 100644 index 000000000..a35622d7e --- /dev/null +++ b/test/test_suite/abi/vec2_wasm.c3t @@ -0,0 +1,127 @@ +// #target: wasm32 +module abi; + +struct Vector2 { + float x; + float y; +} +extern fn Vector2 vector2_zero() { return Vector2 {}; } +extern fn Vector2 vector2_one() { return Vector2 {}; } +extern fn Vector2 vector2_add(Vector2 v1, Vector2 v2) { return Vector2 {}; } +extern fn Vector2 vector2_add_value(Vector2 v, float add) { return Vector2 {}; } +extern fn Vector2 vector2_subtract(Vector2 v1, Vector2 v2) { return Vector2 {}; } +extern fn Vector2 vector2_subtract_value(Vector2 v, float sub) { return Vector2 {}; } + +// #expect: abi.ll +; ModuleID = 'abi' +source_filename = "abi" +target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128-ni:1:10:20" +target triple = "wasm32-unknown-unknown" + +%Vector2 = type { float, float } + +define void @vector2_zero(%Vector2* sret(%Vector2) align 4 %0) #0 { +entry: + %literal = alloca %Vector2, align 4 + %1 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 + store float 0.000000e+00, float* %1, align 4 + %2 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 + store float 0.000000e+00, float* %2, align 4 + %3 = bitcast %Vector2* %0 to i8* + %4 = bitcast %Vector2* %literal to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %3, i8* align 4 %4, i32 8, i1 false) + ret void +} + +define void @vector2_one(%Vector2* sret(%Vector2) align 4 %0) #0 { +entry: + %literal = alloca %Vector2, align 4 + %1 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 + store float 0.000000e+00, float* %1, align 4 + %2 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 + store float 0.000000e+00, float* %2, align 4 + %3 = bitcast %Vector2* %0 to i8* + %4 = bitcast %Vector2* %literal to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %3, i8* align 4 %4, i32 8, i1 false) + ret void +} + +define void @vector2_add(%Vector2* sret(%Vector2) align 4 %0, %Vector2* byval(%Vector2) align 4 %1, %Vector2* byval(%Vector2) align 4 %2) #0 { +entry: + %v1 = alloca %Vector2, align 4 + %v2 = alloca %Vector2, align 4 + %literal = alloca %Vector2, align 4 + %3 = bitcast %Vector2* %v1 to i8* + %4 = bitcast %Vector2* %1 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %3, i8* align 4 %4, i32 8, i1 false) + %5 = bitcast %Vector2* %v2 to i8* + %6 = bitcast %Vector2* %2 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %5, i8* align 4 %6, i32 8, i1 false) + %7 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 + store float 0.000000e+00, float* %7, align 4 + %8 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 + store float 0.000000e+00, float* %8, align 4 + %9 = bitcast %Vector2* %0 to i8* + %10 = bitcast %Vector2* %literal to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %9, i8* align 4 %10, i32 8, i1 false) + ret void +} + +define void @vector2_add_value(%Vector2* sret(%Vector2) align 4 %0, %Vector2* byval(%Vector2) align 4 %1, float %2) #0 { +entry: + %v = alloca %Vector2, align 4 + %add = alloca float, align 4 + %literal = alloca %Vector2, align 4 + %3 = bitcast %Vector2* %v to i8* + %4 = bitcast %Vector2* %1 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %3, i8* align 4 %4, i32 8, i1 false) + store float %2, float* %add, align 4 + %5 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 + store float 0.000000e+00, float* %5, align 4 + %6 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 + store float 0.000000e+00, float* %6, align 4 + %7 = bitcast %Vector2* %0 to i8* + %8 = bitcast %Vector2* %literal to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %7, i8* align 4 %8, i32 8, i1 false) + ret void +} + +define void @vector2_subtract(%Vector2* sret(%Vector2) align 4 %0, %Vector2* byval(%Vector2) align 4 %1, %Vector2* byval(%Vector2) align 4 %2) #0 { +entry: + %v1 = alloca %Vector2, align 4 + %v2 = alloca %Vector2, align 4 + %literal = alloca %Vector2, align 4 + %3 = bitcast %Vector2* %v1 to i8* + %4 = bitcast %Vector2* %1 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %3, i8* align 4 %4, i32 8, i1 false) + %5 = bitcast %Vector2* %v2 to i8* + %6 = bitcast %Vector2* %2 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %5, i8* align 4 %6, i32 8, i1 false) + %7 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 + store float 0.000000e+00, float* %7, align 4 + %8 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 + store float 0.000000e+00, float* %8, align 4 + %9 = bitcast %Vector2* %0 to i8* + %10 = bitcast %Vector2* %literal to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %9, i8* align 4 %10, i32 8, i1 false) + ret void +} + +define void @vector2_subtract_value(%Vector2* sret(%Vector2) align 4 %0, %Vector2* byval(%Vector2) align 4 %1, float %2) #0 { +entry: + %v = alloca %Vector2, align 4 + %sub = alloca float, align 4 + %literal = alloca %Vector2, align 4 + %3 = bitcast %Vector2* %v to i8* + %4 = bitcast %Vector2* %1 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %3, i8* align 4 %4, i32 8, i1 false) + store float %2, float* %sub, align 4 + %5 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 + store float 0.000000e+00, float* %5, align 4 + %6 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 + store float 0.000000e+00, float* %6, align 4 + %7 = bitcast %Vector2* %0 to i8* + %8 = bitcast %Vector2* %literal to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %7, i8* align 4 %8, i32 8, i1 false) + ret void +}