From: James Greenhalgh Date: Wed, 23 Nov 2016 17:20:37 +0000 (+0000) Subject: [Patch 5/17] Add -fpermitted-flt-eval-methods=[c11|ts-18661-3] X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=04f0fcf7bdfa1b4d153ca37df8843c44ed8c4d93;p=gcc.git [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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 30fbed63c88..8ce444b3847 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-11-23 James Greenhalgh + + * 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 * config/m68k/m68k.c (m68k_excess_precision): New. diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 6b86dd2355f..f4d81a19515 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +2016-11-23 James Greenhalgh + + * c-opts.c (c_common_post_options): Add logic to handle the default + case for -fpermitted-flt-eval-methods. + 2016-11-23 Paolo Bonzini * c.opt (Wexpansion-to-defined): New. diff --git a/gcc/c-family/c-opts.c b/gcc/c-family/c-opts.c index de260e7dcee..57717ff41d8 100644 --- a/gcc/c-family/c-opts.c +++ b/gcc/c-family/c-opts.c @@ -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) diff --git a/gcc/common.opt b/gcc/common.opt index 1fa3629f548..d7ccf3b1a90 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -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 diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 32c7a083be0..a9d06099935 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -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 diff --git a/gcc/flag-types.h b/gcc/flag-types.h index 6c5a4cc9346..d69f8f489b8 100644 --- a/gcc/flag-types.h +++ b/gcc/flag-types.h @@ -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 { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d5055da891c..40d00326111 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-11-23 James Greenhalgh + + * gcc.dg/fpermitted-flt-eval-methods_1.c: New. + * gcc.dg/fpermitted-flt-eval-methods_2.c: New. + 2016-11-23 Martin Sebor PR middle-end/78461 diff --git a/gcc/testsuite/gcc.dg/fpermitted-flt-eval-methods_1.c b/gcc/testsuite/gcc.dg/fpermitted-flt-eval-methods_1.c new file mode 100644 index 00000000000..c022f86b250 --- /dev/null +++ b/gcc/testsuite/gcc.dg/fpermitted-flt-eval-methods_1.c @@ -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; + } +} diff --git a/gcc/testsuite/gcc.dg/fpermitted-flt-eval-methods_2.c b/gcc/testsuite/gcc.dg/fpermitted-flt-eval-methods_2.c new file mode 100644 index 00000000000..a76ea7e99a0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/fpermitted-flt-eval-methods_2.c @@ -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; + } +}