aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2023-06-06 23:11:42 +0100
committergingerBill <bill@gingerbill.org>2023-06-06 23:11:42 +0100
commitca6cef9a7ddb1e3714cc9f5a43053bc7a240b115 (patch)
treebf2720a1535cd48cf919d6e33e0ed9f40de7c0ac /src
parent1c2a30d7e9a0f2ce29d2e8c2f06adf83d16779ac (diff)
Fix wasm intrinsics; fix `len` for strings and slices
Diffstat (limited to 'src')
-rw-r--r--src/llvm_backend_proc.cpp12
-rw-r--r--src/llvm_backend_utility.cpp5
2 files changed, 11 insertions, 6 deletions
diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp
index ddae64ef0..f7298a4a6 100644
--- a/src/llvm_backend_proc.cpp
+++ b/src/llvm_backend_proc.cpp
@@ -2890,7 +2890,7 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu
{
char const *name = "llvm.wasm.memory.grow";
LLVMTypeRef types[1] = {
- lb_type(p->module, t_uintptr),
+ lb_type(p->module, t_i32),
};
LLVMValueRef args[2] = {};
@@ -2898,24 +2898,24 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu
args[1] = lb_emit_conv(p, lb_build_expr(p, ce->args[1]), t_uintptr).value;
lbValue res = {};
- res.type = tv.type;
+ res.type = t_i32;
res.value = lb_call_intrinsic(p, name, args, gb_count_of(args), types, gb_count_of(types));
- return res;
+ return lb_emit_conv(p, res, tv.type);
}
case BuiltinProc_wasm_memory_size:
{
char const *name = "llvm.wasm.memory.size";
LLVMTypeRef types[1] = {
- lb_type(p->module, t_uintptr),
+ lb_type(p->module, t_i32),
};
LLVMValueRef args[1] = {};
args[0] = lb_emit_conv(p, lb_build_expr(p, ce->args[0]), t_uintptr).value;
lbValue res = {};
- res.type = tv.type;
+ res.type = t_i32;
res.value = lb_call_intrinsic(p, name, args, gb_count_of(args), types, gb_count_of(types));
- return res;
+ return lb_emit_conv(p, res, tv.type);
}
case BuiltinProc_wasm_memory_atomic_wait32:
diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp
index 4499803e5..0c26382ed 100644
--- a/src/llvm_backend_utility.cpp
+++ b/src/llvm_backend_utility.cpp
@@ -932,6 +932,11 @@ gb_internal i32 lb_convert_struct_index(lbModule *m, Type *t, i32 index) {
return field_remapping[index];
} else if (build_context.ptr_size != build_context.int_size) {
switch (t->kind) {
+ case Type_Basic:
+ if (t->Basic.kind != Basic_string) {
+ break;
+ }
+ /*fallthrough*/
case Type_Slice:
GB_ASSERT(build_context.ptr_size*2 == build_context.int_size);
switch (index) {