ICFGDep.cpp

Go to the documentation of this file.
00001 
00015 #include "ICFGDep.hpp"
00016 #include <Utils/Util.hpp>
00017 
00018 namespace OA {
00019   namespace Activity {
00020 
00021 static bool debug = false;
00022 
00023 
00024 //*****************************************************************
00025 // Interface Implementation
00026 //*****************************************************************
00027     
00032 OA_ptr<LocIterator> 
00033 ICFGDep::getMayDefIterator(StmtHandle stmt, const OA_ptr<Location> use)
00034 {
00035     OA_DEBUG_CTRL_MACRO("DEBUG_ICFGDep:ALL", debug);
00036     if (mDepDFSet[stmt].ptrEqual(0)) {
00037         mDepDFSet[stmt] = new DepDFSet;
00038     }
00039     return mDepDFSet[stmt]->getDefsIterator(use);
00040 }
00041 
00048 OA_ptr<LocIterator> 
00049 ICFGDep::getDiffUseIterator(StmtHandle stmt, OA_ptr<Location> def)
00050 {
00051 
00052     if (mDepDFSet[stmt].ptrEqual(0)) {
00053         mDepDFSet[stmt] = new DepDFSet;
00054     }
00055     if (debug) {
00056         mDepDFSet[stmt]->dump(std::cout);
00057     }
00058     return mDepDFSet[stmt]->getUsesIterator(def);
00059 }
00060     
00063 OA_ptr<LocIterator> ICFGDep::getMustDefIterator(StmtHandle stmt)
00064 {
00065   OA_ptr<LocSetIterator> retval;
00066   if (mMustDefMap[stmt].ptrEqual(0)) {
00067     OA_ptr<LocSet> emptySet; emptySet = new LocSet;
00068     retval = new LocSetIterator(emptySet);  
00069   } else {
00070     retval = new LocSetIterator(mMustDefMap[stmt]); 
00071   }
00072   return retval;
00073 }
00074 
00075 
00076 //*****************************************************************
00077 // Construction methods
00078 //*****************************************************************
00079 
00081 void ICFGDep::insertDepForStmt(StmtHandle stmt, 
00082                                    OA_ptr<Location> use,
00083                                    OA_ptr<Location> def)
00084 {
00085     assert(!use.ptrEqual(0));
00086     assert(!def.ptrEqual(0));
00087 
00088     // first make sure there is a DepDFSet for the given stmt
00089     if (mDepDFSet[stmt].ptrEqual(0)) {
00090         mDepDFSet[stmt] = new DepDFSet;
00091     }
00092 
00093     // then insert the dependence
00094     mDepDFSet[stmt]->insertDep(use,def);
00095 }
00096 
00098 void ICFGDep::insertMustDefForStmt(StmtHandle stmt, 
00099                                        OA_ptr<Location> def)
00100 {
00101     if (mMustDefMap[stmt].ptrEqual(0)) {
00102         mMustDefMap[stmt] = new LocSet;
00103     }
00104     mMustDefMap[stmt]->insert(def);
00105  }
00106  
00107 //*****************************************************************
00108 // Output
00109 //*****************************************************************
00110 void ICFGDep::dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir)
00111 {
00112     std::cout << "====================== Dep" << std::endl;
00113 
00114     OA_ptr<LocIterator> locIterPtr;
00115     std::map<StmtHandle,OA_ptr<LocSet> >::iterator mapIter;
00116 
00117     std::cout << "MustDefMap = " << std::endl;
00118     for (mapIter=mMustDefMap.begin(); mapIter!=mMustDefMap.end(); mapIter++) {
00119         std::cout << "\tstmt = " << ir->toString(mapIter->first) << std::endl;
00120         locIterPtr = getMustDefIterator(mapIter->first);
00121         for ( ; locIterPtr->isValid(); (*locIterPtr)++ ) {
00122             std::cout << "\t\t";
00123             locIterPtr->current()->dump(std::cout,ir);
00124             std::cout << std::endl;
00125         }
00126     }
00127     std::cout << "DepDFSets = " << std::endl;
00128     std::map<StmtHandle,OA_ptr<DepDFSet> >::iterator mapIter2;
00129     for (mapIter2=mDepDFSet.begin(); mapIter2!=mDepDFSet.end(); mapIter2++) {
00130         std::cout << "\tstmt = " << ir->toString(mapIter2->first) << std::endl;
00131         if (!mDepDFSet[mapIter2->first].ptrEqual(NULL)) {
00132             OA_ptr<DepDFSet> depDFSet = mapIter2->second;
00133             depDFSet->dump(os,ir);
00134         }
00135     }
00136 
00137     std::cout << std::endl;
00138 }
00139 
00140 void ICFGDep::output(OA::IRHandlesIRInterface& ir)
00141 {
00142 
00143   // output MustDefMap
00144   sOutBuild->mapStart("MustDefMap", "StmtHandle", "LocSet");
00145 
00146   OA_ptr<LocIterator> locIterPtr;
00147   std::map<StmtHandle,OA_ptr<LocSet> >::iterator mapIter;
00148 
00149   for (mapIter=mMustDefMap.begin(); mapIter!=mMustDefMap.end(); mapIter++) {
00150 
00151     StmtHandle stmt = mapIter->first;
00152     if (stmt == StmtHandle(0)) { continue; }
00153 
00154     sOutBuild->mapEntryStart();
00155     sOutBuild->mapKey(ir.toString(stmt));
00156     sOutBuild->mapValueStart();
00157 
00158     locIterPtr = getMustDefIterator(mapIter->first);
00159     if (locIterPtr->isValid()) {
00160  
00161       sOutBuild->listStart();
00162       for ( ; locIterPtr->isValid(); (*locIterPtr)++ ) {
00163         sOutBuild->listItemStart();
00164         
00165         OA_ptr<Location> loc;
00166         loc = locIterPtr->current();
00167         loc->output(ir);
00168 
00169         sOutBuild->listItemEnd();
00170 
00171       }
00172       sOutBuild->listEnd();
00173 
00174     }
00175     // removing a level of indent manually to accommodate a map Value
00176     // that has a list of objects
00177     ostringstream correct;
00178     correct << popIndt;
00179     sOutBuild->outputString( correct.str() );
00180 
00181     sOutBuild->mapValueEnd();
00182 
00183   }
00184 
00185   sOutBuild->mapEnd("MustDefMap");
00186 
00187 
00188   // output DepDFSets
00189   sOutBuild->mapStart("mDepDFSet", "StmtHandle", "DepDFSet");
00190   
00191   std::map<StmtHandle,OA_ptr<DepDFSet> >::iterator mapIter2;
00192 
00193   for (mapIter2=mDepDFSet.begin(); mapIter2!=mDepDFSet.end(); mapIter2++) {
00194     StmtHandle stmt = mapIter2->first;
00195     if (stmt == StmtHandle(0)) { continue; }
00196 
00197     sOutBuild->mapEntryStart();
00198     sOutBuild->mapKeyStart();
00199 
00200     ostringstream stmtlabel;
00201     stmtlabel << "stmt: " << ir.toString(stmt);
00202     sOutBuild->outputString( stmtlabel.str() );
00203     
00204     sOutBuild->mapKeyEnd();
00205     sOutBuild->mapValueStart();
00206 
00207     ostringstream indentMapValue;
00208     indentMapValue << pushIndt;
00209     sOutBuild->outputString( indentMapValue.str() );
00210 
00211     OA_ptr<DepDFSet> depDFSet = mapIter2->second;
00212     if (!depDFSet.ptrEqual(NULL)) {
00213       depDFSet->output(ir); 
00214     }
00215     // removing two levels of indent manually to accommodate a map Value
00216     // that has a list of objects manually indented
00217     ostringstream correct;
00218     correct << popIndt << popIndt;
00219     sOutBuild->outputString( correct.str() );
00220 
00221     sOutBuild->mapValueEnd();
00222 
00223   }
00224   sOutBuild->mapEnd("DepDFSets");
00225 
00226 }
00227 
00228   } // end of Activity namespace
00229 } // end of OA namespace

Generated on Sat Oct 31 05:21:22 2009 for OpenAnalysis by  doxygen 1.6.1