This patch fixes gen-posix-lock-obj used during library build process to
generate gpg-error.h. libgpg-error package delivers the gpg-error.h
header file to the target system. When built on Solaris, the updated
part of the code generates definition of the gpgrt_lock_t so that it
respects the required alignment on SPARCv7 (32bit).
The fix can be tested using 'gmake test' in the libgcrypt component. If
not applied, the t-lock and random tests fail consistently. For more
information see: https://bugs.gnupg.org/gnupg/issue2378
The fix was created internally and offered for integration to the
upstream. It has not been accepted yet.
--- ./src/gen-posix-lock-obj.c.orig Mon Jun 13 08:07:53 2016
+++ ./src/gen-posix-lock-obj.c Mon Jun 13 08:08:40 2016
@@ -42,21 +42,8 @@
#endif
#endif
-/* Special requirements for certain platforms. */
-# define USE_LONG_DOUBLE_FOR_ALIGNMENT 0
-#if defined(__sun) && !defined (__LP64__) && !defined(_LP64)
-/* Solaris on 32-bit architecture. */
-# define USE_DOUBLE_FOR_ALIGNMENT 1
-#else
-# define USE_DOUBLE_FOR_ALIGNMENT 0
-#endif
-#if defined(__hppa__)
-# define USE_16BYTE_ALIGNMENT 1
-#else
-# define USE_16BYTE_ALIGNMENT 0
-#endif
-#if USE_16BYTE_ALIGNMENT && !HAVE_GCC_ATTRIBUTE_ALIGNED
+#if defined(__hppa__) && !HAVE_GCC_ATTRIBUTE_ALIGNED
# error compiler is not able to enforce a 16 byte alignment
#endif
@@ -122,12 +109,14 @@
"\n"
"#define GPGRT_LOCK_INITIALIZER {%d,{{",
SIZEOF_PTHREAD_MUTEX_T,
-# if USE_16BYTE_ALIGNMENT
+/* Special requirements for certain platforms. */
+# ifdef (__hppa__)
" int _x16_align __attribute__ ((aligned (16)));\n",
-# elif USE_DOUBLE_FOR_ALIGNMENT
- " double _xd_align;\n",
-# elif USE_LONG_DOUBLE_FOR_ALIGNMENT
- " long double _xld_align;\n",
+# elif defined(__sun)
+ "#if (defined(__sparc) || defined(__sparc__)) && \\\n"
+ " !defined (__LP64__) && !defined(_LP64)\n"
+ " double _xd_align;\n"
+ "#endif\n",
# else
"",
# endif