UDDUChainsStandard.cpp

Go to the documentation of this file.
00001 
00015 #include "UDDUChainsStandard.hpp"
00016 
00017 namespace OA {
00018   namespace UDDUChains {
00021 OA_ptr<Interface::ChainStmtIterator> 
00022 UDDUChainsStandard::getUDChainStmtIterator(StmtHandle s)
00023 { 
00024   OA_ptr<ChainStmtIterator> retval;
00025 
00026   // need to create an empty StmtSet if we haven't seen this stmt before
00027   if ((*mUDChainForStmt)[s].ptrEqual(0)) {
00028     (*mUDChainForStmt)[s] = new StmtSet;
00029   }
00030   retval = new ChainStmtIterator((*mUDChainForStmt)[s]);
00031   return retval;
00032 }
00033 
00036 OA_ptr<Interface::StmtsWithUDChainIterator> 
00037 UDDUChainsStandard::getStmtsWithUDChainIterator()
00038 {
00039     OA_ptr<StmtsWithUDChainIterator> retval;
00040     retval = new StmtsWithUDChainIterator(mUDChainForStmt);
00041     return retval;
00042 }
00043 
00046 OA_ptr<Interface::ChainStmtIterator> 
00047 UDDUChainsStandard::getDUChainStmtIterator(StmtHandle s)
00048 { 
00049   OA_ptr<ChainStmtIterator> retval;
00050 
00051   // need to create an empty StmtSet if we haven't seen this stmt before
00052   if ((*mDUChainForStmt)[s].ptrEqual(0)) {
00053     (*mDUChainForStmt)[s] = new StmtSet;
00054   }
00055   retval = new ChainStmtIterator((*mDUChainForStmt)[s]);
00056   return retval;
00057 }
00058 
00061 OA_ptr<Interface::StmtsWithDUChainIterator> 
00062 UDDUChainsStandard::getStmtsWithDUChainIterator()
00063 {
00064     OA_ptr<StmtsWithDUChainIterator> retval;
00065     retval = new StmtsWithDUChainIterator(mDUChainForStmt);
00066     return retval;
00067 }
00068 
00069 
00072 OA_ptr<Interface::ChainStmtIterator> 
00073 UDDUChainsStandard::getUDChainStmtIterator(MemRefHandle h)
00074 { 
00075   OA_ptr<ChainStmtIterator> retval;
00076 
00077   // need to create an empty StmtSet if we haven't seen this memref before
00078   if ((*mUDChainForMemRef)[h].ptrEqual(0)) {
00079     (*mUDChainForMemRef)[h] = new StmtSet;
00080   }
00081   retval = new ChainStmtIterator((*mUDChainForMemRef)[h]);
00082   return retval;
00083 }
00084 
00087 OA_ptr<Interface::MemRefsWithUDChainIterator> 
00088 UDDUChainsStandard::getMemRefsWithUDChainIterator()
00089 {
00090     OA_ptr<MemRefsWithUDChainIterator> retval;
00091     retval = new MemRefsWithUDChainIterator(mUDChainForMemRef);
00092     return retval;
00093 }
00094 
00097 OA_ptr<Interface::ChainStmtIterator> 
00098 UDDUChainsStandard::getDUChainStmtIterator(MemRefHandle h)
00099 { 
00100   OA_ptr<ChainStmtIterator> retval;
00101 
00102   // need to create an empty StmtSet if we haven't seen this memref before
00103   if ((*mDUChainForMemRef)[h].ptrEqual(0)) {
00104     (*mDUChainForMemRef)[h] = new StmtSet;
00105   }
00106   retval = new ChainStmtIterator((*mDUChainForMemRef)[h]);
00107   return retval;
00108 }
00109 
00112 OA_ptr<Interface::MemRefsWithDUChainIterator> 
00113 UDDUChainsStandard::getMemRefsWithDUChainIterator()
00114 {
00115     OA_ptr<MemRefsWithDUChainIterator> retval;
00116     retval = new MemRefsWithDUChainIterator(mDUChainForMemRef);
00117     return retval;
00118 }
00119 //*****************************************************************
00120 // Construction methods 
00121 //*****************************************************************
00122 
00124 void UDDUChainsStandard::insertDefUse(StmtHandle def, StmtHandle use)
00125 { 
00126     if ((*mDUChainForStmt)[def].ptrEqual(0)) {
00127       (*mDUChainForStmt)[def] = new StmtSet;
00128     }
00129     (*mDUChainForStmt)[def]->insert(use); 
00130 
00131     if ((*mUDChainForStmt)[use].ptrEqual(0)) {
00132       (*mUDChainForStmt)[use] = new StmtSet;
00133     }
00134     (*mUDChainForStmt)[use]->insert(def); 
00135 }
00136 
00139 void UDDUChainsStandard::insertMemRefDef(MemRefHandle ref)
00140 { 
00141     if ((*mDUChainForMemRef)[ref].ptrEqual(0)) {
00142       (*mDUChainForMemRef)[ref] = new StmtSet;
00143     }
00144 }
00145 void UDDUChainsStandard::insertMemRefUse(MemRefHandle ref)
00146 { 
00147     if ((*mUDChainForMemRef)[ref].ptrEqual(0)) {
00148       (*mUDChainForMemRef)[ref] = new StmtSet;
00149     }
00150 }
00151 
00152 
00155 void UDDUChainsStandard::insertMemRefDefStmtUse(MemRefHandle def, StmtHandle use)
00156 { 
00157     if ((*mDUChainForMemRef)[def].ptrEqual(0)) {
00158       (*mDUChainForMemRef)[def] = new StmtSet;
00159     }
00160     (*mDUChainForMemRef)[def]->insert(use); 
00161 }
00162 
00165 void UDDUChainsStandard::insertStmtDefMemRefUse(StmtHandle def, MemRefHandle use)
00166 { 
00167     if ((*mUDChainForMemRef)[use].ptrEqual(0)) {
00168       (*mUDChainForMemRef)[use] = new StmtSet;
00169     }
00170     (*mUDChainForMemRef)[use]->insert(def); 
00171 }
00172 
00173 
00174 //*****************************************************************
00175 // Output
00176 //*****************************************************************
00177 
00179 void UDDUChainsStandard::dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir)
00180 {
00181     os << "============= UDDUChains ============" << std::endl;
00182     // first iterate over all statements that have a UDChain associated
00183     // with them
00184     OA_ptr<Interface::StmtsWithUDChainIterator> useStmtIterPtr
00185         = getStmtsWithUDChainIterator(); 
00186     for ( ; useStmtIterPtr->isValid(); (*useStmtIterPtr)++ )
00187     {
00188         StmtHandle useStmt = useStmtIterPtr->current();
00189 
00190         os << "Use StmtHandle(" << useStmt.hval() << ") " << ir->toString(useStmt) 
00191            << std::endl << "\tDefine Statements: " << std::endl;
00192         // iterate over reaching defs for statement useStmt
00193         OA_ptr<Interface::ChainStmtIterator> udChainPtr
00194             = getUDChainStmtIterator(useStmt);
00195         for ( ; udChainPtr->isValid(); (*udChainPtr)++) {
00196             StmtHandle s = udChainPtr->current();
00197             if (s.hval()==0) {
00198               os << "\tStmtHandle(0)" << std::endl;
00199             } else {
00200               os << "\t" << ir->toString(s) << std::endl;
00201             }
00202         }
00203 
00204     }
00205 
00206     // now iterate over all statements that have a DUChain associated
00207     // with them
00208     OA_ptr<Interface::StmtsWithDUChainIterator> defStmtIterPtr
00209         = getStmtsWithDUChainIterator(); 
00210     for ( ; defStmtIterPtr->isValid(); (*defStmtIterPtr)++ )
00211     {
00212         StmtHandle defStmt = defStmtIterPtr->current();
00213 
00214         os << "Def StmtHandle(" << defStmt.hval() << ") " << ir->toString(defStmt) 
00215            << std::endl << "\tUse Statements: " << std::endl;
00216         // iterate over uses for statement defStmt
00217         OA_ptr<Interface::ChainStmtIterator> duChainPtr
00218             = getDUChainStmtIterator(defStmt);
00219         for ( ; duChainPtr->isValid(); (*duChainPtr)++) {
00220             os << "\t" << ir->toString(duChainPtr->current()) << std::endl;
00221         }
00222 
00223     }
00224 
00225     // use memrefs that have UDChains
00226     OA_ptr<Interface::MemRefsWithUDChainIterator> useIterPtr
00227         = getMemRefsWithUDChainIterator();
00228     for ( ; useIterPtr->isValid(); (*useIterPtr)++ ) {
00229         MemRefHandle use = useIterPtr->current();
00230 
00231         os << "Use MemRefHandle(" << use.hval() << ") " << ir->toString(use) 
00232            << std::endl << "\tDefine Statements: " << std::endl;
00233         // iterate over defs for memref use
00234         OA_ptr<Interface::ChainStmtIterator> udChainPtr
00235             = getUDChainStmtIterator(use);
00236         for ( ; udChainPtr->isValid(); (*udChainPtr)++) {
00237             StmtHandle s = udChainPtr->current();
00238             if (s.hval()==0) {
00239               os << "\tStmtHandle(0)" << std::endl;
00240             } else {
00241               os << "\t" << ir->toString(s) << std::endl;
00242             }
00243         }
00244 
00245     }
00246 
00247     // def memrefs that have DUChains
00248     OA_ptr<Interface::MemRefsWithUDChainIterator> defIterPtr
00249         = getMemRefsWithDUChainIterator();
00250     for ( ; defIterPtr->isValid(); (*defIterPtr)++ ) {
00251         MemRefHandle def = defIterPtr->current();
00252 
00253         os << "Def MemRefHandle(" << def.hval() << ") " << ir->toString(def) 
00254            << std::endl << "\tUse Statements: " << std::endl;
00255         // iterate over uses for memref def
00256         OA_ptr<Interface::ChainStmtIterator> duChainPtr
00257             = getDUChainStmtIterator(def);
00258         for ( ; duChainPtr->isValid(); (*duChainPtr)++) {
00259             os << "\t" << ir->toString(duChainPtr->current()) << std::endl;
00260         }
00261 
00262     }
00263 
00264 
00265 }
00266 
00267 
00268 void UDDUChainsStandard::output(OA::IRHandlesIRInterface &ir)
00269 {
00270     sOutBuild->objStart("UDDUChainsStandard");
00271 
00272     sOutBuild->mapStart("mUDChainForStmt", "StmtHandle", "OA::OA_ptr<StmtSet> ");
00273     std::map<StmtHandle, OA::OA_ptr<StmtSet> >::iterator reg_mUDChainForStmt_iterator;
00274     for(reg_mUDChainForStmt_iterator = mUDChainForStmt->begin();
00275         reg_mUDChainForStmt_iterator != mUDChainForStmt->end();
00276         reg_mUDChainForStmt_iterator++)
00277     {
00278         const StmtHandle &first = reg_mUDChainForStmt_iterator->first;
00279         OA::OA_ptr<StmtSet>  &second = reg_mUDChainForStmt_iterator->second;
00280         sOutBuild->mapEntryStart();
00281         sOutBuild->mapKeyStart();
00282         sOutBuild->fieldStart("Use StatementHandle ");
00283         sOutBuild->outputIRHandle(first, ir);
00284         sOutBuild->fieldEnd("UseStatementHandle");
00285 
00286         sOutBuild->mapKeyEnd();
00287         sOutBuild->mapValueStart();
00288 
00289         sOutBuild->fieldStart("Define Statements"); {
00290            sOutBuild->listStart(); {
00291             OA_ptr<StmtHandleIterator> stmtIterPtr;
00292             stmtIterPtr=getUDChainStmtIterator(first);
00293 
00294             for ( ; stmtIterPtr->isValid(); (*stmtIterPtr)++ ) {
00295               sOutBuild->listItemStart(); {
00296                 sOutBuild->outputIRHandle(stmtIterPtr->current(),ir);
00297               }sOutBuild->listItemEnd();
00298             }
00299           }sOutBuild->listEnd();
00300         }sOutBuild->fieldEnd("Define Statements");
00301 
00302 
00303         //second->output(ir);
00304         sOutBuild->mapValueEnd();
00305         sOutBuild->mapEntryEnd();
00306 
00307   }
00308     sOutBuild->mapEnd("mUDChainForStmt");
00309 
00310      sOutBuild->mapStart("mDUChainForStmt", "StmtHandle", "OA::OA_ptr<StmtSet> ");
00311     std::map<StmtHandle, OA::OA_ptr<StmtSet> >::iterator reg_mDUChainForStmt_iterator;
00312     for(reg_mDUChainForStmt_iterator = mDUChainForStmt->begin();
00313         reg_mDUChainForStmt_iterator != mDUChainForStmt->end();
00314         reg_mDUChainForStmt_iterator++)
00315     {
00316         const StmtHandle &first = reg_mDUChainForStmt_iterator->first;
00317         OA::OA_ptr<StmtSet>  &second = reg_mDUChainForStmt_iterator->second;
00318         sOutBuild->mapEntryStart();
00319         sOutBuild->mapKeyStart();
00320         sOutBuild->fieldStart("Def StmtHandle");
00321         sOutBuild->outputIRHandle(first, ir);
00322         sOutBuild->fieldEnd("Def StmtHandle");
00323 
00324         sOutBuild->mapKeyEnd();
00325         sOutBuild->mapValueStart();
00326 
00327         sOutBuild->fieldStart("Use Statements"); {
00328            sOutBuild->listStart(); {
00329             OA_ptr<StmtHandleIterator> stmtIterPtr;
00330             stmtIterPtr=getDUChainStmtIterator(first);
00331 
00332             for ( ; stmtIterPtr->isValid(); (*stmtIterPtr)++ ) {
00333               sOutBuild->listItemStart(); {
00334                 sOutBuild->outputIRHandle(stmtIterPtr->current(),ir);
00335               }sOutBuild->listItemEnd();
00336             }
00337           }sOutBuild->listEnd();
00338         }sOutBuild->fieldEnd("Use Statements");
00339 
00340        //second->output(ir);
00341         sOutBuild->mapValueEnd();
00342         sOutBuild->mapEntryEnd();
00343     }
00344     sOutBuild->mapEnd("mDUChainForStmt");
00345 
00346     sOutBuild->mapStart("mUDChainForMemRef", "MemRefHandle", "OA::OA_ptr<StmtSet> ");
00347     std::map<MemRefHandle, OA::OA_ptr<StmtSet> >::iterator reg_mUDChainForMemRef_iterator;
00348     for(reg_mUDChainForMemRef_iterator = mUDChainForMemRef->begin();
00349         reg_mUDChainForMemRef_iterator != mUDChainForMemRef->end();
00350         reg_mUDChainForMemRef_iterator++)
00351     {
00352         const MemRefHandle &first = reg_mUDChainForMemRef_iterator->first;
00353         OA::OA_ptr<StmtSet>  &second = reg_mUDChainForMemRef_iterator->second;
00354         sOutBuild->mapEntryStart();
00355         sOutBuild->mapKeyStart();
00356         sOutBuild->fieldStart("Use MemRefHandle");
00357         sOutBuild->outputIRHandle(first, ir);
00358         sOutBuild->fieldEnd("Use MemRefHandle");
00359 
00360         sOutBuild->mapKeyEnd();
00361         sOutBuild->mapValueStart();
00362         sOutBuild->fieldStart("Def Statements"); {
00363            sOutBuild->listStart(); {
00364             OA_ptr<StmtHandleIterator> stmtIterPtr;
00365             stmtIterPtr=getUDChainStmtIterator(first);
00366 
00367             for ( ; stmtIterPtr->isValid(); (*stmtIterPtr)++ ) {
00368               sOutBuild->listItemStart(); {
00369                 sOutBuild->outputIRHandle(stmtIterPtr->current(),ir);
00370               }sOutBuild->listItemEnd();
00371             }
00372           }sOutBuild->listEnd();
00373         }sOutBuild->fieldEnd("Def Statements");
00374 
00375         //second->output(ir);
00376         sOutBuild->mapValueEnd();
00377         sOutBuild->mapEntryEnd();
00378     }
00379     sOutBuild->mapEnd("mUDChainForMemRef");
00380 
00381   sOutBuild->mapStart("mDUChainForMemRef", "MemRefHandle", "OA::OA_ptr<StmtSet> ");
00382     std::map<MemRefHandle, OA::OA_ptr<StmtSet> >::iterator reg_mDUChainForMemRef_iterator;
00383     for(reg_mDUChainForMemRef_iterator = mDUChainForMemRef->begin();
00384         reg_mDUChainForMemRef_iterator != mDUChainForMemRef->end();
00385         reg_mDUChainForMemRef_iterator++)
00386     {
00387         const MemRefHandle &first = reg_mDUChainForMemRef_iterator->first;
00388         OA::OA_ptr<StmtSet>  &second = reg_mDUChainForMemRef_iterator->second;
00389         sOutBuild->mapEntryStart();
00390         sOutBuild->mapKeyStart();
00391         sOutBuild->fieldStart("Def MemRefHandle");
00392         sOutBuild->outputIRHandle(first, ir);
00393         sOutBuild->fieldEnd("Def MemRefHandle");
00394 
00395         sOutBuild->mapKeyEnd();
00396         sOutBuild->mapValueStart();
00397         sOutBuild->fieldStart("Use Statements"); {
00398            sOutBuild->listStart(); {
00399             OA_ptr<StmtHandleIterator> stmtIterPtr;
00400             stmtIterPtr=getDUChainStmtIterator(first);
00401 
00402             for ( ; stmtIterPtr->isValid(); (*stmtIterPtr)++ ) {
00403               sOutBuild->listItemStart(); {
00404                 sOutBuild->outputIRHandle(stmtIterPtr->current(),ir);
00405               }sOutBuild->listItemEnd();
00406             }
00407           }sOutBuild->listEnd();
00408         }sOutBuild->fieldEnd("Use Statements");
00409 
00410         //second->output(ir);
00411         sOutBuild->mapValueEnd();
00412         sOutBuild->mapEntryEnd();
00413     }
00414     sOutBuild->mapEnd("mDUChainForMemRef");
00415 
00416 
00417    sOutBuild->mapStart("mMemRefToStmtMap", "MemRefHandle", "StmtHandle");
00418     std::map<MemRefHandle, StmtHandle>::iterator reg_mMemRefToStmtMap_iterator;
00419     for(reg_mMemRefToStmtMap_iterator = mMemRefToStmtMap.begin();
00420         reg_mMemRefToStmtMap_iterator != mMemRefToStmtMap.end();
00421         reg_mMemRefToStmtMap_iterator++)
00422     {
00423         const MemRefHandle &first = reg_mMemRefToStmtMap_iterator->first;
00424         StmtHandle &second = reg_mMemRefToStmtMap_iterator->second;
00425         sOutBuild->mapEntryStart();
00426         sOutBuild->mapKeyStart();
00427         sOutBuild->fieldStart("Def MemRefHandle");
00428         sOutBuild->outputIRHandle(first, ir);
00429         sOutBuild->fieldEnd("Def MemRefHandle");
00430 
00431         sOutBuild->mapKeyEnd();
00432         sOutBuild->mapValueStart();
00433         sOutBuild->outputIRHandle(second, ir);
00434 
00435         sOutBuild->mapKeyEnd();
00436         sOutBuild->mapValueStart();
00437         sOutBuild->fieldStart("Start Use Statements"); {
00438            sOutBuild->listStart(); {
00439             OA_ptr<StmtHandleIterator> stmtIterPtr;
00440             stmtIterPtr=getDUChainStmtIterator(first);
00441 
00442             for ( ; stmtIterPtr->isValid(); (*stmtIterPtr)++ ) {
00443               sOutBuild->listItemStart(); {
00444                 sOutBuild->outputIRHandle(stmtIterPtr->current(),ir);
00445               }sOutBuild->listItemEnd();
00446             }
00447           }sOutBuild->listEnd();
00448         }sOutBuild->fieldEnd("End Use Statements");
00449 
00450 
00451         sOutBuild->mapValueEnd();
00452         sOutBuild->mapEntryEnd();
00453     }
00454     sOutBuild->mapEnd("mMemRefToStmtMap");
00455 
00456 
00457         
00458 } 
00459 
00460 
00461   } // end of UDDUChains namespace
00462 } // end of OA namespace