]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR debug/59418 (ICE in maybe_record_trace_start, at dwarf2cfi.c:2221)
authorEric Botcazou <ebotcazou@adacore.com>
Wed, 18 Dec 2013 10:34:00 +0000 (10:34 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Wed, 18 Dec 2013 10:34:00 +0000 (10:34 +0000)
PR debug/59418
* dwarf2cfi.c (dwarf2out_frame_debug_cfa_offset): Fix comment and tidy.
(dwarf2out_frame_debug_cfa_restore): Handle TARGET_DWARF_REGISTER_SPAN.
(dwarf2out_frame_debug_expr): Tidy.

From-SVN: r206084

gcc/ChangeLog
gcc/dwarf2cfi.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr59418.c [new file with mode: 0644]

index d4f1196c6dd39a84b4dff63e66be4cc10211bcf6..52a1998cf36ea72ee2378da8611d651ad91cb987 100644 (file)
@@ -1,3 +1,10 @@
+2013-12-18  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR debug/59418
+       * dwarf2cfi.c (dwarf2out_frame_debug_cfa_offset): Fix comment and tidy.
+       (dwarf2out_frame_debug_cfa_restore): Handle TARGET_DWARF_REGISTER_SPAN.
+       (dwarf2out_frame_debug_expr): Tidy.
+
 2013-12-18  Alexander Ivchenko  <alexander.ivchenko@intel.com>
            Maxim Kuznetsov  <maxim.kuznetsov@intel.com>
            Sergey Lega  <sergey.s.lega@intel.com>
index 330836b66e88f550fc47ec8662159c3f5f13566a..77152990ea5bdaddf17dd7cba6656cfa54bc40d0 100644 (file)
@@ -1149,18 +1149,15 @@ dwarf2out_frame_debug_cfa_offset (rtx set)
   else
     {
       /* We have a PARALLEL describing where the contents of SRC live.
-        Queue register saves for each piece of the PARALLEL.  */
-      int par_index;
-      int limit;
+        Adjust the offset for each piece of the PARALLEL.  */
       HOST_WIDE_INT span_offset = offset;
 
       gcc_assert (GET_CODE (span) == PARALLEL);
 
-      limit = XVECLEN (span, 0);
-      for (par_index = 0; par_index < limit; par_index++)
+      const int par_len = XVECLEN (span, 0);
+      for (int par_index = 0; par_index < par_len; par_index++)
        {
          rtx elem = XVECEXP (span, 0, par_index);
-
          sregno = dwf_regno (src);
          reg_save (sregno, INVALID_REGNUM, span_offset);
          span_offset += GET_MODE_SIZE (GET_MODE (elem));
@@ -1229,10 +1226,31 @@ dwarf2out_frame_debug_cfa_expression (rtx set)
 static void
 dwarf2out_frame_debug_cfa_restore (rtx reg)
 {
-  unsigned int regno = dwf_regno (reg);
+  gcc_assert (REG_P (reg));
+
+  rtx span = targetm.dwarf_register_span (reg);
+  if (!span)
+    {
+      unsigned int regno = dwf_regno (reg);
+      add_cfi_restore (regno);
+      update_row_reg_save (cur_row, regno, NULL);
+    }
+  else
+    {
+      /* We have a PARALLEL describing where the contents of REG live.
+        Restore the register for each piece of the PARALLEL.  */
+      gcc_assert (GET_CODE (span) == PARALLEL);
 
-  add_cfi_restore (regno);
-  update_row_reg_save (cur_row, regno, NULL);
+      const int par_len = XVECLEN (span, 0);
+      for (int par_index = 0; par_index < par_len; par_index++)
+       {
+         reg = XVECEXP (span, 0, par_index);
+         gcc_assert (REG_P (reg));
+         unsigned int regno = dwf_regno (reg);
+         add_cfi_restore (regno);
+         update_row_reg_save (cur_row, regno, NULL);
+       }
+    }
 }
 
 /* A subroutine of dwarf2out_frame_debug, process a REG_CFA_WINDOW_SAVE.
@@ -1884,23 +1902,23 @@ dwarf2out_frame_debug_expr (rtx expr)
            }
        }
 
-      span = NULL;
       if (REG_P (src))
        span = targetm.dwarf_register_span (src);
+      else
+       span = NULL;
+
       if (!span)
        queue_reg_save (src, NULL_RTX, offset);
       else
        {
          /* We have a PARALLEL describing where the contents of SRC live.
             Queue register saves for each piece of the PARALLEL.  */
-         int par_index;
-         int limit;
          HOST_WIDE_INT span_offset = offset;
 
          gcc_assert (GET_CODE (span) == PARALLEL);
 
-         limit = XVECLEN (span, 0);
-         for (par_index = 0; par_index < limit; par_index++)
+         const int par_len = XVECLEN (span, 0);
+         for (int par_index = 0; par_index < par_len; par_index++)
            {
              rtx elem = XVECEXP (span, 0, par_index);
              queue_reg_save (elem, NULL_RTX, span_offset);
index 29110efb85ba5ba81686451cadbb06d775faab02..f192b5d3526868cac555ca696fa74f51f10f17d1 100644 (file)
@@ -1,3 +1,7 @@
+2013-12-18  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc.dg/pr59418.c: New test.
+
 2013-12-17  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/59523
diff --git a/gcc/testsuite/gcc.dg/pr59418.c b/gcc/testsuite/gcc.dg/pr59418.c
new file mode 100644 (file)
index 0000000..114c1d3
--- /dev/null
@@ -0,0 +1,35 @@
+/* PR debug/59418 */
+/* Reported by Ryan Mansfield <rmansfield@qnx.com> */
+
+/* { dg-do compile } */
+/* { dg-options "-Os -g" } */
+/* { dg-options "-march=armv7-a -mfloat-abi=hard -Os -g" { target arm*-*-* } } */
+
+extern int printf (const char *__format, ...);
+
+void
+foo (const char *pptr, int caplen)
+{
+  int type;
+  const char *tptr;
+  if (caplen < 4)
+    {
+      (void) printf ("foo");
+      return;
+    }
+  while (tptr < pptr)
+    {
+      switch (type)
+       {
+       case 0x01:
+         printf ("");
+       case 0x0b:
+         printf ("");
+       case 0x0e:
+         printf ("");
+       case 0x10:
+         printf ("%1.2fW", bar (tptr, caplen) / 1000.0);
+       }
+    }
+  printf ("foo");
+}