00001 00022 #ifndef SymAliasSets_H 00023 #define SymAliasSets_H 00024 00025 #include <OpenAnalysis/DataFlow/DataFlowSet.hpp> 00026 #include <OpenAnalysis/DataFlow/IRHandleDataFlowSet.hpp> 00027 #include <map> 00028 00029 namespace OA { 00030 namespace Alias { 00031 00042 class SymAliasSets : public virtual DataFlow::DataFlowSet { 00043 private: 00044 class SymSetIterator; 00045 friend class SymSetIterator; 00046 00047 public: 00048 SymAliasSets() : mNextSetId(0) {} 00049 SymAliasSets(const SymAliasSets& other); 00050 ~SymAliasSets() {} 00051 00052 static const int SET_ID_NONE = -1; 00053 00056 OA_ptr<SymHandleIterator> getSymIterator(SymHandle sym); 00057 00058 //***************************************************************** 00059 // DataFlowSet interface 00060 //***************************************************************** 00061 bool operator ==(DataFlow::DataFlowSet &other) const; 00062 bool operator !=(DataFlow::DataFlowSet &other) const; 00063 00064 OA_ptr<DataFlow::DataFlowSet> clone(); 00065 00066 void dump(std::ostream &os, OA_ptr<IRHandlesIRInterface>); 00067 void dump(std::ostream &os); 00068 00069 //***************************************************************** 00070 // Meet routine 00071 //***************************************************************** 00072 00076 OA_ptr<SymAliasSets> meet(SymAliasSets& other); 00077 00078 //***************************************************************** 00079 // Construction methods 00080 //***************************************************************** 00081 00082 /* 00085 void mapSymsToSameInvSym(ExprHandle call, SymHandle sym1, SymHandle sym2); 00086 */ 00087 00090 void mergeSyms(SymHandle sym1, SymHandle sym2); 00091 00092 private: 00093 class SymSet; 00094 std::map<int,OA_ptr<SymSet> > mIdToSymSetMap; 00095 std::map<SymHandle,int> mSymToIdMap; 00096 int mNextSetId; 00097 //std::set<ExprHandle> mCallSet; 00098 00101 void insertSet(OA_ptr<SymSet> pSet); 00102 00104 void replaceSet(int oldSetId, OA_ptr<SymSet> pSet); 00105 00107 int getAliasSetId(SymHandle sym); 00108 00109 class SymSet : public DataFlow::IRHandleDataFlowSet<SymHandle> { 00110 public: 00111 SymSet() : DataFlow::IRHandleDataFlowSet<SymHandle>() {} 00112 SymSet(const SymSet& other) 00113 : DataFlow::IRHandleDataFlowSet<SymHandle>(other) {} 00114 ~SymSet() {} 00115 00116 }; 00117 00118 class SymSetIterator : public virtual SymHandleIterator, 00119 public DataFlow::IRHandleIterator<SymHandle> 00120 { 00121 public: 00122 SymSetIterator(OA_ptr<SymSet> pSet) : DataFlow::IRHandleIterator<SymHandle>(pSet) {} 00123 ~SymSetIterator() {} 00124 00125 void operator++() { DataFlow::IRHandleIterator<SymHandle>::operator++(); } 00126 void operator++(int i) { DataFlow::IRHandleIterator<SymHandle>::operator++(i); } 00127 bool isValid() const 00128 { return DataFlow::IRHandleIterator<SymHandle>::isValid(); } 00129 SymHandle current() const 00130 { return DataFlow::IRHandleIterator<SymHandle>::current(); } 00131 void reset() { DataFlow::IRHandleIterator<SymHandle>::current(); } 00132 }; 00133 00134 00135 }; 00136 00137 } // end of Alias namespace 00138 } // end of OA namespace 00139 00140 #endif 00141
1.7.1