OSDN Git Service

Fix irix6 stdarg failure when last named arg has FP type.
authorwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 6 Feb 1998 14:31:56 +0000 (14:31 +0000)
committerwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 6 Feb 1998 14:31:56 +0000 (14:31 +0000)
* function.c (assign_parms): New variable named_arg, with value
depending on STRICT_ARGUMENT_NAMING.  Use instead of ! last_named.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@17695 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/function.c
gcc/testsuite/gcc.c-torture/ChangeLog
gcc/testsuite/gcc.c-torture/execute/980205.c [new file with mode: 0644]

index c3f3aac..b134080 100644 (file)
@@ -1,3 +1,8 @@
+Fri Feb  6 14:20:16 1998  Jim Wilson  <wilson@cygnus.com>
+
+       * function.c (assign_parms): New variable named_arg, with value
+       depending on STRICT_ARGUMENT_NAMING.  Use instead of ! last_named.
+
 Fri Feb  6 14:34:28 1998  Gavin Koch  <gavin@cygnus.com>
 
        * mips/t-r3900: New - same as t-ecoff but eliminate 
index c60bb24..d78d08a 100644 (file)
@@ -3632,10 +3632,18 @@ assign_parms (fndecl, second_time)
       tree nominal_type = TREE_TYPE (parm);
 
       /* Set LAST_NAMED if this is last named arg before some
-        anonymous args.  We treat it as if it were anonymous too.  */
+        anonymous args.  */
       int last_named = ((TREE_CHAIN (parm) == 0
                         || DECL_NAME (TREE_CHAIN (parm)) == 0)
                        && (stdarg || current_function_varargs));
+      /* Set NAMED_ARG if this arg should be treated as a named arg.  For
+        most machines, if this is a varargs/stdarg function, then we treat
+        the last named arg as if it were anonymous too.  */
+#ifdef STRICT_ARGUMENT_NAMING
+      int named_arg = 1;
+#else
+      int named_arg = ! last_name;
+#endif
 
       if (TREE_TYPE (parm) == error_mark_node
          /* This can happen after weird syntax errors
@@ -3684,7 +3692,7 @@ assign_parms (fndecl, second_time)
          || TREE_ADDRESSABLE (passed_type)
 #ifdef FUNCTION_ARG_PASS_BY_REFERENCE
          || FUNCTION_ARG_PASS_BY_REFERENCE (args_so_far, passed_mode,
-                                             passed_type, ! last_named)
+                                             passed_type, named_arg)
 #endif
          )
        {
@@ -3704,10 +3712,10 @@ assign_parms (fndecl, second_time)
         0 means it arrives on the stack.  */
 #ifdef FUNCTION_INCOMING_ARG
       entry_parm = FUNCTION_INCOMING_ARG (args_so_far, promoted_mode,
-                                         passed_type, ! last_named);
+                                         passed_type, named_arg);
 #else
       entry_parm = FUNCTION_ARG (args_so_far, promoted_mode,
-                                passed_type, ! last_named);
+                                passed_type, named_arg);
 #endif
 
       if (entry_parm == 0)
@@ -3753,12 +3761,12 @@ assign_parms (fndecl, second_time)
 #ifdef FUNCTION_INCOMING_ARG
                           FUNCTION_INCOMING_ARG (args_so_far, promoted_mode,
                                                  passed_type,
-                                                 (! last_named
+                                                 (named_arg
                                                   || varargs_setup)) != 0,
 #else
                           FUNCTION_ARG (args_so_far, promoted_mode,
                                         passed_type,
-                                        ! last_named || varargs_setup) != 0,
+                                        named_arg || varargs_setup) != 0,
 #endif
 #endif
                           fndecl, &stack_args_size, &stack_offset, &arg_size);
@@ -3799,7 +3807,7 @@ assign_parms (fndecl, second_time)
       if (entry_parm)
        {
          int nregs = FUNCTION_ARG_PARTIAL_NREGS (args_so_far, promoted_mode,
-                                                 passed_type, ! last_named);
+                                                 passed_type, named_arg);
 
          if (nregs > 0)
            {
@@ -3864,7 +3872,7 @@ assign_parms (fndecl, second_time)
       /* Update info on where next arg arrives in registers.  */
 
       FUNCTION_ARG_ADVANCE (args_so_far, promoted_mode,
-                           passed_type, ! last_named);
+                           passed_type, named_arg);
 
       /* If this is our second time through, we are done with this parm.  */
       if (second_time)
@@ -4106,7 +4114,7 @@ assign_parms (fndecl, second_time)
                   && FUNCTION_ARG_CALLEE_COPIES (args_so_far,
                                                  TYPE_MODE (DECL_ARG_TYPE (parm)),
                                                  DECL_ARG_TYPE (parm),
-                                                 ! last_named)
+                                                 named_arg)
                   && ! TREE_ADDRESSABLE (DECL_ARG_TYPE (parm)))
            {
              rtx copy;
index 24f690a..1715579 100644 (file)
@@ -1,3 +1,7 @@
+Fri Feb  6 14:30:48 1998  Jim Wilson  <wilson@cygnus.com>
+
+       * execute/980205.c: New test.
+
 Mon Dec  8 23:55:26 1997  J"orn Rennecke <amylaar@cygnus.co.uk>
 
        * noncompile/noncompile.exp (921102-1.c): Fixed comment.
diff --git a/gcc/testsuite/gcc.c-torture/execute/980205.c b/gcc/testsuite/gcc.c-torture/execute/980205.c
new file mode 100644 (file)
index 0000000..da15d3c
--- /dev/null
@@ -0,0 +1,20 @@
+#include <stdarg.h>
+
+void fdouble (double one, ...)
+{
+  double value;
+  va_list ap;
+
+  va_start (ap, one);
+  value = va_arg (ap, double);
+  va_end (ap);
+
+  if (one != 1.0 || value != 2.0)
+    abort ();
+}
+
+int main ()
+{
+  fdouble (1.0, 2.0);
+  exit (0);
+}