Commit d2348985 by Bob Wilson Committed by Bob Wilson

xtensa.c (function_arg_boundary): New.

	* 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.

From-SVN: r116469
parent eff3a276
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> 2006-08-26 Jakub Jelinek <jakub@redhat.com>
PR middle-end/28683 PR middle-end/28683
......
/* Subroutines for insn-output.c for Tensilica's Xtensa architecture. /* 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. Contributed by Bob Wilson (bwilson@tensilica.com) at Tensilica.
This file is part of GCC. This file is part of GCC.
...@@ -1470,7 +1470,7 @@ function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type, ...@@ -1470,7 +1470,7 @@ function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type,
if (type && (TYPE_ALIGN (type) > BITS_PER_WORD)) 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; *arg_words = (*arg_words + align - 1) & -align;
} }
...@@ -1486,6 +1486,20 @@ function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type, ...@@ -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 static bool
xtensa_return_in_msb (tree valtype) xtensa_return_in_msb (tree valtype)
{ {
...@@ -2185,7 +2199,7 @@ xtensa_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p, ...@@ -2185,7 +2199,7 @@ xtensa_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p,
if (TYPE_ALIGN (type) > BITS_PER_WORD) 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, t = build2 (PLUS_EXPR, integer_type_node, orig_ndx,
build_int_cst (NULL_TREE, align - 1)); build_int_cst (NULL_TREE, align - 1));
......
/* Definitions of Tensilica's Xtensa target machine for GNU compiler. /* 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. Contributed by Bob Wilson (bwilson@tensilica.com) at Tensilica.
This file is part of GCC. This file is part of GCC.
...@@ -728,15 +728,7 @@ typedef struct xtensa_args ...@@ -728,15 +728,7 @@ typedef struct xtensa_args
#define FUNCTION_INCOMING_ARG(CUM, MODE, TYPE, NAMED) \ #define FUNCTION_INCOMING_ARG(CUM, MODE, TYPE, NAMED) \
function_arg (&CUM, MODE, TYPE, TRUE) function_arg (&CUM, MODE, TYPE, TRUE)
/* Specify function argument alignment. */ #define FUNCTION_ARG_BOUNDARY function_arg_boundary
#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)))
/* Profiling Xtensa code is typically done with the built-in profiling /* Profiling Xtensa code is typically done with the built-in profiling
feature of Tensilica's instruction set simulator, which does not feature of Tensilica's instruction set simulator, which does not
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment