InterActiveFortran.cpp

Go to the documentation of this file.
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