diff options
author | collison <collison@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-02-10 08:17:09 +0000 |
---|---|---|
committer | collison <collison@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-02-10 08:17:09 +0000 |
commit | fce43e3447526305734fac1330836e42e6c5993b (patch) | |
tree | 10703780b598f77ae0a82333d740d77f14b74fee /gcc/config/aarch64 | |
parent | 780ed12d6070542cf42723d143ac9a3efb2e329c (diff) |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/linaro/gcc-4_9-branch@220574 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/aarch64')
-rw-r--r-- | gcc/config/aarch64/aarch64.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index d26630bb481..76a20a61e77 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -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); |