lto-opts.c (lto_write_options): Handle -fmath-errno, -fsigned-zeros and -ftrapping...
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 7 Oct 2014 07:56:43 +0000 (07:56 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 7 Oct 2014 07:56:43 +0000 (07:56 +0000)
* lto-opts.c (lto_write_options): Handle -fmath-errno, -fsigned-zeros
and -ftrapping-math.
* lto-wrapper.c (merge_and_complain): Likewise.
(run_gcc): Likewise.

From-SVN: r215966

gcc/ChangeLog
gcc/lto-opts.c
gcc/lto-wrapper.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/lto16.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/lto16_pkg.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/lto16_pkg.ads [new file with mode: 0644]

index 73d5d5a6b92dd67eff39762b891bec122f13603a..9349546e524e2c5b7f8e538dde9b8d3c246596cd 100644 (file)
@@ -1,3 +1,10 @@
+2014-10-07  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * lto-opts.c (lto_write_options): Handle -fmath-errno, -fsigned-zeros
+       and -ftrapping-math.
+       * lto-wrapper.c (merge_and_complain): Likewise.
+       (run_gcc): Likewise.
+
 2014-10-06  Eric Botcazou  <ebotcazou@adacore.com>
 
        * calls.c (expand_call): Do not use the target as the return slot if
index 986fb971071c93e0532638c10cf4555e298bb166..ceccb6f44cb0c328a047be17d817c76e7270f80e 100644 (file)
@@ -115,6 +115,24 @@ lto_write_options (void)
       default:
        gcc_unreachable ();
       }
+  /* The default -fmath-errno, -fsigned-zeros and -ftrapping-math change
+     depending on the language (they can be disabled by the Ada and Java
+     front-ends).  Pass thru conservative standard settings.  */
+  if (!global_options_set.x_flag_errno_math)
+    append_to_collect_gcc_options (&temporary_obstack, &first_p,
+                                  global_options.x_flag_errno_math
+                                  ? "-fmath-errno"
+                                  : "-fno-math-errno");
+  if (!global_options_set.x_flag_signed_zeros)
+    append_to_collect_gcc_options (&temporary_obstack, &first_p,
+                                  global_options.x_flag_signed_zeros
+                                  ? "-fsigned-zeros"
+                                  : "-fno-signed-zeros");
+  if (!global_options_set.x_flag_trapping_math)
+    append_to_collect_gcc_options (&temporary_obstack, &first_p,
+                                  global_options.x_flag_trapping_math
+                                  ? "-ftrapping-math"
+                                  : "-fno-trapping-math");
   /* We need to merge -f[no-]strict-overflow, -f[no-]wrapv and -f[no-]trapv
      conservatively, so stream out their defaults.  */
   if (!global_options_set.x_flag_wrapv
index 08fd090588fd948963e290b9188cb9ddb43fbd97..8033b155baa661befaded2911122f369f11bf569 100644 (file)
@@ -261,6 +261,9 @@ merge_and_complain (struct cl_decoded_option **decoded_options,
            (*decoded_options)[j] = *foption;
          break;
 
+       case OPT_fmath_errno:
+       case OPT_fsigned_zeros:
+       case OPT_ftrapping_math:
        case OPT_fwrapv:
          /* For selected options we can merge conservatively.  */
          for (j = 0; j < *decoded_options_count; ++j)
@@ -268,7 +271,10 @@ merge_and_complain (struct cl_decoded_option **decoded_options,
              break;
          if (j == *decoded_options_count)
            append_option (decoded_options, decoded_options_count, foption);
-         /* -fwrapv > -fno-wrapv.  */
+         /* -fmath-errno > -fno-math-errno,
+            -fsigned-zeros > -fno-signed-zeros,
+            -ftrapping-math -> -fno-trapping-math,
+            -fwrapv > -fno-wrapv.  */
          else if (foption->value > (*decoded_options)[j].value)
            (*decoded_options)[j] = *foption;
          break;
@@ -502,6 +508,9 @@ run_gcc (unsigned argc, char *argv[])
        case OPT_fpcc_struct_return:
        case OPT_fshort_double:
        case OPT_ffp_contract_:
+       case OPT_fmath_errno:
+       case OPT_fsigned_zeros:
+       case OPT_ftrapping_math:
        case OPT_fwrapv:
        case OPT_ftrapv:
        case OPT_fstrict_overflow:
index 2b54708db15a994d7b3691c84f5b4379f1e77624..21ca143c0b44e295899cb3043d1e3a38c46d3a4a 100644 (file)
@@ -1,3 +1,8 @@
+2014-10-07  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/lto16.adb: New test.
+       * gnat.dg/lto16_pkg.adb: New helper.
+
 2014-10-06  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/return4.adb: New test.
diff --git a/gcc/testsuite/gnat.dg/lto16.adb b/gcc/testsuite/gnat.dg/lto16.adb
new file mode 100644 (file)
index 0000000..82d02b4
--- /dev/null
@@ -0,0 +1,17 @@
+-- { dg-do link }
+-- { dg-options "-O -flto" }
+-- { dg-require-effective-target lto }
+
+with Lto16_Pkg; use Lto16_Pkg;
+with Text_IO; use Text_IO;
+
+procedure Lto16 is
+begin
+  if F = 0.0 then
+    Put_Line ("zero");
+  else
+    Put_Line ("non-zero");
+  end if;
+exception
+  when others => Put_Line ("exception");
+end;
diff --git a/gcc/testsuite/gnat.dg/lto16_pkg.adb b/gcc/testsuite/gnat.dg/lto16_pkg.adb
new file mode 100644 (file)
index 0000000..edfa399
--- /dev/null
@@ -0,0 +1,18 @@
+with Ada.Calendar; use Ada.Calendar;
+
+package body Lto16_Pkg is
+
+  function F return Float is
+    F1 : Float := Float (Seconds (Clock));
+    F2 : Float := Float (Seconds (Clock));
+    F  : Float;
+  begin
+    if F1 > F2 then
+      F := (F2 - F1) / 2.0;
+    else
+      F := (F1 - F2) / 2.0;
+    end if;
+    return F;
+  end;
+
+end Lto16_Pkg;
diff --git a/gcc/testsuite/gnat.dg/lto16_pkg.ads b/gcc/testsuite/gnat.dg/lto16_pkg.ads
new file mode 100644 (file)
index 0000000..e9b74d3
--- /dev/null
@@ -0,0 +1,5 @@
+package Lto16_Pkg is
+
+  function F return Float;
+
+end Lto16_Pkg;