[Patch 5/17] Add -fpermitted-flt-eval-methods=[c11|ts-18661-3]

gcc/c-family/

	* c-opts.c (c_common_post_options): Add logic to handle the default
	case for -fpermitted-flt-eval-methods.

gcc/

	* common.opt (fpermitted-flt-eval-methods): New.
	* doc/invoke.texi (-fpermitted-flt-eval-methods): Document it.
	* flag_types.h (permitted_flt_eval_methods): New.

gcc/testsuite/

	* gcc.dg/fpermitted-flt-eval-methods_1.c: New.
	* gcc.dg/fpermitted-flt-eval-methods_2.c: New.

From-SVN: r242775
This commit is contained in:
James Greenhalgh 2016-11-23 17:20:37 +00:00 committed by James Greenhalgh
parent b89de1b8dd
commit 04f0fcf7bd
9 changed files with 114 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2016-11-23 James Greenhalgh <james.greenhalgh@arm.com>
* common.opt (fpermitted-flt-eval-methods): New.
* doc/invoke.texi (-fpermitted-flt-eval-methods): Document it.
* flag_types.h (permitted_flt_eval_methods): New.
2016-11-23 James Greenhalgh <james.greenhalgh@arm.com>
* config/m68k/m68k.c (m68k_excess_precision): New.

View File

@ -1,3 +1,8 @@
2016-11-23 James Greenhalgh <james.greenhalgh@arm.com>
* c-opts.c (c_common_post_options): Add logic to handle the default
case for -fpermitted-flt-eval-methods.
2016-11-23 Paolo Bonzini <bonzini@gnu.org>
* c.opt (Wexpansion-to-defined): New.

View File

@ -788,6 +788,18 @@ c_common_post_options (const char **pfilename)
&& flag_unsafe_math_optimizations == 0)
flag_fp_contract_mode = FP_CONTRACT_OFF;
/* If we are compiling C, and we are outside of a standards mode,
we can permit the new values from ISO/IEC TS 18661-3 for
FLT_EVAL_METHOD. Otherwise, we must restrict the possible values to
the set specified in ISO C99/C11. */
if (!flag_iso
&& !c_dialect_cxx ()
&& (global_options_set.x_flag_permitted_flt_eval_methods
== PERMITTED_FLT_EVAL_METHODS_DEFAULT))
flag_permitted_flt_eval_methods = PERMITTED_FLT_EVAL_METHODS_TS_18661;
else
flag_permitted_flt_eval_methods = PERMITTED_FLT_EVAL_METHODS_C11;
/* By default we use C99 inline semantics in GNU99 or C99 mode. C99
inline semantics are not supported in GNU89 or C89 mode. */
if (flag_gnu89_inline == -1)

View File

@ -1326,6 +1326,21 @@ Enum(excess_precision) String(fast) Value(EXCESS_PRECISION_FAST)
EnumValue
Enum(excess_precision) String(standard) Value(EXCESS_PRECISION_STANDARD)
; Whether we permit the extended set of values for FLT_EVAL_METHOD
; introduced in ISO/IEC TS 18661-3, or limit ourselves to those in C99/C11.
fpermitted-flt-eval-methods=
Common Joined RejectNegative Enum(permitted_flt_eval_methods) Var(flag_permitted_flt_eval_methods) Init(PERMITTED_FLT_EVAL_METHODS_DEFAULT)
-fpermitted-flt-eval-methods=[c11|ts-18661] Specify which values of FLT_EVAL_METHOD are permitted.
Enum
Name(permitted_flt_eval_methods) Type(enum permitted_flt_eval_methods) UnknownError(unknown specification for the set of FLT_EVAL_METHOD values to permit %qs)
EnumValue
Enum(permitted_flt_eval_methods) String(c11) Value(PERMITTED_FLT_EVAL_METHODS_C11)
EnumValue
Enum(permitted_flt_eval_methods) String(ts-18661-3) Value(PERMITTED_FLT_EVAL_METHODS_TS_18661)
ffast-math
Common Optimization

