diff options
author | Søren Sandmann Pedersen <ssp@redhat.com> | 2013-10-02 14:18:31 -0400 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@redhat.com> | 2013-10-04 03:12:44 -0400 |
commit | 1b39cb4a1a2401b0103355c1d44bdfa535f7b6ac (patch) | |
tree | 0401689845ab1b79199a85a1c63aae6a60c92de0 | |
parent | 66452ffb8696196341830fdd1e6943bcaeb902f7 (diff) |
configure.ac: For SSE2 and SSSE3 require GCC 4.4 and then use -mstackrealignstackrealign
Code compiled by GCC with -msse2 and -mssse3 assumes a 16 byte aligned
stack, but on x86-32 such alignment is not guaranteed.
Instead of using the __force_align_arg_pointer__ attribute on all
entry points that could potentially call into code compiled with
-msse2 or -mssse3, just compile pixman-sse2.c and pixman-ssse3.c with
-mstackrealign.
This fixes the glyph-test crash introduced by the previous commit and
also
https://bugs.freedesktop.org/show_bug.cgi?id=68300
-rw-r--r-- | configure.ac | 13 | ||||
-rw-r--r-- | pixman/pixman-sse2.c | 6 | ||||
-rw-r--r-- | pixman/pixman.c | 19 |
3 files changed, 7 insertions, 31 deletions
diff --git a/configure.ac b/configure.ac index 2dd47766..ab38f5a9 100644 --- a/configure.ac +++ b/configure.ac @@ -391,7 +391,7 @@ if test "x$SSE2_CFLAGS" = "x" ; then SSE2_CFLAGS="-xarch=sse2" fi else - SSE2_CFLAGS="-msse2 -Winline" + SSE2_CFLAGS="-mstackrealign -msse2 -Winline" fi fi @@ -401,10 +401,8 @@ xserver_save_CFLAGS=$CFLAGS CFLAGS="$SSE2_CFLAGS $CFLAGS" AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ -#if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)) -# if !defined(__amd64__) && !defined(__x86_64__) -# error "Need GCC >= 4.2 for SSE2 intrinsics on x86" -# endif +#if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 4)) +# error "Need GCC >= 4.4 for SSE2 intrinsics on x86" #endif #include <mmintrin.h> #include <xmmintrin.h> @@ -440,7 +438,7 @@ dnl =========================================================================== dnl Check for SSSE3 if test "x$SSSE3_CFLAGS" = "x" ; then - SSSE3_CFLAGS="-mssse3 -Winline" + SSSE3_CFLAGS="-mstackrealign -mssse3 -Winline" fi have_ssse3_intrinsics=no @@ -449,6 +447,9 @@ xserver_save_CFLAGS=$CFLAGS CFLAGS="$SSSE3_CFLAGS $CFLAGS" AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ +#if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 4)) +# error "Need GCC >= 4.4 for SSSE3 intrinsics on x86" +#endif #include <mmintrin.h> #include <xmmintrin.h> #include <emmintrin.h> diff --git a/pixman/pixman-sse2.c b/pixman/pixman-sse2.c index 42c72093..47e8f754 100644 --- a/pixman/pixman-sse2.c +++ b/pixman/pixman-sse2.c @@ -3312,9 +3312,6 @@ sse2_composite_over_n_8_8888 (pixman_implementation_t *imp, } -#if defined(__GNUC__) && !defined(__x86_64__) && !defined(__amd64__) -__attribute__((__force_align_arg_pointer__)) -#endif static pixman_bool_t sse2_fill (pixman_implementation_t *imp, uint32_t * bits, @@ -6411,9 +6408,6 @@ static const pixman_iter_info_t sse2_iters[] = { PIXMAN_null }, }; -#if defined(__GNUC__) && !defined(__x86_64__) && !defined(__amd64__) -__attribute__((__force_align_arg_pointer__)) -#endif pixman_implementation_t * _pixman_implementation_create_sse2 (pixman_implementation_t *fallback) { diff --git a/pixman/pixman.c b/pixman/pixman.c index 9555ceaa..5490e59a 100644 --- a/pixman/pixman.c +++ b/pixman/pixman.c @@ -547,25 +547,6 @@ analyze_extent (pixman_image_t *image, return TRUE; } -/* - * Work around GCC bug causing crashes in Mozilla with SSE2 - * - * When using -msse, gcc generates movdqa instructions assuming that - * the stack is 16 byte aligned. Unfortunately some applications, such - * as Mozilla and Mono, end up aligning the stack to 4 bytes, which - * causes the movdqa instructions to fail. - * - * The __force_align_arg_pointer__ makes gcc generate a prologue that - * realigns the stack pointer to 16 bytes. - * - * On x86-64 this is not necessary because the standard ABI already - * calls for a 16 byte aligned stack. - * - * See https://bugs.freedesktop.org/show_bug.cgi?id=15693 - */ -#if defined (USE_SSE2) && defined(__GNUC__) && !defined(__x86_64__) && !defined(__amd64__) -__attribute__((__force_align_arg_pointer__)) -#endif PIXMAN_EXPORT void pixman_image_composite32 (pixman_op_t op, pixman_image_t * src, |