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
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
00060
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
00098
00099
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
00120
00121
00122
00123
00124
00125
00127 void output(IRHandlesIRInterface& pIR);
00128
00129 void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir);
00130
00131 private:
00132
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
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 }
00213 }
00214
00215 #endif
00216