OSDN Git Service

* config/ia64/ia64.c (ia64_compute_frame_size): Allocate the scratch
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 4 Dec 2012 09:09:12 +0000 (09:09 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 4 Dec 2012 09:09:12 +0000 (09:09 +0000)
area if the function allocates dynamic stack space.
(ia64_initial_elimination_offset): Adjust offsets to above change.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@194123 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/ia64/ia64.c

index 2eb5a7e..600ebbc 100644 (file)
@@ -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-11-24  Richard Henderson  <rth@redhat.com>
 
        PR libgcc/48076
index 71de697..ea2c549 100644 (file)
@@ -2830,8 +2830,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;
@@ -2865,18 +2867,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: