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 }
1.7.1