00001 00015 #include "InterActiveFortran.hpp" 00016 00017 namespace OA { 00018 namespace Activity { 00019 00020 InterActiveFortran::InterActiveFortran() 00021 { 00022 mUnknownLocActive = false; 00023 mNumIterUseful = 0; 00024 mNumIterVary = 0; 00025 mSizeInBytes = 0; 00026 } 00027 00028 00029 InterActiveFortran::~InterActiveFortran() 00030 { 00031 } 00032 00033 00036 OA_ptr<ProcHandleIterator> InterActiveFortran::getKnownProcIterator() 00037 { 00038 // create a procSet 00039 OA_ptr<std::set<ProcHandle> > procSet; 00040 procSet = new std::set<ProcHandle>; 00041 00042 // loop through map to add to list of ProcHandle's 00043 std::map<ProcHandle,OA_ptr<Activity::ActiveStandard> >::iterator mIter; 00044 for (mIter=mProcToActiveMap.begin(); mIter != mProcToActiveMap.end(); mIter++) 00045 { 00046 procSet->insert(mIter->first); 00047 } 00048 00049 OA_ptr<ActivityProcIter> retval; 00050 retval = new ActivityProcIter(procSet); 00051 return retval; 00052 } 00053 00055 bool InterActiveFortran::isActive(SymHandle sym) 00056 { 00057 // an unknown location is active, therefore all symbols are active 00058 if (mUnknownLocActive) { 00059 return true; 00060 } else if (mActiveSymSet.find(sym) != mActiveSymSet.end()) { 00061 return true; 00062 } else { 00063 return false; 00064 } 00065 } 00066 00067 00069 bool InterActiveFortran::isActive(ProcHandle proc, StmtHandle stmt) 00070 { 00071 if (mProcToActiveMap[proc].ptrEqual(0)) { 00072 assert(0); // we don't know about this proc 00073 } else { 00074 return mProcToActiveMap[proc]->isActive(stmt); 00075 } 00076 return false; // default return to make compilers happy 00077 } 00078 00080 bool InterActiveFortran::isActive(ProcHandle proc, MemRefHandle memref) 00081 { 00082 if (mProcToActiveMap[proc].ptrEqual(0)) { 00083 assert(0); // we don't know about this proc 00084 } else { 00085 return mProcToActiveMap[proc]->isActive(memref); 00086 } 00087 return false; // default return to make compilers happy 00088 } 00089 00090 00091 00092 void InterActiveFortran::setActive(SymHandle sym) 00093 { 00094 mActiveSymSet.insert(sym); 00095 } 00096 00097 00098 00100 OA_ptr<SymHandleIterator> InterActiveFortran::getActiveSymIterator() 00101 { 00102 OA_ptr<SymHandleIterator> retval; 00103 OA_ptr<std::set<SymHandle> > retSet; 00104 retSet = new std::set<SymHandle>; 00105 std::set<SymHandle>::iterator symIter; 00106 for (symIter = mActiveSymSet.begin(); symIter!=mActiveSymSet.end(); 00107 symIter++) 00108 { 00109 retSet->insert(*symIter); 00110 } 00111 retval = new ActiveSymIterator(retSet); 00112 return retval; 00113 } 00114 00115 00116 00117 OA_ptr<MemRefHandleIterator> 00118 InterActiveFortran::getActiveMemRefIterator(ProcHandle proc) 00119 { 00120 OA_ptr<MemRefHandleIterator> retval; 00121 00122 if (mProcToActiveMap[proc].ptrEqual(0)) { 00123 assert(0); // we don't know about this proc 00124 } else { 00125 retval = mProcToActiveMap[proc]->getActiveMemRefIterator(); 00126 } 00127 00128 return retval; 00129 } 00130 00131 00132 OA_ptr<StmtHandleIterator> 00133 InterActiveFortran::getActiveStmtIterator(ProcHandle proc) 00134 { 00135 OA_ptr<StmtHandleIterator> retval; 00136 00137 if (mProcToActiveMap[proc].ptrEqual(0)) { 00138 assert(0); // we don't know about this proc 00139 } else { 00140 retval = mProcToActiveMap[proc]->getActiveStmtIterator(); 00141 } 00142 00143 return retval; 00144 } 00145 00146 00148 void InterActiveFortran::mapProcToActive(ProcHandle proc, 00149 OA_ptr<Activity::ActiveStandard> active) 00150 { 00151 mProcToActiveMap[proc] = active; 00152 00153 // get all known active symbols from the procedure so we know all active 00154 // symbols in program 00155 OA_ptr<SymHandleIterator> symIter = active->getActiveSymIterator(); 00156 for ( ; symIter->isValid(); (*symIter)++) { 00157 mActiveSymSet.insert(symIter->current()); 00158 } 00159 00160 // if the procedure has an UnknownLoc that is active then must indicate 00161 // that for whole program 00162 if (active->getUnknownLocActive()==true) { 00163 mUnknownLocActive = true; 00164 } 00165 } 00166 00167 00169 int InterActiveFortran::getNumIterUseful() 00170 { 00171 return mNumIterUseful; 00172 } 00173 00175 int InterActiveFortran::getNumIterVary() 00176 { 00177 return mNumIterVary; 00178 } 00179 00181 int InterActiveFortran::getNumIterActive() 00182 { 00183 return mNumIterActive; 00184 } 00185 00187 int InterActiveFortran::getActiveSizeInBytes() 00188 { 00189 return mSizeInBytes; 00190 } 00191 00193 void InterActiveFortran::setNumIterUseful(int n) 00194 { 00195 mNumIterUseful = n; 00196 } 00197 00199 void InterActiveFortran::setNumIterVary(int n) 00200 { 00201 mNumIterVary = n; 00202 } 00203 00205 void InterActiveFortran::setNumIterActive(int n) 00206 { 00207 mNumIterActive = n; 00208 } 00209 00211 void InterActiveFortran::setActiveSizeInBytes(int size) 00212 { 00213 mSizeInBytes = size; 00214 } 00215 00216 00217 //***************************************************************** 00218 // Annotation Interface 00219 //***************************************************************** 00220 void InterActiveFortran::output(IRHandlesIRInterface &ir){ 00221 00222 sOutBuild->objStart("InterActiveFortran"); { 00223 00224 // Loop through all known procedures 00225 OA_ptr<ProcHandleIterator> procIterPtr = getKnownProcIterator(); 00226 for (; procIterPtr->isValid(); (*procIterPtr)++) { 00227 ProcHandle proc = procIterPtr->current(); 00228 ostringstream oss; 00229 oss << "Procedure( " << ir.toString(proc) << " )"; 00230 sOutBuild->fieldStart(oss.str()); { 00231 00232 sOutBuild->objStart("ActiveStmtSet"); { 00233 sOutBuild->listStart(); { 00234 ostringstream oss; 00235 oss << indt; 00236 OA_ptr<StmtHandleIterator> stmtIterPtr; 00237 stmtIterPtr= getActiveStmtIterator(proc); 00238 for ( ; stmtIterPtr->isValid(); (*stmtIterPtr)++ ) { 00239 sOutBuild->outputString(oss.str()); 00240 sOutBuild->listItemStart(); { 00241 sOutBuild->outputIRHandle(stmtIterPtr->current(),ir); 00242 }sOutBuild->listItemEnd(); 00243 } 00244 }sOutBuild->listEnd(); 00245 }sOutBuild->objEnd("ActiveStmtSet"); 00246 00247 00248 sOutBuild->objStart("ActiveMemRefSet"); { 00249 sOutBuild->listStart(); { 00250 ostringstream oss; 00251 oss << indt; 00252 OA_ptr<MemRefHandleIterator> memrefIterPtr; 00253 memrefIterPtr = getActiveMemRefIterator(proc); 00254 for ( ; memrefIterPtr->isValid(); (*memrefIterPtr)++ ) { 00255 sOutBuild->outputString(oss.str()); 00256 sOutBuild->listItemStart(); { 00257 sOutBuild->outputIRHandle(memrefIterPtr->current(),ir); 00258 }sOutBuild->listItemEnd(); 00259 } 00260 }sOutBuild->listEnd(); 00261 }sOutBuild->objEnd("ActiveMemRefSet"); 00262 00263 }sOutBuild->fieldEnd("Procedure"); 00264 } 00265 00266 sOutBuild->fieldStart("ActiveSymSet"); { 00267 sOutBuild->listStart(); { 00268 ostringstream oss; 00269 oss << indt; 00270 std::set<SymHandle>::iterator symIter; 00271 for (symIter = mActiveSymSet.begin(); symIter!=mActiveSymSet.end(); 00272 symIter++) 00273 { 00274 sOutBuild->outputString(oss.str()); 00275 sOutBuild->listItemStart(); { 00276 sOutBuild->outputIRHandle(*symIter,ir); 00277 }sOutBuild->listItemEnd(); 00278 } 00279 }sOutBuild->listEnd(); 00280 }sOutBuild->fieldEnd("ActiveSymSet"); 00281 sOutBuild->fieldStart("mNumIterUseful"); { 00282 ostringstream oss; oss << mNumIterUseful; 00283 sOutBuild->outputString(oss.str()); 00284 }sOutBuild->fieldEnd("mNumIterUseful"); 00285 sOutBuild->fieldStart("mNumIterVary"); { 00286 ostringstream oss; oss << mNumIterVary; 00287 sOutBuild->outputString(oss.str()); 00288 }sOutBuild->fieldEnd("mNumIterVary"); 00289 00290 } sOutBuild->objEnd("InterActiveFortran"); 00291 00292 } 00293 00295 void InterActiveFortran::dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir) 00296 { 00297 std::cout << "====================== InterActiveFortran" << std::endl; 00298 00299 os << "\tActiveSymList" << std::endl; 00300 std::set<SymHandle>::iterator symIter; 00301 for (symIter = mActiveSymSet.begin(); symIter!=mActiveSymSet.end(); 00302 symIter++) 00303 { 00304 os << "\t\t" << ir->toString(*symIter) << " hval = " 00305 << (*symIter).hval() 00306 << ", active = " << isActive(*symIter) << std::endl; 00307 } 00308 00309 os << "\tgetActiveSizeInBytes() = " << getActiveSizeInBytes() << std::endl; 00310 00311 } 00312 00313 00314 } // end of Activity namespace 00315 } // end of OA namespace 00316
1.7.1