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

Grazvydas Ignotas notasas at gmail.com
Sun May 14 17:40:15 UTC 2017


Gražvydas


On Sat, May 13, 2017 at 12:20 PM, Jan Beich <jbeich at freebsd.org> 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>

Breaks build with -march=i486 on Linux:
u_atomic.c:35:24: warning: ‘sync_mutex’ defined but not used [-Wunused-variable]
  CXXLD    glsl_compiler
glsl/.libs/libstandalone.a(libmesautil_la-u_atomic.o): In function
`__atomic_fetch_add_8':
/home/notaz/src/radeon/mesa/src/util/u_atomic.c:69: undefined
reference to `__sync_add_and_fetch_8'
glsl/.libs/libstandalone.a(libmesautil_la-u_atomic.o): In function
`__atomic_fetch_sub_8':
/home/notaz/src/radeon/mesa/src/util/u_atomic.c:75: undefined
reference to `__sync_sub_and_fetch_8'

Perhaps need to amend this patch with copy-paste implementations of
__atomic_*() functions instead of them calling the sync_*()
counterparts. This atomic stuff is a minefield...

> ---
>  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


More information about the mesa-dev mailing list