2015-02-10 Michael Collison <michael.collison@linaro.org>
authorcollison <collison@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 10 Feb 2015 08:17:09 +0000 (08:17 +0000)
committercollison <collison@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 10 Feb 2015 08:17:09 +0000 (08:17 +0000)
Backport from trunk r217091.
2014-11-04  Jiong Wang  <jiong.wang@arm.com>
2014-11-04  Wilco Dijkstra  <wilco.dijkstra@arm.com>

PR target/63293
* config/aarch64/aarch64.c (aarch64_expand_epiloue): Add barriers before
stack adjustment.

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

gcc/ChangeLog.linaro
gcc/config/aarch64/aarch64.c

index 6b95bd0..95d4275 100644 (file)
@@ -1,4 +1,14 @@
-2015-01-27  Michael Collison  <michael.collison@linaro.org>
+2015-02-10  Michael Collison  <michael.collison@linaro.org>
+
+       Backport from trunk r217091.
+       2014-11-04  Jiong Wang  <jiong.wang@arm.com>
+       2014-11-04  Wilco Dijkstra  <wilco.dijkstra@arm.com>
+
+       PR target/63293
+       * config/aarch64/aarch64.c (aarch64_expand_epiloue): Add barriers before
+       stack adjustment.
+
+2015-02-10  Michael Collison  <michael.collison@linaro.org>
 
        Backport from trunk r217118.
        2014-11-05  Alex Velenko  <Alex.Velenko@arm.com>
index d26630b..76a20a6 100644 (file)
@@ -2437,6 +2437,9 @@ aarch64_expand_epilogue (bool for_sibcall)
   HOST_WIDE_INT fp_offset;
   HOST_WIDE_INT hard_fp_offset;
   rtx insn;
+  /* We need to add memory barrier to prevent read from deallocated stack.  */
+  bool need_barrier_p = (get_frame_size () != 0
+                        || cfun->machine->frame.saved_varargs_size);
 
   aarch64_layout_frame ();
 
@@ -2471,6 +2474,9 @@ aarch64_expand_epilogue (bool for_sibcall)
   if (frame_pointer_needed
       && (crtl->outgoing_args_size || cfun->calls_alloca))
     {
+      if (cfun->calls_alloca)
+       emit_insn (gen_stack_tie (stack_pointer_rtx, stack_pointer_rtx));
+
       insn = emit_insn (gen_add3_insn (stack_pointer_rtx,
                                       hard_frame_pointer_rtx,
                                       GEN_INT (0)));
@@ -2497,6 +2503,9 @@ aarch64_expand_epilogue (bool for_sibcall)
       aarch64_restore_callee_saves (DFmode, fp_offset, V0_REGNUM, V31_REGNUM,
                                    skip_wb, &cfi_ops);
 
+      if (need_barrier_p)
+       emit_insn (gen_stack_tie (stack_pointer_rtx, stack_pointer_rtx));
+
       if (skip_wb)
        {
          enum machine_mode mode1 = (reg1 <= R30_REGNUM) ? DImode : DFmode;
@@ -2537,6 +2546,9 @@ aarch64_expand_epilogue (bool for_sibcall)
 
   if (frame_size > 0)
     {
+      if (need_barrier_p)
+       emit_insn (gen_stack_tie (stack_pointer_rtx, stack_pointer_rtx));
+
       if (frame_size >= 0x1000000)
        {
          rtx op0 = gen_rtx_REG (Pmode, IP0_REGNUM);