From 8e41df8389ae4b94944671de4ad7fab29e0b58bd Mon Sep 17 00:00:00 2001 From: q66 Date: Fri, 10 Jan 2020 17:39:06 +0100 Subject: [PATCH] apr: use __atomic instead of __sync for builtins for 64-bit atomics This allows us to use libatomic on architectures without native support, unlike __sync. --- srcpkgs/apr/patches/atomic64.patch | 56 ++++++++++++++++++++++++++++++ srcpkgs/apr/template | 10 +++++- 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 srcpkgs/apr/patches/atomic64.patch diff --git a/srcpkgs/apr/patches/atomic64.patch b/srcpkgs/apr/patches/atomic64.patch new file mode 100644 index 00000000000..afd06447e01 --- /dev/null +++ b/srcpkgs/apr/patches/atomic64.patch @@ -0,0 +1,56 @@ +commit 69e9378eb86357d4361322256d5d5a39ff4a592d +Author: q66 +Date: Fri Jan 10 13:04:37 2020 +0100 + + use __atomic builtins instead of legacy __sync + + This allows for 64-bit atomic ops on platforms that don't natively + support them such as armv6 and ppc32. + +diff --git atomic/unix/builtins64.c atomic/unix/builtins64.c +index 4a4b685..90b5c5e 100644 +--- atomic/unix/builtins64.c ++++ atomic/unix/builtins64.c +@@ -30,35 +30,34 @@ APR_DECLARE(void) apr_atomic_set64(volatile apr_uint64_t *mem, apr_uint64_t val) + + APR_DECLARE(apr_uint64_t) apr_atomic_add64(volatile apr_uint64_t *mem, apr_uint64_t val) + { +- return __sync_fetch_and_add(mem, val); ++ return __atomic_fetch_add(mem, val, __ATOMIC_SEQ_CST); + } + + APR_DECLARE(void) apr_atomic_sub64(volatile apr_uint64_t *mem, apr_uint64_t val) + { +- __sync_fetch_and_sub(mem, val); ++ __atomic_fetch_sub(mem, val, __ATOMIC_SEQ_CST); + } + + APR_DECLARE(apr_uint64_t) apr_atomic_inc64(volatile apr_uint64_t *mem) + { +- return __sync_fetch_and_add(mem, 1); ++ return __atomic_fetch_add(mem, 1, __ATOMIC_SEQ_CST); + } + + APR_DECLARE(int) apr_atomic_dec64(volatile apr_uint64_t *mem) + { +- return __sync_sub_and_fetch(mem, 1); ++ return (int)__atomic_sub_fetch(mem, 1, __ATOMIC_SEQ_CST); + } + + APR_DECLARE(apr_uint64_t) apr_atomic_cas64(volatile apr_uint64_t *mem, apr_uint64_t with, + apr_uint64_t cmp) + { +- return __sync_val_compare_and_swap(mem, cmp, with); ++ __atomic_compare_exchange_n(mem, &cmp, with, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); ++ return cmp; + } + + APR_DECLARE(apr_uint64_t) apr_atomic_xchg64(volatile apr_uint64_t *mem, apr_uint64_t val) + { +- __sync_synchronize(); +- +- return __sync_lock_test_and_set(mem, val); ++ return __atomic_exchange_n(mem, val, __ATOMIC_SEQ_CST); + } + + #endif /* USE_ATOMICS_BUILTINS */ diff --git a/srcpkgs/apr/template b/srcpkgs/apr/template index d4b2416f0d4..07532f03751 100644 --- a/srcpkgs/apr/template +++ b/srcpkgs/apr/template @@ -1,7 +1,7 @@ # Template file for 'apr' pkgname=apr version=1.7.0 -revision=1 +revision=2 build_style=gnu-configure configure_args="--with-installbuilddir=/usr/share/apr-1/build" makedepends="expat-devel libuuid-devel" @@ -22,6 +22,14 @@ if [ "$CROSS_BUILD" ]; then configure_args+=" apr_cv_mutex_robust_shared=yes" fi +case "$XBPS_TARGET_MACHINE" in + ppc64*) ;; + ppc*|armv[56]*|mips*) + makedepends+=" libatomic-devel" + LDFLAGS="-latomic" + ;; +esac + pre_build() { if [ "$CROSS_BUILD" ]; then sed -i "/LINK_PROG.*OBJECTS_gen_test_char/s|.*|\t${BUILD_CC} ${BUILD_CFLAGS} tools/gen_test_char.c -o tools/gen_test_char|" Makefile