mips.c (mips_va_arg): Handle arguments that must be passed on the stack.
authorRichard Sandiford <rsandifo@redhat.com>
Thu, 25 Sep 2003 07:04:05 +0000 (07:04 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Thu, 25 Sep 2003 07:04:05 +0000 (07:04 +0000)
* config/mips/mips.c (mips_va_arg): Handle arguments that must be
passed on the stack.

From-SVN: r71760

gcc/ChangeLog
gcc/config/mips/mips.c

index ab6266836c51ec3afb1313fd7d10a3d8fb90acfc..d581d45ed147cd620fde3de2916d88649aae4826 100644 (file)
@@ -1,3 +1,8 @@
+2003-09-25  Richard Sandiford  <rsandifo@redhat.com>
+
+       * config/mips/mips.c (mips_va_arg): Handle arguments that must be
+       passed on the stack.
+
 2003-09-25  Nathanael Nerode  <neroden@gcc.gnu.org>
 
        * config.gcc (widely ported systems section): Mostly alphabetize
index 0f0a6803813694971acc9b319c6f8306f2cad2ec..3a9aac3b37b913c5233fc010279c4ce4d7b58178 100644 (file)
@@ -4277,6 +4277,7 @@ mips_va_arg (tree valist, tree type)
     {
       /* Not EABI.  */
       int align;
+      HOST_WIDE_INT min_offset;
 
       /* ??? The original va-mips.h did always align, despite the fact
         that alignments <= UNITS_PER_WORD are preserved by the va_arg
@@ -4295,6 +4296,24 @@ mips_va_arg (tree valist, tree type)
       t = build (PLUS_EXPR, TREE_TYPE (valist), valist,
                 build_int_2 (align - 1, 0));
       t = build (BIT_AND_EXPR, TREE_TYPE (t), t, build_int_2 (-align, -1));
+
+      /* If arguments of type TYPE must be passed on the stack,
+        set MIN_OFFSET to the offset of the first stack parameter.  */
+      if (!MUST_PASS_IN_STACK (TYPE_MODE (type), type))
+       min_offset = 0;
+      else if (TARGET_NEWABI)
+       min_offset = current_function_pretend_args_size;
+      else
+       min_offset = REG_PARM_STACK_SPACE (current_function_decl);
+
+      /* Make sure the new address is at least MIN_OFFSET bytes from
+        the incoming argument pointer.  */
+      if (min_offset > 0)
+       t = build (MAX_EXPR, TREE_TYPE (valist), t,
+                  make_tree (TREE_TYPE (valist),
+                             plus_constant (virtual_incoming_args_rtx,
+                                            min_offset)));
+
       t = build (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);