Go to the documentation of this file.00001
00016 #include <iostream>
00017 #include "ManagerDUActive.hpp"
00018
00019
00020
00021 namespace OA {
00022 namespace Activity {
00023
00024 #if defined(DEBUG_ALL) || defined(DEBUG_ManagerDUActive)
00025 static bool debug = true;
00026 #else
00027 static bool debug = false;
00028 #endif
00029
00030 ManagerDUActive::ManagerDUActive(
00031 OA_ptr<Activity::ActivityIRInterface> _ir,
00032 OA_ptr<OA::DUG::DUGStandard> _dug)
00033 : mIR(_ir), mDUG(_dug)
00034 {
00035 }
00036
00039 void
00040 ManagerDUActive::markVaried(bool activeWithVariedOnly)
00041 {
00042 std::list<CallHandle> callStack;
00043 std::set<OA_ptr<DUG::EdgeInterface> > visited;
00044 std::set<std::pair<unsigned,unsigned> > onPath;
00045
00046 #ifdef DEBUG_DUAA
00047 std::cout << "ManagerDUActive::markVaried: ---" << std::endl;
00048 #endif
00049
00050 std::list<std::pair<SymHandle, ProcHandle> >& indepSyms = mDUG->getIndepSyms();
00051 std::list<std::pair<SymHandle, ProcHandle> >::iterator indepIter = indepSyms.begin();
00052 for (; indepIter != indepSyms.end(); indepIter++) {
00053 callStack.empty();
00054 std::pair<SymHandle, ProcHandle> indepPair = *indepIter;
00055 SymHandle sym = indepPair.first;
00056 ProcHandle proc = indepPair.second;
00057 #ifdef DEBUG_DUAA
00058 std::cout << "ManagerDUActive::markVaried: Independent(" << mIR->toString(sym)
00059 << "), isNode(" << mDUG->isNode(sym, proc) << ")" << std::endl;
00060 #endif
00061
00062 if (mDUG->isNode(sym, proc)){
00063 OA_ptr<DUG::NodeInterface> node = mDUG->getNode(sym, proc);
00064 std::pair<unsigned, unsigned> pathNode(1, node->getId());
00065 onPath.insert(pathNode);
00066 node->markVaried(callStack, mIR, visited, onPath, node->getProc(),
00067 (unsigned)-1, OA_ptr<DUG::EdgeInterface>(),
00068 activeWithVariedOnly);
00069 onPath.erase(pathNode);
00070 }
00071 }
00072
00073 }
00074
00077 void
00078 ManagerDUActive::markUseful()
00079 {
00080 std::list<CallHandle> callStack;
00081 std::set<OA_ptr<DUG::EdgeInterface> > visited;
00082 std::set<std::pair<unsigned,unsigned> > onPath;
00083
00084
00085 #ifdef DEBUG_DUAA
00086 std::cout << "ManagerDUActive::markUseful: ---" << std::endl;
00087 #endif
00088
00089 std::list<std::pair<SymHandle, ProcHandle> >& depSyms = mDUG->getDepSyms();
00090 std::list<std::pair<SymHandle, ProcHandle> >::iterator depIter = depSyms.begin();
00091 for (; depIter != depSyms.end(); depIter++) {
00092 callStack.empty();
00093 std::pair<SymHandle, ProcHandle> depPair = *depIter;
00094 SymHandle sym = depPair.first;
00095 ProcHandle proc = depPair.second;
00096 #ifdef DEBUG_DUAA
00097 std::cout << "ManagerDUActive::markUseful: Dependent(" << mIR->toString(sym)
00098 << "), isNode(" << mDUG->isNode(sym, proc) << ")" << std::endl;
00099 #endif
00100
00101 if (mDUG->isNode(sym, proc)){
00102 OA_ptr<DUG::NodeInterface> node = mDUG->getNode(sym, proc);
00103 std::pair<unsigned, unsigned> pathNode(1, node->getId());
00104 onPath.insert(pathNode);
00105
00106
00107
00108 node->markUseful(callStack, mIR, visited, onPath, node->getProc(),
00109 (unsigned)-1, OA_ptr<DUG::EdgeInterface>());
00110 onPath.erase(pathNode);
00111 }
00112 }
00113 }
00114
00117 OA_ptr<InterActiveFortran>
00118 ManagerDUActive::performAnalysis(OA_ptr<DataFlow::ParamBindings> paramBind,
00119 bool activeWithVariedOnly)
00120 {
00121 #ifdef DEBUG_DUAA
00122 std::cout << "ManagerDUActive::performAnalysis: with activeWithVariedOnly = " << activeWithVariedOnly << std::endl;
00123 #endif
00124 OA_ptr<InterActiveFortran> retval;
00125 retval = new InterActiveFortran;
00126
00127
00128 markVaried(activeWithVariedOnly);
00129 if (!activeWithVariedOnly)
00130 markUseful();
00131
00132
00133
00134 OA_ptr<std::set<SymHandle> > activeSymSet = mDUG->getActiveSymSet();
00135
00136 std::set<SymHandle>::iterator ssIter = activeSymSet->begin();
00137 for (; ssIter != activeSymSet->end(); ssIter++){
00138 retval->setActive(*ssIter);
00139 }
00140
00141
00142 mParamBind = paramBind;
00143
00144
00145 mInterActiveFortran = new InterActiveFortran();
00146
00147 mActiveMap = mDUG->getActiveMap();
00148
00149
00150
00151
00152 std::map<ProcHandle,OA_ptr<ActiveStandard> >::iterator mapIter;
00153 for (mapIter=mActiveMap.begin(); mapIter!=mActiveMap.end(); mapIter++) {
00154 retval->mapProcToActive(mapIter->first,mapIter->second);
00155 }
00156
00157
00158 OA_ptr<SymHandleIterator> symIter = retval->getActiveSymIterator();
00159 int bytes = 0;
00160 int numActiveSyms = 0;
00161 for ( ; symIter->isValid(); (*symIter)++ ) {
00162 SymHandle sym = symIter->current();
00163
00164 bytes += mIR->getSizeInBytes(sym);
00165 numActiveSyms++;
00166
00167 #ifdef DEBUG_DUAA
00168 std::cout << "ManagerICFGActive: sym = " << mIR->toString(sym)
00169 << ", size = " << mIR->getSizeInBytes(sym) << ", bytes = "
00170 << bytes << std::endl;
00171 #endif
00172 }
00173 retval->setActiveSizeInBytes(bytes);
00174
00175 #ifdef DEBUG_DUAA
00176 std::cout << "CSFI - numActiveSyms is " << numActiveSyms << std::endl;
00177 std::cout << "CSFI - total active variable size is " << bytes << " bytes" << std::endl;
00178 #endif
00179
00180 return retval;
00181 }
00182
00183 }
00184 }