[PATCH] Fix struct alignment on hppa-linux

Werner Koch wk at gnupg.org
Tue Aug 5 19:35:20 CEST 2014


On Tue,  5 Aug 2014 18:42, wk at gnupg.org said:

> thus I need to check how to fix it in a portable way.  Enforcing a 16
> byte alignment might for all platfrom won't harm anyway.

but that would be an ABI break.  Thus I basically use the proposed
patch:

>From 3325403c0dd2949bf52efa1b9a5b5cf3191110f9 Mon Sep 17 00:00:00 2001
From: Werner Koch <wk at gnupg.org>
Date: Tue, 5 Aug 2014 19:32:51 +0200
Subject: [PATCH] Use 16 byte alignment for hppa-unknown-linux-gnu.

* configure.ac (HAVE_GCC_ATTRIBUTE_ALIGNED): New.
* src/gen-posix-lock-obj.c (USE_16BYTE_ALIGNMENT): Set for HPPA-Linux.
(main): Enforce alignment if needed.
* src/syscfg/lock-obj-pub.hppa-unknown-linux-gnu.h: Use 16 byte
alignment.
--

Debian-bug-id: 757060
---
 configure.ac                                     | 23 ++++++++++++++++++++++-
 src/gen-posix-lock-obj.c                         | 19 +++++++++++++++++++
 src/syscfg/lock-obj-pub.hppa-unknown-linux-gnu.h |  1 +
 3 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/configure.ac b/configure.ac
index 653d7ed..e1f167f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -167,6 +167,20 @@ AC_CHECK_FUNCS([flockfile])
 # Checks for typedefs, structures, and compiler characteristics.
 AC_C_CONST
 
+#
+# 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
+
 
 # Check for thread library.
 #
@@ -278,5 +292,12 @@ echo "
 
         Revision: mym4_revision  (mym4_revision_dec)
         Platform: $host
-
 "
+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
diff --git a/src/gen-posix-lock-obj.c b/src/gen-posix-lock-obj.c
index df732c3..d2bc645 100644
--- a/src/gen-posix-lock-obj.c
+++ b/src/gen-posix-lock-obj.c
@@ -40,6 +40,19 @@
 # error sizeof pthread_mutex_t is not known.
 #endif
 
+/* Special requirements for certain platforms.  */
+#if defined(__hppa__) && defined(__linux__)
+# define USE_16BYTE_ALIGNMENT 1
+#else
+# define USE_16BYTE_ALIGNMENT 0
+#endif
+
+
+#if USE_16BYTE_ALIGNMENT && !HAVE_GCC_ATTRIBUTE_ALIGNED
+# error compiler is not able to enforce a 16 byte alignment
+#endif
+
+
 static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
 
 
@@ -76,6 +89,7 @@ main (void)
           "  long _vers;\n"
           "  union {\n"
           "    volatile char _priv[%d];\n"
+          "%s"
           "    long _x_align;\n"
           "    long *_xp_align;\n"
           "  } u;\n"
@@ -84,6 +98,11 @@ main (void)
           "#define GPGRT_LOCK_INITIALIZER {%d,{{",
           HOST_TRIPLET_STRING,
           SIZEOF_PTHREAD_MUTEX_T,
+#if USE_16BYTE_ALIGNMENT
+          "    int _x16_align __attribute__ ((aligned (16)));\n",
+#else
+          "",
+#endif
           LOCK_ABI_VERSION);
   p = (unsigned char *)&mtx;
   for (i=0; i < sizeof mtx; i++)
diff --git a/src/syscfg/lock-obj-pub.hppa-unknown-linux-gnu.h b/src/syscfg/lock-obj-pub.hppa-unknown-linux-gnu.h
index fd47664..b57bb76 100644
--- a/src/syscfg/lock-obj-pub.hppa-unknown-linux-gnu.h
+++ b/src/syscfg/lock-obj-pub.hppa-unknown-linux-gnu.h
@@ -7,6 +7,7 @@ typedef struct
   long _vers;
   union {
     volatile char _priv[48];
+    int _x16_align __attribute__ ((aligned (16)));
     long _x_align;
     long *_xp_align;
   } u;
-- 
1.8.4.3




Salam-Shalom,

   Werner

-- 
Die Gedanken sind frei.  Ausnahmen regelt ein Bundesgesetz.




More information about the Gnupg-devel mailing list