This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[VMS/committed]: Fix ABI issue on vms/ia64


Hi,

ia64/VMS doesn't closely follow the 'standard' ia64 ABI (in order to be backward compatible with VAX).
We recently found one mismatch while passing FP parameters.

Manually tested and checked - no test case added as this require another compiler to test.

Committed on trunk.

Tristan.

2012-03-12  Tristan Gingold  <gingold@adacore.com>

	* config/ia64/ia64.c (ia64_function_arg_1): Move code around.
	(ia64_function_arg_advance): Ditto.

Index: gcc/config/ia64/ia64.c
===================================================================
--- gcc/config/ia64/ia64.c	(revision 185231)
+++ gcc/config/ia64/ia64.c	(working copy)
@@ -4491,6 +4491,15 @@
   if (cum->words + offset >= MAX_ARGUMENT_SLOTS)
     return 0;
 
+  /* On OpenVMS argument is either in Rn or Fn.  */
+  if (TARGET_ABI_OPEN_VMS)
+    {
+      if (FLOAT_MODE_P (mode))
+	return gen_rtx_REG (mode, FR_ARG_FIRST + cum->words);
+      else
+	return gen_rtx_REG (mode, basereg + cum->words);
+    }
+
   /* Check for and handle homogeneous FP aggregates.  */
   if (type)
     hfa_mode = hfa_element_mode (type, 0);
@@ -4577,15 +4586,6 @@
       return gen_rtx_PARALLEL (mode, gen_rtvec_v (i, loc));
     }
   
-  /* On OpenVMS variable argument is either in Rn or Fn.  */
-  else if (TARGET_ABI_OPEN_VMS && named == 0)
-    {
-      if (FLOAT_MODE_P (mode))
-	return gen_rtx_REG (mode, FR_ARG_FIRST + cum->words);
-      else
-	return gen_rtx_REG (mode, basereg + cum->words);
-    }
-
   /* Integral and aggregates go in general registers.  If we have run out of
      FR registers, then FP values must also go in general registers.  This can
      happen when we have a SFmode HFA.  */
@@ -4736,6 +4736,14 @@
   cum->atypes[cum->words] = ia64_arg_type (mode);
   cum->words += words + offset;
 
+  /* On OpenVMS argument is either in Rn or Fn.  */
+  if (TARGET_ABI_OPEN_VMS && named == 0)
+    {
+      cum->int_regs = cum->words;
+      cum->fp_regs = cum->words;
+      return;
+    }
+
   /* Check for and handle homogeneous FP aggregates.  */
   if (type)
     hfa_mode = hfa_element_mode (type, 0);
@@ -4776,13 +4784,6 @@
       cum->fp_regs = fp_regs;
     }
 
-  /* On OpenVMS variable argument is either in Rn or Fn.  */
-  else if (TARGET_ABI_OPEN_VMS && named == 0)
-    {
-      cum->int_regs = cum->words;
-      cum->fp_regs = cum->words;
-    }
-
   /* Integral and aggregates go in general registers.  So do TFmode FP values.
      If we have run out of FR registers, then other FP values must also go in
      general registers.  This can happen when we have a SFmode HFA.  */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]