UDDUChainsStandard.hpp

Go to the documentation of this file.
00001 
00015 #ifndef UDDUChainsStandard_hpp
00016 #define UDDUChainsStandard_hpp
00017 
00018 #include <cassert>
00019 #include <iostream>
00020 #include <map>
00021 #include <set>
00022 #include <vector>
00023 #include <list>
00024 #include <OpenAnalysis/Utils/OA_ptr.hpp>
00025 #include <OpenAnalysis/IRInterface/IRHandles.hpp>
00026 #include <OpenAnalysis/UDDUChains/Interface.hpp>
00027 #include <OpenAnalysis/OABase/Annotation.hpp>
00028 #include <OpenAnalysis/Utils/GenOutputTool.hpp>
00029 
00030 
00031 
00032 namespace OA {
00033   namespace UDDUChains {
00034 
00035 //typedef std::set<StmtHandle> StmtSet;
00036 
00037 
00044 class UDDUChainsStandard : public virtual UDDUChains::Interface, public virtual Annotation
00045 {
00046 
00047 public:
00048     UDDUChainsStandard(ProcHandle p) 
00049         { mUDChainForStmt = new std::map<StmtHandle,OA_ptr<StmtSet> >;
00050           mDUChainForStmt = new std::map<StmtHandle,OA_ptr<StmtSet> >;
00051           mUDChainForMemRef = new std::map<MemRefHandle,OA_ptr<StmtSet> >;
00052           mDUChainForMemRef = new std::map<MemRefHandle,OA_ptr<StmtSet> >;
00053         } 
00054     ~UDDUChainsStandard() {}
00055 
00059     //StmtHandle getStmtHandle(MemRefHandle ref)
00060     //{ return mMemRefToStmtMap[ref]; }
00061     
00064     OA_ptr<Interface::ChainStmtIterator> getUDChainStmtIterator(StmtHandle s);
00065 
00068     OA_ptr<Interface::StmtsWithUDChainIterator> getStmtsWithUDChainIterator();
00069 
00072     OA_ptr<Interface::ChainStmtIterator> getDUChainStmtIterator(StmtHandle s);
00073 
00076     OA_ptr<Interface::StmtsWithDUChainIterator> getStmtsWithDUChainIterator();
00077 
00080     OA_ptr<Interface::ChainStmtIterator> getUDChainStmtIterator(MemRefHandle h);
00081 
00084     OA_ptr<Interface::MemRefsWithUDChainIterator> 
00085     getMemRefsWithUDChainIterator();
00086 
00089     OA_ptr<Interface::ChainStmtIterator> getDUChainStmtIterator(MemRefHandle h);
00090 
00093     OA_ptr<Interface::MemRefsWithDUChainIterator> 
00094     getMemRefsWithDUChainIterator();
00095 
00096     //*****************************************************************
00097     // Construction methods 
00098     // FIXME: the relationships between these aren't being verified
00099     // or asserted
00100     //*****************************************************************
00101 
00104     void insertMemRefDef(MemRefHandle ref);
00105     void insertMemRefUse(MemRefHandle ref);
00106 
00108     void insertDefUse(StmtHandle def, StmtHandle use);
00109 
00112     void insertMemRefDefStmtUse(MemRefHandle def, StmtHandle use);
00113 
00116     void insertStmtDefMemRefUse(StmtHandle def, MemRefHandle use);
00117 
00119     //void insertMemRefToStmtMapping(MemRefHandle ref, StmtHandle stmt)
00120     //{ mMemRefToStmtMap[ref] = stmt; }
00121 
00122     //*****************************************************************
00123     // Output
00124     //*****************************************************************
00125 
00127     void output(IRHandlesIRInterface& pIR);
00128     
00129     void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir);
00130 
00131   private:
00132     // data members
00133     OUTPUT
00134     
00135     GENOUT OA_ptr<std::map<StmtHandle,OA_ptr<StmtSet> > > mUDChainForStmt;
00136     GENOUT OA_ptr<std::map<StmtHandle,OA_ptr<StmtSet> > > mDUChainForStmt;
00137     GENOUT OA_ptr<std::map<MemRefHandle,OA_ptr<StmtSet> > > mUDChainForMemRef;
00138     GENOUT OA_ptr<std::map<MemRefHandle,OA_ptr<StmtSet> > > mDUChainForMemRef;
00139     GENOUT std::map<MemRefHandle,StmtHandle>  mMemRefToStmtMap;
00140 
00141   public:
00142 
00143     //*****************************************************************
00144     // Iterators
00145     //*****************************************************************
00150     class ChainStmtIterator : public IRHandleSetIterator<StmtHandle>,
00151                               public Interface::ChainStmtIterator
00152     {
00153       public:
00154         ChainStmtIterator(OA_ptr<std::set<StmtHandle> > pSet) 
00155             : IRHandleSetIterator<StmtHandle>(pSet) {}
00156         ~ChainStmtIterator() {}
00157 
00158         void operator++() { IRHandleSetIterator<StmtHandle>::operator++(); }
00159         bool isValid() const
00160           { return IRHandleSetIterator<StmtHandle>::isValid(); }
00161         StmtHandle current() const
00162           { return IRHandleSetIterator<StmtHandle>::current(); }
00163         void reset() { IRHandleSetIterator<StmtHandle>::current(); }
00164     };
00165 
00166     class StmtsWithUDChainIterator : public Interface::StmtsWithUDChainIterator 
00167     {
00168       public:
00169         StmtsWithUDChainIterator(OA_ptr<std::map<StmtHandle,
00170                                                 OA_ptr<StmtSet> > > pMap) 
00171             : mMap(pMap), mIter(pMap->begin()) { }
00172         ~StmtsWithUDChainIterator() { }
00173 
00174         StmtHandle current() const { return mIter->first; }
00175         bool isValid() const { return (mIter != mMap->end()); }
00176         void operator++() { if (isValid()) mIter++; }
00177         void reset() { mIter = mMap->begin(); }
00178 
00179       private:
00180         OA_ptr<std::map<StmtHandle,OA_ptr<StmtSet> > > mMap;
00181         std::map<StmtHandle,OA_ptr<StmtSet> >::iterator mIter;
00182 
00183     };
00184 
00186     typedef StmtsWithUDChainIterator StmtsWithDUChainIterator;
00187 
00188     class MemRefsWithUDChainIterator 
00189         : public Interface::MemRefsWithUDChainIterator 
00190     {
00191       public:
00192         MemRefsWithUDChainIterator(OA_ptr<std::map<MemRefHandle,
00193                                                 OA_ptr<StmtSet> > > pMap) 
00194             : mMap(pMap), mIter(pMap->begin()) { }
00195         ~MemRefsWithUDChainIterator() { }
00196 
00197         MemRefHandle current() const { return mIter->first; }
00198         bool isValid() const { return (mIter != mMap->end()); }
00199         void operator++() { if (isValid()) mIter++; }
00200         void reset() { mIter = mMap->begin(); }
00201 
00202       private:
00203             
00204         OA_ptr<std::map<MemRefHandle,OA_ptr<StmtSet> > > mMap;
00205         std::map<MemRefHandle,OA_ptr<StmtSet> >::iterator mIter;
00206     };
00207 
00209     typedef MemRefsWithUDChainIterator MemRefsWithDUChainIterator;
00210 };
00211 
00212   } // end of UDDUChains namespace
00213 } // end of OA namespace
00214 
00215 #endif
00216