[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:
parent
b89de1b8dd
commit
04f0fcf7bd
@ -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.
|
||||
|
@ -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.
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
|
19
gcc/testsuite/gcc.dg/fpermitted-flt-eval-methods_1.c
Normal file
19
gcc/testsuite/gcc.dg/fpermitted-flt-eval-methods_1.c
Normal 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;
|
||||
}
|
||||
}
|
19
gcc/testsuite/gcc.dg/fpermitted-flt-eval-methods_2.c
Normal file
19
gcc/testsuite/gcc.dg/fpermitted-flt-eval-methods_2.c
Normal 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;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user