NotationGenerator.hpp

Go to the documentation of this file.
00001 
00008 #ifndef NOTATIONGENERATOR_HPP_
00009 #define NOTATIONGENERATOR_HPP_
00010 
00011 #include <OpenAnalysis/Utils/OA_ptr.hpp>
00012 #include <OpenAnalysis/IRInterface/IRHandles.hpp>
00013 #include <OpenAnalysis/Location/Locations.hpp>
00014 #include <OpenAnalysis/MemRefExpr/MemRefExpr.hpp>
00015 #include <OpenAnalysis/MemRefExpr/MemRefExprVisitor.hpp>
00016 #include <OpenAnalysis/IRInterface/AliasIRInterface.hpp>
00017 #include <iostream>
00018 
00020 std::ostream &indt(std::ostream &os);
00021 
00023 std::ostream &pushIndt(std::ostream &os);
00024 
00026 std::ostream &popIndt(std::ostream &os);
00027 
00028 class NGOutputVisitor;
00029 
00032 class NotationGenerator
00033 {
00034     friend class NGOutputVisitor;
00035 
00036     public:
00038     NotationGenerator(OA::OA_ptr<OA::Alias::AliasIRInterface> ir,
00039                       std::ostream &codeStream);
00040  
00042     void generate(OA::ProcHandle proc);
00043 
00044     private:
00046     void outputProcedure(OA::ProcHandle proc);
00047 
00049     void outputFormals(OA::ProcHandle proc);
00050 
00053     void outputStmt(OA::StmtHandle stmt);
00054     
00056     void outputMemRefExprs(OA::StmtHandle stmt);
00057 
00059     void outputPtrAssignPairs(OA::StmtHandle stmt);
00060 
00062     void outputCallSites(OA::StmtHandle stmt);
00063 
00066     void outputParamBindPtrAssignPairs(OA::StmtHandle stmt);
00067 
00069     void outputParamBindPtrAssignPairs(OA::StmtHandle stmt,
00070          OA::CallHandle call);
00071 
00073     void outputMemRefExpr(OA::OA_ptr<OA::MemRefExpr> expr);
00074     void outputMemRefExpr(OA::NamedRef& expr);
00075     void outputMemRefExpr(OA::UnnamedRef& expr);
00076     void outputMemRefExpr(OA::UnknownRef& expr);
00077     void outputMemRefExpr(OA::AddressOf& expr);
00078     void outputMemRefExpr(OA::Deref& expr);
00079     void outputMemRefExpr(OA::FieldAccess& expr);
00080     void outputMemRefExpr(OA::IdxAccess& expr);
00081     void outputMemRefExpr(OA::IdxExprAccess& expr);
00082     void outputMemRefExpr(OA::SubSetRef& ref);
00083 
00084 
00086     void outputHandle(OA::StmtHandle h);
00087     void outputHandle(OA::ExprHandle h);
00088     void outputHandle(OA::MemRefHandle h);
00089     void outputHandle(OA::ProcHandle h);
00090     void outputHandle(OA::SymHandle h);
00091     void outputHandle(OA::CallHandle h);
00092 
00095     void outputMemRefType(OA::MemRefExpr &expr);
00096 
00098     void outputTF(bool value);
00099     
00102     void outputAccuracy(bool hasFullAccuracy);
00103 
00106     void outputLocations(OA::ProcHandle proc);
00107 
00109     void outputLocation(OA::ProcHandle proc, OA::SymHandle sym);
00110 
00111     //vars
00112     OA::OA_ptr<OA::Alias::AliasIRInterface> mIR;
00113     std::ostream &mCodeStream;
00114 
00118     std::set<OA::SymHandle> mSymHandles;
00119 };
00120 
00121 class NGOutputVisitor : public virtual OA::MemRefExprVisitor {
00122   public:
00123   NGOutputVisitor(NotationGenerator& ng) : mNG(ng) {}
00124   ~NGOutputVisitor() {}
00125 
00126   void visitNamedRef(OA::NamedRef& ref) { mNG.outputMemRefExpr(ref); }
00127   void visitUnnamedRef(OA::UnnamedRef& ref){ mNG.outputMemRefExpr(ref); }
00128   void visitUnknownRef(OA::UnknownRef& ref){ mNG.outputMemRefExpr(ref); }
00129   void visitAddressOf(OA::AddressOf& ref){ mNG.outputMemRefExpr(ref); }
00130   void visitDeref(OA::Deref& ref){ mNG.outputMemRefExpr(ref); }
00131 
00132   void visitSubSetRef(OA::SubSetRef& ref) 
00133     { 
00134         /* PLM 1/23/07 there is SubSetRef in the ouptut
00135         std::cerr << __FILE__ << ":" << __LINE__
00136              << "Unknown SubSetRef type.\n";
00137         exit(-1);
00138         */
00139 
00140         mNG.outputMemRefExpr(ref);
00141     }
00142 
00143   void visitFieldAccess(OA::FieldAccess& ref) { mNG.outputMemRefExpr(ref); }
00144   void visitIdxExprAccess(OA::IdxExprAccess& ref) { mNG.outputMemRefExpr(ref); }
00145   void visitIdxAccess(OA::IdxAccess& ref) { mNG.outputMemRefExpr(ref); }
00146 
00147   private:
00148   NotationGenerator& mNG;
00149 };
00150 
00151 
00152 #endif

Generated on Sat Oct 31 05:21:25 2009 for OpenAnalysis by  doxygen 1.6.1