[OE-core] [PATCH] boost: fix atomics for armv6

Yi Qingliang niqingliang2003 at gmail.com
Mon Sep 29 01:13:08 UTC 2014


It work for me on my s3c6410 board. The new image run without exception.

Signed-off-by: Yi Qingliang <niqingliang2003 at gmail.com>
<niqingliang2003 at gmail.com>

On Sun, Sep 28, 2014 at 11:37 PM, Peter A. Bigot <pab at pabigot.com> wrote:

> meta-raspberrypi and some other systems are ARMv6k but tell OE that
> they're ARMv6 which doesn't fully support non-word atomics.  armv6k
> does, but Boost didn't handle the recognition correctly in the 1.56
> release.  Backport the patch that fixes the build.
>
> See: https://svn.boost.org/trac/boost/ticket/10446
> Signed-off-by: Peter A. Bigot <pab at pabigot.com>
> ---
>
> Note:
>
> I have only tested that this fixes the compile problems; I have not
> verified that the resulting library works correctly with respect to
> atomics.  I'm expecting somebody who uses boost on a platform where this
> is relevant to validate the functional behavior if that's necessary.
>
> Cc: niqingliang2003 at gmail.com
> Cc: danismostlikely at gmail.com
>
> Peter
>
>  ...rt-for-extending-operations-to-GCC-atomic.patch | 412
> +++++++++++++++++++++
>  meta/recipes-support/boost/boost_1.56.0.bb         |   5 +-
>  2 files changed, 416 insertions(+), 1 deletion(-)
>  create mode 100644
> meta/recipes-support/boost/boost/0001-Added-support-for-extending-operations-to-GCC-atomic.patch
>
> diff --git
> a/meta/recipes-support/boost/boost/0001-Added-support-for-extending-operations-to-GCC-atomic.patch
> b/meta/recipes-support/boost/boost/0001-Added-support-for-extending-operations-to-GCC-atomic.patch
> new file mode 100644
> index 0000000..feece81
> --- /dev/null
> +++
> b/meta/recipes-support/boost/boost/0001-Added-support-for-extending-operations-to-GCC-atomic.patch
> @@ -0,0 +1,412 @@
> +From 415db7054723291042e4ff1ffa8fdd5bc8b07163 Mon Sep 17 00:00:00 2001
> +From: Andrey Semashev <andrey.semashev at gmail.com>
> +Date: Sat, 27 Sep 2014 20:40:09 +0400
> +Subject: [PATCH] Added support for extending operations to GCC atomic
> backend.
> +
> +Fix for #10446. Some platforms (e.g. Raspberry Pi) only support atomic
> ops of some particular size but not less. Use extending arithmetic
> operations for these platforms. Also, make sure bools are always treated as
> 8-bit values, even if the actual type is larger. This makes its use in
> atomic<>, atomic_flag and lock pool more consistent.
> +
> +Upstream-Status: Backport [https://svn.boost.org/trac/boost/ticket/10446]
> +Signed-off-by: Peter A. Bigot <pab at pabigot.com>
> +
> +---
> + include/boost/atomic/capabilities.hpp           |   1 +
> + include/boost/atomic/detail/atomic_template.hpp |   2 +-
> + include/boost/atomic/detail/caps_gcc_atomic.hpp |  82 +++++------
> + include/boost/atomic/detail/ops_gcc_atomic.hpp  | 184
> +++++++++++++++++++++---
> + 4 files changed, 206 insertions(+), 63 deletions(-)
> +
> +diff --git a/include/boost/atomic/capabilities.hpp
> b/include/boost/atomic/capabilities.hpp
> +index 658dd22..05bbb0f 100644
> +--- a/include/boost/atomic/capabilities.hpp
> ++++ b/include/boost/atomic/capabilities.hpp
> +@@ -142,6 +142,7 @@
> + #define BOOST_ATOMIC_ADDRESS_LOCK_FREE BOOST_ATOMIC_POINTER_LOCK_FREE
> +
> + #ifndef BOOST_ATOMIC_BOOL_LOCK_FREE
> ++// We store bools in 1-byte storage in all backends
> + #define BOOST_ATOMIC_BOOL_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
> + #endif
> +
> +diff --git a/include/boost/atomic/detail/atomic_template.hpp
> b/include/boost/atomic/detail/atomic_template.hpp
> +index 4fd6d79..bc3922a 100644
> +--- a/include/boost/atomic/detail/atomic_template.hpp
> ++++ b/include/boost/atomic/detail/atomic_template.hpp
> +@@ -234,7 +234,7 @@ class base_atomic< bool, int >
> + {
> + private:
> +     typedef bool value_type;
> +-    typedef atomics::detail::operations< storage_size_of< value_type
> >::value, false > operations;
> ++    typedef atomics::detail::operations< 1u, false > operations;
> +
> + protected:
> +     typedef value_type value_arg_type;
> +diff --git a/include/boost/atomic/detail/caps_gcc_atomic.hpp
> b/include/boost/atomic/detail/caps_gcc_atomic.hpp
> +index 8299ad0..f4e7a70 100644
> +--- a/include/boost/atomic/detail/caps_gcc_atomic.hpp
> ++++ b/include/boost/atomic/detail/caps_gcc_atomic.hpp
> +@@ -29,66 +29,48 @@
> + #define BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B 1
> + #endif
> +
> +-#if __GCC_ATOMIC_BOOL_LOCK_FREE == 2
> +-#define BOOST_ATOMIC_FLAG_LOCK_FREE 2
> +-#else
> +-#define BOOST_ATOMIC_FLAG_LOCK_FREE 0
> +-#endif
> +-#if __GCC_ATOMIC_CHAR_LOCK_FREE == 2
> +-#define BOOST_ATOMIC_CHAR_LOCK_FREE 2
> +-#else
> +-#define BOOST_ATOMIC_CHAR_LOCK_FREE 0
> +-#endif
> +-#if __GCC_ATOMIC_CHAR16_T_LOCK_FREE == 2
> +-#define BOOST_ATOMIC_CHAR16_T_LOCK_FREE 2
> +-#else
> +-#define BOOST_ATOMIC_CHAR16_T_LOCK_FREE 0
> +-#endif
> +-#if __GCC_ATOMIC_CHAR32_T_LOCK_FREE == 2
> +-#define BOOST_ATOMIC_CHAR32_T_LOCK_FREE 2
> ++#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B) &&
> (defined(BOOST_HAS_INT128) || !defined(BOOST_NO_ALIGNMENT))
> ++#define BOOST_ATOMIC_INT128_LOCK_FREE 2
> + #else
> +-#define BOOST_ATOMIC_CHAR32_T_LOCK_FREE 0
> ++#define BOOST_ATOMIC_INT128_LOCK_FREE 0
> + #endif
> +-#if __GCC_ATOMIC_WCHAR_T_LOCK_FREE == 2
> +-#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 2
> ++
> ++#if __GCC_ATOMIC_LLONG_LOCK_FREE == 2
> ++#define BOOST_ATOMIC_LLONG_LOCK_FREE 2
> + #else
> +-#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 0
> ++#define BOOST_ATOMIC_LLONG_LOCK_FREE BOOST_ATOMIC_INT128_LOCK_FREE
> + #endif
> +-#if __GCC_ATOMIC_SHORT_LOCK_FREE == 2
> +-#define BOOST_ATOMIC_SHORT_LOCK_FREE 2
> ++
> ++#if __GCC_ATOMIC_LONG_LOCK_FREE == 2
> ++#define BOOST_ATOMIC_LONG_LOCK_FREE 2
> + #else
> +-#define BOOST_ATOMIC_SHORT_LOCK_FREE 0
> ++#define BOOST_ATOMIC_LONG_LOCK_FREE BOOST_ATOMIC_LLONG_LOCK_FREE
> + #endif
> ++
> + #if __GCC_ATOMIC_INT_LOCK_FREE == 2
> + #define BOOST_ATOMIC_INT_LOCK_FREE 2
> + #else
> +-#define BOOST_ATOMIC_INT_LOCK_FREE 0
> +-#endif
> +-#if __GCC_ATOMIC_LONG_LOCK_FREE == 2
> +-#define BOOST_ATOMIC_LONG_LOCK_FREE 2
> +-#else
> +-#define BOOST_ATOMIC_LONG_LOCK_FREE 0
> ++#define BOOST_ATOMIC_INT_LOCK_FREE BOOST_ATOMIC_LONG_LOCK_FREE
> + #endif
> +-#if __GCC_ATOMIC_LLONG_LOCK_FREE == 2
> +-#define BOOST_ATOMIC_LLONG_LOCK_FREE 2
> ++
> ++#if __GCC_ATOMIC_SHORT_LOCK_FREE == 2
> ++#define BOOST_ATOMIC_SHORT_LOCK_FREE 2
> + #else
> +-#define BOOST_ATOMIC_LLONG_LOCK_FREE 0
> ++#define BOOST_ATOMIC_SHORT_LOCK_FREE BOOST_ATOMIC_INT_LOCK_FREE
> + #endif
> +-#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B) &&
> (defined(BOOST_HAS_INT128) || !defined(BOOST_NO_ALIGNMENT))
> +-#define BOOST_ATOMIC_INT128_LOCK_FREE 2
> ++
> ++#if __GCC_ATOMIC_CHAR_LOCK_FREE == 2
> ++#define BOOST_ATOMIC_CHAR_LOCK_FREE 2
> + #else
> +-#define BOOST_ATOMIC_INT128_LOCK_FREE 0
> ++#define BOOST_ATOMIC_CHAR_LOCK_FREE BOOST_ATOMIC_SHORT_LOCK_FREE
> + #endif
> ++
> + #if __GCC_ATOMIC_POINTER_LOCK_FREE == 2
> + #define BOOST_ATOMIC_POINTER_LOCK_FREE 2
> + #else
> + #define BOOST_ATOMIC_POINTER_LOCK_FREE 0
> + #endif
> +-#if __GCC_ATOMIC_BOOL_LOCK_FREE == 2
> +-#define BOOST_ATOMIC_BOOL_LOCK_FREE 2
> +-#else
> +-#define BOOST_ATOMIC_BOOL_LOCK_FREE 0
> +-#endif
> ++
> +
> + #define BOOST_ATOMIC_INT8_LOCK_FREE BOOST_ATOMIC_CHAR_LOCK_FREE
> +
> +@@ -128,6 +110,24 @@
> + #define BOOST_ATOMIC_INT64_LOCK_FREE 0
> + #endif
> +
> ++
> ++#if __GCC_ATOMIC_WCHAR_T_LOCK_FREE == 2
> ++#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 2
> ++#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 8
> ++#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
> ++#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 4
> ++#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
> ++#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 2
> ++#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
> ++#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 1
> ++#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
> ++#else
> ++#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 0
> ++#endif
> ++
> ++#define BOOST_ATOMIC_CHAR32_T_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
> ++#define BOOST_ATOMIC_CHAR16_T_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
> ++
> + #define BOOST_ATOMIC_THREAD_FENCE 2
> + #define BOOST_ATOMIC_SIGNAL_FENCE 2
> +
> +diff --git a/include/boost/atomic/detail/ops_gcc_atomic.hpp
> b/include/boost/atomic/detail/ops_gcc_atomic.hpp
> +index 2297791..2e4c37b 100644
> +--- a/include/boost/atomic/detail/ops_gcc_atomic.hpp
> ++++ b/include/boost/atomic/detail/ops_gcc_atomic.hpp
> +@@ -24,6 +24,15 @@
> + #include <boost/atomic/detail/ops_cas_based.hpp>
> + #endif
> +
> ++#if __GCC_ATOMIC_LLONG_LOCK_FREE != BOOST_ATOMIC_LLONG_LOCK_FREE ||
> __GCC_ATOMIC_LONG_LOCK_FREE != BOOST_ATOMIC_LONG_LOCK_FREE ||\
> ++    __GCC_ATOMIC_INT_LOCK_FREE != BOOST_ATOMIC_INT_LOCK_FREE ||
> __GCC_ATOMIC_SHORT_LOCK_FREE != BOOST_ATOMIC_SHORT_LOCK_FREE ||\
> ++    __GCC_ATOMIC_CHAR_LOCK_FREE != BOOST_ATOMIC_CHAR_LOCK_FREE ||
> __GCC_ATOMIC_BOOL_LOCK_FREE != BOOST_ATOMIC_BOOL_LOCK_FREE ||\
> ++    __GCC_ATOMIC_WCHAR_T_LOCK_FREE != BOOST_ATOMIC_WCHAR_T_LOCK_FREE
> ++// There are platforms where we need to use larger storage types
> ++#include <boost/atomic/detail/int_sizes.hpp>
> ++#include <boost/atomic/detail/ops_extending_cas_based.hpp>
> ++#endif
> ++
> + #ifdef BOOST_HAS_PRAGMA_ONCE
> + #pragma once
> + #endif
> +@@ -154,73 +163,206 @@ struct gcc_atomic_operations
> +     }
> + };
> +
> +-#if BOOST_ATOMIC_INT8_LOCK_FREE > 0
> ++#if BOOST_ATOMIC_INT128_LOCK_FREE > 0
> ++#if defined(__clang__) && defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B)
> ++
> ++// Workaround for clang bug: http://llvm.org/bugs/show_bug.cgi?id=19149
> ++// Clang 3.4 does not implement 128-bit __atomic* intrinsics even though
> it defines __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16
> + template< bool Signed >
> +-struct operations< 1u, Signed > :
> +-    public gcc_atomic_operations< typename make_storage_type< 1u, Signed
> >::type >
> ++struct operations< 16u, Signed > :
> ++    public cas_based_operations< gcc_dcas_x86_64< Signed > >
> + {
> + };
> ++
> ++#else
> ++
> ++template< bool Signed >
> ++struct operations< 16u, Signed > :
> ++    public gcc_atomic_operations< typename make_storage_type< 16u,
> Signed >::type >
> ++{
> ++};
> ++
> ++#endif
> + #endif
> +
> +-#if BOOST_ATOMIC_INT16_LOCK_FREE > 0
> ++
> ++#if BOOST_ATOMIC_INT64_LOCK_FREE > 0
> ++#if defined(__clang__) && defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B)
> ++
> ++// Workaround for clang bug http://llvm.org/bugs/show_bug.cgi?id=19355
> + template< bool Signed >
> +-struct operations< 2u, Signed > :
> +-    public gcc_atomic_operations< typename make_storage_type< 2u, Signed
> >::type >
> ++struct operations< 8u, Signed > :
> ++    public cas_based_operations< gcc_dcas_x86< Signed > >
> ++{
> ++};
> ++
> ++#elif (BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 8 &&
> __GCC_ATOMIC_LLONG_LOCK_FREE != BOOST_ATOMIC_LLONG_LOCK_FREE) ||\
> ++    (BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 8 && __GCC_ATOMIC_LONG_LOCK_FREE
> != BOOST_ATOMIC_LONG_LOCK_FREE) ||\
> ++    (BOOST_ATOMIC_DETAIL_SIZEOF_INT == 8 && __GCC_ATOMIC_INT_LOCK_FREE
> != BOOST_ATOMIC_INT_LOCK_FREE) ||\
> ++    (BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 8 &&
> __GCC_ATOMIC_SHORT_LOCK_FREE != BOOST_ATOMIC_SHORT_LOCK_FREE) ||\
> ++    (BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 8 &&
> __GCC_ATOMIC_WCHAR_T_LOCK_FREE != BOOST_ATOMIC_WCHAR_T_LOCK_FREE)
> ++
> ++#define BOOST_ATOMIC_DETAIL_INT64_EXTENDED
> ++
> ++template< bool Signed >
> ++struct operations< 8u, Signed > :
> ++    public extending_cas_based_operations< gcc_atomic_operations<
> typename make_storage_type< 16u, Signed >::type >, 8u, Signed >
> + {
> + };
> ++
> ++#else
> ++
> ++template< bool Signed >
> ++struct operations< 8u, Signed > :
> ++    public gcc_atomic_operations< typename make_storage_type< 8u, Signed
> >::type >
> ++{
> ++};
> ++
> ++#endif
> + #endif
> +
> + #if BOOST_ATOMIC_INT32_LOCK_FREE > 0
> ++#if (BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 4 &&
> __GCC_ATOMIC_LLONG_LOCK_FREE != BOOST_ATOMIC_LLONG_LOCK_FREE) ||\
> ++    (BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 4 && __GCC_ATOMIC_LONG_LOCK_FREE
> != BOOST_ATOMIC_LONG_LOCK_FREE) ||\
> ++    (BOOST_ATOMIC_DETAIL_SIZEOF_INT == 4 && __GCC_ATOMIC_INT_LOCK_FREE
> != BOOST_ATOMIC_INT_LOCK_FREE) ||\
> ++    (BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 4 &&
> __GCC_ATOMIC_SHORT_LOCK_FREE != BOOST_ATOMIC_SHORT_LOCK_FREE) ||\
> ++    (BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 4 &&
> __GCC_ATOMIC_WCHAR_T_LOCK_FREE != BOOST_ATOMIC_WCHAR_T_LOCK_FREE)
> ++
> ++#define BOOST_ATOMIC_DETAIL_INT32_EXTENDED
> ++
> ++#if !defined(BOOST_ATOMIC_DETAIL_INT64_EXTENDED)
> ++
> ++template< bool Signed >
> ++struct operations< 4u, Signed > :
> ++    public extending_cas_based_operations< gcc_atomic_operations<
> typename make_storage_type< 8u, Signed >::type >, 4u, Signed >
> ++{
> ++};
> ++
> ++#else // !defined(BOOST_ATOMIC_DETAIL_INT64_EXTENDED)
> ++
> ++template< bool Signed >
> ++struct operations< 4u, Signed > :
> ++    public extending_cas_based_operations< gcc_atomic_operations<
> typename make_storage_type< 16u, Signed >::type >, 4u, Signed >
> ++{
> ++};
> ++
> ++#endif // !defined(BOOST_ATOMIC_DETAIL_INT64_EXTENDED)
> ++
> ++#else
> ++
> + template< bool Signed >
> + struct operations< 4u, Signed > :
> +     public gcc_atomic_operations< typename make_storage_type< 4u, Signed
> >::type >
> + {
> + };
> ++
> ++#endif
> + #endif
> +
> +-#if BOOST_ATOMIC_INT64_LOCK_FREE > 0
> +-#if defined(__clang__) && defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B)
> ++#if BOOST_ATOMIC_INT16_LOCK_FREE > 0
> ++#if (BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 2 &&
> __GCC_ATOMIC_LLONG_LOCK_FREE != BOOST_ATOMIC_LLONG_LOCK_FREE) ||\
> ++    (BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 2 && __GCC_ATOMIC_LONG_LOCK_FREE
> != BOOST_ATOMIC_LONG_LOCK_FREE) ||\
> ++    (BOOST_ATOMIC_DETAIL_SIZEOF_INT == 2 && __GCC_ATOMIC_INT_LOCK_FREE
> != BOOST_ATOMIC_INT_LOCK_FREE) ||\
> ++    (BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 2 &&
> __GCC_ATOMIC_SHORT_LOCK_FREE != BOOST_ATOMIC_SHORT_LOCK_FREE) ||\
> ++    (BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 2 &&
> __GCC_ATOMIC_WCHAR_T_LOCK_FREE != BOOST_ATOMIC_WCHAR_T_LOCK_FREE)
> ++
> ++#define BOOST_ATOMIC_DETAIL_INT16_EXTENDED
> ++
> ++#if !defined(BOOST_ATOMIC_DETAIL_INT32_EXTENDED)
> +
> +-// Workaround for clang bug http://llvm.org/bugs/show_bug.cgi?id=19355
> + template< bool Signed >
> +-struct operations< 8u, Signed > :
> +-    public cas_based_operations< gcc_dcas_x86< Signed > >
> ++struct operations< 2u, Signed > :
> ++    public extending_cas_based_operations< gcc_atomic_operations<
> typename make_storage_type< 4u, Signed >::type >, 2u, Signed >
> ++{
> ++};
> ++
> ++#elif !defined(BOOST_ATOMIC_DETAIL_INT64_EXTENDED)
> ++
> ++template< bool Signed >
> ++struct operations< 2u, Signed > :
> ++    public extending_cas_based_operations< gcc_atomic_operations<
> typename make_storage_type< 8u, Signed >::type >, 2u, Signed >
> + {
> + };
> +
> + #else
> +
> + template< bool Signed >
> +-struct operations< 8u, Signed > :
> +-    public gcc_atomic_operations< typename make_storage_type< 8u, Signed
> >::type >
> ++struct operations< 2u, Signed > :
> ++    public extending_cas_based_operations< gcc_atomic_operations<
> typename make_storage_type< 16u, Signed >::type >, 2u, Signed >
> ++{
> ++};
> ++
> ++#endif
> ++
> ++#else
> ++
> ++template< bool Signed >
> ++struct operations< 2u, Signed > :
> ++    public gcc_atomic_operations< typename make_storage_type< 2u, Signed
> >::type >
> + {
> + };
> +
> + #endif
> + #endif
> +
> +-#if BOOST_ATOMIC_INT128_LOCK_FREE > 0
> +-#if defined(__clang__) && defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B)
> ++#if BOOST_ATOMIC_INT8_LOCK_FREE > 0
> ++#if (BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 1 &&
> __GCC_ATOMIC_LLONG_LOCK_FREE != BOOST_ATOMIC_LLONG_LOCK_FREE) ||\
> ++    (BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 1 && __GCC_ATOMIC_LONG_LOCK_FREE
> != BOOST_ATOMIC_LONG_LOCK_FREE) ||\
> ++    (BOOST_ATOMIC_DETAIL_SIZEOF_INT == 1 && __GCC_ATOMIC_INT_LOCK_FREE
> != BOOST_ATOMIC_INT_LOCK_FREE) ||\
> ++    (BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 1 &&
> __GCC_ATOMIC_SHORT_LOCK_FREE != BOOST_ATOMIC_SHORT_LOCK_FREE) ||\
> ++    (BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 1 &&
> __GCC_ATOMIC_WCHAR_T_LOCK_FREE != BOOST_ATOMIC_WCHAR_T_LOCK_FREE) ||\
> ++    (__GCC_ATOMIC_CHAR_LOCK_FREE != BOOST_ATOMIC_CHAR_LOCK_FREE) ||\
> ++    (__GCC_ATOMIC_BOOL_LOCK_FREE != BOOST_ATOMIC_BOOL_LOCK_FREE)
> ++
> ++#if !defined(BOOST_ATOMIC_DETAIL_INT16_EXTENDED)
> +
> +-// Workaround for clang bug: http://llvm.org/bugs/show_bug.cgi?id=19149
> +-// Clang 3.4 does not implement 128-bit __atomic* intrinsics even though
> it defines __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16
> + template< bool Signed >
> +-struct operations< 16u, Signed > :
> +-    public cas_based_operations< gcc_dcas_x86_64< Signed > >
> ++struct operations< 1u, Signed > :
> ++    public extending_cas_based_operations< gcc_atomic_operations<
> typename make_storage_type< 2u, Signed >::type >, 1u, Signed >
> ++{
> ++};
> ++
> ++#elif !defined(BOOST_ATOMIC_DETAIL_INT32_EXTENDED)
> ++
> ++template< bool Signed >
> ++struct operations< 1u, Signed > :
> ++    public extending_cas_based_operations< gcc_atomic_operations<
> typename make_storage_type< 4u, Signed >::type >, 1u, Signed >
> ++{
> ++};
> ++
> ++#elif !defined(BOOST_ATOMIC_DETAIL_INT64_EXTENDED)
> ++
> ++template< bool Signed >
> ++struct operations< 1u, Signed > :
> ++    public extending_cas_based_operations< gcc_atomic_operations<
> typename make_storage_type< 8u, Signed >::type >, 1u, Signed >
> + {
> + };
> +
> + #else
> +
> + template< bool Signed >
> +-struct operations< 16u, Signed > :
> +-    public gcc_atomic_operations< typename make_storage_type< 16u,
> Signed >::type >
> ++struct operations< 1u, Signed > :
> ++    public extending_cas_based_operations< gcc_atomic_operations<
> typename make_storage_type< 16u, Signed >::type >, 1u, Signed >
> ++{
> ++};
> ++
> ++#endif
> ++
> ++#else
> ++
> ++template< bool Signed >
> ++struct operations< 1u, Signed > :
> ++    public gcc_atomic_operations< typename make_storage_type< 1u, Signed
> >::type >
> + {
> + };
> +
> + #endif
> + #endif
> +
> ++#undef BOOST_ATOMIC_DETAIL_INT16_EXTENDED
> ++#undef BOOST_ATOMIC_DETAIL_INT32_EXTENDED
> ++#undef BOOST_ATOMIC_DETAIL_INT64_EXTENDED
> ++
> + BOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT
> + {
> +
>  __atomic_thread_fence(atomics::detail::convert_memory_order_to_gcc(order));
> +--
> +1.8.5.5
> +
> diff --git a/meta/recipes-support/boost/boost_1.56.0.bb
> b/meta/recipes-support/boost/boost_1.56.0.bb
> index b199c88..dcc77bb 100644
> --- a/meta/recipes-support/boost/boost_1.56.0.bb
> +++ b/meta/recipes-support/boost/boost_1.56.0.bb
> @@ -1,4 +1,7 @@
>  include boost-${PV}.inc
>  include boost.inc
>
> -SRC_URI += "file://arm-intrinsics.patch"
> +SRC_URI += "\
> +    file://arm-intrinsics.patch \
> +
> file://0001-Added-support-for-extending-operations-to-GCC-atomic.patch;striplevel=2
> \
> +"
> --
> 1.8.5.5
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openembedded.org/pipermail/openembedded-core/attachments/20140929/3996f2ee/attachment-0002.html>


More information about the Openembedded-core mailing list