CSFIActivity/DUGStandard.hpp

Go to the documentation of this file.
00001 
00015 //--------------------------------------------------------------------
00016 //--------------------------------------------------------------------
00017 
00018 #ifndef DUGStandard_H
00019 #define DUGStandard_H
00020 
00021 //--------------------------------------------------------------------
00022 #define CONTEXT_SENSITIVITY
00023 // #define DEBUG_DUAA
00024 // #define DEBUG_PATH // to get a path for marking 'varied' or 'useful'
00025 
00026 //--------------------------------------------------------------------
00027 // STL headers
00028 #include <list>
00029 #include <map>
00030 
00031 // OpenAnalysis headers
00032 #include <OpenAnalysis/CallGraph/ManagerCallGraph.hpp>
00033 #include <OpenAnalysis/Utils/OA_ptr.hpp>
00034 #include <OpenAnalysis/Utils/DGraph/DGraphInterface.hpp>
00035 #include <OpenAnalysis/CFG/CFG.hpp>
00036 #include <OpenAnalysis/Location/Locations.hpp>
00037 #include <OpenAnalysis/DataFlow/LocDFSet.hpp>
00038 #include <OpenAnalysis/IRInterface/ActivityIRInterface.hpp>
00039 #include <OpenAnalysis/IRInterface/DUGIRInterface.hpp>
00040 #include <OpenAnalysis/CSFIActivity/DUGInterface.hpp>
00041 #include <OpenAnalysis/Utils/DGraph/DGraphImplement.hpp>
00042 #include <OpenAnalysis/Activity/ActiveStandard.hpp>
00043 //--------------------------------------------------------------------
00044 
00045 
00046 namespace OA {
00047   namespace DUG {
00048       
00049 class Node;
00050 class Edge;
00051 class NodesIterator;
00052 class EdgesIterator;
00053 class DUGStandard;
00054  
00055 //--------------------------------------------------------
00056 class Node : public virtual NodeInterface {
00057 public:
00058     Node (OA_ptr<DUGStandard> pDUG, ProcHandle proc, NodeType pType)
00059         : mDUG(pDUG), mProc(proc), mType(pType) { Ctor(); }
00060     Node (OA_ptr<DUGStandard> pDUG, ProcHandle proc, NodeType pType,
00061           OA_ptr<CFG::NodeInterface> cNode)
00062         : mDUG(pDUG), mProc(proc), mType(pType) { Ctor(); }
00063     Node (OA_ptr<DUGStandard> pDUG, ProcHandle pProc, SymHandle pSym)
00064         : mDUG(pDUG), mProc(pProc), mType(NONEFORMAL_NODE), mSym(pSym) 
00065         { Ctor(); }
00066 
00067     ~Node () { }
00068  
00069     //========================================================
00070     // Info specific to DUG
00071     //========================================================
00072     
00073     NodeType getType() const { return mType; }
00074     bool isFormalParamNode() { return mType == FORMALPARAM_NODE;}
00075 
00076     ProcHandle getProc() const { return mProc; }
00077     OA_ptr<Location> getLoc() const { return mLoc; }
00078     SymHandle getSym() const { return mSym; }
00079     
00080     void markVaried(std::list<CallHandle>&, 
00081                     OA_ptr<Activity::ActivityIRInterface>,
00082                     std::set<OA_ptr<EdgeInterface> >&,
00083                     std::set<std::pair<unsigned,unsigned> >&,
00084                     ProcHandle, unsigned,
00085                     OA_ptr<EdgeInterface>,
00086                     bool activeWithVariedOnly);
00087     void markUseful(std::list<CallHandle>&, 
00088                     OA_ptr<Activity::ActivityIRInterface>,
00089                     std::set<OA_ptr<EdgeInterface> >&,
00090                     std::set<std::pair<unsigned,unsigned> >&,
00091                     ProcHandle, unsigned,
00092                     OA_ptr<EdgeInterface>);
00093 
00094     bool isVaried(){ return mVaried;}
00095     void setVaried()
00096         {
00097             mVaried = true;
00098         }
00099     void unsetVaried()
00100         { 
00101             mVaried = false;
00102         }
00103     bool isVariedContext(CallHandle context) const { 
00104         return mVariedContexts.find(context) != mVariedContexts.end(); }
00105     void insertVariedContext(CallHandle context) { 
00106         mVariedContexts.insert(context); }
00107 
00108     bool isUseful(){ return mUseful;}
00109     void setUseful(){ mUseful = true;};
00110     void unsetUseful(){ mUseful = false;};
00111 
00112     void setActive();
00113     void setActive(SymHandle);
00114 
00115     bool isSelfDependent(){ return mSelfDependent;}
00116     void setSelfDependent(){ mSelfDependent = true;};
00117 
00118     bool isPathFrom(OA_ptr<NodeInterface>,
00119                     std::set<OA_ptr<NodeInterface> >&);
00120     bool hasEdgesToOtherProc(ProcHandle, std::set<SymHandle>&);
00121     bool hasEdgesFromOtherProc(ProcHandle, std::set<SymHandle>&);
00122     void findOutgoingNodes(ProcHandle, std::set<SymHandle>&, std::set<SymHandle>&);
00123 //     void findIncomingNodes(ProcHandle, std::set<SymHandle>&, std::set<SymHandle>&);
00124 
00125 
00126     unsigned int size () const {
00127         assert(0);  //yet to be implemented PLM 09/19/06
00128         return 0; 
00129     }
00130 
00131 
00132     //========================================================
00133     // DGraph::Interface::Node interface
00134     //========================================================
00135     
00137     unsigned int getId() const 
00138         { 
00139             return mDGNode->getId();
00140             //return mId; 
00141         }
00142     
00144     int num_incoming () const { return mDGNode->num_incoming(); }
00145     
00147     int num_outgoing () const { return mDGNode->num_outgoing(); }
00148 
00150     bool isAnEntry() const { return mDGNode->isAnEntry(); }
00151 
00153     bool isAnExit() const { return mDGNode->isAnExit(); }
00154 
00155     bool operator==(DGraph::NodeInterface& other);
00156     bool operator<(DGraph::NodeInterface& other);
00157    
00158     //========================================================
00159     // Output
00160     //========================================================
00161     void dump(std::ostream& os) { }  // for full override
00162     void dumpbase(std::ostream& os) {}
00163     void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir);
00164     void dumpdot(std::ostream& os, OA_ptr<DUGIRInterface> ir);
00165     void longdump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir);
00166     void output(OA::IRHandlesIRInterface& ir) { 
00167         
00168         mDGNode->output(ir);
00169 
00170     }
00171     
00172 public:
00173     //========================================================
00174     // These methods shadow the same named methods in
00175     // the DGraph::Interface class and allow us to return
00176     // the more specific subclass
00177     //========================================================
00178     OA_ptr<DGraph::EdgesIteratorInterface> getIncomingEdgesIterator() const;
00179 
00180     OA_ptr<DGraph::EdgesIteratorInterface> getOutgoingEdgesIterator() const;
00181 
00182     OA_ptr<DGraph::NodesIteratorInterface> getSourceNodesIterator() const;
00183 
00184     OA_ptr<DGraph::NodesIteratorInterface> getSinkNodesIterator() const;
00185 
00186     OA_ptr<EdgesIteratorInterface> getDUGIncomingEdgesIterator() const;
00187 
00188     OA_ptr<EdgesIteratorInterface> getDUGOutgoingEdgesIterator() const;
00189 
00190     OA_ptr<NodesIteratorInterface> getDUGSourceNodesIterator() const;
00191 
00192     OA_ptr<NodesIteratorInterface> getDUGSinkNodesIterator() const;
00193 
00194     //========================================================
00195     // Construction
00196     //========================================================
00197     void addIncomingEdge(OA_ptr<DGraph::EdgeInterface> e)
00198         {
00199             return mDGNode->addIncomingEdge(e);  
00200         }
00201 
00202     void addOutgoingEdge(OA_ptr<DGraph::EdgeInterface> e)
00203         {
00204             return mDGNode->addOutgoingEdge(e); 
00205         }
00206 
00207     void removeIncomingEdge(OA_ptr<DGraph::EdgeInterface> e)
00208         {
00209 
00210             return mDGNode->removeIncomingEdge(e); 
00211         }
00212 
00213     void removeOutgoingEdge(OA_ptr<DGraph::EdgeInterface> e)
00214         {
00215             return mDGNode->removeOutgoingEdge(e);
00216         }  
00217 
00218 private:
00219     void Ctor();
00220    
00221 
00222     unsigned int mId;               // 0 is reserved; first instance is 1
00223     OA_ptr<DUGStandard> mDUG;       // enclosing DUG
00224     ProcHandle mProc;               // enclosing procedure
00225     NodeType mType;                 // node type
00226 
00227     OA_ptr<DGraph::NodeImplement> mDGNode;  // corresponding DGraph node
00228     // in DGraph that keeps 
00229     // structure
00230 
00231     OA_ptr<Location> mLoc;
00232     SymHandle mSym;                  // node key
00233     bool mVaried;                    // 'true' if varied
00234     bool mUseful;                    // 'true' if useful
00235     bool mSelfDependent;             // 'true' if the variable has a self dependence.
00236     // - for context sensitivity between 'varied' and 'useful' analyses
00237     // - For each actual parameter node, the contexts of RETURN edges along which
00238     //   'varied' analysis has propagated are stored.
00239     std::set<CallHandle> mVariedContexts; 
00240                                     
00241     friend class DUGStandard;
00242     friend class Edge;
00243 };
00244   
00245  
00246  
00247  
00248 //--------------------------------------------------------
00249 class Edge : public virtual EdgeInterface {
00250 public:
00251     Edge (OA_ptr<DUGStandard> pDUG,
00252           OA_ptr<Node> pNode1, OA_ptr<Node> pNode2, EdgeType pType,
00253           CallHandle call, ProcHandle p); 
00254     ~Edge () {}
00255     
00256     //========================================================
00257     // Info specific to DUG
00258     //========================================================
00259     
00260     EdgeType getType() const { return mType; }
00261 
00262     ProcHandle getSourceProc() const { return mNode1->getProc(); }
00263     ProcHandle getSinkProc() const { return mNode2->getProc(); }
00264     CallHandle getCall() const { return mCall; }
00265     ProcHandle getProc() const { return mProc; }
00266 
00267     // 090801: explore PARAM_EDGEs just once for each call context
00268     bool isExplored4Varied(CallHandle context) const { 
00269         return mExplored4Varied.find(context) != mExplored4Varied.end(); }
00270     void setExplored4Varied(CallHandle context) { 
00271         mExplored4Varied.insert(context); }
00272     bool isExplored4Useful(CallHandle context) const { 
00273         return mExplored4Useful.find(context) != mExplored4Useful.end(); }
00274     void setExplored4Useful(CallHandle context) { 
00275         mExplored4Useful.insert(context); }
00276 
00277     //========================================================
00278     // DGraph::Interface::Edge interface
00279     //========================================================
00280     
00282     unsigned int getId() const 
00283         {
00284             return mDGEdge->getId();
00285         }
00286 
00288     OA_ptr<DGraph::NodeInterface> getSource () const { return mNode1; }
00289     // FIXME: tail and head should be done like source and sink
00290     // in DGraph::Interface and here
00291     OA_ptr<DGraph::NodeInterface> tail () const { return mNode1; }
00292     
00294     OA_ptr<DGraph::NodeInterface> getSink () const { return mNode2; }
00295     OA_ptr<DGraph::NodeInterface> head () const { return mNode2; }
00296 
00297     OA_ptr<NodeInterface> getDUGSource() const
00298         {
00299             return getSource().convert<Node>();
00300         }
00301 
00302     OA_ptr<NodeInterface> getDUGSink() const
00303         {
00304             return getSink().convert<Node>();
00305         }
00306 
00307 
00308     bool operator==(DGraph::EdgeInterface& other);
00309     bool operator<(DGraph::EdgeInterface& other);
00310 
00311     void dump (std::ostream& os);
00312     void dumpdot (std::ostream& os, OA_ptr<DUGIRInterface> ir);
00313     void dumpdot_label (std::ostream& os, OA_ptr<DUGIRInterface> ir);
00314     void dumpbase (std::ostream& os) {}
00315     void output(OA::IRHandlesIRInterface& ir) { mDGEdge->output(ir); }
00316 
00317 private:
00318 
00319     OA_ptr<DUGStandard> mDUG;
00320     OA_ptr<Node> mNode1, mNode2;
00321     OA_ptr<DGraph::EdgeImplement> mDGEdge;
00322 
00323     EdgeType mType;
00324     CallHandle mCall; // for CALL and RETURN edges
00325     unsigned int mId; // 0 is reserved; first instance is 1
00326     ProcHandle mProc; // proc where this edge is used
00327 
00328     friend class DUGStandard;
00329     friend class Node;
00330 
00331     // 090801: store visit information to remove exponential growth 
00332     //         in number of PARAM_EDGEs
00333     std::set<CallHandle> mExplored4Varied;  
00334     std::set<CallHandle> mExplored4Useful;  
00335 }; 
00336   
00337 //------------------------------------------------------------------
00341 class NodesIterator : public DGraph::NodesIteratorImplement,
00342                       public virtual NodesIteratorInterface
00343 {
00344 public:
00345     NodesIterator(OA_ptr<DGraph::NodesIteratorInterface> ni) 
00346         : DGraph::NodesIteratorImplement(ni) { }
00347 
00348     ~NodesIterator () {}
00349 
00350     OA_ptr<NodeInterface> currentDUGNode() const ;
00351 
00352 };
00353   
00354 //------------------------------------------------------------------
00358 class EdgesIterator : public DGraph::EdgesIteratorImplement, 
00359                       public virtual EdgesIteratorInterface
00360 {
00361 public:
00362     EdgesIterator(OA_ptr<DGraph::EdgesIteratorInterface> ni)
00363         : DGraph::EdgesIteratorImplement(ni) { }
00364 
00365     ~EdgesIterator () {}
00366 
00367     OA_ptr<EdgeInterface> currentDUGEdge() const;
00368 
00369 };
00370   
00371 
00372 //------------------------------------------------------------------
00373 class DUGStandard : public virtual DUGInterface  
00374 {
00375 public:
00376 
00377     friend class Node;  
00378     
00379     DUGStandard (
00380         OA_ptr<DUGIRInterface>,
00381         OA_ptr<DataFlow::ParamBindings>);
00382     virtual ~DUGStandard ();
00383   
00384     //-------------------------------------
00385     // DUG information access
00386     //-------------------------------------
00387 
00390     OA_ptr<Edge> getDUGEdge(OA_ptr<DGraph::EdgeInterface> dgEdge) const;
00391 
00394     OA_ptr<Node> getDUGNode(OA_ptr<DGraph::NodeInterface> dgNode) const;
00395   
00396     std::list<std::pair<SymHandle, ProcHandle> >& getIndepSyms(){
00397         return mIndepSymList;
00398     }
00399     std::list<std::pair<SymHandle, ProcHandle> >& getDepSyms(){
00400         return mDepSymList;
00401     }
00402 
00403     void insertIndepSymList(SymHandle sym, ProcHandle proc){
00404         mIndepSymList.push_back(std::pair<SymHandle, ProcHandle>(sym, proc));
00405         mIndepSymSet.insert(sym);
00406     }
00407 
00408     void insertDepSymList(SymHandle sym, ProcHandle proc){
00409         mDepSymList.push_back(std::pair<SymHandle, ProcHandle>(sym, proc));
00410         mDepSymSet.insert(sym);
00411     }
00412 
00413     void mapSymToProc(SymHandle sym, ProcHandle proc){
00414       
00415         mSymToProc[sym] = proc;
00416     }
00417 
00418     void insertActiveSymSet(SymHandle sym){
00419 #ifdef DEBUG_DUAA
00420         std::cout << "DUGStandard::insertActiveSymSet:(sym: "; 
00421         std::cout << sym << " )" << std::endl;
00422 #endif 
00423         mActiveSymSet->insert(sym);
00424     }
00425 
00426     std::map<ProcHandle,OA_ptr<OA::Activity::ActiveStandard> >& getActiveMap(){
00427         return mActiveMap;
00428     }
00429 
00430     OA_ptr<std::set<SymHandle> > getActiveSymSet(){
00431         return mActiveSymSet;
00432     }
00433     void insertActiveSymSet(OA_ptr<Location>);
00434 
00436     bool isIndependent(ProcHandle proc, SymHandle sym){
00437         if (mIndepSymSet.find(sym) != mIndepSymSet.end()) return true;
00438 
00439         OA_ptr<Location> loc = mIR->getLocation(proc, sym);
00440         if (loc.ptrEqual(0)) return false;
00441         OA_ptr<NamedLoc> nloc = loc.convert<NamedLoc>();
00442         OA_ptr<SymHandleIterator> symIter = nloc->getFullOverlapIter();
00443         for ( ; symIter->isValid(); (*symIter)++) {
00444             SymHandle temp = symIter->current();
00445             if (mIndepSymSet.find(temp) != mIndepSymSet.end()) return true;
00446         }
00447         return false;
00448     }
00449 
00451     bool isDependent(ProcHandle proc, SymHandle sym){
00452         if (mDepSymSet.find(sym) != mDepSymSet.end()) return true;
00453 
00454         OA_ptr<Location> loc = mIR->getLocation(proc, sym);
00455         if (loc.ptrEqual(0)) return false;
00456         OA_ptr<NamedLoc> nloc = loc.convert<NamedLoc>();
00457         OA_ptr<SymHandleIterator> symIter = nloc->getFullOverlapIter();
00458         for ( ; symIter->isValid(); (*symIter)++) {
00459             SymHandle temp = symIter->current();
00460             if (mDepSymSet.find(temp) != mDepSymSet.end()) return true;
00461         }
00462         return false;
00463     }
00464 
00466     bool isActive(SymHandle sym);
00467 
00469     bool isActive(StmtHandle stmt);
00470 
00472     bool isActive(MemRefHandle memref);
00473 
00474     void insertActiveStmtSet(StmtHandle stmt, ProcHandle proc){
00475         mActiveStmtSet->insert(stmt);
00476         mActiveMap[proc]->insertStmt(stmt);
00477     }
00478 
00479 
00480     void insertActiveMemRefSet(MemRefHandle mref, ProcHandle proc){
00481         mActiveMemRefSet->insert(mref);
00482         mActiveMap[proc]->insertMemRef(mref);
00483     }
00484 
00485     void assignActiveStandard(ProcHandle proc) {
00486     
00487         if (mActiveMap[proc].ptrEqual(0)) {
00488             mActiveMap[proc] = new OA::Activity::ActiveStandard(proc);
00489         }
00490     }
00491     
00492     //========================================================
00493     // Construction
00494     //========================================================
00495   
00496   
00497     void addNode(OA_ptr<DGraph::NodeInterface> pNode);
00498     void addEdge(OA_ptr<DGraph::EdgeInterface> pEdge);
00499   
00500 
00501     //========================================================
00502     // DGraph::Interface::Edge interface
00503     //========================================================
00504  
00505     int getNumNodes () { return mDGraph->getNumNodes(); }
00506     int getNumEdges () { return mDGraph->getNumEdges(); }
00507 
00508   
00509     // Output Functionalities 
00510     void dump (std::ostream& os, OA_ptr<IRHandlesIRInterface> ir);
00511     void dumpdot (std::ostream& os, OA_ptr<DUGIRInterface> ir);
00512     void dumpbase(std::ostream& os) {}
00513     void output(OA::IRHandlesIRInterface& ir) { mDGraph->output(ir); }
00514 
00515   
00516     //------------------------------------------------------------------
00517     // Using trick of imitating covariance when getting all iterators
00518     // so that get an iterator specific to actual subclass
00519     // This is why have these getBlahIterator methods that shadow those
00520     // in DGraph::Interface and also have the protected ones
00521     // that must be defined here which override implementation in 
00522     // DGraph::Interface
00523     //------------------------------------------------------------------
00524   
00525     OA_ptr<DGraph::NodesIteratorInterface> getNodesIterator() const;
00526 
00527     OA_ptr<DGraph::NodesIteratorInterface> getEntryNodesIterator() const;
00528 
00529     OA_ptr<DGraph::NodesIteratorInterface> getExitNodesIterator() const;
00530 
00531     OA_ptr<DGraph::EdgesIteratorInterface> getEdgesIterator() const;
00532 
00533     OA_ptr<DGraph::NodesIteratorInterface> getDFSIterator(OA_ptr<DGraph::NodeInterface> n);
00534 
00535     OA_ptr<DGraph::NodesIteratorInterface> getBFSIterator();
00536 
00537     OA_ptr<DGraph::NodesIteratorInterface> 
00538     getReversePostDFSIterator(DGraph::DGraphEdgeDirection pOrient);
00539 
00540     OA_ptr<DGraph::NodesIteratorInterface>
00541     getReversePostDFSIterator(OA_ptr<DGraph::NodeInterface> root, 
00542                               DGraph::DGraphEdgeDirection pOrient);
00543 
00544     OA_ptr<DGraph::NodesIteratorInterface> getPostDFSIterator(
00545         DGraph::DGraphEdgeDirection pOrient);
00546 
00547     OA_ptr<DGraph::NodesIteratorInterface>
00548     getPostDFSIterator(OA_ptr<DGraph::NodeInterface> root, 
00549                        DGraph::DGraphEdgeDirection pOrient);
00550 
00551 
00552     //==================================================================
00553   
00554     OA_ptr<NodesIteratorInterface>
00555     getDUGNodesIterator() const;
00556 
00557     OA_ptr<EdgesIteratorInterface>
00558     getDUGEdgesIterator() const;
00559 
00560     OA_ptr<NodesIteratorInterface>
00561     getDUGEntryNodesIterator() const;
00562 
00563     OA_ptr<NodesIteratorInterface>
00564     getDUGExitNodesIterator() const;
00565 
00566     OA_ptr<NodesIteratorInterface>
00567     getDUGReversePostDFSIterator(DGraph::DGraphEdgeDirection pOrient);
00568 
00569     OA_ptr<NodesIteratorInterface>
00570     getDUGDFSIterator(OA_ptr<NodeInterface> n);
00571 
00573     void mapSymToMemRefSet(SymHandle sym, MemRefHandle mref) {
00574         mSymToMemRefSet[sym].insert(mref);
00575     }
00576 
00578     void mapSymToStmtSet(SymHandle sym, StmtHandle stmt) {
00579         mSymToStmtSet[sym].insert(stmt);
00580     }
00581 
00584     std::set<MemRefHandle> getMemRefSet(SymHandle sym) {
00585         return mSymToMemRefSet[sym];
00586     }
00587 
00590     std::set<StmtHandle> getStmtSet(SymHandle sym) {
00591         return mSymToStmtSet[sym];
00592     }
00593  
00594     //==================================================================
00595 
00596     OA_ptr<Node> getNode(SymHandle, ProcHandle);
00597     bool isNode(SymHandle, ProcHandle);
00598 
00599 private:
00600     OA_ptr<Node> mEntry; 
00601     OA_ptr<Node> mExit;
00602 
00603     // dgraph that will store underlying graph structure
00604     //  OA_ptr<DGraph::DGraphImplement> mDGraph;
00605   
00606     OA_ptr<DGraph::DGraphImplement> mDGraph;
00607 
00608     // using lists instead of sets because some of the iterators
00609     // need an ordered list of things and only want to have one
00610     // NodeIterator and EdgesIterator implementation
00611     OA_ptr<std::list<OA_ptr<Node> > > mCallNodes;
00612     OA_ptr<std::list<OA_ptr<Node> > > mReturnNodes;
00613 
00614     // map from SymHandle to Node
00615     std::map<SymHandle, OA_ptr<Node> > mSymToNode;
00616 
00617     // map from SymHandle to Location
00618     std::map<SymHandle, OA_ptr<Location> > mSymToLoc;
00619     std::map<SymHandle, ProcHandle> mSymToProc;
00620 
00621     // DUAA specific
00622     OA_ptr<DUGIRInterface>            mIR;
00623     //OA_ptr<IRHandlesIRInterface>      mIR;
00624     OA_ptr<DataFlow::ParamBindings>   mParamBind;
00625 
00626 
00627     std::list<std::pair<SymHandle, ProcHandle> > mIndepSymList;
00628     std::list<std::pair<SymHandle, ProcHandle> > mDepSymList;
00629     std::set<SymHandle>             mIndepSymSet;
00630     std::set<SymHandle>             mDepSymSet;
00631 
00632     OA_ptr<std::set<StmtHandle> > mActiveStmtSet;
00633     OA_ptr<std::set<MemRefHandle> > mActiveMemRefSet;
00634     OA_ptr<std::set<SymHandle> >    mActiveSymSet;
00635     std::map<ProcHandle,OA_ptr<OA::Activity::ActiveStandard> > mActiveMap;
00636 
00637     bool mUnknownLocActive;
00638 
00639 
00640 
00641     std::map<SymHandle, std::set<MemRefHandle> > mSymToMemRefSet;
00642 
00643     std::map<SymHandle, std::set<StmtHandle> > mSymToStmtSet;
00644 
00645     std::map<OA_ptr<Location>, OA_ptr<std::set<MemRefHandle> > > mLocToMemRefSet;
00646 
00647     std::map<OA_ptr<Location>, OA_ptr<std::set<StmtHandle> > > mLocToStmtSet;
00648 
00649 };
00650 //--------------------------------------------------------------------
00651 
00652   } // end of DUG namespace
00653 } // end of OA namespace
00654 
00655 #endif

Generated on Sat Oct 31 05:21:21 2009 for OpenAnalysis by  doxygen 1.6.1