diff options
author | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-11-02 12:10:36 +0000 |
---|---|---|
committer | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-11-02 12:10:36 +0000 |
commit | 103dfb1064d6066be8e5dab587a7d6c8fdf6545a (patch) | |
tree | a0393256909d5ee902af286748f2b0fbdf7d191d /gcc/cfgrtl.c | |
parent | 71aa0c9f22901eca069eaee147fe426c132d97ca (diff) | |
download | gcc-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
Diffstat (limited to 'gcc/cfgrtl.c')
-rw-r--r-- | gcc/cfgrtl.c | 43 |
1 files changed, 27 insertions, 16 deletions
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)))) |