diff options
Diffstat (limited to 'meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0049-PR-target-48142.patch')
-rw-r--r-- | meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0049-PR-target-48142.patch | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0049-PR-target-48142.patch b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0049-PR-target-48142.patch new file mode 100644 index 0000000000..11d3e1ee2e --- /dev/null +++ b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0049-PR-target-48142.patch @@ -0,0 +1,92 @@ +From 18bc61fc490330f5dc59639626fa9bb5269e31d7 Mon Sep 17 00:00:00 2001 +From: ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> +Date: Thu, 31 Mar 2011 11:14:41 +0000 +Subject: [PATCH 049/200] PR target/48142 + * config/i386/i386.c (ix86_adjust_stack_and_probe): Differentiate + frame-related from frame-unrelated adjustments to the stack pointer. + +git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@171778 138bc75d-0d04-0410-961f-82ee72b054a4 + +index 4fb654f..a524d77 100644 +--- a/gcc/config/i386/i386.c ++++ b/gcc/config/i386/i386.c +@@ -9981,7 +9981,7 @@ ix86_adjust_stack_and_probe (const HOST_WIDE_INT size) + probe that many bytes past the specified size to maintain a protection + area at the botton of the stack. */ + const int dope = 4 * UNITS_PER_WORD; +- rtx size_rtx = GEN_INT (size); ++ rtx size_rtx = GEN_INT (size), last; + + /* See if we have a constant small number of probes to generate. If so, + that's the easy case. The run-time loop is made up of 11 insns in the +@@ -10021,9 +10021,9 @@ ix86_adjust_stack_and_probe (const HOST_WIDE_INT size) + emit_stack_probe (stack_pointer_rtx); + + /* Adjust back to account for the additional first interval. */ +- emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx, +- plus_constant (stack_pointer_rtx, +- PROBE_INTERVAL + dope))); ++ last = emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx, ++ plus_constant (stack_pointer_rtx, ++ PROBE_INTERVAL + dope))); + } + + /* Otherwise, do the same as above, but in a loop. Note that we must be +@@ -10084,15 +10084,33 @@ ix86_adjust_stack_and_probe (const HOST_WIDE_INT size) + } + + /* Adjust back to account for the additional first interval. */ +- emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx, +- plus_constant (stack_pointer_rtx, +- PROBE_INTERVAL + dope))); ++ last = emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx, ++ plus_constant (stack_pointer_rtx, ++ PROBE_INTERVAL + dope))); + + release_scratch_register_on_entry (&sr); + } + + gcc_assert (cfun->machine->fs.cfa_reg != stack_pointer_rtx); +- cfun->machine->fs.sp_offset += size; ++ ++ /* Even if the stack pointer isn't the CFA register, we need to correctly ++ describe the adjustments made to it, in particular differentiate the ++ frame-related ones from the frame-unrelated ones. */ ++ if (size > 0) ++ { ++ rtx expr = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (2)); ++ XVECEXP (expr, 0, 0) ++ = gen_rtx_SET (VOIDmode, stack_pointer_rtx, ++ plus_constant (stack_pointer_rtx, -size)); ++ XVECEXP (expr, 0, 1) ++ = gen_rtx_SET (VOIDmode, stack_pointer_rtx, ++ plus_constant (stack_pointer_rtx, ++ PROBE_INTERVAL + dope + size)); ++ add_reg_note (last, REG_FRAME_RELATED_EXPR, expr); ++ RTX_FRAME_RELATED_P (last) = 1; ++ ++ cfun->machine->fs.sp_offset += size; ++ } + + /* Make sure nothing is scheduled before we are done. */ + emit_insn (gen_blockage ()); +new file mode 100644 +index 0000000..7964057 +--- /dev/null ++++ b/gcc/testsuite/g++.dg/other/i386-9.C +@@ -0,0 +1,12 @@ ++// PR target/48142 ++// Testcase by Zdenek Sojka <zsojka@seznam.cz> ++ ++// { dg-do run { target i?86-*-* x86_64-*-* } } ++// { dg-options "-Os -mpreferred-stack-boundary=5 -fstack-check -fno-omit-frame-pointer" } ++ ++int main() ++{ ++ try { throw 0; } ++ catch (...) {} ++ return 0; ++} +-- +1.7.0.4 + |