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