From 1e4222f98633c169b050bbea7ff12f92b825024f Mon Sep 17 00:00:00 2001 From: Wenyong Huang Date: Wed, 22 Mar 2023 09:43:24 +0800 Subject: [PATCH 1/2] Fix a_store operation in atomic.h --- libc-top-half/musl/src/internal/atomic.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/libc-top-half/musl/src/internal/atomic.h b/libc-top-half/musl/src/internal/atomic.h index 96c1552d6..88399976f 100644 --- a/libc-top-half/musl/src/internal/atomic.h +++ b/libc-top-half/musl/src/internal/atomic.h @@ -182,6 +182,7 @@ static inline void a_dec(volatile int *p) #define a_store a_store static inline void a_store(volatile int *p, int v) { +#ifdef __wasilibc_unmodified_upstream #ifdef a_barrier a_barrier(); *p = v; @@ -189,6 +190,18 @@ static inline void a_store(volatile int *p, int v) #else a_swap(p, v); #endif +#else + /** + * The wasm opcodes generated by a_barrier mode are like below: + * atomic.fence + * local.get + * i32.const + * i32.store + * atomic.fence + * which are not atomic operations, so we use a_swap instead. + */ + a_swap(p, v); +#endif } #endif From 214e2150f4fb8e918e803794b4533af0e1954716 Mon Sep 17 00:00:00 2001 From: Wenyong Huang Date: Wed, 22 Mar 2023 16:34:51 +0800 Subject: [PATCH 2/2] restore a_store and remove defining a_barrier instead --- libc-top-half/musl/arch/wasm32/atomic_arch.h | 1 - libc-top-half/musl/src/internal/atomic.h | 13 ------------- 2 files changed, 14 deletions(-) diff --git a/libc-top-half/musl/arch/wasm32/atomic_arch.h b/libc-top-half/musl/arch/wasm32/atomic_arch.h index dd9428c94..c24ce2d7b 100644 --- a/libc-top-half/musl/arch/wasm32/atomic_arch.h +++ b/libc-top-half/musl/arch/wasm32/atomic_arch.h @@ -1,4 +1,3 @@ -#define a_barrier() (__sync_synchronize()) #define a_cas(p, t, s) (__sync_val_compare_and_swap((p), (t), (s))) #define a_crash() (__builtin_trap()) #define a_clz_32 __builtin_clz diff --git a/libc-top-half/musl/src/internal/atomic.h b/libc-top-half/musl/src/internal/atomic.h index 88399976f..96c1552d6 100644 --- a/libc-top-half/musl/src/internal/atomic.h +++ b/libc-top-half/musl/src/internal/atomic.h @@ -182,7 +182,6 @@ static inline void a_dec(volatile int *p) #define a_store a_store static inline void a_store(volatile int *p, int v) { -#ifdef __wasilibc_unmodified_upstream #ifdef a_barrier a_barrier(); *p = v; @@ -190,18 +189,6 @@ static inline void a_store(volatile int *p, int v) #else a_swap(p, v); #endif -#else - /** - * The wasm opcodes generated by a_barrier mode are like below: - * atomic.fence - * local.get - * i32.const - * i32.store - * atomic.fence - * which are not atomic operations, so we use a_swap instead. - */ - a_swap(p, v); -#endif } #endif