Commit 925a4487 by Eric Botcazou Committed by Eric Botcazou

re PR target/19933 (Problem with define of HUGE_VAL in math_c99.)

fixincludes/
	PR target/19933
	PR target/21315
	* inclhack.def: New fixes solaris_math_[1-9].
	* 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.

Co-Authored-By: Joseph Myers <joseph@codesourcery.com>

From-SVN: r99953
parent 7a774cac
2005-05-19 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.
2005-05-19 Kelley Cook <kcook@gcc.gnu.org> 2005-05-19 Kelley Cook <kcook@gcc.gnu.org>
* aclocal.m4: Remove superfluous reference to accross.m4. * aclocal.m4: Remove superfluous reference to accross.m4.
......
...@@ -2564,6 +2564,176 @@ fix = { ...@@ -2564,6 +2564,176 @@ fix = {
test_text = "extern int utime(const char *, struct utimbuf *);"; 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 * Sun Solaris 2.5.1, 2.6 defines PTHREAD_{MUTEX|COND}_INITIALIZER
......
/* 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 */
2005-05-19 Eric Botcazou <ebotcazou@libertysurf.fr>
* 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.
2005-05-18 Richard Henderson <rth@redhat.com> 2005-05-18 Richard Henderson <rth@redhat.com>
* gcc.dg/tree-ssa/20031015-1.c: Expect one V_MUST_DEF. * gcc.dg/tree-ssa/20031015-1.c: Expect one V_MUST_DEF.
......
/* { dg-do run { target *-*-solaris2.1[0-9]* } } */
/* { dg-options "-std=c99 -O" } */
#include <math.h>
#include "c99-math.h"
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 <math.h>
#include "c99-math.h"
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 <math.h>
#include "c99-math.h"
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;
}
#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 (); \
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment