00001
00015
00016
00017
00018 #ifndef DUGStandard_H
00019 #define DUGStandard_H
00020
00021
00022 #define CONTEXT_SENSITIVITY
00023
00024
00025
00026
00027
00028 #include <list>
00029 #include <map>
00030
00031
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
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
00124
00125
00126 unsigned int size () const {
00127 assert(0);
00128 return 0;
00129 }
00130
00131
00132
00133
00134
00135
00137 unsigned int getId() const
00138 {
00139 return mDGNode->getId();
00140
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
00160
00161 void dump(std::ostream& os) { }
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
00175
00176
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
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;
00223 OA_ptr<DUGStandard> mDUG;
00224 ProcHandle mProc;
00225 NodeType mType;
00226
00227 OA_ptr<DGraph::NodeImplement> mDGNode;
00228
00229
00230
00231 OA_ptr<Location> mLoc;
00232 SymHandle mSym;
00233 bool mVaried;
00234 bool mUseful;
00235 bool mSelfDependent;
00236
00237
00238
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
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
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
00279
00280
00282 unsigned int getId() const
00283 {
00284 return mDGEdge->getId();
00285 }
00286
00288 OA_ptr<DGraph::NodeInterface> getSource () const { return mNode1; }
00289
00290
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;
00325 unsigned int mId;
00326 ProcHandle mProc;
00327
00328 friend class DUGStandard;
00329 friend class Node;
00330
00331
00332
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
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
00494
00495
00496
00497 void addNode(OA_ptr<DGraph::NodeInterface> pNode);
00498 void addEdge(OA_ptr<DGraph::EdgeInterface> pEdge);
00499
00500
00501
00502
00503
00504
00505 int getNumNodes () { return mDGraph->getNumNodes(); }
00506 int getNumEdges () { return mDGraph->getNumEdges(); }
00507
00508
00509
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
00518
00519
00520
00521
00522
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
00604
00605
00606 OA_ptr<DGraph::DGraphImplement> mDGraph;
00607
00608
00609
00610
00611 OA_ptr<std::list<OA_ptr<Node> > > mCallNodes;
00612 OA_ptr<std::list<OA_ptr<Node> > > mReturnNodes;
00613
00614
00615 std::map<SymHandle, OA_ptr<Node> > mSymToNode;
00616
00617
00618 std::map<SymHandle, OA_ptr<Location> > mSymToLoc;
00619 std::map<SymHandle, ProcHandle> mSymToProc;
00620
00621
00622 OA_ptr<DUGIRInterface> mIR;
00623
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 }
00653 }
00654
00655 #endif