commit:     617823801a0fd4105e0de308d6b4a4efedcd1fdf
Author:     Austin English <wizardedit <AT> gentoo <DOT> org>
AuthorDate: Sun Jun 26 22:51:05 2016 +0000
Commit:     Austin English <wizardedit <AT> gentoo <DOT> org>
CommitDate: Sun Jun 26 22:52:09 2016 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=61782380

x11-libs/pixman: fix building with Clang

Gentoo-Bug: https://bugs.gentoo.org/566048

Package-Manager: portage-2.2.28

 x11-libs/pixman/files/pixman-0.32.8-clang.patch | 93 +++++++++++++++++++++++++
 x11-libs/pixman/pixman-0.32.8.ebuild            |  7 +-
 2 files changed, 99 insertions(+), 1 deletion(-)

diff --git a/x11-libs/pixman/files/pixman-0.32.8-clang.patch 
b/x11-libs/pixman/files/pixman-0.32.8-clang.patch
new file mode 100644
index 0000000..d531929
--- /dev/null
+++ b/x11-libs/pixman/files/pixman-0.32.8-clang.patch
@@ -0,0 +1,93 @@
+From d24b415f3e2753a588759d028b811e1ce38fea6c Mon Sep 17 00:00:00 2001
+From: Andrea Canciani <ranm...@gmail.com>
+Date: Sun, 11 Oct 2015 09:45:57 +0200
+Subject: mmx: Improve detection of support for "K" constraint
+
+Older versions of clang emitted an error on the "K" constraint, but at
+least since version 3.7 it is supported. Just like gcc, this
+constraint is only allowed for constants, but apparently clang
+requires them to be known before inlining.
+
+Using the macro definition _mm_shuffle_pi16(A, N) ensures that the "K"
+constraint is always applied to a literal constant, independently from
+the compiler optimizations and allows building pixman-mmx on modern
+clang.
+
+Reviewed-by: Matt Turner <matts...@gmail.com>
+Signed-off-by: Andrea Canciani <ranm...@gmail.com>
+
+diff --git a/configure.ac b/configure.ac
+index 2178126..3a66909 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -347,15 +347,27 @@ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+ #error "Need GCC >= 3.4 for MMX intrinsics"
+ #endif
+ #include <mmintrin.h>
++#include <stdint.h>
++
++/* Check support for block expressions */
++#define _mm_shuffle_pi16(A, N)                                                
\
++    ({                                                                        
\
++      __m64 ret;                                                      \
++                                                                      \
++      /* Some versions of clang will choke on K */                    \
++      asm ("pshufw %2, %1, %0\n\t"                                    \
++           : "=y" (ret)                                               \
++           : "y" (A), "K" ((const int8_t)N)                           \
++      );                                                              \
++                                                                      \
++      ret;                                                            \
++    })
++
+ int main () {
+     __m64 v = _mm_cvtsi32_si64 (1);
+     __m64 w;
+ 
+-    /* Some versions of clang will choke on K */
+-    asm ("pshufw %2, %1, %0\n\t"
+-        : "=y" (w)
+-        : "y" (v), "K" (5)
+-    );
++    w = _mm_shuffle_pi16(v, 5);
+ 
+     /* Some versions of clang will choke on this */
+     asm ("pmulhuw %1, %0\n\t"
+diff --git a/pixman/pixman-mmx.c b/pixman/pixman-mmx.c
+index 05c48a4..dec3974 100644
+--- a/pixman/pixman-mmx.c
++++ b/pixman/pixman-mmx.c
+@@ -89,21 +89,7 @@ _mm_mulhi_pu16 (__m64 __A, __m64 __B)
+     return __A;
+ }
+ 
+-#  ifdef __OPTIMIZE__
+-extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, 
__artificial__))
+-_mm_shuffle_pi16 (__m64 __A, int8_t const __N)
+-{
+-    __m64 ret;
+-
+-    asm ("pshufw %2, %1, %0\n\t"
+-      : "=y" (ret)
+-      : "y" (__A), "K" (__N)
+-    );
+-
+-    return ret;
+-}
+-#  else
+-#   define _mm_shuffle_pi16(A, N)                                     \
++# define _mm_shuffle_pi16(A, N)                                               
\
+     ({                                                                        
\
+       __m64 ret;                                                      \
+                                                                       \
+@@ -114,7 +100,6 @@ _mm_shuffle_pi16 (__m64 __A, int8_t const __N)
+                                                                       \
+       ret;                                                            \
+     })
+-#  endif
+ # endif
+ #endif
+ 
+-- 
+cgit v0.10.2
+

diff --git a/x11-libs/pixman/pixman-0.32.8.ebuild 
b/x11-libs/pixman/pixman-0.32.8.ebuild
index cefd423..e612abc 100644
--- a/x11-libs/pixman/pixman-0.32.8.ebuild
+++ b/x11-libs/pixman/pixman-0.32.8.ebuild
@@ -1,8 +1,9 @@
-# Copyright 1999-2015 Gentoo Foundation
+# Copyright 1999-2016 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
 # $Id$
 
 EAPI=5
+XORG_EAUTORECONF=yes
 XORG_MULTILIB=yes
 inherit xorg-2 toolchain-funcs versionator
 
@@ -16,6 +17,10 @@ RDEPEND="abi_x86_32? (
        !app-emulation/emul-linux-x86-gtklibs[-abi_x86_32(-)]
        )"
 
+PATCHES=(
+       "${FILESDIR}/${P}-clang.patch"
+)
+
 src_configure() {
        XORG_CONFIGURE_OPTIONS=(
                $(use_enable cpu_flags_x86_mmxext mmx)

Reply via email to