View File

@ -178,6 +178,7 @@ in the following sections.
@item C Language Options
@xref{C Dialect Options,,Options Controlling C Dialect}.
@gccoptlist{-ansi -std=@var{standard} -fgnu89-inline @gol
-fpermitted-flt-eval-methods=@var{standard} @gol
-aux-info @var{filename} -fallow-parameterless-variadic-functions @gol
-fno-asm -fno-builtin -fno-builtin-@var{function} -fgimple@gol
-fhosted -ffreestanding -fopenacc -fopenmp -fopenmp-simd @gol
@ -1867,6 +1868,30 @@ The preprocessor macros @code{__GNUC_GNU_INLINE__} and
in effect for @code{inline} functions. @xref{Common Predefined
Macros,,,cpp,The C Preprocessor}.
@item -fpermitted-flt-eval-methods=@var{style}
@opindex fpermitted-flt-eval-methods
@opindex fpermitted-flt-eval-methods=c11
@opindex fpermitted-flt-eval-methods=ts-18661-3
ISO/IEC TS 18661-3 defines new permissible values for
@code{FLT_EVAL_METHOD} that indicate that operations and constants with
a semantic type that is an interchange or extended format should be
evaluated to the precision and range of that type. These new values are
a superset of those permitted under C99/C11, which does not specify the
meaning of other positive values of @code{FLT_EVAL_METHOD}. As such, code
conforming to C11 may not have been written expecting the possibility of
the new values.
@option{-fpermitted-flt-eval-methods} specifies whether the compiler
should allow only the values of @code{FLT_EVAL_METHOD} specified in C99/C11,
or the extended set of values specified in ISO/IEC TS 18661-3.
@var{style} is either @code{c11} or @code{ts-18661-3} as appropriate.
The default when in a standards compliant mode (@option{-std=c11} or similar)
is @option{-fpermitted-flt-eval-methods=c11}. The default when in a GNU
dialect (@option{-std=gnu11} or similar) is
@option{-fpermitted-flt-eval-methods=ts-18661-3}.
@item -aux-info @var{filename}
@opindex aux-info
Output to the given filename prototyped declarations for all functions

View File

@ -158,6 +158,14 @@ enum excess_precision
EXCESS_PRECISION_STANDARD
};
/* The options for which values of FLT_EVAL_METHOD are permissible. */
enum permitted_flt_eval_methods
{
PERMITTED_FLT_EVAL_METHODS_DEFAULT,
PERMITTED_FLT_EVAL_METHODS_TS_18661,
PERMITTED_FLT_EVAL_METHODS_C11
};
/* Type of stack check. */
enum stack_check_type
{

View File

@ -1,3 +1,8 @@
2016-11-23 James Greenhalgh <james.greenhalgh@arm.com>
* gcc.dg/fpermitted-flt-eval-methods_1.c: New.
* gcc.dg/fpermitted-flt-eval-methods_2.c: New.
2016-11-23 Martin Sebor <msebor@redhat.com>
PR middle-end/78461

View File

@ -0,0 +1,19 @@
/* { dg-do run } */
/* { dg-options "-std=c11" } */
/* Test that we only see the C99/C11 values for __FLT_EVAL_METHOD__ if
we are compiling with -std=c11. */
int main (int argc, char** argv)
{
switch (__FLT_EVAL_METHOD__)
{
case 0:
case 1:
case 2:
case -1:
return 0;
default:
return 1;
}
}

View File

@ -0,0 +1,19 @@
/* { dg-do run } */
/* { dg-options "-fpermitted-flt-eval-methods=c11" } */
/* Test that we only see the C99/C11 values for __FLT_EVAL_METHOD__ if
we are compiling with -fpermitted-flt-eval-methods=c11. */
int main (int argc, char** argv)
{
switch (__FLT_EVAL_METHOD__)
{
case 0:
case 1:
case 2:
case -1:
return 0;
default:
return 1;
}
}