Go to the documentation of this file.00001
00015 #include "InterSideEffectStandard.hpp"
00016 #include "SideEffectStandard.hpp"
00017
00018 namespace OA {
00019 namespace SideEffect{
00020
00021 static bool debug = false;
00022
00023
00024
00025
00026
00027 InterSideEffectStandard::InterSideEffectStandard()
00028 {
00029 mDefaultSideEffect = new SideEffectStandard;
00030 }
00031
00034 OA_ptr<ProcIterator> InterSideEffectStandard::getKnownProcIterator()
00035 {
00036
00037 OA_ptr<std::set<ProcHandle> > procSet;
00038 procSet = new std::set<ProcHandle>;
00039
00040
00041 ProcToSideEffectMap::iterator mIter;
00042 for (mIter=mProcToSideEffectMap.begin();
00043 mIter != mProcToSideEffectMap.end(); mIter++)
00044 {
00045 procSet->insert(mIter->first);
00046 }
00047
00048 OA_ptr<InterSideEffectProcIter> retval;
00049 retval = new InterSideEffectProcIter(procSet);
00050 return retval;
00051 }
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 OA_ptr<LocIterator>
00062 InterSideEffectStandard::getLMODIterator(CallHandle call)
00063 {
00064 if (mCallToSideEffectMap[call].ptrEqual(0)) {
00065 return mDefaultSideEffect->getLMODIterator();
00066 } else {
00067 return mCallToSideEffectMap[call]->getLMODIterator();
00068 }
00069 }
00070
00071 OA_ptr<LocIterator>
00072 InterSideEffectStandard::getMODIterator(CallHandle call)
00073 {
00074 if (mCallToSideEffectMap[call].ptrEqual(0)) {
00075 return mDefaultSideEffect->getMODIterator();
00076 } else {
00077 return mCallToSideEffectMap[call]->getMODIterator();
00078 }
00079 }
00080
00081 OA_ptr<LocIterator>
00082 InterSideEffectStandard::getLDEFIterator(CallHandle call)
00083 {
00084 if (mCallToSideEffectMap[call].ptrEqual(0)) {
00085 return mDefaultSideEffect->getLDEFIterator();
00086 } else {
00087 return mCallToSideEffectMap[call]->getLDEFIterator();
00088 }
00089 }
00090
00091 OA_ptr<LocIterator>
00092 InterSideEffectStandard::getDEFIterator(CallHandle call)
00093 {
00094 if (mCallToSideEffectMap[call].ptrEqual(0)) {
00095 return mDefaultSideEffect->getDEFIterator();
00096 } else {
00097 return mCallToSideEffectMap[call]->getDEFIterator();
00098 }
00099 }
00100
00101 OA_ptr<LocIterator>
00102 InterSideEffectStandard::getLUSEIterator(CallHandle call)
00103 {
00104 if (mCallToSideEffectMap[call].ptrEqual(0)) {
00105 return mDefaultSideEffect->getLUSEIterator();
00106 } else {
00107 return mCallToSideEffectMap[call]->getLUSEIterator();
00108 }
00109 }
00110
00111 OA_ptr<LocIterator>
00112 InterSideEffectStandard::getUSEIterator(CallHandle call)
00113 {
00114 if (mCallToSideEffectMap[call].ptrEqual(0)) {
00115 return mDefaultSideEffect->getUSEIterator();
00116 } else {
00117 return mCallToSideEffectMap[call]->getUSEIterator();
00118 }
00119 }
00120
00121 OA_ptr<LocIterator>
00122 InterSideEffectStandard::getLREFIterator(CallHandle call)
00123 {
00124 if (mCallToSideEffectMap[call].ptrEqual(0)) {
00125 return mDefaultSideEffect->getLREFIterator();
00126 } else {
00127 return mCallToSideEffectMap[call]->getLREFIterator();
00128 }
00129 }
00130
00131 OA_ptr<LocIterator>
00132 InterSideEffectStandard::getREFIterator(CallHandle call)
00133 {
00134 if (mCallToSideEffectMap[call].ptrEqual(0)) {
00135 return mDefaultSideEffect->getREFIterator();
00136 } else {
00137 return mCallToSideEffectMap[call]->getREFIterator();
00138 }
00139 }
00140
00141
00142
00143 OA_ptr<LocIterator>
00144 InterSideEffectStandard::getLMODIterator(ProcHandle p)
00145 {
00146 if (mProcToSideEffectMap[p].ptrEqual(0)) {
00147 return mDefaultSideEffect->getLMODIterator();
00148 } else {
00149 return mProcToSideEffectMap[p]->getLMODIterator();
00150 }
00151 }
00152
00153 OA_ptr<LocIterator>
00154 InterSideEffectStandard::getMODIterator(ProcHandle p)
00155 {
00156 if (mProcToSideEffectMap[p].ptrEqual(0)) {
00157 return mDefaultSideEffect->getMODIterator();
00158 } else {
00159 return mProcToSideEffectMap[p]->getMODIterator();
00160 }
00161 }
00162
00163 OA_ptr<LocIterator>
00164 InterSideEffectStandard::getLDEFIterator(ProcHandle p)
00165 {
00166 if (mProcToSideEffectMap[p].ptrEqual(0)) {
00167 return mDefaultSideEffect->getLDEFIterator();
00168 } else {
00169 return mProcToSideEffectMap[p]->getLDEFIterator();
00170 }
00171 }
00172
00173 OA_ptr<LocIterator>
00174 InterSideEffectStandard::getDEFIterator(ProcHandle p)
00175 {
00176 if (mProcToSideEffectMap[p].ptrEqual(0)) {
00177 return mDefaultSideEffect->getDEFIterator();
00178 } else {
00179 return mProcToSideEffectMap[p]->getDEFIterator();
00180 }
00181 }
00182
00183 OA_ptr<LocIterator>
00184 InterSideEffectStandard::getLUSEIterator(ProcHandle p)
00185 {
00186 if (mProcToSideEffectMap[p].ptrEqual(0)) {
00187 return mDefaultSideEffect->getLUSEIterator();
00188 } else {
00189 return mProcToSideEffectMap[p]->getLUSEIterator();
00190 }
00191 }
00192
00193 OA_ptr<LocIterator>
00194 InterSideEffectStandard::getUSEIterator(ProcHandle p)
00195 {
00196 if (mProcToSideEffectMap[p].ptrEqual(0)) {
00197 return mDefaultSideEffect->getUSEIterator();
00198 } else {
00199 return mProcToSideEffectMap[p]->getUSEIterator();
00200 }
00201 }
00202
00203 OA_ptr<LocIterator>
00204 InterSideEffectStandard::getLREFIterator(ProcHandle p)
00205 {
00206 if (mProcToSideEffectMap[p].ptrEqual(0)) {
00207 return mDefaultSideEffect->getLREFIterator();
00208 } else {
00209 return mProcToSideEffectMap[p]->getLREFIterator();
00210 }
00211 }
00212
00213 OA_ptr<LocIterator>
00214 InterSideEffectStandard::getREFIterator(ProcHandle p)
00215 {
00216 if (mProcToSideEffectMap[p].ptrEqual(0)) {
00217 return mDefaultSideEffect->getREFIterator();
00218 } else {
00219 return mProcToSideEffectMap[p]->getREFIterator();
00220 }
00221 }
00222
00223
00224
00225
00226
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00320 void InterSideEffectStandard::mapProcToSideEffect(ProcHandle proc,
00321 OA_ptr<OA::SideEffect::SideEffectStandard> sideEffect)
00322 {
00323 mProcToSideEffectMap[proc] = sideEffect;
00324 }
00325
00327 OA_ptr<OA::SideEffect::SideEffectStandard>
00328 InterSideEffectStandard::getSideEffectResults(ProcHandle proc)
00329 {
00330 return mProcToSideEffectMap[proc];
00331 }
00332
00333
00336 void InterSideEffectStandard::mapCallToSideEffect(CallHandle call,
00337 OA_ptr<OA::SideEffect::SideEffectStandard> sideEffect)
00338 {
00339 if (sideEffect.ptrEqual(0) ) { std::cout << "sideEffect.ptrEqual(0)" << std::endl; }
00340 if (debug) {
00341 std::cout << "mapCallToSideEffect(call = " << call.hval() << std::endl;
00342 }
00343 mCallToSideEffectMap[call] = sideEffect;
00344 }
00345
00346 int InterSideEffectStandard::getLocCount(ProcHandle proc)
00347 {
00348 if (mProcToSideEffectMap[proc].ptrEqual(0)) {
00349 return 0;
00350 }
00351
00352 int count = 0;
00353 OA_ptr<LocIterator> locIterPtr;
00354
00355
00356 locIterPtr = mProcToSideEffectMap[proc]->getLMODIterator();
00357 for (; locIterPtr->isValid(); (*locIterPtr)++ ) {
00358 count++;
00359 }
00360
00361 locIterPtr = mProcToSideEffectMap[proc]->getMODIterator();
00362 for (; locIterPtr->isValid(); (*locIterPtr)++ ) {
00363 count++;
00364 }
00365
00366 locIterPtr = mProcToSideEffectMap[proc]->getLDEFIterator();
00367 for (; locIterPtr->isValid(); (*locIterPtr)++ ) {
00368 count++;
00369 }
00370
00371 locIterPtr = mProcToSideEffectMap[proc]->getDEFIterator();
00372 for (; locIterPtr->isValid(); (*locIterPtr)++ ) {
00373 count++;
00374 }
00375
00376 locIterPtr = mProcToSideEffectMap[proc]->getLUSEIterator();
00377 for (; locIterPtr->isValid(); (*locIterPtr)++ ) {
00378 count++;
00379 }
00380
00381 locIterPtr = mProcToSideEffectMap[proc]->getUSEIterator();
00382 for (; locIterPtr->isValid(); (*locIterPtr)++ ) {
00383 count++;
00384 }
00385
00386 locIterPtr = mProcToSideEffectMap[proc]->getLREFIterator();
00387 for (; locIterPtr->isValid(); (*locIterPtr)++ ) {
00388 count++;
00389 }
00390
00391 locIterPtr = mProcToSideEffectMap[proc]->getREFIterator();
00392 for (; locIterPtr->isValid(); (*locIterPtr)++ ) {
00393 count++;
00394 }
00395
00396 return count;
00397 }
00398
00399 void InterSideEffectStandard::initCallSideEffect(CallHandle call)
00400 {
00401 mCallToSideEffectMap[call] = new SideEffectStandard;
00402
00403 mCallToSideEffectMap[call]->emptyLMOD();
00404 mCallToSideEffectMap[call]->emptyMOD();
00405 mCallToSideEffectMap[call]->emptyLDEF();
00406 mCallToSideEffectMap[call]->emptyDEF();
00407 mCallToSideEffectMap[call]->emptyLUSE();
00408 mCallToSideEffectMap[call]->emptyUSE();
00409 mCallToSideEffectMap[call]->emptyLREF();
00410 mCallToSideEffectMap[call]->emptyREF();
00411 }
00412
00414 void InterSideEffectStandard::insertLMOD(CallHandle p, OA_ptr<Location> loc)
00415 {
00416 mCallToSideEffectMap[p]->insertLMOD(loc);
00417 }
00418
00420 void InterSideEffectStandard::insertMOD(CallHandle p, OA_ptr<Location> loc)
00421 {
00422 mCallToSideEffectMap[p]->insertMOD(loc);
00423 }
00424
00426 void InterSideEffectStandard::insertLDEF(CallHandle p, OA_ptr<Location> loc)
00427 {
00428 mCallToSideEffectMap[p]->insertLDEF(loc);
00429 }
00430
00432 void InterSideEffectStandard::insertDEF(CallHandle p, OA_ptr<Location> loc)
00433 {
00434 mCallToSideEffectMap[p]->insertDEF(loc);
00435 }
00436
00438 void InterSideEffectStandard::insertLUSE(CallHandle p, OA_ptr<Location> loc)
00439 {
00440 mCallToSideEffectMap[p]->insertLUSE(loc);
00441 }
00442
00444 void InterSideEffectStandard::insertUSE(CallHandle p, OA_ptr<Location> loc)
00445 {
00446 mCallToSideEffectMap[p]->insertUSE(loc);
00447 }
00448
00450 void InterSideEffectStandard::insertLREF(CallHandle p, OA_ptr<Location> loc)
00451 {
00452 mCallToSideEffectMap[p]->insertLREF(loc);
00453 }
00454
00456 void InterSideEffectStandard::insertREF(CallHandle p, OA_ptr<Location> loc)
00457 {
00458 mCallToSideEffectMap[p]->insertREF(loc);
00459 }
00460
00461
00462
00464
00465
00466
00467
00468
00470
00471
00472
00473
00474
00476
00477
00478
00479
00480
00482
00483
00484
00485
00486
00488
00489
00490
00491
00492
00494
00495
00496
00497
00498
00500
00501
00502
00503
00504
00506
00507
00508
00509
00510
00511
00512
00513
00514 void InterSideEffectStandard::dump(std::ostream& os,
00515 OA_ptr<IRHandlesIRInterface> ir)
00516 {
00517 std::cout << "====================== InterSideEffect" << std::endl;
00518
00519
00520 OA_ptr<ProcIterator> procIterPtr = getKnownProcIterator();
00521 for (; procIterPtr->isValid(); (*procIterPtr)++) {
00522 ProcHandle proc = procIterPtr->current();
00523
00524
00525 std::cout << "Procedure( " << ir->toString(proc) << " )" << std::endl;
00526
00527 OA_ptr<LocIterator> locIterPtr;
00528
00529 std::cout << "\tLMOD = ";
00530 locIterPtr = getLMODIterator(proc);
00531 for ( ; locIterPtr->isValid(); (*locIterPtr)++ ) {
00532 locIterPtr->current()->dump(std::cout,ir);
00533 }
00534 std::cout << "\tMOD = ";
00535
00536 locIterPtr = getMODIterator(proc);
00537 for ( ; locIterPtr->isValid(); (*locIterPtr)++ ) {
00538 locIterPtr->current()->dump(std::cout,ir);
00539 }
00540 std::cout << std::endl;
00541
00542 std::cout << "\tLDEF = ";
00543 locIterPtr = getLDEFIterator(proc);
00544 for ( ; locIterPtr->isValid(); (*locIterPtr)++ ) {
00545 locIterPtr->current()->dump(std::cout,ir);
00546 }
00547 std::cout << "\tDEF = ";
00548 locIterPtr = getDEFIterator(proc);
00549 for ( ; locIterPtr->isValid(); (*locIterPtr)++ ) {
00550 locIterPtr->current()->dump(std::cout,ir);
00551 }
00552 std::cout << std::endl;
00553
00554 std::cout << "\tLUSE = ";
00555 locIterPtr = getLUSEIterator(proc);
00556 for ( ; locIterPtr->isValid(); (*locIterPtr)++ ) {
00557 locIterPtr->current()->dump(std::cout,ir);
00558 }
00559 std::cout << "\tUSE = ";
00560 locIterPtr = getUSEIterator(proc);
00561 for ( ; locIterPtr->isValid(); (*locIterPtr)++ ) {
00562 locIterPtr->current()->dump(std::cout,ir);
00563 }
00564 std::cout << std::endl;
00565
00566 std::cout << "\tLREF = ";
00567 locIterPtr = getLREFIterator(proc);
00568 for ( ; locIterPtr->isValid(); (*locIterPtr)++ ) {
00569 locIterPtr->current()->dump(std::cout,ir);
00570 }
00571 std::cout << "\tREF = ";
00572 locIterPtr = getREFIterator(proc);
00573 for ( ; locIterPtr->isValid(); (*locIterPtr)++ ) {
00574 locIterPtr->current()->dump(std::cout,ir);
00575 }
00576 std::cout << std::endl;
00577 }
00578
00579
00580 CallToSideEffectMap::iterator mapIter;
00581 for (mapIter=mCallToSideEffectMap.begin();
00582 mapIter!=mCallToSideEffectMap.end(); mapIter++)
00583 {
00584 CallHandle call = mapIter->first;
00585
00586
00587 std::cout << "Call( " << ir->toString(call) << " )" << std::endl;
00588
00589 OA_ptr<LocIterator> locIterPtr;
00590
00591 std::cout << "\tLMOD = ";
00592 locIterPtr = getLMODIterator(call);
00593 for ( ; locIterPtr->isValid(); (*locIterPtr)++ ) {
00594 locIterPtr->current()->dump(std::cout,ir);
00595 }
00596 std::cout << "\tMOD = ";
00597
00598 locIterPtr = getMODIterator(call);
00599 for ( ; locIterPtr->isValid(); (*locIterPtr)++ ) {
00600 locIterPtr->current()->dump(std::cout,ir);
00601 }
00602 std::cout << std::endl;
00603
00604 std::cout << "\tLDEF = ";
00605 locIterPtr = getLDEFIterator(call);
00606 for ( ; locIterPtr->isValid(); (*locIterPtr)++ ) {
00607 locIterPtr->current()->dump(std::cout,ir);
00608 }
00609 std::cout << "\tDEF = ";
00610 locIterPtr = getDEFIterator(call);
00611 for ( ; locIterPtr->isValid(); (*locIterPtr)++ ) {
00612 locIterPtr->current()->dump(std::cout,ir);
00613 }
00614 std::cout << std::endl;
00615
00616 std::cout << "\tLUSE = ";
00617 locIterPtr = getLUSEIterator(call);
00618 for ( ; locIterPtr->isValid(); (*locIterPtr)++ ) {
00619 locIterPtr->current()->dump(std::cout,ir);
00620 }
00621 std::cout << "\tUSE = ";
00622 locIterPtr = getUSEIterator(call);
00623 for ( ; locIterPtr->isValid(); (*locIterPtr)++ ) {
00624 locIterPtr->current()->dump(std::cout,ir);
00625 }
00626 std::cout << std::endl;
00627
00628 std::cout << "\tLREF = ";
00629 locIterPtr = getLREFIterator(call);
00630 for ( ; locIterPtr->isValid(); (*locIterPtr)++ ) {
00631 locIterPtr->current()->dump(std::cout,ir);
00632 }
00633 std::cout << "\tREF = ";
00634 locIterPtr = getREFIterator(call);
00635 for ( ; locIterPtr->isValid(); (*locIterPtr)++ ) {
00636 locIterPtr->current()->dump(std::cout,ir);
00637 }
00638 std::cout << std::endl;
00639 }
00640
00641
00642
00643 }
00644
00645 }
00646 }