| 1 | diff -aur ./boost/atomic/detail/config.hpp /google/src/cloud/egilliam/lnboost/google3/third_party/boost/do_not_include_from_google3_only_third_party/boost/boost/atomic/detail/config.hpp
|
|---|
| 2 | --- ./boost/atomic/detail/config.hpp 2018-05-09 16:17:05.000000000 -0600
|
|---|
| 3 | +++ /google/src/cloud/egilliam/lnboost/google3/third_party/boost/do_not_include_from_google3_only_third_party/boost/boost/atomic/detail/config.hpp 2018-05-16 16:23:16.000000000 -0600
|
|---|
| 4 | @@ -36,10 +36,17 @@
|
|---|
| 5 | #define BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA
|
|---|
| 6 | #endif
|
|---|
| 7 |
|
|---|
| 8 | -#if (defined(__i386__) || defined(__x86_64__)) && (defined(__clang__) || (defined(BOOST_GCC) && (BOOST_GCC+0) < 40500) || defined(__SUNPRO_CC))
|
|---|
| 9 | // This macro indicates that the compiler does not support allocating eax:edx or rax:rdx register pairs ("A") in asm blocks
|
|---|
| 10 | +#if defined(__i386__) || defined(__x86_64__)
|
|---|
| 11 | +#if defined(__clang__) && defined(__has_feature)
|
|---|
| 12 | +// Clang introduced this feature after it started supporting rax:rdx register pairs, so can use it to make this determination.
|
|---|
| 13 | +#if !__has_feature(__attribute_diagnose_if_objc__)
|
|---|
| 14 | #define BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS
|
|---|
| 15 | #endif
|
|---|
| 16 | +#elif (defined(BOOST_GCC) && (BOOST_GCC+0) < 40500) || defined(__SUNPRO_CC)
|
|---|
| 17 | +#define BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS
|
|---|
| 18 | +#endif
|
|---|
| 19 | +#endif
|
|---|
| 20 |
|
|---|
| 21 | #if defined(__i386__) && (defined(__PIC__) || defined(__PIE__)) && !(defined(__clang__) || (defined(BOOST_GCC) && (BOOST_GCC+0) >= 50100))
|
|---|
| 22 | // This macro indicates that asm blocks should preserve ebx value unchanged. Some compilers are able to maintain ebx themselves
|
|---|
| 23 | diff -aur ./boost/atomic/detail/ops_gcc_x86_dcas.hpp /google/src/cloud/egilliam/lnboost/google3/third_party/boost/do_not_include_from_google3_only_third_party/boost/boost/atomic/detail/ops_gcc_x86_dcas.hpp
|
|---|
| 24 | --- ./boost/atomic/detail/ops_gcc_x86_dcas.hpp 2018-05-09 16:17:05.000000000 -0600
|
|---|
| 25 | +++ /google/src/cloud/egilliam/lnboost/google3/third_party/boost/do_not_include_from_google3_only_third_party/boost/boost/atomic/detail/ops_gcc_x86_dcas.hpp 2018-05-16 16:43:51.000000000 -0600
|
|---|
| 26 | @@ -158,10 +158,11 @@
|
|---|
| 27 | }
|
|---|
| 28 | else
|
|---|
| 29 | {
|
|---|
| 30 | +#if defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS)
|
|---|
| 31 | #if defined(__clang__)
|
|---|
| 32 | - // Clang cannot allocate eax:edx register pairs but it has sync intrinsics
|
|---|
| 33 | + // Older versions of Clang cannot allocate eax:edx register pairs, but they do have sync intrinsics
|
|---|
| 34 | value = __sync_val_compare_and_swap(&storage, (storage_type)0, (storage_type)0);
|
|---|
| 35 | -#elif defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS)
|
|---|
| 36 | +#else // defined(__clang__)
|
|---|
| 37 | uint32_t value_bits[2];
|
|---|
| 38 | // We don't care for comparison result here; the previous value will be stored into value anyway.
|
|---|
| 39 | // Also we don't care for ebx and ecx values, they just have to be equal to eax and edx before cmpxchg8b.
|
|---|
| 40 | @@ -175,6 +176,7 @@
|
|---|
| 41 | : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
|
|---|
| 42 | );
|
|---|
| 43 | BOOST_ATOMIC_DETAIL_MEMCPY(&value, value_bits, sizeof(value));
|
|---|
| 44 | +#endif // defined(__clang__)
|
|---|
| 45 | #else // defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS)
|
|---|
| 46 | // We don't care for comparison result here; the previous value will be stored into value anyway.
|
|---|
| 47 | // Also we don't care for ebx and ecx values, they just have to be equal to eax and edx before cmpxchg8b.
|
|---|
| 48 | @@ -196,9 +198,9 @@
|
|---|
| 49 | static BOOST_FORCEINLINE bool compare_exchange_strong(
|
|---|
| 50 | storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT
|
|---|
| 51 | {
|
|---|
| 52 | -#if defined(__clang__)
|
|---|
| 53 | +#if defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS) && defined(__clang__)
|
|---|
| 54 |
|
|---|
| 55 | - // Clang cannot allocate eax:edx register pairs but it has sync intrinsics
|
|---|
| 56 | + // Older versions of Clang cannot allocate eax:edx register pairs, but they do have sync intrinsics
|
|---|
| 57 | storage_type old_expected = expected;
|
|---|
| 58 | expected = __sync_val_compare_and_swap(&storage, old_expected, desired);
|
|---|
| 59 | return expected == old_expected;
|
|---|
| 60 | @@ -401,13 +403,15 @@
|
|---|
| 61 |
|
|---|
| 62 | static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order) BOOST_NOEXCEPT
|
|---|
| 63 | {
|
|---|
| 64 | +#if defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS)
|
|---|
| 65 | +
|
|---|
| 66 | #if defined(__clang__)
|
|---|
| 67 |
|
|---|
| 68 | - // Clang cannot allocate rax:rdx register pairs but it has sync intrinsics
|
|---|
| 69 | + // Older versions of Clang cannot allocate rax:rdx register pairs, but they do have sync intrinsics
|
|---|
| 70 | storage_type value = storage_type();
|
|---|
| 71 | return __sync_val_compare_and_swap(&storage, value, value);
|
|---|
| 72 |
|
|---|
| 73 | -#elif defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS)
|
|---|
| 74 | +#else // defined(__clang__)
|
|---|
| 75 |
|
|---|
| 76 | // Some compilers can't allocate rax:rdx register pair either and also don't support 128-bit __sync_val_compare_and_swap
|
|---|
| 77 | uint64_t value_bits[2];
|
|---|
| 78 | @@ -428,6 +432,8 @@
|
|---|
| 79 | BOOST_ATOMIC_DETAIL_MEMCPY(&value, value_bits, sizeof(value));
|
|---|
| 80 | return value;
|
|---|
| 81 |
|
|---|
| 82 | +#endif // defined(__clang__)
|
|---|
| 83 | +
|
|---|
| 84 | #else // defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS)
|
|---|
| 85 |
|
|---|
| 86 | storage_type value;
|
|---|
| 87 | @@ -452,14 +458,16 @@
|
|---|
| 88 | static BOOST_FORCEINLINE bool compare_exchange_strong(
|
|---|
| 89 | storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT
|
|---|
| 90 | {
|
|---|
| 91 | +#if defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS)
|
|---|
| 92 | +
|
|---|
| 93 | #if defined(__clang__)
|
|---|
| 94 |
|
|---|
| 95 | - // Clang cannot allocate rax:rdx register pairs but it has sync intrinsics
|
|---|
| 96 | + // Older versions of Clang cannot allocate rax:rdx register pairs, but they do have sync intrinsics
|
|---|
| 97 | storage_type old_expected = expected;
|
|---|
| 98 | expected = __sync_val_compare_and_swap(&storage, old_expected, desired);
|
|---|
| 99 | return expected == old_expected;
|
|---|
| 100 |
|
|---|
| 101 | -#elif defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS)
|
|---|
| 102 | +#else // defined(__clang__)
|
|---|
| 103 |
|
|---|
| 104 | // Some compilers can't allocate rax:rdx register pair either but also don't support 128-bit __sync_val_compare_and_swap
|
|---|
| 105 | bool success;
|
|---|
| 106 | @@ -474,6 +482,8 @@
|
|---|
| 107 |
|
|---|
| 108 | return success;
|
|---|
| 109 |
|
|---|
| 110 | +#endif // defined(__clang__)
|
|---|
| 111 | +
|
|---|
| 112 | #else // defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS)
|
|---|
| 113 |
|
|---|
| 114 | bool success;
|
|---|