ReachDefsStandard.cpp

Go to the documentation of this file.
00001 
00015 #include "ReachDefsStandard.hpp"
00016 
00017 namespace OA {
00018   namespace ReachDefs {
00019 
00022 OA_ptr<Interface::ReachDefsIterator> 
00023 ReachDefsStandard::getReachDefsIterator(StmtHandle s) 
00024 { 
00025     OA_ptr<ReachDefsStandardReachDefsIterator> retval;
00026 
00027     if (mReachDefs[s].ptrEqual(0)) {
00028         mReachDefs[s] = new std::set<StmtHandle>;
00029     }
00030     retval = new ReachDefsStandardReachDefsIterator(mReachDefs[s]);
00031     return retval;
00032 }
00033 
00036 OA_ptr<Interface::ReachDefsIterator> 
00037 ReachDefsStandard::getExitReachDefsIterator() 
00038 { 
00039     OA_ptr<ReachDefsStandardReachDefsIterator> retval;
00040     retval = new ReachDefsStandardReachDefsIterator(mExitReachDefs);
00041     return retval;
00042 }
00043 
00044 void ReachDefsStandard::output(IRHandlesIRInterface& ir)
00045 {    
00046     sOutBuild->objStart("ReachDefsStandard");
00047 
00048     sOutBuild->mapStart("mReachDefs", "StmtHandle", "OA_ptr<std::set<StmtHandle> >");
00049     std::map<StmtHandle,OA_ptr<std::set<StmtHandle> > >::iterator mapIter;
00050     for (mapIter = mReachDefs.begin(); mapIter != mReachDefs.end(); mapIter++) {
00051         StmtHandle s = mapIter->first;
00052         OA_ptr<std::set<StmtHandle> > rdset = mapIter->second;
00053         if ( rdset.ptrEqual(0) ) continue;
00054 
00055         sOutBuild->mapEntryStart();
00056         sOutBuild->mapKeyStart();
00057         sOutBuild->outputIRHandle(s, ir);
00058         sOutBuild->mapKeyEnd();
00059         sOutBuild->mapValueStart();
00060 
00061         sOutBuild->listStart();
00062         std::set<StmtHandle>::iterator setIter;
00063         for (setIter=rdset->begin(); setIter!=rdset->end(); setIter++) {
00064             sOutBuild->listItemStart();
00065             sOutBuild->outputIRHandle(*setIter, ir);
00066             sOutBuild->listItemEnd();
00067         }
00068         sOutBuild->listEnd();
00069 
00070         sOutBuild->mapValueEnd();
00071         sOutBuild->mapEntryEnd();
00072     }
00073     sOutBuild->mapEnd("mReachDefs");
00074 
00075     sOutBuild->fieldStart("mExitReachDefs");
00076     sOutBuild->listStart();
00077     std::set<StmtHandle>::iterator setIter;
00078     for (setIter=mExitReachDefs->begin(); 
00079          setIter!=mExitReachDefs->end(); setIter++) 
00080     {
00081         sOutBuild->listItemStart();
00082         sOutBuild->outputIRHandle(*setIter, ir);
00083         sOutBuild->listItemEnd();
00084     }
00085     sOutBuild->listEnd();
00086     sOutBuild->fieldEnd("mExitReachDefs");
00087 
00088     sOutBuild->objEnd("ReachDefsStandard");
00089 }
00090 
00091 
00092 
00095 void ReachDefsStandard::dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir)
00096 {
00097     std::map<StmtHandle,OA_ptr<std::set<StmtHandle> > >::iterator mapIter;
00098     for (mapIter = mReachDefs.begin(); mapIter != mReachDefs.end(); mapIter++) {
00099         StmtHandle s = mapIter->first;
00100 
00101         os << "StmtHandle(" << s.hval() << ") " << ir->toString(s) 
00102            << std::endl << "\treachdefs: " << std::endl;
00103         // iterate over reaching defs for statement s
00104         OA_ptr<Interface::ReachDefsIterator> setIterPtr
00105             = getReachDefsIterator(s);
00106         for (; setIterPtr->isValid(); (*setIterPtr)++) {
00107             os << "\t" << ir->toString(setIterPtr->current()) << std::endl;
00108         }
00109 
00110     }
00111 }
00112 
00113 
00114 
00115   } // end of ReachDefs namespace
00116 } // end of OA namespace