* config/xtensa/xtensa.c (function_arg_boundary): New.
authorbwilson <bwilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 26 Aug 2006 17:03:22 +0000 (17:03 +0000)
committerbwilson <bwilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 26 Aug 2006 17:03:22 +0000 (17:03 +0000)
(function_arg, xtensa_gimplify_va_arg_expr): Limit alignment to
STACK_BOUNDARY.
* config/xtensa/xtensa.h (FUNCTION_ARG_BOUNDARY): Move code to new
function_arg_boundary function that limits alignment to STACK_BOUNDARY.

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

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

index 6360ec6..cfd6d8c 100644 (file)
@@ -1,3 +1,11 @@
+2006-08-26  Bob Wilson  <bob.wilson@acm.org>
+
+       * config/xtensa/xtensa.c (function_arg_boundary): New.
+       (function_arg, xtensa_gimplify_va_arg_expr): Limit alignment to
+       STACK_BOUNDARY.
+       * config/xtensa/xtensa.h (FUNCTION_ARG_BOUNDARY): Move code to new
+       function_arg_boundary function that limits alignment to STACK_BOUNDARY.
+
 2006-08-26  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/28683
index d05d97e..836ae2e 100644 (file)
@@ -1,5 +1,5 @@
 /* Subroutines for insn-output.c for Tensilica's Xtensa architecture.
-   Copyright 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+   Copyright 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
    Contributed by Bob Wilson (bwilson@tensilica.com) at Tensilica.
 
 This file is part of GCC.
@@ -1470,7 +1470,7 @@ function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type,
 
   if (type && (TYPE_ALIGN (type) > BITS_PER_WORD))
     {
-      int align = TYPE_ALIGN (type) / BITS_PER_WORD;
+      int align = MIN (TYPE_ALIGN (type), STACK_BOUNDARY) / BITS_PER_WORD;
       *arg_words = (*arg_words + align - 1) & -align;
     }
 
@@ -1486,6 +1486,20 @@ function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type,
 }
 
 
+int
+function_arg_boundary (enum machine_mode mode, tree type)
+{
+  unsigned int alignment;
+
+  alignment = type ? TYPE_ALIGN (type) : GET_MODE_ALIGNMENT (mode);
+  if (alignment < PARM_BOUNDARY)
+    alignment = PARM_BOUNDARY;
+  if (alignment > STACK_BOUNDARY)
+    alignment = STACK_BOUNDARY;
+  return alignment;
+}
+
+
 static bool
 xtensa_return_in_msb (tree valtype)
 {
@@ -2185,7 +2199,7 @@ xtensa_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p,
 
   if (TYPE_ALIGN (type) > BITS_PER_WORD)
     {
-      int align = TYPE_ALIGN (type) / BITS_PER_UNIT;
+      int align = MIN (TYPE_ALIGN (type), STACK_BOUNDARY) / BITS_PER_UNIT;
 
       t = build2 (PLUS_EXPR, integer_type_node, orig_ndx,
                  build_int_cst (NULL_TREE, align - 1));
index c290a38..d7f7010 100644 (file)
@@ -1,5 +1,5 @@
 /* Definitions of Tensilica's Xtensa target machine for GNU compiler.
-   Copyright 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+   Copyright 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
    Contributed by Bob Wilson (bwilson@tensilica.com) at Tensilica.
 
 This file is part of GCC.
@@ -728,15 +728,7 @@ typedef struct xtensa_args
 #define FUNCTION_INCOMING_ARG(CUM, MODE, TYPE, NAMED) \
   function_arg (&CUM, MODE, TYPE, TRUE)
 
-/* Specify function argument alignment.  */
-#define FUNCTION_ARG_BOUNDARY(MODE, TYPE)                              \
-  ((TYPE) != 0                                                         \
-   ? (TYPE_ALIGN (TYPE) <= PARM_BOUNDARY                               \
-      ? PARM_BOUNDARY                                                  \
-      : TYPE_ALIGN (TYPE))                                             \
-   : (GET_MODE_ALIGNMENT (MODE) <= PARM_BOUNDARY                       \
-      ? PARM_BOUNDARY                                                  \
-      : GET_MODE_ALIGNMENT (MODE)))
+#define FUNCTION_ARG_BOUNDARY function_arg_boundary
 
 /* Profiling Xtensa code is typically done with the built-in profiling
    feature of Tensilica's instruction set simulator, which does not