cfg-flags.def (ABNORMAL_CALL): Fix comment.
authorEric Botcazou <ebotcazou@adacore.com>
Fri, 2 Nov 2012 12:10:36 +0000 (12:10 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 2 Nov 2012 12:10:36 +0000 (12:10 +0000)
* cfg-flags.def (ABNORMAL_CALL): Fix comment.
(EH): Likewise.
(SIBCALL): Likewise.
* cfgrtl.c (rtl_verify_flow_info_1): Adjust error messages.
Deal with EDGE_SIBCALL and fix the EDGE_ABNORMAL check.

From-SVN: r193094

gcc/ChangeLog
gcc/cfg-flags.def
gcc/cfgrtl.c

index 64fe31a0477e09f82d47eee0fc6ddb01b023a803..f0a6a97f91e2c2647caa749b2ad187b419daa6e3 100644 (file)
@@ -1,3 +1,11 @@
+2012-11-02  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * cfg-flags.def (ABNORMAL_CALL): Fix comment.
+       (EH): Likewise.
+       (SIBCALL): Likewise.
+       * cfgrtl.c (rtl_verify_flow_info_1): Adjust error messages.
+       Deal with EDGE_SIBCALL and fix the EDGE_ABNORMAL check.
+
 2012-11-02  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/55147
index 839b9b358cf4cfc077e16fd42926b3218ab6988e..e9e2dd604e653400712a898a039608d4761d1bbb 100644 (file)
@@ -115,13 +115,14 @@ DEF_EDGE_FLAG(FALLTHRU, 0)
 DEF_EDGE_FLAG(ABNORMAL, 1)
 
 /* Edge out of a basic block that ends with a CALL_INSN with abnormal
-   exit, like an exception, or a sibcall.
+   exit, like an exception or a non-local goto.
+   ABNORMAL_CALL edges also have ABNORMAL set.
    This flag is only used for the RTL CFG.  */
 DEF_EDGE_FLAG(ABNORMAL_CALL, 2)
 
 /* Exception edge.  Exception handling edges represent possible control
-   transfers from a trapping instruction to an exception handler.  EH
-   edges also have EDGE_ABNORMAL set.  */
+   transfers from a trapping instruction to an exception handler.
+   EH edges also have ABNORMAL set for the RTL CFG.  */
 DEF_EDGE_FLAG(EH, 3)
 
 /* Never merge blocks via this edge.  This is used for exception handling,
@@ -158,6 +159,7 @@ DEF_EDGE_FLAG(EXECUTABLE, 10)
 DEF_EDGE_FLAG(CROSSING, 11)
 
 /* Edge from a sibcall CALL_INSN to exit.
+   SIBCALL edges also have ABNORMAL set.
    This flag is only used for the RTL CFG.  */
 DEF_EDGE_FLAG(SIBCALL, 12)
 
index 9156ee8756dd1a9233449ab252ae6534365b6efa..1f601e51d03acd589ba31796bc124006b03e7302 100644 (file)
@@ -2095,7 +2095,8 @@ rtl_verify_flow_info_1 (void)
   /* Now check the basic blocks (boundaries etc.) */
   FOR_EACH_BB_REVERSE (bb)
     {
-      int n_fallthru = 0, n_eh = 0, n_call = 0, n_abnormal = 0, n_branch = 0;
+      int n_fallthru = 0, n_branch = 0, n_abnormal_call = 0, n_sibcall = 0;
+      int n_eh = 0, n_abnormal = 0;
       edge e, fallthru = NULL;
       rtx note;
       edge_iterator ei;
@@ -2132,13 +2133,13 @@ rtl_verify_flow_info_1 (void)
                }
              if (e->flags & EDGE_FALLTHRU)
                {
-                 error ("fallthru edge crosses section boundary (bb %i)",
+                 error ("fallthru edge crosses section boundary in bb %i",
                         e->src->index);
                  err = 1;
                }
              if (e->flags & EDGE_EH)
                {
-                 error ("EH edge crosses section boundary (bb %i)",
+                 error ("EH edge crosses section boundary in bb %i",
                         e->src->index);
                  err = 1;
                }
@@ -2158,22 +2159,26 @@ rtl_verify_flow_info_1 (void)
            n_branch++;
 
          if (e->flags & EDGE_ABNORMAL_CALL)
-           n_call++;
+           n_abnormal_call++;
+
+         if (e->flags & EDGE_SIBCALL)
+           n_sibcall++;
 
          if (e->flags & EDGE_EH)
            n_eh++;
-         else if (e->flags & EDGE_ABNORMAL)
+
+         if (e->flags & EDGE_ABNORMAL)
            n_abnormal++;
        }
 
       if (n_eh && !find_reg_note (BB_END (bb), REG_EH_REGION, NULL_RTX))
        {
-         error ("missing REG_EH_REGION note in the end of bb %i", bb->index);
+         error ("missing REG_EH_REGION note at the end of bb %i", bb->index);
          err = 1;
        }
       if (n_eh > 1)
        {
-         error ("too many eh edges %i", bb->index);
+         error ("too many exception handling edges in bb %i", bb->index);
          err = 1;
        }
       if (n_branch
@@ -2186,29 +2191,35 @@ rtl_verify_flow_info_1 (void)
        }
       if (n_fallthru && any_uncondjump_p (BB_END (bb)))
        {
-         error ("fallthru edge after unconditional jump %i", bb->index);
+         error ("fallthru edge after unconditional jump in bb %i", bb->index);
          err = 1;
        }
       if (n_branch != 1 && any_uncondjump_p (BB_END (bb)))
        {
-         error ("wrong number of branch edges after unconditional jump %i",
-                bb->index);
+         error ("wrong number of branch edges after unconditional jump"
+                " in bb %i", bb->index);
          err = 1;
        }
       if (n_branch != 1 && any_condjump_p (BB_END (bb))
          && JUMP_LABEL (BB_END (bb)) != BB_HEAD (fallthru->dest))
        {
-         error ("wrong amount of branch edges after conditional jump %i",
-                bb->index);
+         error ("wrong amount of branch edges after conditional jump"
+                " in bb %i", bb->index);
+         err = 1;
+       }
+      if (n_abnormal_call && !CALL_P (BB_END (bb)))
+       {
+         error ("abnormal call edges for non-call insn in bb %i", bb->index);
          err = 1;
        }
-      if (n_call && !CALL_P (BB_END (bb)))
+      if (n_sibcall && !CALL_P (BB_END (bb)))
        {
-         error ("call edges for non-call insn in bb %i", bb->index);
+         error ("sibcall edges for non-call insn in bb %i", bb->index);
          err = 1;
        }
-      if (n_abnormal
-         && (!CALL_P (BB_END (bb)) && n_call != n_abnormal)
+      if (n_abnormal > n_eh
+         && !(CALL_P (BB_END (bb))
+              && n_abnormal == n_abnormal_call + n_sibcall)
          && (!JUMP_P (BB_END (bb))
              || any_condjump_p (BB_END (bb))
              || any_uncondjump_p (BB_END (bb))))