00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #include "bb_verifier.h"
00044 #include "targ_isa_registers.h"
00045 #include "bb.h"
00046
00047 void BB_Verify_Flags(void)
00048 {
00049 BB* bb;
00050 OP* op;
00051 for(bb = REGION_First_BB; bb != NULL; bb = BB_next(bb))
00052 {
00053 if(BB_entry(bb)) {
00054 Is_True(!BB_preds_len(bb),("An entry bb hasn't been set"));
00055 }
00056
00057 if(BB_exit(bb)) {
00058 Is_True(!BB_succs_len(bb), ("An exit bb hasn't been set!"));
00059 }
00060
00061 ANNOTATION * annotations = BB_annotations(bb);
00062 while(annotations){
00063 ANNOTATION_KIND kind = annotations->kind;
00064 switch(kind){
00065 case ANNOT_LABEL:
00066 Is_True(BB_has_label(bb), ("a bb with label hasn't been set"));
00067 break;
00068 case ANNOT_PRAGMA:
00069 Is_True(BB_has_pragma(bb), ("a bb with pragma hasn't been set"));
00070 break;
00071 case ANNOT_ENTRYINFO:
00072 Is_True(BB_entry(bb),("An entry bb hasn't been set"));
00073 break;
00074 case ANNOT_EXITINFO:
00075 Is_True(BB_exit(bb), ("An exit bb hasn't been set!"));
00076 break;
00077 case ANNOT_CALLINFO:
00078 Is_True(BB_call(bb), ("A call bb hasn't been set!"));
00079 break;
00080 case ANNOT_NOTE:
00081 Is_True(BB_has_note(bb), ("a bb with note hasn't been set!"));
00082 break;
00083 case ANNOT_LOOPINFO:
00084 Is_True(BB_loophead(bb), ("loophead bb hasn't been set!"));
00085 break;
00086 case ANNOT_ROTATING_KERNEL:
00087 Is_True(BB_rotating_kernel(bb), ("a rotating kernel bb hasn't been set!"));
00088 break;
00089 case ANNOT_ASMINFO:
00090 Is_True(BB_asm(bb), ("a bb with asm hasn't been set!"));
00091 break;
00092 case ANNOT_SWITCH:
00093 break;
00094 default:
00095 Is_True(FALSE, ("unexpected annotation kind: %d", kind));
00096 }
00097 annotations = annotations->next;
00098 }
00099
00100 op = BB_last_op(bb);
00101 if(BB_call(bb)) {
00102 Is_True(OP_call(op), ("A call bb isn't right"));
00103 }
00104
00105 if(BB_scheduled(bb)) {
00106 Is_True(BB_Verify_Sched(bb), ("a sched bb isn't right!"));
00107 }
00108
00109 if(BB_reg_alloc(bb)) {
00110 Is_True(BB_Verify_Reg_Alloc(bb), ("a reg alloc bb isn't right!"));
00111 }
00112
00113 if(BB_recovery(bb)) {
00114 Is_True(BB_Verify_Recovery(bb), ("a recovery bb isn't right!"));
00115 }
00116
00117 if(BB_chk_split(bb)) {
00118 Is_True(BB_Verify_Chk_Split(bb), ("a chk split bb isn't right!"));
00119 }
00120 }
00121 }
00122
00123 BOOL BB_Verify_Sched(BB* bb)
00124 {
00125 OP* op;
00126 FOR_ALL_BB_OPs(bb, op){
00127 if(!OP_simulated(op) && !OP_dummy(op) && !OP_bundled(op)) {
00128 return FALSE;
00129 }
00130 }
00131 return TRUE;
00132 }
00133
00134 BOOL BB_Verify_Reg_Alloc(BB* bb)
00135 {
00136 OP* op;
00137 TN* tn;
00138 mUINT8 i;
00139 FOR_ALL_BB_OPs(bb, op){
00140 for(i = 0; i<OP_results(op); i++){
00141 tn = OP_result(op, i);
00142 if(TN_is_register(tn) &&
00143 TN_register(tn) == REGISTER_UNDEFINED)
00144 return FALSE;
00145 }
00146
00147 for(i = 0; i<OP_opnds(op); i++){
00148 tn = OP_opnd(op, i);
00149 if(TN_is_register(tn) &&
00150 TN_register(tn) == REGISTER_UNDEFINED)
00151 return FALSE;
00152 }
00153 }
00154 return TRUE;
00155 }
00156
00157 BOOL BB_Verify_Recovery(BB* bb)
00158 {
00159 if(BB_preds_len(bb) != 1) return FALSE;
00160 OP* op = BB_last_op(BBLIST_item(BB_preds(bb)));
00161 if(OP_chk(op)) {
00162 return TRUE;
00163 }
00164 else if ((op = OP_prev(op)) && OP_chk(op)) {
00165 return TRUE;
00166 }
00167 else if ((op = OP_prev(op)) && OP_chk(op)) {
00168 return TRUE;
00169 }
00170
00171 return FALSE;
00172 }
00173
00174 BOOL BB_Verify_Chk_Split(BB* bb)
00175 {
00176 if(BB_chk_split_head(bb)) {
00177 return TRUE;
00178 }
00179
00180 OP* op;
00181 BOOL has_chk_op = FALSE;
00182 FOR_ALL_BB_OPs(bb, op) {
00183 if(OP_chk(op)) {
00184 has_chk_op = TRUE;
00185 break;
00186 }
00187 }
00188
00189 if (!has_chk_op) {
00190 BB* succ_bb = BBLIST_item(BB_succs(bb));
00191 if(BB_chk_split(succ_bb)) {
00192 Is_True(BB_chk_split_head(succ_bb), ("The chk BB should be chk_split_head!"));
00193 } else {
00194 if(BB_succs(succ_bb) && BB_chk_split(BBLIST_item(BB_succs(succ_bb)))) {
00195 Is_True(BB_chk_split_head(BBLIST_item(BB_succs(succ_bb))),
00196 ("The chk BB should be chk_split_head!"));
00197 }
00198 }
00199
00200 succ_bb = BBLIST_item(BB_preds(bb));
00201 if(BB_chk_split(succ_bb)) {
00202 return TRUE;
00203 } else if(BB_preds(succ_bb)) {
00204 succ_bb = BBLIST_item(BB_preds(succ_bb));
00205 if(BB_chk_split(succ_bb)) {
00206 return TRUE;
00207 }
00208 }
00209 }
00210 else {
00211 return TRUE;
00212 }
00213
00214 return FALSE;
00215 }
00216