summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2012-11-02 12:10:36 +0000
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2012-11-02 12:10:36 +0000
commit103dfb1064d6066be8e5dab587a7d6c8fdf6545a (patch)
treea0393256909d5ee902af286748f2b0fbdf7d191d
parent71aa0c9f22901eca069eaee147fe426c132d97ca (diff)
downloadgcc-103dfb1064d6066be8e5dab587a7d6c8fdf6545a.tar.gz
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@193094 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/cfg-flags.def8
-rw-r--r--gcc/cfgrtl.c43
3 files changed, 40 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 64fe31a0477..f0a6a97f91e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/cfg-flags.def b/gcc/cfg-flags.def
index 839b9b358cf..e9e2dd604e6 100644
--- a/gcc/cfg-flags.def
+++ b/gcc/cfg-flags.def
@@ -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)
diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index 9156ee8756d..1f601e51d03 100644
--- a/gcc/cfgrtl.c
+++ b/gcc/cfgrtl.c
@@ -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))))