UDDUChainsXAIF.cpp

Go to the documentation of this file.
00001 
00015 #include <OpenAnalysis/XAIF/UDDUChainsXAIF.hpp>
00016 
00017 namespace OA {
00018   namespace XAIF {
00019 
00020     UDDUChainsXAIF::UDDUChainsXAIF() {
00021       // initialize the extra map
00022       mMemRefToIdMap = new std::map<MemRefHandle,int>;
00023     }
00024  
00025     OA_ptr<UDDUChainsXAIF::ChainIterator> 
00026     UDDUChainsXAIF::getUDChainIterator(MemRefHandle h) {
00027       OA_ptr<ChainIterator> retval;
00028       // if haven't seen this MemRef before then just create an empty set
00029       // and return an iterator over that
00030       std::map<MemRefHandle,int>::iterator pos = mMemRefToIdMap->find(h);
00031       if (pos == mMemRefToIdMap->end()) {
00032         OA_ptr<StmtSet> emptySet;  emptySet = new StmtSet;
00033         retval = new ChainIterator(emptySet);
00034         // otherwise return an iterator over the set with which
00035         // this mem ref is associated
00036       } else {
00037         retval = new ChainIterator((*mIdToStmtSetMap)[pos->second]);
00038       } 
00039       return retval; 
00040     }
00041 
00042     OA_ptr<UDDUChainsXAIF::ChainIterator> 
00043     UDDUChainsXAIF::getDUChainIterator(MemRefHandle h) {
00044       // DU and UD chains are stored in the same fashion
00045       return getUDChainIterator(h);
00046     }
00047 
00048     int UDDUChainsXAIF::getUDDUChainId(MemRefHandle ref) {
00049       int retval;
00050       // if have seen this MemRef before then return setId
00051       std::map<MemRefHandle,int>::iterator pos = mMemRefToIdMap->find(ref);
00052       if (pos != mMemRefToIdMap->end()) {
00053         retval = pos->second;
00054       } else {
00055         // we don't have a chaing for this memory reference so indicate that
00056         // it has an empty chain by returning the zeroth chain
00057         retval = 0;
00058       }
00059       return retval;
00060     }
00061 
00062     OA_ptr<UDDUChainsXAIF::MemRefsWithChainIterator> 
00063     UDDUChainsXAIF::getMemRefsWithChainIterator() {
00064       OA_ptr<MemRefsWithChainIterator> retval;
00065       retval = new MemRefsWithChainIterator(mMemRefToIdMap);
00066       return retval;
00067     }
00068     
00069     void UDDUChainsXAIF::insertInto(MemRefHandle ref, int setId) {
00070       (*mMemRefToIdMap)[ref] = setId;
00071     }
00072 
00073     void UDDUChainsXAIF::dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir) {
00074       ChainsXAIF::dump(os,ir);
00075       
00076       // print all memrefs and their mapping
00077       os << "MemRef mapping to UDDUChains sets:" << std::endl;
00078       OA_ptr<MemRefsWithChainIterator> memRefIterPtr
00079         = getMemRefsWithChainIterator();
00080       for ( ; memRefIterPtr->isValid(); (*memRefIterPtr)++ ) {
00081         MemRefHandle memref = memRefIterPtr->current();
00082         int setId = getUDDUChainId(memref);
00083         os << "(" << memref.hval() << ") " << ir->toString(memref);
00084         os << " --> " << setId << std::endl;
00085       }
00086     }
00087 
00088   } 
00089 }