[Mesa-dev] [PATCH 1/2] Clang doesn't have 64bit __atomic* builtins on i386

Nicolai Hähnle nhaehnle at gmail.com
Mon May 15 14:21:57 UTC 2017


On 13.05.2017 11:20, Jan Beich wrote:
> glsl/.libs/libstandalone.a(libmesautil_la-disk_cache.o): In function `disk_cache_remove':
> disk_cache.c:(.text+0x763): undefined reference to `__atomic_fetch_add_8'
> glsl/.libs/libstandalone.a(libmesautil_la-disk_cache.o): In function `cache_put':
> disk_cache.c:(.text+0xabc): undefined reference to `__atomic_fetch_add_8'
> disk_cache.c:(.text+0xec1): undefined reference to `__atomic_fetch_add_8'
> c++: error: linker command failed with exit code 1 (use -v to see invocation)
 >
> Signed-off-by: Jan Beich <jbeich at FreeBSD.org>

So... there's a bit of a conceptual problem here.

disk_cache uses atomics on mmap()ed files, and relies on atomicity 
across process boundaries.

This workaround will only result in atomicity local to each process, 
which really doesn't buy anything, because disk_cache updates are 
restricted to one thread per process anyway.

Why on earth don't you have 8-byte atomics? Are you still trying to 
support the original 386 or something?

Cheers,
Nicolai



> ---
>  configure.ac        | 13 ++++++++++++-
>  src/util/u_atomic.c |  4 ++++
>  2 files changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/configure.ac b/configure.ac
> index ce5301f3e4..08d8879986 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -415,13 +415,24 @@ AM_CONDITIONAL([GCC_ATOMIC_BUILTINS_SUPPORTED], [test x$GCC_ATOMIC_BUILTINS_SUPP
>
>  dnl Check if host supports 64-bit atomics
>  dnl note that lack of support usually results in link (not compile) error
> -AC_MSG_CHECKING(whether __sync_add_and_fetch_8 is supported)
> +save_CFLAGS=$CFLAGS
> +if test "x$GCC_ATOMIC_BUILTINS_SUPPORTED" = x1; then
> +    CFLAGS="$CFLAGS -DUSE_GCC_ATOMIC_BUILTINS"
> +    AC_MSG_CHECKING(whether __atomic_fetch_add_8 is supported)
> +else
> +    AC_MSG_CHECKING(whether __sync_add_and_fetch_8 is supported)
> +fi
>  AC_LINK_IFELSE([AC_LANG_SOURCE([[
>  #include <stdint.h>
>  uint64_t v;
>  int main() {
> +#ifdef USE_GCC_ATOMIC_BUILTINS
> +    return __atomic_add_fetch(&v, 1, __ATOMIC_ACQ_REL);
> +#else
>      return __sync_add_and_fetch(&v, (uint64_t)1);
> +#endif
>  }]])], GCC_64BIT_ATOMICS_SUPPORTED=yes, GCC_64BIT_ATOMICS_SUPPORTED=no)
> +CFLAGS=$save_CFLAGS
>  if test "x$GCC_64BIT_ATOMICS_SUPPORTED" != xyes; then
>      DEFINES="$DEFINES -DMISSING_64BIT_ATOMICS"
>  fi
> diff --git a/src/util/u_atomic.c b/src/util/u_atomic.c
> index 44b75fb0c0..691c34cf30 100644
> --- a/src/util/u_atomic.c
> +++ b/src/util/u_atomic.c
> @@ -34,6 +34,7 @@
>
>  static pthread_mutex_t sync_mutex = PTHREAD_MUTEX_INITIALIZER;
>
> +#ifndef USE_GCC_ATOMIC_BUILTINS
>  WEAK uint64_t
>  __sync_add_and_fetch_8(uint64_t *ptr, uint64_t val)
>  {
> @@ -60,6 +61,8 @@ __sync_sub_and_fetch_8(uint64_t *ptr, uint64_t val)
>     return r;
>  }
>
> +#else
> +
>  WEAK uint64_t
>  __atomic_fetch_add_8(uint64_t *ptr, uint64_t val, int memorder)
>  {
> @@ -71,5 +74,6 @@ __atomic_fetch_sub_8(uint64_t *ptr, uint64_t val, int memorder)
>  {
>     return __sync_sub_and_fetch(ptr, val);
>  }
> +#endif /* !USE_GCC_ATOMIC_BUILTINS */
>
>  #endif
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>


-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the mesa-dev mailing list