This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix PR target/19933 and PR target/21315
- From: Eric Botcazou <ebotcazou at libertysurf dot fr>
- To: gcc-patches at gcc dot gnu dot org
- Cc: Bruce <bkorb at gnu dot org>,"Joseph S. Myers" <joseph at codesourcery dot com>,Mark Mitchell <mark at codesourcery dot com>
- Date: Wed, 18 May 2005 11:06:17 +0200
- Subject: Re: [PATCH] Fix PR target/19933 and PR target/21315
- References: <200505121514.03992.ebotcazou@libertysurf.fr>
> With the invaluable help of Joseph who untangled the subtleties of the C99
> builtins for me, I've come up with the following patch for 4.x (I'd like
> something for 3.4.x at one point).
Revised version attached, with modifications suggested by Joseph. Retested on
sparc-sun-solaris2.10.
2005-05-18 Eric Botcazou <ebotcazou@libertysurf.fr>
Joseph S. Myers <joseph@codesourcery.com>
PR target/19933
PR target/21315
* inclhack.def: New fixes solaris_math_[1-9].
* fixincl.x: Regenerate.
* tests/base/iso/math_c99.h: New.
--
Eric Botcazou
Index: inclhack.def
===================================================================
RCS file: /cvs/gcc/gcc/fixincludes/inclhack.def,v
retrieving revision 1.16.14.3
diff -u -r1.16.14.3 inclhack.def
--- inclhack.def 10 May 2005 00:27:53 -0000 1.16.14.3
+++ inclhack.def 18 May 2005 08:45:51 -0000
@@ -2564,6 +2564,176 @@
test_text = "extern int utime(const char *, struct utimbuf *);";
};
+/*
+ * Sun Solaris 10 defines several C99 math macros in terms of
+ * builtins specific to the Studio compiler, in particular not
+ * compatible with the GNU compiler.
+ */
+fix = {
+ hackname = solaris_math_1;
+ select = '@\(#\)math_c99.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
+ bypass = "__GNUC__";
+ files = iso/math_c99.h;
+ c_fix = format;
+ c_fix_arg = "#define\tHUGE_VA%1\t(__builtin_huge_va%2())";
+ c_fix_arg = "^#define[ \t]+HUGE_VA([LF]+)[ \t]+__builtin_huge_va([lf]+)";
+ test_text =
+ '#ident "@(#)math_c99.h 1.9 04/11/01 SMI"'"\n"
+ "#undef HUGE_VAL\n"
+ "#define HUGE_VAL __builtin_huge_val\n"
+ "#undef HUGE_VALF\n"
+ "#define HUGE_VALF __builtin_huge_valf\n"
+ "#undef HUGE_VALL\n"
+ "#define HUGE_VALL __builtin_huge_vall";
+};
+
+fix = {
+ hackname = solaris_math_2;
+ select = '@\(#\)math_c99.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
+ bypass = "__GNUC__";
+ files = iso/math_c99.h;
+ c_fix = format;
+ c_fix_arg = "#define\tINFINITY\t(__builtin_inff())";
+ c_fix_arg = "^#define[ \t]+INFINITY[ \t]+__builtin_infinity";
+ test_text =
+ '#ident "@(#)math_c99.h 1.9 04/11/01 SMI"'"\n"
+ "#undef INFINITY\n"
+ "#define INFINITY __builtin_infinity";
+};
+
+fix = {
+ hackname = solaris_math_3;
+ select = '@\(#\)math_c99.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
+ bypass = "__GNUC__";
+ files = iso/math_c99.h;
+ c_fix = format;
+ c_fix_arg = "#define\tNAN\t\t(__builtin_nanf(\"\"))";
+ c_fix_arg = "^#define[ \t]+NAN[ \t]+__builtin_nan";
+ test_text =
+ '#ident "@(#)math_c99.h 1.9 04/11/01 SMI"'"\n"
+ "#undef NAN\n"
+ "#define NAN __builtin_nan";
+};
+
+fix = {
+ hackname = solaris_math_4;
+ select = '@\(#\)math_c99.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
+ bypass = "__GNUC__";
+ files = iso/math_c99.h;
+ c_fix = format;
+ c_fix_arg = "#define\tfpclassify(x) \\\n"
+ " __extension__ ({ __typeof(x) __x_fp = (x); \\\n"
+ "\t\t isnan(__x_fp) \\\n"
+ "\t\t ? FP_NAN \\\n"
+ "\t\t : isinf(__x_fp) \\\n"
+ "\t\t ? FP_INFINITE \\\n"
+ "\t\t : isnormal(__x_fp) \\\n"
+ "\t\t\t ? FP_NORMAL \\\n"
+ "\t\t\t : __x_fp == 0.0 \\\n"
+ "\t\t\t ? FP_ZERO \\\n"
+ "\t\t\t : FP_SUBNORMAL; })";
+ c_fix_arg = "^#define[ \t]+fpclassify\\(x\\)[ \t]+__builtin_fpclassify\\(x\\)";
+ test_text =
+ '#ident "@(#)math_c99.h 1.9 04/11/01 SMI"'"\n"
+ "#undef fpclassify\n"
+ "#define fpclassify(x) __builtin_fpclassify(x)";
+};
+
+fix = {
+ hackname = solaris_math_5;
+ select = '@\(#\)math_c99.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
+ bypass = "__GNUC__";
+ files = iso/math_c99.h;
+ c_fix = format;
+ c_fix_arg = "#define\tisfinite(x) \\\n"
+ " __extension__ ({ __typeof (x) __x_f = (x); \\\n"
+ "\t\t __builtin_expect(!isnan(__x_f - __x_f), 1); })";
+ c_fix_arg = "^#define[ \t]+isfinite\\(x\\)[ \t]+__builtin_isfinite\\(x\\)";
+ test_text =
+ '#ident "@(#)math_c99.h 1.9 04/11/01 SMI"'"\n"
+ "#undef isfinite\n"
+ "#define isfinite(x) __builtin_isfinite(x)";
+};
+
+fix = {
+ hackname = solaris_math_6;
+ select = '@\(#\)math_c99.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
+ bypass = "__GNUC__";
+ files = iso/math_c99.h;
+ c_fix = format;
+ c_fix_arg = "#define\tisinf(x) \\\n"
+ " __extension__ ({ __typeof (x) __x_i = (x); \\\n"
+ "\t\t __builtin_expect(!isnan(__x_i) && !isfinite(__x_i), 0); })";
+ c_fix_arg = "^#define[ \t]+isinf\\(x\\)[ \t]+__builtin_isinf\\(x\\)";
+ test_text =
+ '#ident "@(#)math_c99.h 1.9 04/11/01 SMI"'"\n"
+ "#undef isinf\n"
+ "#define isinf(x) __builtin_isinf(x)";
+};
+
+fix = {
+ hackname = solaris_math_7;
+ select = '@\(#\)math_c99.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
+ bypass = "__GNUC__";
+ files = iso/math_c99.h;
+ c_fix = format;
+ c_fix_arg = "#define\tisnormal(x) \\\n"
+ " __extension__ ({ __typeof(x) __x_n = (x); \\\n"
+ "\t\t if (__x_n < 0.0) __x_n = -__x_n; \\\n"
+ "\t\t __builtin_expect(isfinite(__x_n) \\\n"
+ "\t\t\t\t && (sizeof(__x_n) == sizeof(float) \\\n"
+ "\t\t\t\t\t ? __x_n >= __FLT_MIN__ \\\n"
+ "\t\t\t\t\t : sizeof(__x_n) == sizeof(long double) \\\n"
+ "\t\t\t\t\t ? __x_n >= __LDBL_MIN__ \\\n"
+ "\t\t\t\t\t : __x_n >= __DBL_MIN__), 1); })";
+ c_fix_arg = "^#define[ \t]+isnormal\\(x\\)[ \t]+__builtin_isnormal\\(x\\)";
+ test_text =
+ '#ident "@(#)math_c99.h 1.9 04/11/01 SMI"'"\n"
+ "#undef isnormal\n"
+ "#define isnormal(x) __builtin_isnormal(x)";
+};
+
+fix = {
+ hackname = solaris_math_8;
+ select = '@\(#\)math_c99.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
+ bypass = "__GNUC__";
+ files = iso/math_c99.h;
+ c_fix = format;
+ c_fix_arg = "#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 = "^#define[ \t]+signbit\\(x\\)[ \t]+__builtin_signbit\\(x\\)";
+ test_text =
+ '#ident "@(#)math_c99.h 1.9 04/11/01 SMI"'"\n"
+ "#undef signbit\n"
+ "#define signbit(x) __builtin_signbit(x)";
+};
+
+fix = {
+ hackname = solaris_math_9;
+ select = '@\(#\)math_c99.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
+ bypass = "__GNUC__";
+ files = iso/math_c99.h;
+ c_fix = format;
+ c_fix_arg = "#define\t%1(x, y)%2__builtin_%1(x, y)";
+ c_fix_arg = "^#define[ \t]+([a-z]+)\\(x, y\\)([ \t]+)\\(\\(x\\) __builtin_[a-z]+\\(y\\)\\)";
+ test_text =
+ '#ident "@(#)math_c99.h 1.9 04/11/01 SMI"'"\n"
+ "#undef isgreater\n"
+ "#define isgreater(x, y) ((x) __builtin_isgreater(y))\n"
+ "#undef isgreaterequal\n"
+ "#define isgreaterequal(x, y) ((x) __builtin_isgreaterequal(y))\n"
+ "#undef isless\n"
+ "#define isless(x, y) ((x) __builtin_isless(y))\n"
+ "#undef islessequal\n"
+ "#define islessequal(x, y) ((x) __builtin_islessequal(y))\n"
+ "#undef islessgreater\n"
+ "#define islessgreater(x, y) ((x) __builtin_islessgreater(y))\n"
+ "#undef isunordered\n"
+ "#define isunordered(x, y) ((x) __builtin_isunordered(y))";
+};
/*
* Sun Solaris 2.5.1, 2.6 defines PTHREAD_{MUTEX|COND}_INITIALIZER
--- /dev/null 2005-05-11 10:11:50.000000000 +0200
+++ tests/base/iso/math_c99.h 2005-05-12 16:07:37.000000000 +0200
@@ -0,0 +1,112 @@
+/* DO NOT EDIT THIS FILE.
+
+ It has been auto-edited by fixincludes from:
+
+ "fixinc/tests/inc/iso/math_c99.h"
+
+ This had to be done to correct non-standard usages in the
+ original, manufacturer supplied header file. */
+
+
+
+#if defined( SOLARIS_MATH_1_CHECK )
+#ident "@(#)math_c99.h 1.9 04/11/01 SMI"
+#undef HUGE_VAL
+#define HUGE_VAL (__builtin_huge_val())
+#undef HUGE_VALF
+#define HUGE_VALF (__builtin_huge_valf())
+#undef HUGE_VALL
+#define HUGE_VALL (__builtin_huge_vall())
+#endif /* SOLARIS_MATH_1_CHECK */
+
+
+#if defined( SOLARIS_MATH_2_CHECK )
+#ident "@(#)math_c99.h 1.9 04/11/01 SMI"
+#undef INFINITY
+#define INFINITY (__builtin_inff())
+#endif /* SOLARIS_MATH_2_CHECK */
+
+
+#if defined( SOLARIS_MATH_3_CHECK )
+#ident "@(#)math_c99.h 1.9 04/11/01 SMI"
+#undef NAN
+#define NAN (__builtin_nanf(""))
+#endif /* SOLARIS_MATH_3_CHECK */
+
+
+#if defined( SOLARIS_MATH_4_CHECK )
+#ident "@(#)math_c99.h 1.9 04/11/01 SMI"
+#undef fpclassify
+#define fpclassify(x) \
+ __extension__ ({ __typeof(x) __x_fp = (x); \
+ isnan(__x_fp) \
+ ? FP_NAN \
+ : isinf(__x_fp) \
+ ? FP_INFINITE \
+ : isnormal(__x_fp) \
+ ? FP_NORMAL \
+ : __x_fp == 0.0 \
+ ? FP_ZERO \
+ : FP_SUBNORMAL; })
+#endif /* SOLARIS_MATH_4_CHECK */
+
+
+#if defined( SOLARIS_MATH_5_CHECK )
+#ident "@(#)math_c99.h 1.9 04/11/01 SMI"
+#undef isfinite
+#define isfinite(x) \
+ __extension__ ({ __typeof (x) __x_f = (x); \
+ __builtin_expect(!isnan(__x_f - __x_f), 1); })
+#endif /* SOLARIS_MATH_5_CHECK */
+
+
+#if defined( SOLARIS_MATH_6_CHECK )
+#ident "@(#)math_c99.h 1.9 04/11/01 SMI"
+#undef isinf
+#define isinf(x) \
+ __extension__ ({ __typeof (x) __x_i = (x); \
+ __builtin_expect(!isnan(__x_i) && !isfinite(__x_i), 0); })
+#endif /* SOLARIS_MATH_6_CHECK */
+
+
+#if defined( SOLARIS_MATH_7_CHECK )
+#ident "@(#)math_c99.h 1.9 04/11/01 SMI"
+#undef isnormal
+#define isnormal(x) \
+ __extension__ ({ __typeof(x) __x_n = (x); \
+ if (__x_n < 0.0) __x_n = -__x_n; \
+ __builtin_expect(isfinite(__x_n) \
+ && (sizeof(__x_n) == sizeof(float) \
+ ? __x_n >= __FLT_MIN__ \
+ : sizeof(__x_n) == sizeof(long double) \
+ ? __x_n >= __LDBL_MIN__ \
+ : __x_n >= __DBL_MIN__), 1); })
+#endif /* SOLARIS_MATH_7_CHECK */
+
+
+#if defined( SOLARIS_MATH_8_CHECK )
+#ident "@(#)math_c99.h 1.9 04/11/01 SMI"
+#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_8_CHECK */
+
+
+#if defined( SOLARIS_MATH_9_CHECK )
+#ident "@(#)math_c99.h 1.9 04/11/01 SMI"
+#undef isgreater
+#define isgreater(x, y) __builtin_isgreater(x, y)
+#undef isgreaterequal
+#define isgreaterequal(x, y) __builtin_isgreaterequal(x, y)
+#undef isless
+#define isless(x, y) __builtin_isless(x, y)
+#undef islessequal
+#define islessequal(x, y) __builtin_islessequal(x, y)
+#undef islessgreater
+#define islessgreater(x, y) __builtin_islessgreater(x, y)
+#undef isunordered
+#define isunordered(x, y) __builtin_isunordered(x, y)
+#endif /* SOLARIS_MATH_9_CHECK */