aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2014-10-07 07:56:43 +0000
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2014-10-07 07:56:43 +0000
commit3b68434490a85265312e4b0a0c4153c5ac05ca7d (patch)
treeddfc6423ea43b158728db7853802890da8621bf1
parent224bdd518eae3c5b48c0f10988f2e520a6546685 (diff)
* lto-opts.c (lto_write_options): Handle -fmath-errno, -fsigned-zeros
and -ftrapping-math. * lto-wrapper.c (merge_and_complain): Likewise. (run_gcc): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@215966 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/lto-opts.c18
-rw-r--r--gcc/lto-wrapper.c11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gnat.dg/lto16.adb17
-rw-r--r--gcc/testsuite/gnat.dg/lto16_pkg.adb18
-rw-r--r--gcc/testsuite/gnat.dg/lto16_pkg.ads5
7 files changed, 80 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 73d5d5a6b92..9349546e524 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/lto-opts.c b/gcc/lto-opts.c
index 986fb971071..ceccb6f44cb 100644
--- a/gcc/lto-opts.c
+++ b/gcc/lto-opts.c
@@ -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
diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c
index 08fd090588f..8033b155baa 100644
--- a/gcc/lto-wrapper.c
+++ b/gcc/lto-wrapper.c
@@ -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:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2b54708db15..21ca143c0b4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..82d02b4116f
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/lto16.adb
@@ -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
index 00000000000..edfa399369a
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/lto16_pkg.adb
@@ -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
index 00000000000..e9b74d39337
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/lto16_pkg.ads
@@ -0,0 +1,5 @@
+package Lto16_Pkg is
+
+ function F return Float;
+
+end Lto16_Pkg;