diff mbox

[libdrm] configure.ac: rework compiler builtin atomic tests

Message ID 1440833570-31080-1-git-send-email-jsg@jsg.id.au (mailing list archive)
State New, archived
Headers show

Commit Message

Jonathan Gray Aug. 29, 2015, 7:32 a.m. UTC
The libdrm autoconf test for atomics uses __sync_val_compare_and_swap with
the address of a function argument which triggers a gcc ICE on sparc64
with the OpenBSD system compiler.

Mark Kettenis pointed out that while other architectures probably spill the
argument onto the stack this is likely not the case on register window
architectures like SPARC and suggested passing a pointer as an argument
instead which avoids the ICE and allows the drm libraries requiring
atomics to build on sparc64 with the autoconf build.

Reported-by: Christian Weisgerber <naddy@openbsd.org>
Signed-off-by: Jonathan Gray <jsg@jsg.id.au>
Reviewed-by: Mark Kettenis <kettenis@openbsd.org>
Reviewed-by: Matthieu Herrb <matthieu@openbsd.org>
---
 configure.ac | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Emil Velikov Nov. 16, 2015, 1:51 p.m. UTC | #1
Hi Jonathan,

On 29 August 2015 at 08:32, Jonathan Gray <jsg@jsg.id.au> wrote:
> The libdrm autoconf test for atomics uses __sync_val_compare_and_swap with
> the address of a function argument which triggers a gcc ICE on sparc64
> with the OpenBSD system compiler.
>
> Mark Kettenis pointed out that while other architectures probably spill the
> argument onto the stack this is likely not the case on register window
> architectures like SPARC and suggested passing a pointer as an argument
> instead which avoids the ICE and allows the drm libraries requiring
> atomics to build on sparc64 with the autoconf build.
>
> Reported-by: Christian Weisgerber <naddy@openbsd.org>
> Signed-off-by: Jonathan Gray <jsg@jsg.id.au>
> Reviewed-by: Mark Kettenis <kettenis@openbsd.org>
> Reviewed-by: Matthieu Herrb <matthieu@openbsd.org>
> ---
>  configure.ac | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/configure.ac b/configure.ac
> index f07507b..705ac3e 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -210,8 +210,8 @@ AC_CACHE_CHECK([for native atomic primitives], drm_cv_atomic_primitives, [
>         drm_cv_atomic_primitives="none"
>
>         AC_LINK_IFELSE([AC_LANG_PROGRAM([[
> -       int atomic_add(int i) { return __sync_fetch_and_add (&i, 1); }
> -       int atomic_cmpxchg(int i, int j, int k) { return __sync_val_compare_and_swap (&i, j, k); }
> +       int atomic_add(int *i) { return __sync_fetch_and_add (i, 1); }
> +       int atomic_cmpxchg(int *i, int j, int k) { return __sync_val_compare_and_swap (i, j, k); }
>                                           ]],[[]])], [drm_cv_atomic_primitives="Intel"],[])
>
Just pushed this patch to master.

Sorry that it took so long - must have missed it. Feel free to ping if
you catch us 'sleeping on the job'.

Thanks
Emil
diff mbox

Patch

diff --git a/configure.ac b/configure.ac
index f07507b..705ac3e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -210,8 +210,8 @@  AC_CACHE_CHECK([for native atomic primitives], drm_cv_atomic_primitives, [
 	drm_cv_atomic_primitives="none"
 
 	AC_LINK_IFELSE([AC_LANG_PROGRAM([[
-	int atomic_add(int i) { return __sync_fetch_and_add (&i, 1); }
-	int atomic_cmpxchg(int i, int j, int k) { return __sync_val_compare_and_swap (&i, j, k); }
+	int atomic_add(int *i) { return __sync_fetch_and_add (i, 1); }
+	int atomic_cmpxchg(int *i, int j, int k) { return __sync_val_compare_and_swap (i, j, k); }
 					  ]],[[]])], [drm_cv_atomic_primitives="Intel"],[])
 
 	if test "x$drm_cv_atomic_primitives" = "xnone"; then