Use configure test for aligned attribute.
authorWerner Koch <wk@gnupg.org>
Wed, 21 Nov 2012 10:47:35 +0000 (11:47 +0100)
committerWerner Koch <wk@gnupg.org>
Wed, 21 Nov 2012 10:47:35 +0000 (11:47 +0100)
* configure.ac (HAVE_GCC_ATTRIBUTE_ALIGNED): New test and ac_define.
* cipher/cipher-internal.h, cipher/rijndael.c, random/rndhw.c: Use new
macro instead of a fixed test for __GNUC__.
--

We assume that compilers that grok "__attribute__ ((aligned (16)))"
implement that in the same way as gcc does.  In case it turns out
that this is not the case we will need to do two more things: Detect
such different behaviour and come up with a construct to allows the
use of that other style of alignment forcing.

cipher/cipher-internal.h
cipher/rijndael.c
configure.ac
random/rndhw.c

index 437e9c0..025bf2e 100644 (file)
@@ -31,7 +31,7 @@
    We use the aligned attribute, thus it is only possible to implement
    this with gcc.  */
 #undef NEED_16BYTE_ALIGNED_CONTEXT
-#if defined (__GNUC__)
+#ifdef HAVE_GCC_ATTRIBUTE_ALIGNED
 # define NEED_16BYTE_ALIGNED_CONTEXT 1
 #endif
 
index a2aedf0..b9ee8ad 100644 (file)
@@ -52,7 +52,7 @@
 
 
 /* Helper macro to force alignment to 16 bytes.  */
-#ifdef __GNUC__
+#ifdef HAVE_GCC_ATTRIBUTE_ALIGNED
 # define ATTR_ALIGNED_16  __attribute__ ((aligned (16)))
 #else
 # define ATTR_ALIGNED_16
@@ -63,7 +63,7 @@
    code.  */
 #undef USE_PADLOCK
 #ifdef ENABLE_PADLOCK_SUPPORT
-# ifdef __GNUC__
+# ifdef HAVE_GCC_ATTRIBUTE_ALIGNED
 #  if (defined (__i386__) && SIZEOF_UNSIGNED_LONG == 4) || defined(__x86_64__)
 #   define USE_PADLOCK 1
 #  endif
index 0e99ca5..a2235a8 100644 (file)
@@ -789,6 +789,21 @@ if test "$gcry_cv_visibility_attribute" = "yes" \
 fi
 
 
+#
+# Check whether the compiler supports the GCC style aligned attribute
+#
+AC_CACHE_CHECK([whether the GCC style aligned attribute is supported],
+       [gcry_cv_gcc_attribute_aligned],
+       [gcry_cv_gcc_attribute_aligned=no
+        AC_COMPILE_IFELSE([AC_LANG_SOURCE(
+          [[struct { int a; } foo __attribute__ ((aligned (16)));]])],
+          [gcry_cv_gcc_attribute_aligned=yes])])
+if test "$gcry_cv_gcc_attribute_aligned" = "yes" ; then
+   AC_DEFINE(HAVE_GCC_ATTRIBUTE_ALIGNED,1,
+     [Defined if a GCC style "__attribute__ ((aligned (n))" is supported])
+fi
+
+
 #######################################
 #### Checks for library functions. ####
 #######################################
@@ -1286,6 +1301,15 @@ cat <<G10EOF
 G10EOF
 fi
 
+if test "$gcry_cv_gcc_attribute_aligned" != "yes" ; then
+cat <<G10EOF
+
+   Please not that your compiler does not support the GCC style
+   aligned attribute. Using this software may evoke bus errors.
+
+G10EOF
+fi
+
 if test -n "$gpl"; then
   echo "Please note that you are building a version of Libgcrypt with"
   echo "  $gpl"
index 0a5c9fa..775d90f 100644 (file)
@@ -27,7 +27,7 @@
 
 #undef USE_PADLOCK
 #ifdef ENABLE_PADLOCK_SUPPORT
-# ifdef __GNUC__
+# ifdef HAVE_GCC_ATTRIBUTE_ALIGNED
 #  if (defined (__i386__) && SIZEOF_UNSIGNED_LONG == 4) || defined(__x86_64__)
 #   define USE_PADLOCK 1
 #  endif