Go to the documentation of this file.00001
00015 #include "AliasMapXAIF.hpp"
00016
00017 namespace OA {
00018 namespace XAIF {
00019
00020 static bool debug = false;
00021
00022 AliasMapXAIF::AliasMapXAIF(ProcHandle p) : mProcHandle(p) {}
00023
00025 OA_ptr<MemRefHandleIterator> AliasMapXAIF::getMemRefIter() {
00026
00027 OA_ptr<MemRefSet> memrefSet; memrefSet = new MemRefSet;
00028
00029
00030 std::map<MemRefHandle,int>::iterator mapIter;
00031 for (mapIter=mMemRefToIdMap.begin(); mapIter!=mMemRefToIdMap.end(); mapIter++) {
00032 memrefSet->insert(mapIter->first);
00033 }
00034
00035 OA_ptr<MemRefHandleIterator> retIter;
00036 retIter = new Alias::AliasMapMemRefIter(memrefSet);
00037 return retIter;
00038 }
00039
00040 int AliasMapXAIF::getMapSetId(MemRefHandle ref) {
00041 std::map<MemRefHandle,int>::iterator pos;
00042 pos = mMemRefToIdMap.find(ref);
00043 if (pos != mMemRefToIdMap.end()) {
00044 return pos->second;
00045 }
00046 else {
00047 return 0;
00048 }
00049 }
00050
00051 int AliasMapXAIF::findMapSet(MemRefHandle ref) {
00052 std::map<MemRefHandle,int>::iterator pos;
00053 pos = mMemRefToIdMap.find(ref);
00054 if (pos != mMemRefToIdMap.end()) {
00055 return pos->second;
00056 }
00057 else {
00058 return AliasMapXAIF::SET_ID_NONE;
00059 }
00060 }
00061
00062 int AliasMapXAIF::findMapSet(OA_ptr<std::set<LocTuple> > pLocTupleSet) {
00063 int retval = SET_ID_NONE;
00064
00065 std::map<int,OA_ptr<std::set<LocTuple> > >::iterator mapIter;
00066 for (mapIter=mIdToLocTupleSetMap.begin(); mapIter!=mIdToLocTupleSetMap.end(); mapIter++) {
00067 OA_ptr<std::set<LocTuple> > mapLocTupleSet = mapIter->second;
00068 if (pLocTupleSet == mapLocTupleSet) {
00069 return mapIter->first;
00070 }
00071 }
00072 return retval;
00073 }
00074
00075 OA_ptr<IdIterator> AliasMapXAIF::getIdIterator() {
00076 OA_ptr<IdIterator> retval;
00077 retval = new IdIterator(mIdToLocTupleSetMap);
00078 return retval;
00079 }
00080
00082 OA_ptr<LocTupleIterator> AliasMapXAIF::getLocIterator(int setId) {
00083 OA_ptr<LocTupleIterator> retval;
00084 retval = new LocTupleIterator(*mIdToLocTupleSetMap[setId]);
00085 return retval;
00086 }
00087
00089 void AliasMapXAIF::mapLocTupleSet(OA_ptr<std::set<LocTuple> > ltSet, int setId) {
00090 mIdToLocTupleSetMap[setId] = ltSet;
00091 }
00092
00095 void AliasMapXAIF::mapMemRefToMapSet(MemRefHandle ref, int setId) {
00096
00097
00098 int currSetId = findMapSet(ref);
00099 if (currSetId != AliasMapXAIF::SET_ID_NONE) {
00100 mIdToMemRefSetMap[currSetId].erase(ref);
00101 }
00102 mMemRefToIdMap[ref] = setId;
00103 mIdToMemRefSetMap[setId].insert(ref);
00104 }
00105
00107 void AliasMapXAIF::output(IRHandlesIRInterface& ir) {
00108 sOutBuild->objStart("AliasMapXAIF");
00109 sOutBuild->outputIRHandle(mProcHandle, ir);
00110
00111
00112 sOutBuild->mapStart("mIdToLocTupleSetMap", "int", "OA_ptr<std::set<LocTuple> >");
00113
00114 for (OA_ptr<IdIterator> idIterPtr = getIdIterator(); idIterPtr->isValid(); ++(*idIterPtr) ) {
00115
00116 int i = idIterPtr->current();
00117 sOutBuild->mapEntryStart();
00118 sOutBuild->mapKey(OA::int2string(i));
00119 sOutBuild->mapValueStart();
00120 sOutBuild->listStart();
00121 for (OA_ptr<LocTupleIterator> locIterPtr = getLocIterator(i); locIterPtr->isValid(); ++(*locIterPtr) ) {
00122 LocTuple loc = locIterPtr->current();
00123 sOutBuild->listItemStart();
00124 loc.output(ir);
00125 sOutBuild->listItemEnd();
00126 }
00127 sOutBuild->listEnd();
00128 sOutBuild->mapValueEnd();
00129 sOutBuild->mapEntryEnd();
00130 }
00131 sOutBuild->mapEnd("mIdToLocTupleSetMap");
00132
00133
00134 sOutBuild->mapStart("mMemRefToIdMap", "MemRefHandle", "int");
00135 for (OA_ptr<MemRefHandleIterator> memIterPtr = getMemRefIter(); memIterPtr->isValid(); (*memIterPtr)++) {
00136 MemRefHandle memref = memIterPtr->current();
00137 sOutBuild->mapEntryStart();
00138 sOutBuild->mapKeyStart();
00139 sOutBuild->outputIRHandle(memref, ir);
00140 sOutBuild->mapKeyEnd();
00141 sOutBuild->mapValue(OA::int2string(findMapSet(memref)));
00142 sOutBuild->mapEntryEnd();
00143 }
00144 sOutBuild->mapEnd("mMemRefToIdMap");
00145 sOutBuild->objEnd("AliasMap");
00146 }
00147
00149 void AliasMapXAIF::dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir) {
00150
00151 os << "============= AliasMapXAIF ============" << std::endl;
00152 OA_ptr<IdIterator> idIterPtr = getIdIterator();
00153 for ( ; idIterPtr->isValid(); ++(*idIterPtr) ) {
00154 int i = idIterPtr->current();
00155 os << "AliasMapSet[" << i << "] = { ";
00156 for (OA_ptr<LocTupleIterator> locIterPtr = getLocIterator(i); locIterPtr->isValid(); ++(*locIterPtr) ) {
00157 LocTuple loc = locIterPtr->current();
00158 os << ", ";
00159 os << "< " << loc.getLocRange().getStart() << "..";
00160 os << loc.getLocRange().getEnd() << ", " << loc.isFull();
00161 os << " > ";
00162 }
00163 os << " }" << std::endl;
00164 }
00165
00166
00167 os << "MemRef mapping to AliasMap sets:" << std::endl;
00168 for (OA_ptr<MemRefHandleIterator> memIterPtr = getMemRefIter(); memIterPtr->isValid(); (*memIterPtr)++) {
00169 MemRefHandle memref = memIterPtr->current();
00170 os << "(" << memref << ") " << ir->toString(memref);
00171 os << " --> " << findMapSet(memref) << std::endl;
00172 }
00173 }
00174
00175 }
00176 }