00001 #include <stream.h>
00002 #include "../DDgraph.h"
00003 #include "../Program.h"
00004 #include "../p-setjmp.h"
00005 #include "../utilities/switches_util.h"
00006 #include "../StringElem.h"
00007 #include "../String.h"
00008
00009 struct DDI_list {
00010 int id;
00011 DDiterator* iter;
00012 DDI_list* next;
00013 };
00014
00015
00016 class DDgraphTester {
00017
00018 int _cur_ddi_num;
00019 DDgraph& _ddgraph;
00020 StmtList& _stmts;
00021 DDI_list* _ddi_list;
00022
00023 public:
00024
00025 inline DDgraphTester(ProgramUnit& PU)
00026 : _ddgraph(PU.ddgraph()), _stmts(PU.stmts()) {
00027 _ddi_list = 0;
00028 _cur_ddi_num = 0;
00029 }
00030
00031 inline ~DDgraphTester() {
00032
00033 while (_ddi_list) {
00034 DDI_list* temp = _ddi_list;
00035 _ddi_list = _ddi_list->next;
00036 delete temp->iter;
00037 delete temp;
00038 }
00039 }
00040
00041
00042 void add(int num_of_dvfs);
00043
00044 void show_active_arcs();
00045
00046 void merge_DVF(int dditer_num);
00047
00048 void show_arcs();
00049
00050 void add_dditerator(int num_of_dditer);
00051
00052 void del_dditerator(int dditer_num);
00053
00054 void show_dditerator();
00055
00056 void del_current(int dditer_num);
00057
00058 void prev_current(int dditer_num);
00059
00060 void next_current(int dditer_num);
00061
00062 void grab_current(int dditer_num);
00063
00064 void show_program();
00065
00066 void reset(int dditer_num);
00067
00068 void set_to_last(int dditer_num);
00069
00070 };
00071
00072
00073 void
00074 DDgraphTester::merge_DVF(int dditer_num) {
00075
00076 DDI_list* trip = _ddi_list;
00077
00078 if (!trip) {
00079 cout << "no DDiterator alive\n";
00080 return;
00081 }
00082
00083 while (trip->id != dditer_num) {
00084 trip = trip->next;
00085 if (!trip) {
00086 cout << "Wrong number\n";
00087 return;
00088 }
00089 }
00090
00091 merge_DVs(trip->iter->_active_arc->_working_dv_fields);
00092 }
00093
00094
00095 void
00096 DDgraphTester::reset(int dditer_num) {
00097
00098 DDI_list* trip = _ddi_list;
00099
00100 if (!trip) {
00101 cout << "no DDiterator alive\n";
00102 return;
00103 }
00104
00105 while (trip->id != dditer_num) {
00106 trip = trip->next;
00107 if (!trip) {
00108 cout << "Wrong number\n";
00109 return;
00110 }
00111 }
00112
00113 trip->iter->reset();
00114 }
00115
00116
00117 void
00118 DDgraphTester::set_to_last(int dditer_num) {
00119
00120 DDI_list* trip = _ddi_list;
00121
00122 if (!trip) {
00123 cout << "no DDiterator alive\n";
00124 return;
00125 }
00126
00127 while (trip->id != dditer_num) {
00128 trip = trip->next;
00129 if (!trip) {
00130 cout << "Wrong number\n";
00131 return;
00132 }
00133 }
00134
00135 trip->iter->set_to_last();
00136 }
00137
00138
00139 #define OCTA 8
00140 #define EndOfDV ';'
00141
00142 void
00143 DDgraphTester:: add(int num_of_dvfs) {
00144
00145 List<DVfield> dvf_list;
00146 Iterator<Statement> iter = _stmts.iterator();
00147 char from_stmt_tag[OCTA], to_stmt_tag[OCTA];
00148 int from_expr_num, to_expr_num;
00149 char dep_decided[OCTA], dep_type[OCTA], dv[OCTA][3];
00150
00151 for (int i = 1; i <= num_of_dvfs; i++) {
00152
00153 cout << i << ": " ;
00154 cin >> from_stmt_tag >> from_expr_num >> to_stmt_tag >> to_expr_num;
00155 cin >> dep_decided >> dep_type;
00156
00157 for (int dv_len = 0; dv_len < OCTA; dv_len++) {
00158 cin >> dv[dv_len];
00159 if (dv[dv_len][0] == EndOfDV)
00160 break;
00161 }
00162 dv_len--;
00163
00164 Statement *from_stmt = 0, *to_stmt = 0;
00165 Expression *from_expr, *to_expr;
00166 DEP_DECISION ddeci;
00167 DEP_TYPE dtype;
00168
00169 for (iter.reset(); iter.valid(); iter++)
00170 if (!strcmp(iter.current().tag(), from_stmt_tag)) {
00171 from_stmt = &iter.current();
00172 break;
00173 }
00174 if (!from_stmt)
00175 continue;
00176
00177 for (iter.reset(); iter.valid(); iter++)
00178 if (!strcmp(iter.current().tag(), to_stmt_tag)) {
00179 to_stmt = &iter.current();
00180 break;
00181 }
00182 if (!to_stmt)
00183 continue;
00184
00185 if (from_expr_num >
00186 from_stmt->in_refs().entries() + from_stmt->out_refs().entries())
00187 continue;
00188 else if (from_expr_num > from_stmt->in_refs().entries())
00189 from_expr = &from_stmt->out_refs()._element
00190 (from_expr_num - from_stmt->in_refs().entries() - 1);
00191 else
00192 from_expr = &from_stmt->in_refs()._element(from_expr_num - 1);
00193
00194 if (to_expr_num >
00195 to_stmt->in_refs().entries() + to_stmt->out_refs().entries())
00196 continue;
00197 else if (to_expr_num > to_stmt->in_refs().entries())
00198 to_expr = &to_stmt->out_refs()._element
00199 (to_expr_num - to_stmt->in_refs().entries() - 1);
00200 else
00201 to_expr = &to_stmt->in_refs()._element(to_expr_num - 1);
00202
00203 switch (dep_decided[0]) {
00204 case 'a': ddeci = _ASSUMED; break;
00205 case 'p': ddeci = _PROVED; break;
00206 default : continue;
00207 }
00208
00209 switch (dep_type[0]) {
00210 case 'f': dtype = _FLOW; break;
00211 case 'a': dtype = _ANTI; break;
00212 case 'i': dtype = _INPUT; break;
00213 case 'o': dtype = _OUTPUT; break;
00214 default : continue;
00215 }
00216
00217 DVfield * new_dvf = new DVfield(ddeci, dtype, *from_stmt, *from_expr,
00218 *to_stmt, *to_expr);
00219
00220 List<ElementDV> & dvs = new_dvf->_dv;
00221
00222 for (; dv_len >= 0; dv_len--)
00223 if (!strcmp(dv[dv_len], "*"))
00224 dvs.ins_first(new ElementDV(_STAR));
00225 else if (!strcmp(dv[dv_len], "="))
00226 dvs.ins_first(new ElementDV(_EQ));
00227 else if (!strcmp(dv[dv_len], "<>"))
00228 dvs.ins_first(new ElementDV(_NEQ));
00229 else if (!strcmp(dv[dv_len], "<"))
00230 dvs.ins_first(new ElementDV(_LT));
00231 else if (!strcmp(dv[dv_len], ">"))
00232 dvs.ins_first(new ElementDV(_GT));
00233 else if (!strcmp(dv[dv_len], "<="))
00234 dvs.ins_first(new ElementDV(_LE));
00235 else if (!strcmp(dv[dv_len], ">="))
00236 dvs.ins_first(new ElementDV(_GE));
00237
00238 dvf_list.ins_last(new_dvf);
00239 }
00240
00241 _ddgraph.add(dvf_list);
00242 }
00243
00244
00245 void
00246 DDgraphTester::show_active_arcs() {
00247
00248 Iterator<ActiveArc> iter = _ddgraph._active_arcs;
00249
00250 for (int num = 1; iter.valid(); iter++, num++) {
00251
00252
00253
00254 cout << " [" << num << "] refs(" << iter.current()._references
00255 << ")this(" << iter.current()._this_arc << ")prev("
00256 << iter.current()._prev_arc << ")next(" << iter.current()._next_arc
00257 << ") src(" << iter.current()._source_stmt.tag();
00258
00259
00260
00261 Iterator<Expression> seiter = iter.current()._source_stmt.in_refs();
00262
00263 for (int i = 0; seiter.valid(); seiter++, i++)
00264 if (&iter.current()._source_expr == &seiter.current())
00265 break;
00266 if (seiter.valid())
00267 cout << "," << i + 1;
00268 else {
00269 Iterator<Expression> seiter = iter.current()._source_stmt.out_refs();
00270
00271 for (; seiter.valid(); seiter++, i++)
00272 if (&iter.current()._source_expr == &seiter.current())
00273 break;
00274 if (seiter.valid())
00275 cout << "," << i + 1;
00276 else
00277 cout << ",WHAT?";
00278 }
00279
00280
00281
00282 cout << ") tgt(" << iter.current()._target_stmt.tag();
00283
00284 Iterator<Expression> teiter = iter.current()._target_stmt.in_refs();
00285
00286 for (i = 0; teiter.valid(); teiter++, i++)
00287 if (&iter.current()._target_expr == &teiter.current())
00288 break;
00289 if (teiter.valid())
00290 cout << "," << i + 1;
00291 else {
00292 Iterator<Expression> teiter = iter.current()._target_stmt.out_refs();
00293
00294 for (; teiter.valid(); teiter++, i++)
00295 if (&iter.current()._target_expr == &teiter.current())
00296 break;
00297 if (teiter.valid())
00298 cout << "," << i + 1;
00299 else
00300 cout << ",WHAT?";
00301 }
00302
00303
00304
00305 Iterator<DVfield> dviter = iter.current()._working_dv_fields;
00306
00307 cout << ") **DVS**>> {";
00308 for (; dviter.valid(); dviter++) {
00309 cout << dviter.current()._references << " ref,";
00310 if (dviter.current()._valid)
00311 cout << "v,";
00312 else
00313 cout << "iv,";
00314
00315 if (dviter.current()._dep_decided == _PROVED)
00316 cout << "pr,";
00317 else
00318 cout << "as,";
00319
00320 if (&dviter.current()._from_expr == &iter.current()._source_expr &&
00321 &dviter.current()._to_expr == &iter.current()._target_expr)
00322 cout << "nm,";
00323 else if (&dviter.current()._from_expr == &iter.current()._target_expr &&
00324 &dviter.current()._to_expr == &iter.current()._source_expr)
00325 cout << "rv,";
00326 else
00327 cout << dviter.current()._from_stmt.tag() << ":" <<
00328 dviter.current()._to_stmt.tag() << ",";
00329
00330 switch (dviter.current()._dep_type) {
00331 case _FLOW: cout << "f,"; break;
00332 case _ANTI: cout << "a,"; break;
00333 case _INPUT: cout << "i,"; break;
00334 case _OUTPUT: cout << "o,"; break;
00335 case _UNKNOWN: cout << "u,";
00336 }
00337
00338
00339
00340 Iterator<ElementDV> edviter = dviter.current()._dv;
00341
00342 for (; edviter.valid(); edviter++)
00343 switch (edviter.current().direction()) {
00344 case _STAR: cout << "*,"; break;
00345 case _EQ: cout << "=,"; break;
00346 case _NEQ: cout << "<>,"; break;
00347 case _GT: cout << ">,"; break;
00348 case _LT: cout << "<,"; break;
00349 case _GE: cout << ">=,"; break;
00350 case _LE: cout << "<=,"; break;
00351 default: cout << "NOWAY!,";
00352 }
00353 cout << "} {" ;
00354 }
00355 cout << "}\n";
00356 }
00357
00358 }
00359
00360
00361 void
00362 DDgraphTester::show_arcs() {
00363
00364 Iterator<Statement> iter = _stmts.iterator();
00365
00366 for (; iter.valid(); iter++) {
00367
00368
00369
00370 Iterator<Expression> iriter = iter.current().in_refs();
00371
00372 for (int i = 1; iriter.valid(); iriter++, i++)
00373 if (Arc_type* arc = _ddgraph.arcs_ptr(iriter.current())) {
00374
00375
00376
00377
00378 cout << " " << iter.current().tag() << ',' << i << "->";
00379
00380 do {
00381
00382
00383 Statement* tgt_stmt = _ddgraph.target_stmt(arc);
00384 Expression* tgt_expr = _ddgraph.target_expr(arc);
00385 Iterator<Expression> eiter = tgt_stmt->in_refs();
00386
00387
00388
00389 cout << tgt_stmt->tag() << ',';
00390
00391 for (int j = 1; eiter.valid(); eiter++, j++)
00392 if (tgt_expr == &eiter.current())
00393 break;
00394 if (eiter.valid())
00395 cout << j;
00396 else {
00397 Iterator<Expression> eiter = tgt_stmt->out_refs();
00398
00399 for (; eiter.valid(); eiter++, j++)
00400 if (tgt_expr == &eiter.current())
00401 break;
00402 if (eiter.valid())
00403 cout << j;
00404 else
00405 cout << "What?";
00406 }
00407
00408 if (_ddgraph.is_active(arc))
00409 cout << ": Ac ";
00410 else
00411 cout << ": iA ";
00412
00413
00414
00415 Arc_type* arc_data = _ddgraph.data_field(arc);
00416 int pos = 1;
00417
00418 while (_ddgraph.is_new_dvfield(arc_data, pos)) {
00419
00420 switch (_ddgraph.dep_decision(arc_data, pos)) {
00421 case _ASSUMED: cout << "| as,"; break;
00422 case _PROVED : cout << "| pr,"; break;
00423 default : cout << "| Hey!,";
00424 }
00425
00426 switch (_ddgraph.dep_direction(arc_data, pos)) {
00427 case _NORMAL: cout << "nm,"; break;
00428 case _REVERSE: cout << "rv,"; break;
00429 default : cout << "Hey!,";
00430 }
00431
00432 switch (_ddgraph.dep_type(arc_data, pos)) {
00433 case _FLOW: cout << "f,"; break;
00434 case _ANTI: cout << "a,"; break;
00435 case _INPUT: cout << "i,"; break;
00436 case _OUTPUT: cout << "o,"; break;
00437 case _UNKNOWN: cout << "u,"; break;
00438 default : cout << "Hey!,";
00439 }
00440
00441
00442
00443 DIREC_TYPE dir;
00444
00445 while ((dir = _ddgraph.direction(arc_data, pos))
00446 != _DELIM)
00447 switch (dir) {
00448 case _GT: cout << "> "; break;
00449 case _LT: cout << "< "; break;
00450 case _LE: cout << "<= "; break;
00451 case _GE: cout << ">= "; break;
00452 case _EQ: cout << "= "; break;
00453 case _NEQ: cout << "<> "; break;
00454 case _STAR: cout << "* "; break;
00455 default: cout << "Hey! ";
00456 }
00457 }
00458
00459 if (arc = _ddgraph.next_arc(arc))
00460 cout << "\n ";
00461 else {
00462 cout << endl;
00463 break;
00464 }
00465 } while (1);
00466
00467 }
00468
00469
00470
00471 Iterator<Expression> oriter = iter.current().out_refs();
00472
00473 for (; oriter.valid(); oriter++, i++)
00474 if (Arc_type* arc = _ddgraph.arcs_ptr(oriter.current())) {
00475
00476
00477
00478
00479 cout << " " << iter.current().tag() << ',' << i << "->";
00480
00481 do {
00482
00483
00484 Statement* tgt_stmt = _ddgraph.target_stmt(arc);
00485 Expression* tgt_expr = _ddgraph.target_expr(arc);
00486 Iterator<Expression> eiter = tgt_stmt->in_refs();
00487
00488
00489
00490 cout << tgt_stmt->tag() << ',';
00491
00492 for (int j = 1; eiter.valid(); eiter++, j++)
00493 if (tgt_expr == &eiter.current())
00494 break;
00495 if (eiter.valid())
00496 cout << j;
00497 else {
00498 Iterator<Expression> eiter = tgt_stmt->out_refs();
00499
00500 for (; eiter.valid(); eiter++, j++)
00501 if (tgt_expr == &eiter.current())
00502 break;
00503 if (eiter.valid())
00504 cout << j;
00505 else
00506 cout << "What?";
00507 }
00508
00509 if (_ddgraph.is_active(arc))
00510 cout << ": Ac ";
00511 else
00512 cout << ": iA ";
00513
00514
00515
00516 Arc_type* arc_data = _ddgraph.data_field(arc);
00517 int pos = 1;
00518
00519 while (_ddgraph.is_new_dvfield(arc_data, pos)) {
00520
00521 switch (_ddgraph.dep_decision(arc_data, pos)) {
00522 case _ASSUMED: cout << "| as,"; break;
00523 case _PROVED : cout << "| pr,"; break;
00524 default : cout << " Hey!,";
00525 }
00526
00527 switch (_ddgraph.dep_direction(arc_data, pos)) {
00528 case _NORMAL: cout << "nm,"; break;
00529 case _REVERSE: cout << "rv,"; break;
00530 default : cout << "Hey!,";
00531 }
00532
00533 switch (_ddgraph.dep_type(arc_data, pos)) {
00534 case _FLOW: cout << "f,"; break;
00535 case _ANTI: cout << "a,"; break;
00536 case _INPUT: cout << "i,"; break;
00537 case _OUTPUT: cout << "o,"; break;
00538 case _UNKNOWN: cout << "u,"; break;
00539 default : cout << "Hey!,";
00540 }
00541
00542
00543
00544 DIREC_TYPE dir;
00545
00546 while ((dir = _ddgraph.direction(arc_data, pos))
00547 != _DELIM)
00548 switch (dir) {
00549 case _GT: cout << "> "; break;
00550 case _LT: cout << "< "; break;
00551 case _LE: cout << "<= "; break;
00552 case _GE: cout << ">= "; break;
00553 case _EQ: cout << "= "; break;
00554 case _NEQ: cout << "<> "; break;
00555 case _STAR: cout << "* "; break;
00556 default: cout << "Hey! ";
00557 }
00558 }
00559
00560 if (arc = _ddgraph.next_arc(arc))
00561 cout << "\n ";
00562 else {
00563 cout << endl;
00564 break;
00565 }
00566 } while (1);
00567 }
00568 }
00569 }
00570
00571
00572 void
00573 DDgraphTester::add_dditerator(int num_of_dditer) {
00574
00575 char buf[OCTA];
00576 Iterator<Statement> iter = _stmts.iterator();
00577
00578 for (int i = 1; i <= num_of_dditer; i++) {
00579
00580 cout << "Init. type for DDI From-part " << i << ": ";
00581 cin >> buf;
00582
00583 if (buf[0] == 'l') {
00584
00585 RefList<Statement> * fstmts = new RefList<Statement>;
00586
00587 cout << "Enumerate distinct Statement tags and"
00588 << " Type ';' as an end mark\n";
00589
00590 while (1) {
00591 cin >> buf;
00592 if (buf[0] == ';')
00593 break;
00594
00595 for (iter.reset(); iter.valid(); iter++)
00596 if (!strcmp(iter.current().tag(), buf)) {
00597 fstmts->ins_last(iter.current());
00598 break;
00599 }
00600 }
00601
00602 if (fstmts->entries() == 0) {
00603 delete fstmts;
00604 fstmts = 0;
00605 continue;
00606 }
00607
00608 cout << "Init. type for DDI To-part " << i << ": ";
00609 cin >> buf;
00610
00611 if (buf[0] == 'l') {
00612
00613 RefList<Statement> * tstmts = new RefList<Statement>;
00614
00615 cout << "Enumerate distinct Statement tags and"
00616 << " Type ';' as an end mark\n";
00617
00618 while (1) {
00619 cin >> buf;
00620 if (buf[0] == ';')
00621 break;
00622
00623 for (iter.reset(); iter.valid(); iter++)
00624 if (!strcmp(iter.current().tag(), buf)) {
00625 tstmts->ins_last(iter.current());
00626 break;
00627 }
00628 }
00629
00630 if (tstmts->entries()) {
00631
00632
00633
00634 DDI_list* new_ddi = new DDI_list;
00635
00636 new_ddi->id = ++_cur_ddi_num;
00637 new_ddi->iter = new DDiterator(fstmts, tstmts, _ddgraph);
00638 new_ddi->next = 0;
00639
00640 if (_ddi_list) {
00641
00642 DDI_list* temp = _ddi_list;
00643
00644 while (temp->next)
00645 temp = temp->next;
00646 temp->next = new_ddi;
00647 }
00648 else
00649 _ddi_list = new_ddi;
00650
00651 }
00652 else {
00653 delete fstmts;
00654 fstmts = 0;
00655 delete tstmts;
00656 tstmts = 0;
00657 }
00658 }
00659 else if (buf[0] == 'p') {
00660
00661 int num;
00662 Expression * expr = 0;
00663
00664 cout << "Statement tag & Expression number? ";
00665 cin >> buf >> num;
00666
00667 for (iter.reset(); iter.valid(); iter++)
00668 if (!strcmp(iter.current().tag(), buf)) {
00669 if (num <= iter.current().in_refs().entries()) {
00670
00671 Iterator<Expression> eiter = iter.current().in_refs();
00672 while (--num > 0)
00673 eiter++;
00674 expr = &eiter.current();
00675 }
00676 else if (num <= iter.current().out_refs().entries()
00677 + iter.current().in_refs().entries()) {
00678
00679 Iterator<Expression> eiter = iter.current().out_refs();
00680 num -= iter.current().out_refs().entries();
00681 while (--num > 0)
00682 eiter++;
00683 expr = &eiter.current();
00684 }
00685 break;
00686 }
00687
00688 if (expr) {
00689
00690
00691
00692 DDI_list* new_ddi = new DDI_list;
00693
00694 new_ddi->id = ++_cur_ddi_num;
00695 new_ddi->next = 0;
00696 new_ddi->iter = new DDiterator(fstmts, iter.current(),
00697 *expr, _ddgraph);
00698 if (_ddi_list) {
00699
00700 DDI_list* temp = _ddi_list;
00701
00702 while (temp->next)
00703 temp = temp->next;
00704 temp->next = new_ddi;
00705 }
00706 else
00707 _ddi_list = new_ddi;
00708 }
00709 else
00710 delete fstmts;
00711 fstmts = 0;
00712 }
00713 else
00714 delete fstmts;
00715 fstmts = 0;
00716 }
00717 else if (buf[0] = 'p') {
00718
00719 int num;
00720 Expression * expr = 0;
00721
00722 cout << "Statement tag & Expression number? ";
00723 cin >> buf >> num;
00724
00725 for (iter.reset(); iter.valid(); iter++)
00726 if (!strcmp(iter.current().tag(), buf)) {
00727 if (num <= iter.current().in_refs().entries()) {
00728
00729 Iterator<Expression> eiter = iter.current().in_refs();
00730 while (--num > 0)
00731 eiter++;
00732 expr = &eiter.current();
00733 }
00734 else if (num <= iter.current().out_refs().entries()
00735 + iter.current().in_refs().entries()) {
00736
00737 Iterator<Expression> eiter = iter.current().out_refs();
00738 num -= iter.current().in_refs().entries();
00739 while (--num > 0)
00740 eiter++;
00741 expr = &eiter.current();
00742 }
00743 break;
00744 }
00745
00746 if (!expr)
00747 continue;
00748
00749 Statement * stmt = &iter.current();
00750
00751 cout << "Init. type for DDI To-part " << i << ": ";
00752 cin >> buf;
00753
00754 if (buf[0] == 'l') {
00755
00756 RefList<Statement> * tstmts = new RefList<Statement>;
00757
00758 cout << "Enumerate distinct Statement tags and"
00759 << " Type ';' as an end mark\n";
00760
00761 while (1) {
00762 cin >> buf;
00763 if (buf[0] == ';')
00764 break;
00765
00766 for (iter.reset(); iter.valid(); iter++)
00767 if (!strcmp(iter.current().tag(), buf)) {
00768 tstmts->ins_last(iter.current());
00769 break;
00770 }
00771 }
00772
00773
00774
00775 if (tstmts->entries()) {
00776
00777 DDI_list* new_ddi = new DDI_list;
00778
00779 new_ddi->id = ++_cur_ddi_num;
00780 new_ddi->next = 0;
00781 new_ddi->iter = new DDiterator(*stmt, *expr, tstmts, _ddgraph);
00782
00783 if (_ddi_list) {
00784
00785 DDI_list* temp = _ddi_list;
00786
00787 while (temp->next)
00788 temp = temp->next;
00789 temp->next = new_ddi;
00790 }
00791 else
00792 _ddi_list = new_ddi;
00793
00794 }
00795 else
00796 delete tstmts;
00797 tstmts = 0;
00798 }
00799 else if (buf[0] == 'p') {
00800
00801 Expression * expr2 = 0;
00802
00803 cout << "Statement tag & Expression number? ";
00804 cin >> buf >> num;
00805
00806 for (iter.reset(); iter.valid(); iter++)
00807 if (!strcmp(iter.current().tag(), buf)) {
00808 if (num <= iter.current().in_refs().entries()) {
00809
00810 Iterator<Expression> eiter = iter.current().in_refs();
00811 while (--num > 0)
00812 eiter++;
00813 expr2 = &eiter.current();
00814 }
00815 else if (num <= iter.current().out_refs().entries()
00816 + iter.current().in_refs().entries()) {
00817
00818 Iterator<Expression> eiter = iter.current().out_refs();
00819 num -= iter.current().in_refs().entries();
00820 while (--num > 0)
00821 eiter++;
00822 expr2 = &eiter.current();
00823 }
00824 break;
00825 }
00826
00827 if (expr2) {
00828
00829
00830
00831 DDI_list* new_ddi = new DDI_list;
00832
00833 new_ddi->id = ++_cur_ddi_num;
00834 new_ddi->next = 0;
00835 new_ddi->iter = new DDiterator(*stmt, *expr, iter.current(),
00836 *expr2, _ddgraph);
00837 if (_ddi_list) {
00838
00839 DDI_list* temp = _ddi_list;
00840
00841 while (temp->next)
00842 temp = temp->next;
00843 temp->next = new_ddi;
00844 }
00845 else
00846 _ddi_list = new_ddi;
00847 }
00848 }
00849 }
00850 }
00851 }
00852
00853
00854 void
00855 DDgraphTester::del_dditerator(int dditer_num) {
00856
00857 DDI_list* pred = 0;
00858 DDI_list* trip = _ddi_list;
00859
00860 while (trip && trip->id != dditer_num) {
00861 pred = trip;
00862 trip = trip->next;
00863 }
00864
00865 if (trip) {
00866 if (pred)
00867 pred->next = trip->next;
00868 else
00869 _ddi_list = trip->next;
00870 delete trip->iter;
00871 delete trip;
00872 trip->iter = 0;
00873 trip = 0;
00874 }
00875 else
00876 cout << "Wrong number!\n";
00877 }
00878
00879
00880 void
00881 DDgraphTester::show_dditerator() {
00882
00883 for (DDI_list* trip = _ddi_list; trip; trip = trip->next) {
00884
00885 cout << " " << trip->id << ": ";
00886 if (trip->iter->_init_from == _STMTS)
00887 cout << "init(sts,";
00888 else if (trip->iter->_init_from == _EXPR)
00889 cout << "init(exp,";
00890 else
00891 cout << "init(NonSense,";
00892
00893 if (trip->iter->_init_to == _STMTS)
00894 cout << "sts) ";
00895 else if (trip->iter->_init_to == _EXPR)
00896 cout << "exp) ";
00897 else
00898 cout << "NonSense) ";
00899
00900 Iterator<ActiveArc> iter = _ddgraph._active_arcs;
00901
00902 for (int n = 1; iter.valid(); n++, iter++)
00903 if (&iter.current() == trip->iter->_active_arc)
00904 break;
00905
00906 if (iter.end())
00907 cout << "Dangling\n";
00908 else {
00909 cout << "aarc(" << n << ") ";
00910
00911 Iterator<DVfield> dviter = iter.current()._working_dv_fields;
00912
00913 for (n = 1; dviter.valid(); n++, dviter++)
00914 if (&dviter.current() == trip->iter->_current_dvf)
00915 break;
00916
00917 if (dviter.valid())
00918 cout << "curDV(" << n << ")\n";
00919 else
00920 cout << "Dangling\n";
00921 }
00922 }
00923 }
00924
00925
00926 void
00927 DDgraphTester::del_current(int dditer_num) {
00928
00929 DDI_list* trip = _ddi_list;
00930
00931 if (!trip) {
00932 cout << "no DDiterator alive\n";
00933 return;
00934 }
00935
00936 while (trip->id != dditer_num) {
00937 trip = trip->next;
00938 if (!trip) {
00939 cout << "Wrong number\n";
00940 return;
00941 }
00942 }
00943
00944 trip->iter->del();
00945 cout << "current dvfield deleted\n";
00946 }
00947
00948
00949 void
00950 DDgraphTester::prev_current(int dditer_num) {
00951
00952 DDI_list* trip = _ddi_list;
00953
00954 if (!trip) {
00955 cout << "no DDiterator alive\n";
00956 return;
00957 }
00958
00959 while (trip->id != dditer_num) {
00960 trip = trip->next;
00961 if (!trip) {
00962 cout << "Wrong number\n";
00963 return;
00964 }
00965 }
00966
00967 --*trip->iter;
00968 cout << "current dvfield moved to the previous one\n";
00969 }
00970
00971
00972 void
00973 DDgraphTester::next_current(int dditer_num) {
00974
00975 DDI_list* trip = _ddi_list;
00976
00977 if (!trip) {
00978 cout << "no DDiterator alive\n";
00979 return;
00980 }
00981
00982 while (trip->id != dditer_num) {
00983 trip = trip->next;
00984 if (!trip) {
00985 cout << "Wrong number\n";
00986 return;
00987 }
00988 }
00989
00990 ++*trip->iter;
00991 cout << "current dvfield moved to the next one\n";
00992 }
00993
00994
00995 void
00996 DDgraphTester::grab_current(int dditer_num) {
00997
00998 DDI_list* trip = _ddi_list;
00999
01000 if (!trip) {
01001 cout << "no DDiterator alive\n";
01002 return;
01003 }
01004
01005 while (trip->id != dditer_num) {
01006 trip = trip->next;
01007 if (!trip) {
01008 cout << "Wrong number\n";
01009 return;
01010 }
01011 }
01012
01013 DVfield* temp = trip->iter->grab();
01014 cout << "current dvfield grabbed & deleted\n";
01015 }
01016
01017
01018 void
01019 DDgraphTester::show_program() {
01020
01021 Iterator<Statement> iter = _stmts;
01022 int indent = 0;
01023
01024 if (!(iter.valid()))
01025 return;
01026
01027 if (iter.current().stmt_class() == FLOW_ENTRY_STMT) {
01028 ++iter;
01029
01030 if (!(iter.valid()))
01031 return;
01032
01033 if (iter.current().stmt_class() == ENTRY_STMT) {
01034
01035 ++iter;
01036 }
01037 }
01038
01039 for (; iter.valid(); ++iter) {
01040 for (Iterator<StringElem> pre_iter = iter.current().pre_directives();
01041 pre_iter.valid(); ++pre_iter)
01042 cout << (String) pre_iter.current() << endl;
01043
01044 cout << iter.current().tag() << '\t';
01045 iter.current().write(cout, indent);
01046
01047 for (Iterator<StringElem> post_iter = iter.current().post_directives();
01048 post_iter.valid(); ++post_iter)
01049 cout << (String) post_iter.current() << endl;
01050 }
01051 }
01052
01053
01054
01055
01056 main(int argc, char *argv[]) {
01057
01058 cout << "Now, Start!\n";
01059
01060 P_ASSERT_HANDLER(0);
01061 int next_arg = parse_switches(argc, argv);
01062
01063 p_assert(next_arg < argc, "Fortran input file not specified");
01064
01065 Program p;
01066 p.read(argv[next_arg]);
01067
01068 KeyIterator<String,ProgramUnit> iter_prog = p;
01069
01070
01071
01072
01073
01074
01075 for (; iter_prog.valid(); ++iter_prog) {
01076
01077
01078 DDgraphTester ddg_tester(iter_prog.current_data());
01079
01080 while (1) {
01081
01082 int num;
01083 char buf[OCTA];
01084 DDtests_Seq ddt_seq = _None;
01085
01086 cout << "(s)how, (d)elete, (a)dd, (g)rab, (p)rev, (n)ext,\n"
01087 << "(f)irst, (l)ast, (m)erge, dd(t)ests (q)uit? ";
01088 cin >> buf;
01089 switch (buf[0]) {
01090
01091 case 't':
01092 cout << "Select all the ddtests you want include where the options"
01093 << " are\n(g)cd-const -> (b)anerjee -> (o)mega[this sequence"
01094 << " is fixed], and at the end type ';'\n";
01095 do {
01096 cin >> buf;
01097 switch (buf[0]) {
01098 case 'g':
01099 if (_None == ddt_seq)
01100 ddt_seq = _GCD_Only;
01101 else if (_Banerjee_Only == ddt_seq)
01102 ddt_seq = _GCD_Banerjee;
01103 else if (_Omega_Only == ddt_seq)
01104 ddt_seq = _GCD_Omega;
01105 else if (_Banerjee_Omega == ddt_seq)
01106 ddt_seq = _All;
01107 break;
01108 case 'b':
01109 if (_None == ddt_seq)
01110 ddt_seq = _Banerjee_Only;
01111 else if (_GCD_Only == ddt_seq)
01112 ddt_seq = _GCD_Banerjee;
01113 else if (_Omega_Only == ddt_seq)
01114 ddt_seq = _Banerjee_Omega;
01115 else if (_GCD_Omega == ddt_seq)
01116 ddt_seq = _All;
01117 break;
01118 case 'o':
01119 if (_None == ddt_seq)
01120 ddt_seq = _Omega_Only;
01121 else if (_Banerjee_Only == ddt_seq)
01122 ddt_seq = _Banerjee_Omega;
01123 else if (_GCD_Only == ddt_seq)
01124 ddt_seq = _GCD_Omega;
01125 else if (_GCD_Banerjee == ddt_seq)
01126 ddt_seq = _All;
01127 }
01128 } while (buf[0] != ';');
01129 cout << "Want to include input dependence(Y/n)? ";
01130 cin >> buf;
01131 if (buf[0] == 'y' || buf[0] == 'Y')
01132 ddtests_main(p, ddt_seq, 1);
01133 else
01134 ddtests_main(p, ddt_seq, 0);
01135 break;
01136
01137 case 's':
01138 cout << "(p)rogram, a(c)tive_arcs, a(r)cs, (d)diterators? ";
01139 cin >> buf;
01140 if (buf[0] == 'c')
01141 ddg_tester.show_active_arcs();
01142 else if (buf[0] == 'r')
01143 ddg_tester.show_arcs();
01144 else if (buf[0] == 'p')
01145 ddg_tester.show_program();
01146 else if (buf[0] == 'd')
01147 ddg_tester.show_dditerator();
01148 break;
01149
01150 case 'a':
01151 cout << "d(v)fields, d(d)iterators? ";
01152 cin >> buf;
01153 if (buf[0] == 'v') {
01154 cout << "How many DVfields? ";
01155 cin >> num;
01156 cout << "Enter from_stmt tag, from_expr number, to_stmt tag, "
01157 << "to_expr number, dep_decision, dep_type and DVs\n";
01158 ddg_tester.add(num);
01159 }
01160 else if (buf[0] == 'd') {
01161 cout << "How many DDiterators? ";
01162 cin >> num;
01163 cout << "Initialization Type -> (l): stmt list,"
01164 << " (p): pair of a stmt & an expr\n";
01165 ddg_tester.add_dditerator(num);
01166 }
01167 break;
01168
01169 case 'm':
01170 cout << "DDiterator number? ";
01171 cin >> num;
01172 ddg_tester.merge_DVF(num);
01173 break;
01174
01175 case 'f':
01176 cout << "DDiterator number? ";
01177 cin >> num;
01178 ddg_tester.reset(num);
01179 break;
01180
01181 case 'l':
01182 cout << "DDiterator number? ";
01183 cin >> num;
01184 ddg_tester.set_to_last(num);
01185 break;
01186
01187 case 'd':
01188 cout << "What DDiterator number? ";
01189 cin >> num;
01190 cout << "(i)tself, its (c)urrent DVfield? ";
01191 cin >> buf;
01192 if (buf[0] == 'i')
01193 ddg_tester.del_dditerator(num);
01194 else if (buf[0] == 'c')
01195 ddg_tester.del_current(num);
01196 break;
01197
01198 case 'g':
01199 cout << "What DDiterator number? ";
01200 cin >> num;
01201 ddg_tester.grab_current(num);
01202 break;
01203
01204 case 'p':
01205 cout << "What DDiterator number? ";
01206 cin >> num;
01207 ddg_tester.prev_current(num);
01208 break;
01209
01210 case 'n':
01211 cout << "What DDiterator number? ";
01212 cin >> num;
01213 ddg_tester.next_current(num);
01214 break;
01215
01216 case 'q':
01217 exit(0);
01218 }
01219 }
01220
01221
01222 }
01223
01224
01225 }