Patchwork [Ada] Coordinate front-end and middle-end floating-point settings

login
register
mail settings
Submitter Eric Botcazou
Date May 24, 2013, 9:40 a.m.
Message ID <2917853.lFgu23fYqJ@polaris>
Download mbox | patch
Permalink /patch/246116/
State New
Headers show

Comments

Eric Botcazou - May 24, 2013, 9:40 a.m.
This (partially) coordinates the floating-point settings of the front-end and
the middle-end for the Ada compiler:
  - if Machine_Overflows is set to True, -ftrapping-math is enabled in the
compiler; otherwise, it is disabled (unless overridden by the user).
  - if Signed_Zeros is set to True, -fsigned-zeros  is enabled in the
compiler; otherwise, it is disabled (unless overridden by the user).

Tested on x86_64-suse-linux, applied on the mainline.


2013-05-24  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc-interface/gigi.h (gnat_init_gcc_fp): Declare.
	* gcc-interface/trans.c (gigi): Call it.
	* gcc-interface/misc.c (gnat_init_gcc_fp): New function.

Patch

Index: gcc-interface/gigi.h
===================================================================
--- gcc-interface/gigi.h	(revision 199286)
+++ gcc-interface/gigi.h	(working copy)
@@ -502,7 +502,13 @@  extern tree get_block_jmpbuf_decl (void)
    for location information and flag propagation.  */
 extern void gnat_pushdecl (tree decl, Node_Id gnat_node);
 
+/* Initialize the GCC support for exception handling.  */
 extern void gnat_init_gcc_eh (void);
+
+/* Initialize the GCC support for floating-point operations.  */
+extern void gnat_init_gcc_fp (void);
+
+/* Install the builtin functions we might need.  */
 extern void gnat_install_builtins (void);
 
 /* Return an integer type with the number of bits of precision given by
Index: gcc-interface/trans.c
===================================================================
--- gcc-interface/trans.c	(revision 199286)
+++ gcc-interface/trans.c	(working copy)
@@ -677,6 +677,9 @@  gigi (Node_Id gnat_root, int max_gnat_no
   if (Exception_Mechanism == Back_End_Exceptions)
     gnat_init_gcc_eh ();
 
+  /* Initialize the GCC support for FP operations.  */
+  gnat_init_gcc_fp ();
+
   /* Now translate the compilation unit proper.  */
   Compilation_Unit_to_gnu (gnat_root);
 
Index: gcc-interface/misc.c
===================================================================
--- gcc-interface/misc.c	(revision 199275)
+++ gcc-interface/misc.c	(working copy)
@@ -6,7 +6,7 @@ 
  *                                                                          *
  *                           C Implementation File                          *
  *                                                                          *
- *          Copyright (C) 1992-2012, Free Software Foundation, Inc.         *
+ *          Copyright (C) 1992-2013, Free Software Foundation, Inc.         *
  *                                                                          *
  * GNAT is free software;  you can  redistribute it  and/or modify it under *
  * terms of the  GNU General Public License as published  by the Free Soft- *
@@ -346,9 +346,7 @@  gnat_init (void)
   return true;
 }
 
-/* If we are using the GCC mechanism to process exception handling, we
-   have to register the personality routine for Ada and to initialize
-   various language dependent hooks.  */
+/* Initialize the GCC support for exception handling.  */
 
 void
 gnat_init_gcc_eh (void)
@@ -381,6 +379,28 @@  gnat_init_gcc_eh (void)
   init_eh ();
 }
 
+/* Initialize the GCC support for floating-point operations.  */
+
+void
+gnat_init_gcc_fp (void)
+{
+  /* Disable FP optimizations that ignore the signedness of zero if
+     S'Signed_Zeros is True, but don't override the user if not.  */
+  if (Signed_Zeros_On_Target)
+    flag_signed_zeros = 1;
+  else if (!global_options_set.x_flag_signed_zeros)
+    flag_signed_zeros = 0;
+
+  /* Assume that FP operations can trap if S'Machine_Overflow is True,
+     but don't override the user if not.
+
+     ??? Alpha/VMS enables FP traps without declaring it.  */
+  if (Machine_Overflows_On_Target || TARGET_ABI_OPEN_VMS)
+    flag_trapping_math = 1;
+  else if (!global_options_set.x_flag_trapping_math)
+    flag_trapping_math = 0;
+}
+
 /* Print language-specific items in declaration NODE.  */
 
 static void