ICFGDep.cpp
Go to the documentation of this file.00001
00015 #include "ICFGDep.hpp"
00016 #include <Utils/Util.hpp>
00017
00018 namespace OA {
00019 namespace Activity {
00020
00021 static bool debug = false;
00022
00023
00024
00025
00026
00027
00032 OA_ptr<LocIterator>
00033 ICFGDep::getMayDefIterator(StmtHandle stmt, const OA_ptr<Location> use)
00034 {
00035 OA_DEBUG_CTRL_MACRO("DEBUG_ICFGDep:ALL", debug);
00036 if (mDepDFSet[stmt].ptrEqual(0)) {
00037 mDepDFSet[stmt] = new DepDFSet;
00038 }
00039 return mDepDFSet[stmt]->getDefsIterator(use);
00040 }
00041
00048 OA_ptr<LocIterator>
00049 ICFGDep::getDiffUseIterator(StmtHandle stmt, OA_ptr<Location> def)
00050 {
00051
00052 if (mDepDFSet[stmt].ptrEqual(0)) {
00053 mDepDFSet[stmt] = new DepDFSet;
00054 }
00055 if (debug) {
00056 mDepDFSet[stmt]->dump(std::cout);
00057 }
00058 return mDepDFSet[stmt]->getUsesIterator(def);
00059 }
00060
00063 OA_ptr<LocIterator> ICFGDep::getMustDefIterator(StmtHandle stmt)
00064 {
00065 OA_ptr<LocSetIterator> retval;
00066 if (mMustDefMap[stmt].ptrEqual(0)) {
00067 OA_ptr<LocSet> emptySet; emptySet = new LocSet;
00068 retval = new LocSetIterator(emptySet);
00069 } else {
00070 retval = new LocSetIterator(mMustDefMap[stmt]);
00071 }
00072 return retval;
00073 }
00074
00075
00076
00077
00078
00079
00081 void ICFGDep::insertDepForStmt(StmtHandle stmt,
00082 OA_ptr<Location> use,
00083 OA_ptr<Location> def)
00084 {
00085 assert(!use.ptrEqual(0));
00086 assert(!def.ptrEqual(0));
00087
00088
00089 if (mDepDFSet[stmt].ptrEqual(0)) {
00090 mDepDFSet[stmt] = new DepDFSet;
00091 }
00092
00093
00094 mDepDFSet[stmt]->insertDep(use,def);
00095 }
00096
00098 void ICFGDep::insertMustDefForStmt(StmtHandle stmt,
00099 OA_ptr<Location> def)
00100 {
00101 if (mMustDefMap[stmt].ptrEqual(0)) {
00102 mMustDefMap[stmt] = new LocSet;
00103 }
00104 mMustDefMap[stmt]->insert(def);
00105 }
00106
00107
00108
00109
00110 void ICFGDep::dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir)
00111 {
00112 std::cout << "====================== Dep" << std::endl;
00113
00114 OA_ptr<LocIterator> locIterPtr;
00115 std::map<StmtHandle,OA_ptr<LocSet> >::iterator mapIter;
00116
00117 std::cout << "MustDefMap = " << std::endl;
00118 for (mapIter=mMustDefMap.begin(); mapIter!=mMustDefMap.end(); mapIter++) {
00119 std::cout << "\tstmt = " << ir->toString(mapIter->first) << std::endl;
00120 locIterPtr = getMustDefIterator(mapIter->first);
00121 for ( ; locIterPtr->isValid(); (*locIterPtr)++ ) {
00122 std::cout << "\t\t";
00123 locIterPtr->current()->dump(std::cout,ir);
00124 std::cout << std::endl;
00125 }
00126 }
00127 std::cout << "DepDFSets = " << std::endl;
00128 std::map<StmtHandle,OA_ptr<DepDFSet> >::iterator mapIter2;
00129 for (mapIter2=mDepDFSet.begin(); mapIter2!=mDepDFSet.end(); mapIter2++) {
00130 std::cout << "\tstmt = " << ir->toString(mapIter2->first) << std::endl;
00131 if (!mDepDFSet[mapIter2->first].ptrEqual(NULL)) {
00132 OA_ptr<DepDFSet> depDFSet = mapIter2->second;
00133 depDFSet->dump(os,ir);
00134 }
00135 }
00136
00137 std::cout << std::endl;
00138 }
00139
00140 void ICFGDep::output(OA::IRHandlesIRInterface& ir)
00141 {
00142
00143
00144 sOutBuild->mapStart("MustDefMap", "StmtHandle", "LocSet");
00145
00146 OA_ptr<LocIterator> locIterPtr;
00147 std::map<StmtHandle,OA_ptr<LocSet> >::iterator mapIter;
00148
00149 for (mapIter=mMustDefMap.begin(); mapIter!=mMustDefMap.end(); mapIter++) {
00150
00151 StmtHandle stmt = mapIter->first;
00152 if (stmt == StmtHandle(0)) { continue; }
00153
00154 sOutBuild->mapEntryStart();
00155 sOutBuild->mapKey(ir.toString(stmt));
00156 sOutBuild->mapValueStart();
00157
00158 locIterPtr = getMustDefIterator(mapIter->first);
00159 if (locIterPtr->isValid()) {
00160
00161 sOutBuild->listStart();
00162 for ( ; locIterPtr->isValid(); (*locIterPtr)++ ) {
00163 sOutBuild->listItemStart();
00164
00165 OA_ptr<Location> loc;
00166 loc = locIterPtr->current();
00167 loc->output(ir);
00168
00169 sOutBuild->listItemEnd();
00170
00171 }
00172 sOutBuild->listEnd();
00173
00174 }
00175
00176
00177 ostringstream correct;
00178 correct << popIndt;
00179 sOutBuild->outputString( correct.str() );
00180
00181 sOutBuild->mapValueEnd();
00182
00183 }
00184
00185 sOutBuild->mapEnd("MustDefMap");
00186
00187
00188
00189 sOutBuild->mapStart("mDepDFSet", "StmtHandle", "DepDFSet");
00190
00191 std::map<StmtHandle,OA_ptr<DepDFSet> >::iterator mapIter2;
00192
00193 for (mapIter2=mDepDFSet.begin(); mapIter2!=mDepDFSet.end(); mapIter2++) {
00194 StmtHandle stmt = mapIter2->first;
00195 if (stmt == StmtHandle(0)) { continue; }
00196
00197 sOutBuild->mapEntryStart();
00198 sOutBuild->mapKeyStart();
00199
00200 ostringstream stmtlabel;
00201 stmtlabel << "stmt: " << ir.toString(stmt);
00202 sOutBuild->outputString( stmtlabel.str() );
00203
00204 sOutBuild->mapKeyEnd();
00205 sOutBuild->mapValueStart();
00206
00207 ostringstream indentMapValue;
00208 indentMapValue << pushIndt;
00209 sOutBuild->outputString( indentMapValue.str() );
00210
00211 OA_ptr<DepDFSet> depDFSet = mapIter2->second;
00212 if (!depDFSet.ptrEqual(NULL)) {
00213 depDFSet->output(ir);
00214 }
00215
00216
00217 ostringstream correct;
00218 correct << popIndt << popIndt;
00219 sOutBuild->outputString( correct.str() );
00220
00221 sOutBuild->mapValueEnd();
00222
00223 }
00224 sOutBuild->mapEnd("DepDFSets");
00225
00226 }
00227
00228 }
00229 }