xtensa.c (function_arg_advance): Check for args that must be passed in the stack.
authorBob Wilson <bob.wilson@acm.org>
Wed, 14 Jul 2004 19:52:46 +0000 (19:52 +0000)
committerBob Wilson <bwilson@gcc.gnu.org>
Wed, 14 Jul 2004 19:52:46 +0000 (19:52 +0000)
* config/xtensa/xtensa.c (function_arg_advance): Check for args
that must be passed in the stack.
(xtensa_gimplify_va_arg_expr): Skip special-case padding for small
arguments if the size is not a constant.

From-SVN: r84708

gcc/ChangeLog
gcc/config/xtensa/xtensa.c

index 62033604e750b842943543d011b8c5f9dace915d..f42c44365288c252abc84c44d6385abac433b9d4 100644 (file)
@@ -1,3 +1,10 @@
+2004-07-14  Bob Wilson  <bob.wilson@acm.org>
+
+       * config/xtensa/xtensa.c (function_arg_advance): Check for args
+       that must be passed in the stack.
+       (xtensa_gimplify_va_arg_expr): Skip special-case padding for small
+       arguments if the size is not a constant.
+
 2004-07-14  Per Bothner  <per@bothner.com>
 
        * c-typeck.c (emit_side_effect_warnings):  Use EXPR_HAS_LOCATION
index 09f835282fe3efabcdbe0a46bb634899085df127..940ba0eca4756d36e2fafabc1666b6eb94d6ac95 100644 (file)
@@ -1783,7 +1783,9 @@ function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type)
            ? (int) GET_MODE_SIZE (mode)
            : int_size_in_bytes (type)) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
 
-  if ((*arg_words + words > max) && (*arg_words < max))
+  if (*arg_words < max
+      && (targetm.calls.must_pass_in_stack (mode, type)
+         || *arg_words + words > max))
     *arg_words = max;
 
   *arg_words += words;
@@ -2619,7 +2621,7 @@ xtensa_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p,
      are aligned differently.  */
 
 
-  if (BYTES_BIG_ENDIAN)
+  if (BYTES_BIG_ENDIAN && TREE_CODE (type_size) == INTEGER_CST)
     {
       t = size_int (PARM_BOUNDARY / BITS_PER_UNIT);
       t = fold (build (GE_EXPR, boolean_type_node, type_size, t));