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
1.7.1