Go to the documentation of this file.00001
00015 #ifndef ReachConstsManagerStandard_h
00016 #define ReachConstsManagerStandard_h
00017
00018
00019
00020 #include <OpenAnalysis/Utils/OA_ptr.hpp>
00021 #include <OpenAnalysis/IRInterface/ReachConstsIRInterface.hpp>
00022 #include <OpenAnalysis/ReachConsts/ReachConstsStandard.hpp>
00023
00024 #include <OpenAnalysis/CFG/CFGInterface.hpp>
00025
00026
00027 #include <OpenAnalysis/Alias/Interface.hpp>
00028
00029 #include <OpenAnalysis/DataFlow/CFGDFProblem.hpp>
00030 #include <OpenAnalysis/DataFlow/IRHandleDataFlowSet.hpp>
00031 #include <OpenAnalysis/SideEffect/InterSideEffectInterface.hpp>
00032
00033
00034 #include <OpenAnalysis/IRInterface/ConstValBasicInterface.hpp>
00035 #include <OpenAnalysis/ExprTree/EvalToConstVisitor.hpp>
00036 #include <OpenAnalysis/DataFlow/CFGDFSolver.hpp>
00037 #include <OpenAnalysis/DataFlow/LocDFSet.hpp>
00038
00039
00040 namespace OA {
00041 namespace ReachConsts {
00042
00043
00049 class ManagerReachConstsStandard
00050 : private DataFlow::CFGDFProblem {
00051
00052 public:
00053 ManagerReachConstsStandard(OA_ptr<ReachConstsIRInterface> _ir);
00054 ~ManagerReachConstsStandard () {}
00055
00056 OA_ptr<ReachConstsStandard> performAnalysis(ProcHandle,
00057 OA_ptr<CFG::CFGInterface> cfg, OA_ptr<Alias::Interface> alias,
00058 OA_ptr<SideEffect::InterSideEffectInterface> interSE,
00059 DataFlow::DFPImplement algorithm);
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081 private:
00082 OA_ptr<DataFlow::DataFlowSet> initializeTop();
00083
00084 OA_ptr<DataFlow::DataFlowSet> initializeBottom();
00085
00087 void initializeTopAndBottom();
00088
00089
00090 void initializeNode(OA_ptr<CFG::NodeInterface> n);
00092 OA_ptr<DataFlow::DataFlowSet>
00093 initializeNodeIN(OA_ptr<CFG::NodeInterface> n);
00094 OA_ptr<DataFlow::DataFlowSet>
00095 initializeNodeOUT(OA_ptr<CFG::NodeInterface> n);
00096
00097
00098 OA_ptr<DataFlow::DataFlowSet>
00099 meet (OA_ptr<DataFlow::DataFlowSet> set1,
00100 OA_ptr<DataFlow::DataFlowSet> set2);
00101
00102 OA_ptr<DataFlow::DataFlowSet>
00103 transfer(OA_ptr<DataFlow::DataFlowSet> in, OA::StmtHandle stmt);
00104
00105
00106
00107
00108
00111 void setUseMemRef2Const(StmtHandle stmt, const ConstDefSet& in);
00112
00115 void setDefMemRef2Const(StmtHandle stmt, const ConstDefSet& in);
00116
00117 enum MeetOp {
00118 CD1toBOTTOM,CD2toBOTTOM,BOTHtoBOTTOM,CD1toVALUECD2,CD2toVALUECD1,NOTHING
00119 };
00120
00122 MeetOp getMustMeetOp(OA_ptr<ConstDef> cd1, OA_ptr<ConstDef> cd2);
00123
00125 MeetOp getMayOnlyMeetOp(OA_ptr<ConstDef> cd1, OA_ptr<ConstDef> cd2);
00126
00127 private:
00128
00129 OA_ptr<ReachConstsIRInterface> mIR;
00130 ProcHandle mProc;
00131 OA_ptr<Alias::Interface> mAlias;
00132 std::map<StmtHandle,std::set<OA_ptr<Location> > > mStmtMayDefMap;
00133 std::map<StmtHandle,std::set<OA_ptr<Location> > > mStmtMustDefMap;
00134 OA_ptr<ConstDefSet> mAllTop;
00135 OA_ptr<ConstDefSet> mAllBottom;
00136 OA_ptr<CFG::CFGInterface> mCFG;
00137 OA_ptr<SideEffect::InterSideEffectInterface> mInterSE;
00138 OA_ptr<ReachConstsStandard> mRCS;
00139
00140 OA_ptr<DataFlow::CFGDFSolver> mSolver;
00141
00142 };
00143
00144 }
00145 }
00146
00147 #endif