From 24ed07b6d563373b2185196447f9afe2a9831483 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 6 Jun 2023 11:12:14 +0100 Subject: [PATCH] Add error requiring an explicit calling convention for foreign procedures --- core/runtime/os_specific_js.odin | 2 +- core/runtime/procs_wasm32.odin | 4 ++-- src/checker.cpp | 8 ++++++++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/core/runtime/os_specific_js.odin b/core/runtime/os_specific_js.odin index a9ba871f9..246141d87 100644 --- a/core/runtime/os_specific_js.odin +++ b/core/runtime/os_specific_js.odin @@ -5,7 +5,7 @@ foreign import "odin_env" _os_write :: proc "contextless" (data: []byte) -> (int, _OS_Errno) { foreign odin_env { - write :: proc "c" (fd: u32, p: []byte) --- + write :: proc "contextless" (fd: u32, p: []byte) --- } write(1, data) return len(data), 0 diff --git a/core/runtime/procs_wasm32.odin b/core/runtime/procs_wasm32.odin index 2a4210c1e..3981cead0 100644 --- a/core/runtime/procs_wasm32.odin +++ b/core/runtime/procs_wasm32.odin @@ -8,7 +8,7 @@ ti_int :: struct #raw_union { } @(link_name="__ashlti3", linkage="strong") -__ashlti3 :: proc "c" (a: i128, b_: u32) -> i128 { +__ashlti3 :: proc "contextless" (a: i128, b_: u32) -> i128 { bits_in_dword :: size_of(u32)*8 b := u32(b_) @@ -29,7 +29,7 @@ __ashlti3 :: proc "c" (a: i128, b_: u32) -> i128 { @(link_name="__multi3", linkage="strong") -__multi3 :: proc "c" (a, b: i128) -> i128 { +__multi3 :: proc "contextless" (a, b: i128) -> i128 { x, y, r: ti_int x.all = a diff --git a/src/checker.cpp b/src/checker.cpp index a25d85fb8..49f2c4bb4 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -3889,6 +3889,14 @@ gb_internal void check_collect_value_decl(CheckerContext *c, Ast *decl) { GB_ASSERT(pl->type->kind == Ast_ProcType); auto cc = pl->type->ProcType.calling_convention; if (cc == ProcCC_ForeignBlockDefault) { + if (is_arch_wasm()) { + begin_error_block(); + error(init, "For wasm related targets, it is required that you either define the" + " @(default_calling_convention=) on the foreign block or" + " explicitly assign it on the procedure signature"); + error_line("\tSuggestion: when dealing with normal Odin code (e.g. js_wasm32), use \"contextless\"; when dealing with Emscripten like code, use \"c\"\n"); + end_error_block(); + } cc = ProcCC_CDecl; if (c->foreign_context.default_cc > 0) { cc = c->foreign_context.default_cc;