re PR debug/46095 (ICE: in dwarf2out_frame_debug_expr, at dwarf2out.c:2341 with -fstack-protector)

PR debug/46095
	* config/i386/i386.c (pro_epilogue_adjust_stack): Instead of
	marking r11 set RTX_FRAME_RELATED_P if offset is too large for
	style < 0, add REG_FRAME_RELATED_EXPR.

	* gcc.target/i386/pr46095.c: New test.

From-SVN: r166767
This commit is contained in:
Jakub Jelinek 2010-11-15 21:09:24 +01:00 committed by Jakub Jelinek
parent 61630b2768
commit 23d8fd35c4
4 changed files with 31 additions and 2 deletions

View file

@ -1,5 +1,10 @@
2010-11-15 Jakub Jelinek <jakub@redhat.com>
PR debug/46095
* config/i386/i386.c (pro_epilogue_adjust_stack): Instead of
marking r11 set RTX_FRAME_RELATED_P if offset is too large for
style < 0, add REG_FRAME_RELATED_EXPR.
PR debug/46387
* rtl.h (vt_equate_reg_base_value): New prototype.
* alias.c (vt_equate_reg_base_value): New function.

View file

@ -9418,6 +9418,7 @@ pro_epilogue_adjust_stack (rtx dest, rtx src, rtx offset,
{
struct machine_function *m = cfun->machine;
rtx insn;
bool add_frame_related_expr = false;
if (! TARGET_64BIT)
insn = gen_pro_epilogue_adjust_stack_si_add (dest, src, offset);
@ -9438,7 +9439,7 @@ pro_epilogue_adjust_stack (rtx dest, rtx src, rtx offset,
}
insn = emit_insn (gen_rtx_SET (DImode, tmp, offset));
if (style < 0)
RTX_FRAME_RELATED_P (insn) = 1;
add_frame_related_expr = true;
insn = gen_pro_epilogue_adjust_stack_di_add (dest, src, tmp);
}
@ -9461,7 +9462,15 @@ pro_epilogue_adjust_stack (rtx dest, rtx src, rtx offset,
RTX_FRAME_RELATED_P (insn) = 1;
}
else if (style < 0)
RTX_FRAME_RELATED_P (insn) = 1;
{
RTX_FRAME_RELATED_P (insn) = 1;
if (add_frame_related_expr)
{
rtx r = gen_rtx_PLUS (Pmode, src, offset);
r = gen_rtx_SET (VOIDmode, dest, r);
add_reg_note (insn, REG_FRAME_RELATED_EXPR, r);
}
}
if (dest == stack_pointer_rtx)
{

View file

@ -1,5 +1,8 @@
2010-11-15 Jakub Jelinek <jakub@redhat.com>
PR debug/46095
* gcc.target/i386/pr46095.c: New test.
PR debug/46387
* gcc.dg/pr46387.c: New test.

View file

@ -0,0 +1,12 @@
/* PR debug/46095 */
/* { dg-do compile { target lp64 } } */
/* { dg-options "-O -fschedule-insns2 -fno-omit-frame-pointer -fstack-protector" } */
extern void bar (char *);
void
foo (void)
{
char c[0x80000000UL];
bar (c);
}