Skip to content

Commit f2b40b5

Browse files
committed
fix(darwin fn call): fixed stack alignment with darwin aarch64 function call
1 parent 392e7cc commit f2b40b5

5 files changed

Lines changed: 679 additions & 191 deletions

File tree

core/iwasm/common/wasm_runtime_common.c

Lines changed: 104 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6127,13 +6127,69 @@ wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr,
61276127

61286128
ints[n_ints++] = (uint64)(uintptr_t)exec_env;
61296129

6130+
#if defined(BH_PLATFORM_DARWIN) && defined(BUILD_TARGET_AARCH64)
6131+
uint8 *stack_base = (uint8 *)stacks;
6132+
uint32 stack_offset = 0;
6133+
6134+
#define STK_PUSH_I32(val) \
6135+
*(uint32 *)(stack_base + stack_offset) = (uint32)(val); \
6136+
stack_offset += 4
6137+
6138+
#define STK_PUSH_I64(val) \
6139+
stack_offset = (stack_offset + 7) & ~7; \
6140+
*(uint64 *)(stack_base + stack_offset) = (uint64)(val); \
6141+
stack_offset += 8
6142+
6143+
#define STK_PUSH_F32(val) \
6144+
*(float32 *)(stack_base + stack_offset) = (float32)(val); \
6145+
stack_offset += 4
6146+
6147+
#define STK_PUSH_F64(val) \
6148+
stack_offset = (stack_offset + 7) & ~7; \
6149+
*(float64 *)(stack_base + stack_offset) = (float64)(val); \
6150+
stack_offset += 8
6151+
6152+
#define STK_PUSH_PTR(val) STK_PUSH_I64((uint64)(uintptr_t)(val))
6153+
6154+
#if WASM_ENABLE_SIMD != 0
6155+
#define STK_PUSH_V128(val) \
6156+
stack_offset = (stack_offset + 15) & ~15; \
6157+
*(v128 *)(stack_base + stack_offset) = (v128)(val); \
6158+
stack_offset += 16
6159+
#endif
6160+
6161+
#define STK_FINALIZE() (n_stacks = (stack_offset + 7) >> 3)
6162+
6163+
#else
6164+
#define STK_PUSH_I32(val) (stacks[n_stacks++] = (uint64)(val))
6165+
#define STK_PUSH_I64(val) (stacks[n_stacks++] = (uint64)(val))
6166+
#define STK_PUSH_F32(val) (*(float32 *)&stacks[n_stacks++] = (float32)(val))
6167+
#define STK_PUSH_F64(val) (*(float64 *)&stacks[n_stacks++] = (float64)(val))
6168+
#define STK_PUSH_PTR(val) (stacks[n_stacks++] = (uint64)(uintptr_t)(val))
6169+
6170+
#if WASM_ENABLE_SIMD != 0
6171+
#if defined(_WIN32) || defined(_WIN32_)
6172+
#define STK_PUSH_V128(val) \
6173+
*(v128 *)&stacks[n_stacks++] = (val); \
6174+
n_stacks++
6175+
#else
6176+
#define STK_PUSH_V128(val) \
6177+
*(v128 *)&stacks[n_stacks++] = (v128)(val); \
6178+
n_stacks++
6179+
#endif
6180+
#endif
6181+
6182+
#define STK_FINALIZE()
6183+
#endif
6184+
61306185
for (i = 0; i < func_type->param_count; i++) {
61316186
switch (func_type->types[i]) {
61326187
case VALUE_TYPE_I32:
61336188
#if WASM_ENABLE_GC == 0 && WASM_ENABLE_REF_TYPES != 0
61346189
case VALUE_TYPE_FUNCREF:
61356190
#endif
61366191
{
6192+
bool is_ptr = false;
61376193
arg_i32 = *argv_src++;
61386194
arg_i64 = arg_i32;
61396195
if (signature
@@ -6156,6 +6212,7 @@ wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr,
61566212

61576213
arg_i64 = (uintptr_t)wasm_runtime_addr_app_to_native(
61586214
module, (uint64)arg_i32);
6215+
is_ptr = true;
61596216
}
61606217
else if (signature[i + 1] == '$') {
61616218
/* param is a string */
@@ -6165,17 +6222,25 @@ wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr,
61656222

61666223
arg_i64 = (uintptr_t)wasm_runtime_addr_app_to_native(
61676224
module, (uint64)arg_i32);
6225+
is_ptr = true;
61686226
}
61696227
}
61706228
if (n_ints < MAX_REG_INTS)
61716229
ints[n_ints++] = arg_i64;
6172-
else
6173-
stacks[n_stacks++] = arg_i64;
6230+
else {
6231+
if (is_ptr) {
6232+
STK_PUSH_PTR(arg_i64);
6233+
}
6234+
else {
6235+
STK_PUSH_I32(arg_i64);
6236+
}
6237+
}
61746238
break;
61756239
}
61766240
case VALUE_TYPE_I64:
61776241
#if WASM_ENABLE_MEMORY64 != 0
61786242
{
6243+
bool is_ptr = false;
61796244
arg_i64 = GET_I64_FROM_ADDR(argv_src);
61806245
argv_src += 2;
61816246
if (signature && is_memory64) {
@@ -6197,6 +6262,7 @@ wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr,
61976262

61986263
arg_i64 = (uint64)wasm_runtime_addr_app_to_native(
61996264
module, arg_i64);
6265+
is_ptr = true;
62006266
}
62016267
else if (signature[i + 1] == '$') {
62026268
/* param is a string */
@@ -6206,12 +6272,19 @@ wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr,
62066272

62076273
arg_i64 = (uint64)wasm_runtime_addr_app_to_native(
62086274
module, arg_i64);
6275+
is_ptr = true;
62096276
}
62106277
}
62116278
if (n_ints < MAX_REG_INTS)
62126279
ints[n_ints++] = arg_i64;
6213-
else
6214-
stacks[n_stacks++] = arg_i64;
6280+
else {
6281+
if (is_ptr) {
6282+
STK_PUSH_PTR(arg_i64);
6283+
}
6284+
else {
6285+
STK_PUSH_I64(arg_i64);
6286+
}
6287+
}
62156288
break;
62166289
}
62176290
#endif
@@ -6237,24 +6310,25 @@ wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr,
62376310
#endif
62386311
if (n_ints < MAX_REG_INTS)
62396312
ints[n_ints++] = *(uint64 *)argv_src;
6240-
else
6241-
stacks[n_stacks++] = *(uint64 *)argv_src;
6313+
else {
6314+
STK_PUSH_I64(*(uint64 *)argv_src);
6315+
}
62426316
argv_src += 2;
62436317
break;
62446318
case VALUE_TYPE_F32:
62456319
if (n_fps < MAX_REG_FLOATS) {
62466320
*(float32 *)&fps[n_fps++] = *(float32 *)argv_src++;
62476321
}
62486322
else {
6249-
*(float32 *)&stacks[n_stacks++] = *(float32 *)argv_src++;
6323+
STK_PUSH_F32(*(float32 *)argv_src++);
62506324
}
62516325
break;
62526326
case VALUE_TYPE_F64:
62536327
if (n_fps < MAX_REG_FLOATS) {
62546328
*(float64 *)&fps[n_fps++] = *(float64 *)argv_src;
62556329
}
62566330
else {
6257-
*(float64 *)&stacks[n_stacks++] = *(float64 *)argv_src;
6331+
STK_PUSH_F64(*(float64 *)argv_src);
62586332
}
62596333
argv_src += 2;
62606334
break;
@@ -6265,8 +6339,9 @@ wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr,
62656339
if (is_aot_func) {
62666340
if (n_ints < MAX_REG_INTS)
62676341
ints[n_ints++] = externref_idx;
6268-
else
6269-
stacks[n_stacks++] = externref_idx;
6342+
else {
6343+
STK_PUSH_I32(externref_idx);
6344+
}
62706345
}
62716346
else {
62726347
void *externref_obj;
@@ -6276,8 +6351,9 @@ wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr,
62766351

62776352
if (n_ints < MAX_REG_INTS)
62786353
ints[n_ints++] = (uintptr_t)externref_obj;
6279-
else
6280-
stacks[n_stacks++] = (uintptr_t)externref_obj;
6354+
else {
6355+
STK_PUSH_PTR(externref_obj);
6356+
}
62816357
}
62826358
break;
62836359
}
@@ -6288,8 +6364,7 @@ wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr,
62886364
*(v128 *)&fps[n_fps++] = *(v128 *)argv_src;
62896365
}
62906366
else {
6291-
*(v128 *)&stacks[n_stacks++] = *(v128 *)argv_src;
6292-
n_stacks++;
6367+
STK_PUSH_V128(*(v128 *)argv_src);
62936368
}
62946369
argv_src += 4;
62956370
break;
@@ -6304,11 +6379,24 @@ wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr,
63046379
for (i = 0; i < ext_ret_count; i++) {
63056380
if (n_ints < MAX_REG_INTS)
63066381
ints[n_ints++] = *(uint64 *)argv_src;
6307-
else
6308-
stacks[n_stacks++] = *(uint64 *)argv_src;
6382+
else {
6383+
STK_PUSH_PTR(*(uint64 *)argv_src);
6384+
}
63096385
argv_src += 2;
63106386
}
63116387

