00001 00016 #ifndef MemRefsVisitor_H 00017 #define MemRefsVisitor_H 00018 00019 #include <OpenAnalysis/ExprTree/ExprTreeVisitor.hpp> 00020 //#include <OpenAnalysis/Alias/Interface.hpp> 00021 00022 namespace OA { 00023 00024 // Seems like there should already be a MemRefIterator in the OA namespace 00025 // but I cannot seem to locate it, so here it is: 00027 class MemRefIterator : public virtual OA::MemRefHandleIterator, 00028 public OA::IRHandleSetIterator<OA::MemRefHandle> 00029 { 00030 public: 00031 MemRefIterator(OA::OA_ptr<std::set<OA::MemRefHandle> > pList) 00032 : OA::IRHandleSetIterator<OA::MemRefHandle>(pList) {} 00033 ~MemRefIterator() {} 00034 00035 void operator++() { OA::IRHandleSetIterator<OA::MemRefHandle>::operator++(); } 00036 bool isValid() const 00037 { return OA::IRHandleSetIterator<OA::MemRefHandle>::isValid(); } 00038 OA::MemRefHandle current() const 00039 { return OA::IRHandleSetIterator<OA::MemRefHandle>::current(); } 00040 void reset() { OA::IRHandleSetIterator<OA::MemRefHandle>::reset(); } 00041 }; 00042 00043 //-------------------------------------------------------------------- 00046 00047 class MemRefsVisitor : public ExprTreeVisitor { 00048 public: 00049 MemRefsVisitor() : mHasMemRef(false) { } 00050 ~MemRefsVisitor() {} 00051 00052 void visitExprTreeBefore(ExprTree&) 00053 { mMemRefSet = new std::set<MemRefHandle>; } 00054 void visitExprTreeAfter(ExprTree&) { } 00055 00056 //--------------------------------------- 00057 // method for each ExprTree::Node subclass 00058 //--------------------------------------- 00059 // default base class so that visitors can handle unknown 00060 // node sub-classes in a generic fashion 00061 void visitNode(ExprTree::Node&); 00062 00063 void visitOpNode(ExprTree::OpNode& n); 00064 void visitCallNode(ExprTree::CallNode& n); 00065 void visitMemRefNode(ExprTree::MemRefNode& n); 00066 void visitConstSymNode(ExprTree::ConstSymNode& n); 00067 void visitConstValNode(ExprTree::ConstValNode& n); 00068 00070 bool hasMemRef() { return mHasMemRef; } 00071 OA_ptr<MemRefHandleIterator> getMemRefsIterator() 00072 { OA_ptr<MemRefIterator> retval; 00073 retval = new MemRefIterator(mMemRefSet); 00074 return retval; 00075 } 00076 00077 private: 00078 bool mHasMemRef; 00079 OA_ptr<std::set<MemRefHandle> > mMemRefSet; 00080 //OA_ptr<Alias::Interface> mAlias; 00081 }; 00082 00083 00084 00085 } // end of OA namespace 00086 00087 #endif
1.6.1