[Mesa-dev] [PATCH V3] mesa: use build flag to ensure stack is realigned on x86

Timothy Arceri t_arceri at yahoo.com.au
Mon Dec 8 21:43:41 PST 2014


Nowadays GCC assumes stack pointer is 16-byte aligned even on 32-bits, but
 that is an assumption OpenGL drivers (or any dynamic library for that matter)
 can't afford to make as there are many closed- and open- source application
 binaries out there that only assume 4-byte stack alignment.

V3: move all sse4.1 build flag config to the same location
 and add comment as to why we need to do the realign

V2: use $target_cpu rather than $host_cpu
  and setup build flags in config rather than makefile

https://bugs.freedesktop.org/show_bug.cgi?id=86788
Signed-off-by: Timothy Arceri <t_arceri at yahoo.com.au>
Reviewed-by: Matt Turner <mattst88 at gmail.com>
CC: "10.4" <mesa-stable at lists.freedesktop.org>
---
 If there are no other comments I'll commit it to master
 tomorrow.

 The last hunk should be dropped when applying to 10.4.

 configure.ac               | 11 ++++++++++-
 src/mesa/Makefile.am       |  2 +-
 src/mesa/main/sse_minmax.c |  3 ---
 3 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/configure.ac b/configure.ac
index b0df1bb..e510bcf 100644
--- a/configure.ac
+++ b/configure.ac
@@ -253,8 +253,16 @@ AC_SUBST([VISIBILITY_CXXFLAGS])
 dnl
 dnl Optional flags, check for compiler support
 dnl
+SSE41_CFLAGS="-msse4.1"
+dnl 32-bit Mesa is 4-byte aligned to allow support for old applications
+dnl therefore we need to realign the stack when using SSE
+case "$target_cpu" in
+    i?86)
+        SSE41_CFLAGS="$SSE41_CFLAGS -mstackrealign"
+    ;;
+esac
 save_CFLAGS="$CFLAGS"
-CFLAGS="-msse4.1 $CFLAGS"
+CFLAGS="$SSE41_CFLAGS $CFLAGS"
 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
 #include <smmintrin.h>
 int main () {
@@ -267,6 +275,7 @@ if test "x$SSE41_SUPPORTED" = x1; then
     DEFINES="$DEFINES -DUSE_SSE41"
 fi
 AM_CONDITIONAL([SSE41_SUPPORTED], [test x$SSE41_SUPPORTED = x1])
+AC_SUBST([SSE41_CFLAGS], $SSE41_CFLAGS)
 
 dnl Can't have static and shared libraries, default to static if user
 dnl explicitly requested. If both disabled, set to static since shared
diff --git a/src/mesa/Makefile.am b/src/mesa/Makefile.am
index 932db4f..3b68573 100644
--- a/src/mesa/Makefile.am
+++ b/src/mesa/Makefile.am
@@ -153,7 +153,7 @@ libmesagallium_la_LIBADD = \
 libmesa_sse41_la_SOURCES = \
 	main/streaming-load-memcpy.c \
 	main/sse_minmax.c
-libmesa_sse41_la_CFLAGS = $(AM_CFLAGS) -msse4.1
+libmesa_sse41_la_CFLAGS = $(AM_CFLAGS) $(SSE41_CFLAGS)
 
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = gl.pc
diff --git a/src/mesa/main/sse_minmax.c b/src/mesa/main/sse_minmax.c
index 93cf2a6..222ac14 100644
--- a/src/mesa/main/sse_minmax.c
+++ b/src/mesa/main/sse_minmax.c
@@ -31,9 +31,6 @@
 #include <stdint.h>
 
 void
-#if !defined(__x86_64__)
-   __attribute__((force_align_arg_pointer))
-#endif
 _mesa_uint_array_min_max(const unsigned *ui_indices, unsigned *min_index,
                          unsigned *max_index, const unsigned count)
 {
-- 
1.9.3



More information about the mesa-dev mailing list