6388+
STK_FINALIZE();
6389+
6390+
#undef STK_PUSH_I32
6391+
#undef STK_PUSH_I64
6392+
#undef STK_PUSH_F32
6393+
#undef STK_PUSH_F64
6394+
#undef STK_PUSH_PTR
6395+
#if WASM_ENABLE_SIMD != 0
6396+
#undef STK_PUSH_V128
6397+
#endif
6398+
#undef STK_FINALIZE
6399+
63126400
exec_env->attachment = attachment;
63136401
if (result_count == 0) {
63146402
invokeNative_Void(func_ptr, argv1, n_stacks);

tests/standalone/test-invoke-native/main.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111

1212
static char global_heap_buf[10 * 1024 * 1024] = { 0 };
1313

14-
void
15-
test_invoke_native();
14+
#include "test_invoke_native.h"
1615

1716
int
1817
main(int argc, char *argv[])
@@ -31,9 +30,9 @@ main(int argc, char *argv[])
3130
return -1;
3231
}
3332

34-
test_invoke_native();
33+
int failed = test_invoke_native();
3534

3635
/* destroy runtime environment */
3736
wasm_runtime_destroy();
38-
return 0;
37+
return failed > 0 ? -1 : 0;
3938
}

tests/standalone/test-invoke-native/run.sh

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,11 @@ elif [[ $1 == "--multi-tier-jit" ]]; then
1616
CMAKE_FLAGS="-DWAMR_BUILD_FAST_JIT=1 -DWAMR_BUILD_JIT=1"
1717
fi
1818

19-
TARGET="X86_64"
20-
if [[ $3 = "X86_32" ]]; then
21-
TARGET="X86_32"
22-
fi
23-
2419
echo "============> test dump-invoke-native"
2520

2621
rm -fr build
2722
mkdir build && cd build
28-
cmake .. ${CMAKE_FLAGS} -DWAMR_BUILD_TARGET=${TARGET}
23+
cmake .. ${CMAKE_FLAGS}
2924
make -j ${nproc} > /dev/null 2>&1
3025
cd ..
3126

0 commit comments

Comments
 (0)