Predefine __NO_MATH_ERRNO__ for -fno-math-errno.

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?

	* 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:
	* c-cppbuiltin.c (c_cpp_builtins_optimize_pragma): Define and
	undefine __NO_MATH_ERRNO__ based on changes to -fmath-errno state.

testsuite:
	* 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.

From-SVN: r217420
This commit is contained in:
Joseph Myers 2014-11-12 13:33:45 +00:00 committed by Joseph Myers
parent b9700367fa
commit 2079956a87
10 changed files with 65 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2014-11-12 Joseph Myers <joseph@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.
2014-11-12 Richard Biener <rguenther@suse.de>
* genmatch.c (::gen_transform): Add capture_info and

View File

@ -1,3 +1,8 @@
2014-11-12 Joseph Myers <joseph@codesourcery.com>
* c-cppbuiltin.c (c_cpp_builtins_optimize_pragma): Define and
undefine __NO_MATH_ERRNO__ based on changes to -fmath-errno state.
2014-11-12 Jakub Jelinek <jakub@redhat.com>
PR c/59708

View File

@ -549,6 +549,11 @@ c_cpp_builtins_optimize_pragma (cpp_reader *pfile, tree prev_tree,
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__");

View File

@ -102,6 +102,8 @@ define_builtin_macros_for_compilation_flags (cpp_reader *pfile)
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);

View File

@ -2421,6 +2421,10 @@ Annex G requirements (for example, because @option{-fcx-limited-range}
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

View File

@ -1,3 +1,8 @@
2014-11-12 Joseph Myers <joseph@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.
2014-11-12 H.J. Lu <hongjiu.lu@intel.com>
PR testsuite/63830

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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