Skip to content

Commit 114bf94

Browse files
authored
Fix get invokeNative float ret value issue with clang compiler (#1248)
When using clang compiler, the f32/f64 return value might be invalid when calling invokeNative asm code. Declare the return type of invokeNative as void, and set volatile for the converted function pointers to resolve the issue.
1 parent 471cac4 commit 114bf94

File tree

1 file changed

+26
-28
lines changed

1 file changed

+26
-28
lines changed

core/iwasm/common/wasm_runtime_common.c

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3049,7 +3049,7 @@ wasm_runtime_invoke_native_raw(WASMExecEnv *exec_env, void *func_ptr,
30493049
|| defined(BUILD_TARGET_RISCV32_ILP32D) \
30503050
|| defined(BUILD_TARGET_RISCV32_ILP32) || defined(BUILD_TARGET_ARC)
30513051
typedef void (*GenericFunctionPointer)();
3052-
int64
3052+
void
30533053
invokeNative(GenericFunctionPointer f, uint32 *args, uint32 n_stacks);
30543054

30553055
typedef float64 (*Float64FuncPtr)(GenericFunctionPointer, uint32 *, uint32);
@@ -3058,13 +3058,16 @@ typedef int64 (*Int64FuncPtr)(GenericFunctionPointer, uint32 *, uint32);
30583058
typedef int32 (*Int32FuncPtr)(GenericFunctionPointer, uint32 *, uint32);
30593059
typedef void (*VoidFuncPtr)(GenericFunctionPointer, uint32 *, uint32);
30603060

3061-
static Float64FuncPtr invokeNative_Float64 =
3061+
static volatile Float64FuncPtr invokeNative_Float64 =
30623062
(Float64FuncPtr)(uintptr_t)invokeNative;
3063-
static Float32FuncPtr invokeNative_Float32 =
3063+
static volatile Float32FuncPtr invokeNative_Float32 =
30643064
(Float32FuncPtr)(uintptr_t)invokeNative;
3065-
static Int64FuncPtr invokeNative_Int64 = (Int64FuncPtr)(uintptr_t)invokeNative;
3066-
static Int32FuncPtr invokeNative_Int32 = (Int32FuncPtr)(uintptr_t)invokeNative;
3067-
static VoidFuncPtr invokeNative_Void = (VoidFuncPtr)(uintptr_t)invokeNative;
3065+
static volatile Int64FuncPtr invokeNative_Int64 =
3066+
(Int64FuncPtr)(uintptr_t)invokeNative;
3067+
static volatile Int32FuncPtr invokeNative_Int32 =
3068+
(Int32FuncPtr)(uintptr_t)invokeNative;
3069+
static volatile VoidFuncPtr invokeNative_Void =
3070+
(VoidFuncPtr)(uintptr_t)invokeNative;
30683071

30693072
#if defined(BUILD_TARGET_ARM_VFP) || defined(BUILD_TARGET_THUMB_VFP)
30703073
#define MAX_REG_INTS 4
@@ -3520,7 +3523,7 @@ wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr,
35203523
|| defined(BUILD_TARGET_THUMB) || defined(BUILD_TARGET_MIPS) \
35213524
|| defined(BUILD_TARGET_XTENSA)
35223525
typedef void (*GenericFunctionPointer)();
3523-
int64
3526+
void
35243527
invokeNative(GenericFunctionPointer f, uint32 *args, uint32 sz);
35253528

35263529
typedef float64 (*Float64FuncPtr)(GenericFunctionPointer f, uint32 *, uint32);
@@ -3529,13 +3532,16 @@ typedef int64 (*Int64FuncPtr)(GenericFunctionPointer f, uint32 *, uint32);
35293532
typedef int32 (*Int32FuncPtr)(GenericFunctionPointer f, uint32 *, uint32);
35303533
typedef void (*VoidFuncPtr)(GenericFunctionPointer f, uint32 *, uint32);
35313534

3532-
static Int64FuncPtr invokeNative_Int64 = (Int64FuncPtr)invokeNative;
3533-
static Int32FuncPtr invokeNative_Int32 = (Int32FuncPtr)(uintptr_t)invokeNative;
3534-
static Float64FuncPtr invokeNative_Float64 =
3535+
static volatile Int64FuncPtr invokeNative_Int64 =
3536+
(Int64FuncPtr)(uintptr_t)invokeNative;
3537+
static volatile Int32FuncPtr invokeNative_Int32 =
3538+
(Int32FuncPtr)(uintptr_t)invokeNative;
3539+
static volatile Float64FuncPtr invokeNative_Float64 =
35353540
(Float64FuncPtr)(uintptr_t)invokeNative;
3536-
static Float32FuncPtr invokeNative_Float32 =
3541+
static volatile Float32FuncPtr invokeNative_Float32 =
35373542
(Float32FuncPtr)(uintptr_t)invokeNative;
3538-
static VoidFuncPtr invokeNative_Void = (VoidFuncPtr)(uintptr_t)invokeNative;
3543+
static volatile VoidFuncPtr invokeNative_Void =
3544+
(VoidFuncPtr)(uintptr_t)invokeNative;
35393545

35403546
static inline void
35413547
word_copy(uint32 *dest, uint32 *src, unsigned num)
@@ -3762,33 +3768,25 @@ typedef uint32x4_t __m128i;
37623768
#endif /* end of WASM_ENABLE_SIMD != 0 */
37633769

37643770
typedef void (*GenericFunctionPointer)();
3765-
#if defined(__APPLE__) || defined(__MACH__)
3766-
/**
3767-
* Define the return type as 'void' in MacOS, since after converting
3768-
* 'int64 invokeNative' into 'float64 invokeNative_Float64', the
3769-
* return value passing might be invalid, the caller reads the return
3770-
* value from register rax but not xmm0.
3771-
*/
37723771
void
37733772
invokeNative(GenericFunctionPointer f, uint64 *args, uint64 n_stacks);
3774-
#else
3775-
int64
3776-
invokeNative(GenericFunctionPointer f, uint64 *args, uint64 n_stacks);
3777-
#endif
37783773

37793774
typedef float64 (*Float64FuncPtr)(GenericFunctionPointer, uint64 *, uint64);
37803775
typedef float32 (*Float32FuncPtr)(GenericFunctionPointer, uint64 *, uint64);
37813776
typedef int64 (*Int64FuncPtr)(GenericFunctionPointer, uint64 *, uint64);
37823777
typedef int32 (*Int32FuncPtr)(GenericFunctionPointer, uint64 *, uint64);
37833778
typedef void (*VoidFuncPtr)(GenericFunctionPointer, uint64 *, uint64);
37843779

3785-
static Float64FuncPtr invokeNative_Float64 =
3780+
static volatile Float64FuncPtr invokeNative_Float64 =
37863781
(Float64FuncPtr)(uintptr_t)invokeNative;
3787-
static Float32FuncPtr invokeNative_Float32 =
3782+
static volatile Float32FuncPtr invokeNative_Float32 =
37883783
(Float32FuncPtr)(uintptr_t)invokeNative;
3789-
static Int64FuncPtr invokeNative_Int64 = (Int64FuncPtr)(uintptr_t)invokeNative;
3790-
static Int32FuncPtr invokeNative_Int32 = (Int32FuncPtr)(uintptr_t)invokeNative;
3791-
static VoidFuncPtr invokeNative_Void = (VoidFuncPtr)(uintptr_t)invokeNative;
3784+
static volatile Int64FuncPtr invokeNative_Int64 =
3785+
(Int64FuncPtr)(uintptr_t)invokeNative;
3786+
static volatile Int32FuncPtr invokeNative_Int32 =
3787+
(Int32FuncPtr)(uintptr_t)invokeNative;
3788+
static volatile VoidFuncPtr invokeNative_Void =
3789+
(VoidFuncPtr)(uintptr_t)invokeNative;
37923790

37933791
#if WASM_ENABLE_SIMD != 0
37943792
typedef v128 (*V128FuncPtr)(GenericFunctionPointer, uint64 *, uint64);

0 commit comments

Comments
 (0)