# HG changeset patch
# Parent 4bb6a086dc232e27851ff33b22610d45dd18be57
Fix <iso/math_c99.h> signbit on Solaris
@@ -2,11 +2,11 @@
*
* DO NOT EDIT THIS FILE (fixincl.x)
*
- * It has been AutoGen-ed Tuesday January 7, 2014 at 12:02:54 PM MET
+ * It has been AutoGen-ed Wednesday June 25, 2014 at 05:24:42 PM MEST
* From the definitions inclhack.def
* and the template file fixincl
*/
-/* DO NOT SVN-MERGE THIS FILE, EITHER Tue Jan 7 12:02:54 MET 2014
+/* DO NOT SVN-MERGE THIS FILE, EITHER Wed Jun 25 17:24:42 MEST 2014
*
* You must regenerate it. Use the ./genfixes script.
*
@@ -15,7 +15,7 @@
* certain ANSI-incompatible system header files which are fixed to work
* correctly with ANSI C and placed in a directory that GNU C will search.
*
- * This file contains 224 fixup descriptions.
+ * This file contains 225 fixup descriptions.
*
* See README for more information.
*
@@ -6893,6 +6893,60 @@ static const char* apzSolaris_Math_9Patc
/* * * * * * * * * * * * * * * * * * * * * * * * * *
*
+ * Description of Solaris_Math_11 fix
+ */
+tSCC zSolaris_Math_11Name[] =
+ "solaris_math_11";
+
+/*
+ * File name selection pattern
+ */
+tSCC zSolaris_Math_11List[] =
+ "iso/math_c99.h\0";
+/*
+ * Machine/OS name selection pattern
+ */
+#define apzSolaris_Math_11Machs (const char**)NULL
+
+/*
+ * content selection pattern - do fix if pattern found
+ */
+tSCC zSolaris_Math_11Select0[] =
+ "@\\(#\\)math_c99\\.h[ \t]+1\\.[0-9]+[ \t]+[0-9/]+ ";
+
+#define SOLARIS_MATH_11_TEST_CT 1
+static tTestDesc aSolaris_Math_11Tests[] = {
+ { TT_EGREP, zSolaris_Math_11Select0, (regex_t*)NULL }, };
+
+/*
+ * Fix Command Arguments for Solaris_Math_11
+ */
+static const char* apzSolaris_Math_11Patch[] = {
+ "format",
+ "#undef\tsignbit\n\
+#define\tsignbit(x)\t(sizeof(x) == sizeof(float) \\\n\
+\t\t\t ? __builtin_signbitf(x) \\\n\
+\t\t\t : sizeof(x) == sizeof(long double) \\\n\
+\t\t\t ? __builtin_signbitl(x) \\\n\
+\t\t\t : __builtin_signbit(x))",
+ "^#undef[ \t]+signbit\n\
+#if defined\\(__sparc\\)\n\
+#define[ \t]+signbit\\(x\\)[ \t]+__extension__\\( \\\\\n\
+[ \t]+\\{[ \t]*__typeof\\(x\\)[ \t]*__x_s[ \t]*=[ \t]*\\(x\\);[ \t]*\\\\\n\
+[ \t]+\\(int\\)[ \t]*\\(\\*\\(unsigned[ \t]*\\*\\)[ \t]*\\&__x_s[ \t]*>>[ \t]*31\\);[ \t]*\\}\\)\n\
+#elif defined\\(__i386\\) \\|\\| defined\\(__amd64\\)\n\
+#define[ \t]+signbit\\(x\\)[ \t]+__extension__\\( \\\\\n\
+[ \t]+\\{ __typeof\\(x\\) __x_s = \\(x\\); \\\\\n\
+[ \t]+\\(sizeof \\(__x_s\\) == sizeof \\(float\\) \\? \\\\\n\
+[ \t]+\\(int\\) \\(\\*\\(unsigned \\*\\) \\&__x_s >> 31\\) : \\\\\n\
+[ \t]+sizeof \\(__x_s\\) == sizeof \\(double\\) \\? \\\\\n\
+[ \t]+\\(int\\) \\(\\(\\(unsigned \\*\\) \\&__x_s\\)\\[1\\] >> 31\\) : \\\\\n\
+[ \t]+\\(int\\) \\(\\(\\(unsigned short \\*\\) \\&__x_s\\)\\[4\\] >> 15\\)\\); \\}\\)\n\
+#endif",
+ (char*)NULL };
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * *
+ *
* Description of Solaris_Once_Init_1 fix
*/
tSCC zSolaris_Once_Init_1Name[] =
@@ -9187,9 +9241,9 @@ static const char* apzX11_SprintfPatch[]
*
* List of all fixes
*/
-#define REGEX_COUNT 261
+#define REGEX_COUNT 262
#define MACH_LIST_SIZE_LIMIT 187
-#define FIX_COUNT 224
+#define FIX_COUNT 225
/*
* Enumerate the fixes
@@ -9361,6 +9415,7 @@ typedef enum {
SOLARIS_MATH_4_FIXIDX,
SOLARIS_MATH_8_FIXIDX,
SOLARIS_MATH_9_FIXIDX,
+ SOLARIS_MATH_11_FIXIDX,
SOLARIS_ONCE_INIT_1_FIXIDX,
SOLARIS_POSIX_SPAWN_RESTRICT_FIXIDX,
SOLARIS_POW_INT_OVERLOAD_FIXIDX,
@@ -10252,6 +10307,11 @@ tFixDesc fixDescList[ FIX_COUNT ] = {
SOLARIS_MATH_9_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE,
aSolaris_Math_9Tests, apzSolaris_Math_9Patch, 0 },
+ { zSolaris_Math_11Name, zSolaris_Math_11List,
+ apzSolaris_Math_11Machs,
+ SOLARIS_MATH_11_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE,
+ aSolaris_Math_11Tests, apzSolaris_Math_11Patch, 0 },
+
{ zSolaris_Once_Init_1Name, zSolaris_Once_Init_1List,
apzSolaris_Once_Init_1Machs,
SOLARIS_ONCE_INIT_1_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE,
@@ -3562,6 +3562,53 @@ fix = {
};
/*
+ * Newer Solaris 10/11 GCC signbit implementations cause strict-aliasing
+ * warnings.
+ */
+fix = {
+ hackname = solaris_math_11;
+ select = '@\(#\)math_c99\.h' "[ \t]+1\\.[0-9]+[ \t]+[0-9/]+ ";
+ files = iso/math_c99.h;
+ c_fix = format;
+ c_fix_arg = "#undef\tsignbit\n"
+ "#define\tsignbit(x)\t(sizeof(x) == sizeof(float) \\\n"
+ "\t\t\t ? __builtin_signbitf(x) \\\n"
+ "\t\t\t : sizeof(x) == sizeof(long double) \\\n"
+ "\t\t\t ? __builtin_signbitl(x) \\\n"
+ "\t\t\t : __builtin_signbit(x))";
+ c_fix_arg = "^#undef[ \t]+signbit\n"
+ "#if defined\\(__sparc\\)\n"
+ "#define[ \t]+signbit\\(x\\)[ \t]+__extension__\\( \\\\\n"
+ "[ \t]+\\{[ \t]*__typeof\\(x\\)[ \t]*__x_s[ \t]*=[ \t]*\\(x\\);[ \t]*\\\\\n"
+ "[ \t]+\\(int\\)[ \t]*\\(\\*\\(unsigned[ \t]*\\*\\)[ \t]*\\&__x_s[ \t]*>>[ \t]*31\\);[ \t]*\\}\\)\n"
+ "#elif defined\\(__i386\\) \\|\\| defined\\(__amd64\\)\n"
+ "#define[ \t]+signbit\\(x\\)[ \t]+__extension__\\( \\\\\n"
+ "[ \t]+\\{ __typeof\\(x\\) __x_s = \\(x\\); \\\\\n"
+ "[ \t]+\\(sizeof \\(__x_s\\) == sizeof \\(float\\) \\? \\\\\n"
+ "[ \t]+\\(int\\) \\(\\*\\(unsigned \\*\\) \\&__x_s >> 31\\) : \\\\\n"
+ "[ \t]+sizeof \\(__x_s\\) == sizeof \\(double\\) \\? \\\\\n"
+ "[ \t]+\\(int\\) \\(\\(\\(unsigned \\*\\) \\&__x_s\\)\\[1\\] >> 31\\) : \\\\\n"
+ "[ \t]+\\(int\\) \\(\\(\\(unsigned short \\*\\) \\&__x_s\\)\\[4\\] >> 15\\)\\); \\}\\)\n"
+ "#endif";
+ test_text =
+ "/* @(#)math_c99.h 1.14 13/03/27 */\n"
+ "#undef signbit\n"
+ "#if defined(__sparc)\n"
+ "#define signbit(x) __extension__( \\\\\n"
+ " { __typeof(x) __x_s = (x); \\\\\n"
+ " (int) (*(unsigned *) &__x_s >> 31); })\n"
+ "#elif defined(__i386) || defined(__amd64)\n"
+ "#define signbit(x) __extension__( \\\\\n"
+ " { __typeof(x) __x_s = (x); \\\\\n"
+ " (sizeof (__x_s) == sizeof (float) ? \\\\\n"
+ " (int) (*(unsigned *) &__x_s >> 31) : \\\\\n"
+ " sizeof (__x_s) == sizeof (double) ? \\\\\n"
+ " (int) (((unsigned *) &__x_s)[1] >> 31) : \\\\\n"
+ " (int) (((unsigned short *) &__x_s)[4] >> 15)); })\n"
+ "#endif";
+};
+
+/*
* Sun Solaris defines PTHREAD_ONCE_INIT as an array containing a
* structure. As such, it need two levels of brackets, but only
* contains one. Wrap the macro definition in an extra layer.
@@ -75,3 +75,14 @@
#undef isunordered
#define isunordered(x, y) __builtin_isunordered(x, y)
#endif /* SOLARIS_MATH_9_CHECK */
+
+
+#if defined( SOLARIS_MATH_11_CHECK )
+/* @(#)math_c99.h 1.14 13/03/27 */
+#undef signbit
+#define signbit(x) (sizeof(x) == sizeof(float) \
+ ? __builtin_signbitf(x) \
+ : sizeof(x) == sizeof(long double) \
+ ? __builtin_signbitl(x) \
+ : __builtin_signbit(x))
+#endif /* SOLARIS_MATH_11_CHECK */
new file mode 100644
@@ -0,0 +1,11 @@
+/* Some versions of Solaris <math.h> give strict-aliasing warnings for
+ signbit. */
+/* { dg-options "-std=c99 -O2 -Wstrict-aliasing" } */
+
+#include <math.h>
+
+int
+main (void)
+{
+ return signbit (1.0f) | signbit (1.0) | signbit (1.0l);;
+}