Patchwork [x86] Fix ICE with -fstack-check on Linux

login
register
mail settings
Submitter Eric Botcazou
Date Nov. 9, 2012, 9:04 a.m.
Message ID <4424229.JXHDEqDEIv@polaris>
Download mbox | patch
Permalink /patch/197996/
State New
Headers show

Comments

Eric Botcazou - Nov. 9, 2012, 9:04 a.m.
This is a regression present on the mainline and 4.7 branch.  The compiler 
ICEs on the attached Ada testcase at -O -fstack-check in ix86_expand_prologue:

  gcc_assert (m->fs.sp_offset == frame.stack_pointer_offset);

The problem is that release_scratch_register_on_entry uses a POP instruction 
but doesn't update cfun->machine accordingly.

Tested on x86_64-suse-linux, applied on mainline and 4.7 branch as obvious.


2012-11-09  Eric Botcazou  <ebotcazou@adacore.com>

	* config/i386/i386.c (release_scratch_register_on_entry): Also adjust
	sp_offset manually.


2012-11-09  Eric Botcazou  <ebotcazou@adacore.com>

	* gnat.dg/stack_check3.ad[sb]: New test.

Patch

Index: config/i386/i386.c
===================================================================
--- config/i386/i386.c	(revision 193322)
+++ config/i386/i386.c	(working copy)
@@ -9462,6 +9462,7 @@  release_scratch_register_on_entry (struc
 {
   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.  */
@@ -9469,6 +9470,7 @@  release_scratch_register_on_entry (struc
       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;
     }
 }