re PR debug/46095 (ICE: in dwarf2out_frame_debug_expr, at dwarf2out.c:2341 with ...
authorJakub Jelinek <jakub@redhat.com>
Mon, 15 Nov 2010 20:09:24 +0000 (21:09 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 15 Nov 2010 20:09:24 +0000 (21:09 +0100)
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

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr46095.c [new file with mode: 0644]

index fc7c8d10acd3104b965d887566b1ec4c01d656bd..b0cd604822ac89852f2c24a320751091e2803ab9 100644 (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.
index 15e8b271b9dfd9a4a57fa54b556a327738cd5746..f7cd0faccb8f66e777c27a3db124ccc844b710bd 100644 (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)
     {
index 5b8a56e08b0b2ad71818785981d59da0cf588da2..00f541844be64c887dd36ded7027ee96a09f738a 100644 (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.
 
diff --git a/gcc/testsuite/gcc.target/i386/pr46095.c b/gcc/testsuite/gcc.target/i386/pr46095.c
new file mode 100644 (file)
index 0000000..ab9501e
--- /dev/null
@@ -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);
+}