This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix PR target/19933 and PR target/21315


Hi,

GCC still has some rough edges on Solaris 10 when it comes to C99 support, 
because some C99 math macros are defined to Sun CC's builtins (e.g. HUGE_VAL, 
this is PR target/19933).  As a consequence, the Fortran 95 compiler is 
totally unusable (this is PR target/21315).

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).

Bootstrapped/regtested on sparc-sun-solaris2.10.  OK for mainline and 4.0 
branch?


2005-05-12  Eric Botcazou  <ebotcazou@libertysurf.fr>
            Joseph S. Myers <joseph@codesourcery.com>

fixincludes/
	* inclhack.def: New fixes solaris_math_[1-10].
	* fixincl.x: Regenerate.
	* tests/base/iso/math_c99.h: New.

gcc/testsuite/
	* gcc.dg/c99-math.h: New
	* gcc.dg/c99-math-float-1.c: New test.
	* gcc.dg/c99-math-double-1.c: Likewise.
	* gcc.dg/c99-math-long-double-1.c: Likewise.


-- 
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	12 May 2005 04:23:28 -0000
@@ -2564,6 +2564,185 @@
     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__.*\n"
+             "^#define[ \t]+HUGE_VAL";
+    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__.*\n"
+             "^#define[ \t]+INFINITY";
+    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__.*\n"
+             "^#define[ \t]+NAN";
+    files = iso/math_c99.h;
+    c_fix = format;
+    c_fix_arg = "#define\tNAN\t\t(__builtin_nan(\"\"))";
+    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__.*\n"
+             "^#define[ \t]+fpclassify";
+    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__.*\n"
+             "^#define[ \t]+isfinite";
+    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__.*\n"
+             "^#define[ \t]+isinf";
+    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__.*\n"
+             "^#define[ \t]+isnormal";
+    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__.*\n"
+             "^#define[ \t]+signbit";
+    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__.*\n"
+             "^#define[ \t]+isgreater";
+    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-11 20:53:00.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_nan(""))
+#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 */
#include <math.h>

extern void abort(void);

#define C99_MATH_TESTS(nan, inf, huge, norm, zero)	\
{							\
  if (fpclassify (nan) != FP_NAN)			\
    abort ();						\
							\
  if (fpclassify (inf) != FP_INFINITE)			\
    abort ();						\
							\
  if (fpclassify (huge) != FP_INFINITE)			\
    abort ();						\
							\
  if (fpclassify (norm) != FP_NORMAL)			\
    abort ();						\
							\
  if (fpclassify (zero) != FP_ZERO)			\
    abort ();						\
							\
							\
  if (!isnan (nan))					\
    abort ();						\
							\
  if (isnan (inf))					\
    abort ();						\
							\
  if (isnan (huge))					\
    abort ();						\
							\
  if (isnan (norm))					\
    abort ();						\
							\
  if (isnan (zero))					\
    abort ();						\
							\
							\
  if (isinf (nan))					\
    abort ();						\
							\
  if (!isinf (inf))					\
    abort ();						\
							\
  if (!isinf (huge))					\
    abort ();						\
							\
  if (isnan (norm))					\
    abort ();						\
							\
  if (isinf (zero))					\
    abort ();						\
							\
							\
  if (isfinite (nan))					\
    abort ();						\
							\
  if (isfinite (inf))					\
    abort ();						\
							\
  if (isfinite (huge))					\
    abort ();						\
							\
  if (!isfinite (norm))					\
    abort ();						\
							\
  if (!isfinite (zero))					\
    abort ();						\
							\
							\
  if (isnormal (nan))					\
    abort ();						\
							\
  if (isnormal (inf))					\
    abort ();						\
							\
  if (isnormal (huge))					\
    abort ();						\
							\
  if (!isnormal (norm))					\
    abort ();						\
							\
  if (isnormal (zero))					\
    abort ();						\
							\
							\
  if (signbit (norm))					\
    abort ();						\
							\
  if (!signbit (-(norm)))				\
    abort ();						\
							\
							\
  if (!isgreater ((inf), (norm)))			\
    abort ();						\
							\
  if (!isgreaterequal ((inf), (huge)))			\
    abort ();						\
							\
  if (!isless ((norm), (inf)))				\
    abort ();						\
							\
  if (!islessequal ((huge), (inf)))			\
    abort ();						\
							\
  if (!islessgreater ((inf), (norm)))			\
    abort ();						\
							\
  if (!isunordered ((nan), (norm)))			\
    abort ();						\
}
/* { dg-do run { target *-*-solaris2.1[0-9] } } */
/* { dg-options "-std=c99 -O" } */

#include <float.h>
#include <math.h>

#include "c99-math.h"


extern void abort(void);

int main(void)
{
  float nan = NAN;
  float inf = INFINITY;
  float huge = HUGE_VALF;
  float norm = FLT_MIN;
  float zero = 0.0f;

  C99_MATH_TESTS (nan, inf, huge, norm, zero)

  return 0;
}
/* { dg-do run { target *-*-solaris2.1[0-9] } } */
/* { dg-options "-std=c99 -O" } */

#include <float.h>
#include <math.h>

#include "c99-math.h"


extern void abort(void);

int main(void)
{
  double nan = NAN;
  double inf = INFINITY;
  double huge = HUGE_VAL;
  double norm = DBL_MIN;
  double zero = 0.0;

  C99_MATH_TESTS (nan, inf, huge, norm, zero)

  return 0;
}
/* { dg-do run { target *-*-solaris2.1[0-9] } } */
/* { dg-options "-std=c99 -O" } */

#include <float.h>
#include <math.h>

#include "c99-math.h"


extern void abort(void);

int main(void)
{
  long double nan = NAN;
  long double inf = INFINITY;
  long double huge = HUGE_VALL;
  long double norm = LDBL_MIN;
  long double zero = 0.0l;

  C99_MATH_TESTS (nan, inf, huge, norm, zero)

  return 0;
}

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]