Acked-by: Ethan Jackson <et...@nicira.com>
On Thu, Jul 18, 2013 at 2:26 PM, Ben Pfaff <b...@nicira.com> wrote: > We found out earlier that GCC sometimes produces an error only at link time > for atomic built-ins that are not supported on a platform. This actually > tries the link at configure time and should thus reliably detect whether > the atomic built-ins are really supported. > > Signed-off-by: Ben Pfaff <b...@nicira.com> > --- > I thought I'd already sent out these patches, but it looks like they > never made it to ovs-dev or patchwork. > > configure.ac | 1 + > lib/ovs-atomic.h | 2 +- > m4/openvswitch.m4 | 72 > +++++++++++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 74 insertions(+), 1 deletions(-) > > diff --git a/configure.ac b/configure.ac > index e4f9991..e44ae36 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -82,6 +82,7 @@ OVS_CHECK_GROFF > OVS_CHECK_GNU_MAKE > OVS_CHECK_CACHE_TIME > OVS_CHECK_TLS > +OVS_CHECK_GCC4_ATOMICS > OVS_CHECK_ATOMIC_ALWAYS_LOCK_FREE(1) > OVS_CHECK_ATOMIC_ALWAYS_LOCK_FREE(2) > OVS_CHECK_ATOMIC_ALWAYS_LOCK_FREE(4) > diff --git a/lib/ovs-atomic.h b/lib/ovs-atomic.h > index a0a34f3..3fc9dcb 100644 > --- a/lib/ovs-atomic.h > +++ b/lib/ovs-atomic.h > @@ -240,7 +240,7 @@ > #include "ovs-atomic-c11.h" > #elif __GNUC__ >= 4 && __GNUC_MINOR__ >= 7 > #include "ovs-atomic-gcc4.7+.h" > - #elif __GNUC__ >= 4 > + #elif HAVE_GCC4_ATOMICS > #include "ovs-atomic-gcc4+.h" > #else > #include "ovs-atomic-pthreads.h" > diff --git a/m4/openvswitch.m4 b/m4/openvswitch.m4 > index ca80506..e6e5d08 100644 > --- a/m4/openvswitch.m4 > +++ b/m4/openvswitch.m4 > @@ -426,6 +426,78 @@ static thread_local int var;], [return var;])], > fi > fi]) > > +dnl OVS_CHECK_GCC4_ATOMICS > +dnl > +dnl Checks whether the compiler and linker support GCC 4.0+ atomic built-ins. > +dnl A compile-time only check is not enough because the compiler defers > +dnl unimplemented built-ins to libgcc, which sometimes also lacks > +dnl implementations. > +AC_DEFUN([OVS_CHECK_GCC4_ATOMICS], > + [AC_CACHE_CHECK( > + [whether $CC supports GCC 4.0+ atomic built-ins], > + [ovs_cv_gcc4_atomics], > + [AC_LINK_IFELSE( > + [AC_LANG_PROGRAM([[#include <stdlib.h> > + > +#define ovs_assert(expr) if (!(expr)) abort(); > +#define TEST_ATOMIC_TYPE(TYPE) \ > + { \ > + TYPE x = 1; \ > + TYPE orig; \ > + \ > + __sync_synchronize(); \ > + ovs_assert(x == 1); \ > + \ > + __sync_synchronize(); \ > + x = 3; \ > + __sync_synchronize(); \ > + ovs_assert(x == 3); \ > + \ > + orig = __sync_fetch_and_add(&x, 1); \ > + ovs_assert(orig == 3); \ > + __sync_synchronize(); \ > + ovs_assert(x == 4); \ > + \ > + orig = __sync_fetch_and_sub(&x, 2); \ > + ovs_assert(orig == 4); \ > + __sync_synchronize(); \ > + ovs_assert(x == 2); \ > + \ > + orig = __sync_fetch_and_or(&x, 6); \ > + ovs_assert(orig == 2); \ > + __sync_synchronize(); \ > + ovs_assert(x == 6); \ > + \ > + orig = __sync_fetch_and_and(&x, 10); \ > + ovs_assert(orig == 6); \ > + __sync_synchronize(); \ > + ovs_assert(x == 2); \ > + \ > + orig = __sync_fetch_and_xor(&x, 10); \ > + ovs_assert(orig == 2); \ > + __sync_synchronize(); \ > + ovs_assert(x == 8); \ > + }]], [dnl > +TEST_ATOMIC_TYPE(char); > +TEST_ATOMIC_TYPE(unsigned char); > +TEST_ATOMIC_TYPE(signed char); > +TEST_ATOMIC_TYPE(short); > +TEST_ATOMIC_TYPE(unsigned short); > +TEST_ATOMIC_TYPE(int); > +TEST_ATOMIC_TYPE(unsigned int); > +TEST_ATOMIC_TYPE(long int); > +TEST_ATOMIC_TYPE(unsigned long int); > +TEST_ATOMIC_TYPE(long long int); > +TEST_ATOMIC_TYPE(unsigned long long int); > +])], > + [ovs_cv_gcc4_atomics=yes], > + [ovs_cv_gcc4_atomics=no])]) > + if test $ovs_cv_gcc4_atomics = yes; then > + AC_DEFINE([HAVE_GCC4_ATOMICS], [1], > + [Define to 1 if the C compiler and linker supports the GCC > 4.0+ > + atomic built-ins.]) > + fi]) > + > dnl OVS_CHECK_ATOMIC_ALWAYS_LOCK_FREE(SIZE) > dnl > dnl Checks __atomic_always_lock_free(SIZE, 0) > -- > 1.7.2.5 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev X-CudaMail-Whitelist-To: dev@openvswitch.org _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev