On Tue, Nov 11, 2014 at 9:37 PM, Joseph Myers <jos...@codesourcery.com> wrote: > This patch adds a predefined macro __NO_MATH_ERRNO__ for when > -fno-math-errno is passed or implied. This allows math.h to provide a > more accurate definition of the C99 math_errhandling macro that takes > this option into account, and allows for choice of libm functions to > be optimized at compile time based on this option. > > (There may be a case for such interfaces for -fno-rounding-math > (default) and -fno-trapping-math as well, but as C99 standard pragmas > would allow those to vary on a per-block basis, predefined macros > would be problematic as the interface; you can't select a > -fno-trapping-math or -fno-rounding-math version of a function in a > standard header if a conforming program could then use "#pragma STDC > FENV_ACCESS ON" to require a -ftrapping-math -frounding-math version > in a particular block. So built-in functions might be a better way of > providing access to information about those options.) > > Bootstrapped with no regressions on x86_64-unknown-linux-gnu. OK to > commit (the cppbuiltin.c changes)?
Ok. Thanks, Richard. > 2014-11-11 Joseph Myers <jos...@codesourcery.com> > > * cppbuiltin.c (define_builtin_macros_for_compilation_flags): > Define __NO_MATH_ERRNO__ if -fno-math-errno. > * doc/cpp.texi (__NO_MATH_ERRNO__): Document predefined macro. > > c-family: > 2014-11-11 Joseph Myers <jos...@codesourcery.com> > > * c-cppbuiltin.c (c_cpp_builtins_optimize_pragma): Define and > undefine __NO_MATH_ERRNO__ based on changes to -fmath-errno state. > > testsuite: > 2014-11-11 Joseph Myers <jos...@codesourcery.com> > > * gcc.dg/no-math-errno-1.c, gcc.dg/no-math-errno-2.c, > gcc.dg/no-math-errno-3.c, gcc.dg/no-math-errno-4.c: New tests. > > Index: gcc/c-family/c-cppbuiltin.c > =================================================================== > --- gcc/c-family/c-cppbuiltin.c (revision 217347) > +++ gcc/c-family/c-cppbuiltin.c (working copy) > @@ -549,6 +549,11 @@ c_cpp_builtins_optimize_pragma (cpp_reader *pfile, > else if (prev->x_flag_signaling_nans && !cur->x_flag_signaling_nans) > cpp_undef (pfile, "__SUPPORT_SNAN__"); > > + if (!prev->x_flag_errno_math && cur->x_flag_errno_math) > + cpp_undef (pfile, "__NO_MATH_ERRNO__"); > + else if (prev->x_flag_errno_math && !cur->x_flag_errno_math) > + cpp_define (pfile, "__NO_MATH_ERRNO__"); > + > if (!prev->x_flag_finite_math_only && cur->x_flag_finite_math_only) > { > cpp_undef (pfile, "__FINITE_MATH_ONLY__"); > Index: gcc/cppbuiltin.c > =================================================================== > --- gcc/cppbuiltin.c (revision 217347) > +++ gcc/cppbuiltin.c (working copy) > @@ -102,6 +102,8 @@ define_builtin_macros_for_compilation_flags (cpp_r > cpp_define (pfile, "__FAST_MATH__"); > if (flag_signaling_nans) > cpp_define (pfile, "__SUPPORT_SNAN__"); > + if (!flag_errno_math) > + cpp_define (pfile, "__NO_MATH_ERRNO__"); > > cpp_define_formatted (pfile, "__FINITE_MATH_ONLY__=%d", > flag_finite_math_only); > Index: gcc/doc/cpp.texi > =================================================================== > --- gcc/doc/cpp.texi (revision 217347) > +++ gcc/doc/cpp.texi (working copy) > @@ -2421,6 +2421,10 @@ Annex G requirements (for example, because @option > was used). If 1 or more, it indicates that it is intended to support > those requirements; this does not mean that all relevant language > features are supported by GCC. > + > +@item __NO_MATH_ERRNO__ > +This macro is defined if @option{-fno-math-errno} is used, or enabled > +by another option such as @option{-ffast-math} or by default. > @end table > > @node System-specific Predefined Macros > Index: gcc/testsuite/gcc.dg/no-math-errno-1.c > =================================================================== > --- gcc/testsuite/gcc.dg/no-math-errno-1.c (revision 0) > +++ gcc/testsuite/gcc.dg/no-math-errno-1.c (working copy) > @@ -0,0 +1,7 @@ > +/* Test __NO_MATH_ERRNO__ is defined with -fno-math-errno. */ > +/* { dg-do compile } */ > +/* { dg-options "-fno-math-errno" } */ > + > +#ifndef __NO_MATH_ERRNO__ > +#error "__NO_MATH_ERRNO__ not defined" > +#endif > Index: gcc/testsuite/gcc.dg/no-math-errno-2.c > =================================================================== > --- gcc/testsuite/gcc.dg/no-math-errno-2.c (revision 0) > +++ gcc/testsuite/gcc.dg/no-math-errno-2.c (working copy) > @@ -0,0 +1,7 @@ > +/* Test __NO_MATH_ERRNO__ is defined with -ffast-math. */ > +/* { dg-do compile } */ > +/* { dg-options "-ffast-math" } */ > + > +#ifndef __NO_MATH_ERRNO__ > +#error "__NO_MATH_ERRNO__ not defined" > +#endif > Index: gcc/testsuite/gcc.dg/no-math-errno-3.c > =================================================================== > --- gcc/testsuite/gcc.dg/no-math-errno-3.c (revision 0) > +++ gcc/testsuite/gcc.dg/no-math-errno-3.c (working copy) > @@ -0,0 +1,7 @@ > +/* Test __NO_MATH_ERRNO__ is not defined with -fmath-errno. */ > +/* { dg-do compile } */ > +/* { dg-options "-fmath-errno" } */ > + > +#ifdef __NO_MATH_ERRNO__ > +#error "__NO_MATH_ERRNO__ defined" > +#endif > Index: gcc/testsuite/gcc.dg/no-math-errno-4.c > =================================================================== > --- gcc/testsuite/gcc.dg/no-math-errno-4.c (revision 0) > +++ gcc/testsuite/gcc.dg/no-math-errno-4.c (working copy) > @@ -0,0 +1,17 @@ > +/* Test __NO_MATH_ERRNO__ is defined and undefined by pragmas. */ > +/* { dg-do compile } */ > +/* { dg-options "-fmath-errno" } */ > + > +#ifdef __NO_MATH_ERRNO__ > +#error "__NO_MATH_ERRNO__ defined" > +#endif > + > +#pragma GCC optimize "-fno-math-errno" > +#ifndef __NO_MATH_ERRNO__ > +#error "__NO_MATH_ERRNO__ not defined" > +#endif > + > +#pragma GCC optimize "-fmath-errno" > +#ifdef __NO_MATH_ERRNO__ > +#error "__NO_MATH_ERRNO__ defined" > +#endif > > -- > Joseph S. Myers > jos...@codesourcery.com