From 617823801a0fd4105e0de308d6b4a4efedcd1fdf Mon Sep 17 00:00:00 2001 From: Austin English Date: Sun, 26 Jun 2016 17:51:05 -0500 Subject: 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(-) create mode 100644 x11-libs/pixman/files/pixman-0.32.8-clang.patch (limited to 'x11-libs') 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 000000000000..d5319292fbd8 --- /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 +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 +Signed-off-by: Andrea Canciani + +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 ++#include ++ ++/* 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 cefd42305df7..e612abc0ca83 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) -- cgit v1.2.3-65-gdbad