OSDN Git Service

* config/i386/i386.c (release_scratch_register_on_entry): Also adjust
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 9 Nov 2012 09:13:25 +0000 (09:13 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 9 Nov 2012 09:13:25 +0000 (09:13 +0000)
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
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/stack_check3.adb [new file with mode: 0644]
gcc/testsuite/stack_check3.ads [new file with mode: 0644]

index e7dd8fd..2fc1be0 100644 (file)
@@ -1,3 +1,8 @@
+2012-11-09  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * config/i386/i386.c (release_scratch_register_on_entry): Also adjust
+       sp_offset manually.
+
 2012-11-07  Uros Bizjak  <ubizjak@gmail.com>
 
        Backport from mainline
index 6589227..45be11b 100644 (file)
@@ -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;
     }
 }
 
index 6e4a181..7f402b1 100644 (file)
@@ -1,3 +1,7 @@
+2012-11-09  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/stack_check3.ad[sb]: New test.
+
 2012-11-07  Eric Botcazou  <ebotcazou@adacore.com>
 
        * 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 (file)
index 0000000..734ed42
--- /dev/null
@@ -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 (file)
index 0000000..869c418
--- /dev/null
@@ -0,0 +1,5 @@
+package Stack_Check3 is
+
+  procedure Reset;
+
+end Stack_Check3;