InterSideEffectStandard.cpp

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 // Interface Implementation
00025 //*****************************************************************
00026 
00027 InterSideEffectStandard::InterSideEffectStandard()
00028 { 
00029     mDefaultSideEffect = new SideEffectStandard;
00030 }
00031 
00034 OA_ptr<ProcIterator> InterSideEffectStandard::getKnownProcIterator()
00035 {
00036     // create a procSet
00037     OA_ptr<std::set<ProcHandle> > procSet;
00038     procSet = new std::set<ProcHandle>;
00039 
00040     // loop through all maps to add to list of ProcHandle's
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 // For the next eight methods,
00057 // If don't have SideEffect information for the given call
00058 // then return iterator from default/empty SideEffect
00059 // analysis results
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 // Other informational methods
00225 //*****************************************************************
00226 /*
00228 bool SideEffectStandard::inLMOD(ProcHandle p, OA_ptr<Location> loc)
00229 {
00230     if (mProcToLMODSet[p].ptrEqual(0)) {
00231         return false;
00232     } else {
00233         LocSet::iterator pos = mProcToLMODSet[p]->find(loc);
00234         return pos != mProcToLMODSet[p]->end();
00235     }
00236 }
00237 
00239 bool SideEffectStandard::inMOD(ProcHandle p, OA_ptr<Location> loc)
00240 {
00241     if (mProcToMODSet[p].ptrEqual(0)) {
00242         return false;
00243     } else {
00244         LocSet::iterator pos = mProcToMODSet[p]->find(loc);
00245         return pos != mProcToMODSet[p]->end();
00246     }
00247 }
00248 
00250 bool SideEffectStandard::inLDEF(ProcHandle p, OA_ptr<Location> loc)
00251 {
00252     if (mProcToLDEFSet[p].ptrEqual(0)) {
00253         return false;
00254     } else {
00255         LocSet::iterator pos = mProcToLDEFSet[p]->find(loc);
00256         return pos != mProcToLDEFSet[p]->end();
00257     }
00258 }
00259 
00261 bool SideEffectStandard::inDEF(ProcHandle p, OA_ptr<Location> loc)
00262 {
00263     if (mProcToDEFSet[p].ptrEqual(0)) {
00264         return false;
00265     } else {
00266         LocSet::iterator pos = mProcToDEFSet[p]->find(loc);
00267         return pos != mProcToDEFSet[p]->end();
00268     }
00269 }
00270 
00272 bool SideEffectStandard::inLUSE(ProcHandle p, OA_ptr<Location> loc)
00273 {
00274     if (mProcToLUSESet[p].ptrEqual(0)) {
00275         return false;
00276     } else {
00277         LocSet::iterator pos = mProcToLUSESet[p]->find(loc);
00278         return pos != mProcToLUSESet[p]->end();
00279     }
00280 }
00281 
00283 bool SideEffectStandard::inUSE(ProcHandle p, OA_ptr<Location> loc)
00284 {
00285     if (mProcToUSESet[p].ptrEqual(0)) {
00286         return false;
00287     } else {
00288         LocSet::iterator pos = mProcToUSESet[p]->find(loc);
00289         return pos != mProcToUSESet[p]->end();
00290     }
00291 }
00292 
00294 bool SideEffectStandard::inLREF(ProcHandle p, OA_ptr<Location> loc)
00295 {
00296     if (mProcToLREFSet[p].ptrEqual(0)) {
00297         return false;
00298     } else {
00299         LocSet::iterator pos = mProcToLREFSet[p]->find(loc);
00300         return pos != mProcToLREFSet[p]->end();
00301     }
00302 }
00303 
00305 bool SideEffectStandard::inREF(ProcHandle p, OA_ptr<Location> loc)
00306 {
00307     if (mProcToREFSet[p].ptrEqual(0)) {
00308         return false;
00309     } else {
00310         LocSet::iterator pos = mProcToREFSet[p]->find(loc);
00311         return pos != mProcToREFSet[p]->end();
00312     }
00313 }
00314 */
00315 //*****************************************************************
00316 // Construction methods
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     // LMOD
00356     locIterPtr = mProcToSideEffectMap[proc]->getLMODIterator();
00357     for (; locIterPtr->isValid(); (*locIterPtr)++ ) {
00358         count++;
00359     }
00360     // MOD
00361     locIterPtr = mProcToSideEffectMap[proc]->getMODIterator();
00362     for (; locIterPtr->isValid(); (*locIterPtr)++ ) {
00363         count++;
00364     }
00365     // LDEF
00366     locIterPtr = mProcToSideEffectMap[proc]->getLDEFIterator();
00367     for (; locIterPtr->isValid(); (*locIterPtr)++ ) {
00368         count++;
00369     }
00370     // DEF
00371     locIterPtr = mProcToSideEffectMap[proc]->getDEFIterator();
00372     for (; locIterPtr->isValid(); (*locIterPtr)++ ) {
00373         count++;
00374     }
00375     // LUSE
00376     locIterPtr = mProcToSideEffectMap[proc]->getLUSEIterator();
00377     for (; locIterPtr->isValid(); (*locIterPtr)++ ) {
00378         count++;
00379     }
00380     // USE
00381     locIterPtr = mProcToSideEffectMap[proc]->getUSEIterator();
00382     for (; locIterPtr->isValid(); (*locIterPtr)++ ) {
00383         count++;
00384     }
00385     // LREF
00386     locIterPtr = mProcToSideEffectMap[proc]->getLREFIterator();
00387     for (; locIterPtr->isValid(); (*locIterPtr)++ ) {
00388         count++;
00389     }
00390     // REF
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     // empty out all the sets
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 void SideEffectStandard::emptyLMOD(ProcHandle p)
00465 {
00466     mProcToLMODSet[p] = new LocSet;
00467 }
00468 
00470 void SideEffectStandard::emptyMOD(ProcHandle p)
00471 {
00472     mProcToMODSet[p] = new LocSet;
00473 }
00474 
00476 void SideEffectStandard::emptyLDEF(ProcHandle p)
00477 {
00478     mProcToLDEFSet[p] = new LocSet;
00479 }
00480     
00482 void SideEffectStandard::emptyDEF(ProcHandle p)
00483 {
00484     mProcToDEFSet[p] = new LocSet;
00485 }
00486     
00488 void SideEffectStandard::emptyLUSE(ProcHandle p)
00489 {
00490     mProcToLUSESet[p] = new LocSet;
00491 }
00492 
00494 void SideEffectStandard::emptyUSE(ProcHandle p)
00495 {
00496     mProcToUSESet[p] = new LocSet;
00497 }
00498 
00500 void SideEffectStandard::emptyLREF(ProcHandle p)
00501 {
00502     mProcToLREFSet[p] = new LocSet;
00503 }
00504 
00506 void SideEffectStandard::emptyREF(ProcHandle p)
00507 {
00508     mProcToREFSet[p] = new LocSet;
00509 }
00510 */
00511 //*****************************************************************
00512 // Output
00513 //*****************************************************************
00514 void InterSideEffectStandard::dump(std::ostream& os, 
00515                                    OA_ptr<IRHandlesIRInterface> ir)
00516 {
00517     std::cout << "====================== InterSideEffect" << std::endl;
00518 
00519     // Loop through all known procedures
00520     OA_ptr<ProcIterator> procIterPtr = getKnownProcIterator();
00521     for (; procIterPtr->isValid(); (*procIterPtr)++) {
00522         ProcHandle proc = procIterPtr->current();
00523 
00524         // print all sets for each procedure
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     // Loop through all known call sites
00580     CallToSideEffectMap::iterator mapIter;
00581     for (mapIter=mCallToSideEffectMap.begin();
00582          mapIter!=mCallToSideEffectMap.end(); mapIter++)
00583     {
00584         CallHandle call = mapIter->first;
00585 
00586         // print all sets for each procedure
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   } // end of UDDUChains namespace
00646 } // end of OA namespace