SymAliasSets.hpp

Go to the documentation of this file.
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