diff mbox

Predefine __NO_MATH_ERRNO__ for -fno-math-errno

Message ID alpine.DEB.2.10.1411112035150.12642@digraph.polyomino.org.uk
State New
Headers show

Commit Message

Joseph Myers Nov. 11, 2014, 8:37 p.m. UTC
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)?

2014-11-11  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.

c-family:
2014-11-11  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.

testsuite:
2014-11-11  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.

Comments

Richard Biener Nov. 12, 2014, 8:25 a.m. UTC | #1
On Tue, Nov 11, 2014 at 9:37 PM, Joseph Myers <joseph@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  <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.
>
> c-family:
> 2014-11-11  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.
>
> testsuite:
> 2014-11-11  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.
>
> 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
> joseph@codesourcery.com
diff mbox

Patch

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