From: Søren Sandmann Pedersen <s...@redhat.com> 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 --- configure.ac | 13 +++++++------ pixman/pixman-sse2.c | 6 ------ pixman/pixman.c | 19 ------------------- 3 files changed, 7 insertions(+), 31 deletions(-) diff --git a/configure.ac b/configure.ac index 2dd4776..ab38f5a 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 42c7209..47e8f75 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 9555cea..5490e59 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, -- 1.7.11.7 _______________________________________________ Pixman mailing list Pixman@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/pixman