ia64.c (ia64_compute_frame_size): Allocate the scratch area if the function allocates dynamic stack space.
* config/ia64/ia64.c (ia64_compute_frame_size): Allocate the scratch area if the function allocates dynamic stack space. (ia64_initial_elimination_offset): Adjust offsets to above change. From-SVN: r194122
This commit is contained in:
parent
ee88f662f7
commit
b38fd39644
|
@ -1,3 +1,9 @@
|
|||
2012-12-03 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* config/ia64/ia64.c (ia64_compute_frame_size): Allocate the scratch
|
||||
area if the function allocates dynamic stack space.
|
||||
(ia64_initial_elimination_offset): Adjust offsets to above change.
|
||||
|
||||
2012-12-03 Richard Biener <rguenther@suse.de>
|
||||
|
||||
Backport from mainline
|
||||
|
|
|
@ -2943,8 +2943,10 @@ ia64_compute_frame_size (HOST_WIDE_INT size)
|
|||
|
||||
/* We always use the 16-byte scratch area provided by the caller, but
|
||||
if we are a leaf function, there's no one to which we need to provide
|
||||
a scratch area. */
|
||||
if (current_function_is_leaf)
|
||||
a scratch area. However, if the function allocates dynamic stack space,
|
||||
the dynamic offset is computed early and contains STACK_POINTER_OFFSET,
|
||||
so we need to cope. */
|
||||
if (current_function_is_leaf && !cfun->calls_alloca)
|
||||
total_size = MAX (0, total_size - 16);
|
||||
|
||||
current_frame_info.total_size = total_size;
|
||||
|
@ -2978,18 +2980,15 @@ ia64_initial_elimination_offset (int from, int to)
|
|||
switch (to)
|
||||
{
|
||||
case HARD_FRAME_POINTER_REGNUM:
|
||||
if (current_function_is_leaf)
|
||||
offset = -current_frame_info.total_size;
|
||||
else
|
||||
offset = -(current_frame_info.total_size
|
||||
- crtl->outgoing_args_size - 16);
|
||||
offset = -current_frame_info.total_size;
|
||||
if (!current_function_is_leaf || cfun->calls_alloca)
|
||||
offset += 16 + crtl->outgoing_args_size;
|
||||
break;
|
||||
|
||||
case STACK_POINTER_REGNUM:
|
||||
if (current_function_is_leaf)
|
||||
offset = 0;
|
||||
else
|
||||
offset = 16 + crtl->outgoing_args_size;
|
||||
offset = 0;
|
||||
if (!current_function_is_leaf || cfun->calls_alloca)
|
||||
offset += 16 + crtl->outgoing_args_size;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
Loading…
Reference in New Issue