From 48fd730dd854ef287af51083a73285c7c170c7a4 Mon Sep 17 00:00:00 2001 From: ebotcazou Date: Fri, 9 Nov 2012 09:13:25 +0000 Subject: [PATCH] * config/i386/i386.c (release_scratch_register_on_entry): Also adjust sp_offset manually. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@193353 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 5 +++++ gcc/config/i386/i386.c | 2 ++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/stack_check3.adb | 36 ++++++++++++++++++++++++++++++++++++ gcc/testsuite/stack_check3.ads | 5 +++++ 5 files changed, 52 insertions(+) create mode 100644 gcc/testsuite/stack_check3.adb create mode 100644 gcc/testsuite/stack_check3.ads diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e7dd8fd146a..2fc1be0b774 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2012-11-09 Eric Botcazou + + * config/i386/i386.c (release_scratch_register_on_entry): Also adjust + sp_offset manually. + 2012-11-07 Uros Bizjak Backport from mainline diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 6589227cc20..45be11bb267 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -9604,6 +9604,7 @@ release_scratch_register_on_entry (struct scratch_reg *sr) { if (sr->saved) { + struct machine_function *m = cfun->machine; rtx x, insn = emit_insn (gen_pop (sr->reg)); /* The RTX_FRAME_RELATED_P mechanism doesn't know about pop. */ @@ -9611,6 +9612,7 @@ release_scratch_register_on_entry (struct scratch_reg *sr) x = gen_rtx_PLUS (Pmode, stack_pointer_rtx, GEN_INT (UNITS_PER_WORD)); x = gen_rtx_SET (VOIDmode, stack_pointer_rtx, x); add_reg_note (insn, REG_FRAME_RELATED_EXPR, x); + m->fs.sp_offset -= UNITS_PER_WORD; } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6e4a1818583..7f402b1c0ba 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2012-11-09 Eric Botcazou + + * gnat.dg/stack_check3.ad[sb]: New test. + 2012-11-07 Eric Botcazou * gcc.c-torture/compile/20121107-1.c: New test. diff --git a/gcc/testsuite/stack_check3.adb b/gcc/testsuite/stack_check3.adb new file mode 100644 index 00000000000..734ed422733 --- /dev/null +++ b/gcc/testsuite/stack_check3.adb @@ -0,0 +1,36 @@ +-- { dg-do compile } +-- { dg-options "-O -fstack-check" } + +package body Stack_Check3 is + + type Int_Arr is array (1 .. 34) of Integer; + + type Rec (D : Boolean := False) is + record + case D is + when True => IA : Int_Arr; + when False => null; + end case; + end record; + + type Rec_Arr is array (1 .. 256) of Rec; + + protected Prot_Arr is + procedure Reset; + private + A : Rec_Arr; + end Prot_Arr; + + protected body Prot_Arr is + procedure Reset is + begin + A := (others => (D => False)); + end Reset; + end Prot_Arr; + + procedure Reset is + begin + Prot_Arr.Reset; + end Reset; + +end Stack_Check3; diff --git a/gcc/testsuite/stack_check3.ads b/gcc/testsuite/stack_check3.ads new file mode 100644 index 00000000000..869c418839e --- /dev/null +++ b/gcc/testsuite/stack_check3.ads @@ -0,0 +1,5 @@ +package Stack_Check3 is + + procedure Reset; + +end Stack_Check3; -- 2.11.0