diff --git a/libcxxabi/include/__cxxabi_config.h b/libcxxabi/include/__cxxabi_config.h --- a/libcxxabi/include/__cxxabi_config.h +++ b/libcxxabi/include/__cxxabi_config.h @@ -69,4 +69,8 @@ #define _LIBCXXABI_NO_CFI #endif +#if defined(__arm__) +# define _LIBCXXABI_USE_32BIT_GUARD +#endif + #endif // ____CXXABI_CONFIG_H diff --git a/libcxxabi/include/cxxabi.h b/libcxxabi/include/cxxabi.h --- a/libcxxabi/include/cxxabi.h +++ b/libcxxabi/include/cxxabi.h @@ -77,7 +77,7 @@ extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_deleted_virtual(void); // 3.3.2 One-time Construction API -#ifdef __arm__ +#if defined(_LIBCXXABI_USE_32BIT_GUARD) extern _LIBCXXABI_FUNC_VIS int __cxa_guard_acquire(uint32_t *); extern _LIBCXXABI_FUNC_VIS void __cxa_guard_release(uint32_t *); extern _LIBCXXABI_FUNC_VIS void __cxa_guard_abort(uint32_t *); diff --git a/libcxxabi/src/cxa_guard.cpp b/libcxxabi/src/cxa_guard.cpp --- a/libcxxabi/src/cxa_guard.cpp +++ b/libcxxabi/src/cxa_guard.cpp @@ -35,7 +35,7 @@ INIT_NOT_COMPLETE, }; -#ifdef __arm__ +#if defined(_LIBCXXABI_USE_32BIT_GUARD) // A 32-bit, 4-byte-aligned static data value. The least significant 2 bits must // be statically initialized to 0. typedef uint32_t guard_type; @@ -44,7 +44,7 @@ #endif #if !defined(_LIBCXXABI_HAS_NO_THREADS) && defined(__APPLE__) && \ - !defined(__arm__) + !defined(_LIBCXXABI_USE_32BIT_GUARD) // This is a special-case pthread dependency for Mac. We can't pull this // out into libcxx's threading API (__threading_support) because not all // supported Mac environments provide this function (in pthread.h). To @@ -239,7 +239,7 @@ GuardValue GuardValue::INIT_COMPLETE() { guard_type value = {0}; -#ifdef __arm__ +#if defined(_LIBCXXABI_USE_32BIT_GUARD) value |= 1; #else char* init_bit = (char*)&value; @@ -253,7 +253,7 @@ } bool GuardValue::is_initialization_complete() const { -#ifdef __arm__ +#if defined(_LIBCXXABI_USE_32BIT_GUARD) return value & 1; #else const char* init_bit = (const char*)&value; @@ -271,31 +271,31 @@ // Create a guard object with the lock set to the specified value. guard_type GuardValue::guard_value_from_lock(lock_type l) { -#if defined(__APPLE__) && !defined(__arm__) +#if defined(__APPLE__) && !defined(_LIBCXXABI_USE_32BIT_GUARD) #if __LITTLE_ENDIAN__ return static_cast(l) << 32; #else return static_cast(l); #endif -#else // defined(__APPLE__) && !defined(__arm__) +#else // defined(__APPLE__) && !defined(_LIBCXXABI_USE_32BIT_GUARD) guard_type f = {0}; memcpy(static_cast(static_cast(&f)) + 1, &l, sizeof(lock_type)); return f; -#endif // defined(__APPLE__) && !defined(__arm__) +#endif // defined(__APPLE__) && !defined(_LIBCXXABI_USE_32BIT_GUARD) } lock_type GuardValue::lock_value_from_guard(guard_type g) { -#if defined(__APPLE__) && !defined(__arm__) +#if defined(__APPLE__) && !defined(_LIBCXXABI_USE_32BIT_GUARD) #if __LITTLE_ENDIAN__ return static_cast(g >> 32); #else return static_cast(g); #endif -#else // defined(__APPLE__) && !defined(__arm__) +#else // defined(__APPLE__) && !defined(_LIBCXXABI_USE_32BIT_GUARD) uint8_t guard_bytes[sizeof(guard_type)]; memcpy(&guard_bytes, &g, sizeof(guard_type)); return guard_bytes[1] != 0; -#endif // defined(__APPLE__) && !defined(__arm__) +#endif // defined(__APPLE__) && !defined(_LIBCXXABI_USE_32BIT_GUARD) } } // __cxxabiv1