mirror of
https://github.com/openssl/openssl.git
synced 2025-01-30 14:01:55 +08:00
Never use __atomic_*
on macOS 10.7 and 10.8
macOS 10.7 and 10.8 had a bit wired clang which is detected as `__GNUC__` which has `__ATOMIC_ACQ_REL` but it excepts one option at `__atomic_is_lock_free` instead of 2. This prevents OpenSSL to be compiled on such systems. Fixes: #18055 Signed-off-by: Kirill A. Korinsky <kirill@korins.ky> Reviewed-by: Paul Dale <pauli@openssl.org> Reviewed-by: Tomas Mraz <tomas@openssl.org> (Merged from https://github.com/openssl/openssl/pull/18056)
This commit is contained in:
parent
c29cf39449
commit
d39de4792d
@ -17,6 +17,18 @@
|
||||
# include <atomic.h>
|
||||
#endif
|
||||
|
||||
#if defined(__apple_build_version__) && __apple_build_version__ < 6000000
|
||||
/*
|
||||
* OS/X 10.7 and 10.8 had a weird version of clang which has __ATOMIC_ACQUIRE and
|
||||
* __ATOMIC_ACQ_REL but which expects only one parameter for __atomic_is_lock_free()
|
||||
* rather than two which has signature __atomic_is_lock_free(sizeof(_Atomic(T))).
|
||||
* All of this makes impossible to use __atomic_is_lock_free here.
|
||||
*
|
||||
* See: https://github.com/llvm/llvm-project/commit/a4c2602b714e6c6edb98164550a5ae829b2de760
|
||||
*/
|
||||
#define BROKEN_CLANG_ATOMICS
|
||||
#endif
|
||||
|
||||
#if defined(OPENSSL_THREADS) && !defined(CRYPTO_TDEBUG) && !defined(OPENSSL_SYS_WINDOWS)
|
||||
|
||||
# if defined(OPENSSL_SYS_UNIX)
|
||||
@ -188,7 +200,7 @@ int CRYPTO_THREAD_compare_id(CRYPTO_THREAD_ID a, CRYPTO_THREAD_ID b)
|
||||
|
||||
int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock)
|
||||
{
|
||||
# if defined(__GNUC__) && defined(__ATOMIC_ACQ_REL)
|
||||
# if defined(__GNUC__) && defined(__ATOMIC_ACQ_REL) && !defined(BROKEN_CLANG_ATOMICS)
|
||||
if (__atomic_is_lock_free(sizeof(*val), val)) {
|
||||
*ret = __atomic_add_fetch(val, amount, __ATOMIC_ACQ_REL);
|
||||
return 1;
|
||||
@ -215,7 +227,7 @@ int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock)
|
||||
int CRYPTO_atomic_or(uint64_t *val, uint64_t op, uint64_t *ret,
|
||||
CRYPTO_RWLOCK *lock)
|
||||
{
|
||||
# if defined(__GNUC__) && defined(__ATOMIC_ACQ_REL)
|
||||
# if defined(__GNUC__) && defined(__ATOMIC_ACQ_REL) && !defined(BROKEN_CLANG_ATOMICS)
|
||||
if (__atomic_is_lock_free(sizeof(*val), val)) {
|
||||
*ret = __atomic_or_fetch(val, op, __ATOMIC_ACQ_REL);
|
||||
return 1;
|
||||
@ -240,7 +252,7 @@ int CRYPTO_atomic_or(uint64_t *val, uint64_t op, uint64_t *ret,
|
||||
|
||||
int CRYPTO_atomic_load(uint64_t *val, uint64_t *ret, CRYPTO_RWLOCK *lock)
|
||||
{
|
||||
# if defined(__GNUC__) && defined(__ATOMIC_ACQUIRE)
|
||||
# if defined(__GNUC__) && defined(__ATOMIC_ACQUIRE) && !defined(BROKEN_CLANG_ATOMICS)
|
||||
if (__atomic_is_lock_free(sizeof(*val), val)) {
|
||||
__atomic_load(val, ret, __ATOMIC_ACQUIRE);
|
||||
return 1;
|
||||
|
Loading…
Reference in New Issue
Block a user