ManagerInterSideEffectStandard.hpp
Go to the documentation of this file.00001
00016 #ifndef ManagerInterSideEffectStandard_h
00017 #define ManagerInterSideEffectStandard_h
00018
00019
00020
00021 #include <OpenAnalysis/Utils/OA_ptr.hpp>
00022 #include <OpenAnalysis/IRInterface/InterSideEffectIRInterface.hpp>
00023 #include <OpenAnalysis/SideEffect/InterSideEffectStandard.hpp>
00024 #include <OpenAnalysis/SideEffect/ManagerSideEffectStandard.hpp>
00025 #include <OpenAnalysis/Alias/InterAliasInterface.hpp>
00026 #include <OpenAnalysis/DataFlow/CountDFSet.hpp>
00027 #include <OpenAnalysis/DataFlow/ParamBindings.hpp>
00028 #include <OpenAnalysis/DataFlow/CalleeToCallerVisitor.hpp>
00029 #include <OpenAnalysis/DataFlow/CallGraphDFProblem.hpp>
00030 #include <OpenAnalysis/DataFlow/CallGraphDFSolver.hpp>
00031
00032
00033
00034 namespace OA {
00035 namespace SideEffect {
00036
00037
00042 class ManagerInterSideEffectStandard : private DataFlow::CallGraphDFProblem {
00043 public:
00044 ManagerInterSideEffectStandard(OA_ptr<InterSideEffectIRInterface> _ir);
00045 ~ManagerInterSideEffectStandard () {}
00046
00047 OA_ptr<InterSideEffectStandard>
00048 performAnalysis(OA_ptr<CallGraph::CallGraphInterface> callGraph,
00049 OA_ptr<DataFlow::ParamBindings> paramBind,
00050 OA_ptr<Alias::InterAliasInterface> interAlias,
00051 OA_ptr<ManagerSideEffectStandard> intraMan,
00052 DataFlow::DFPImplement algorithm);
00053
00054 private:
00055
00056
00057
00058
00059
00060
00061
00063 OA_ptr<DataFlow::DataFlowSet> initializeTop();
00064
00066 OA_ptr<DataFlow::DataFlowSet> initializeBottom();
00067
00069 OA_ptr<DataFlow::DataFlowSet> initializeNode(ProcHandle proc);
00072
00073
00074 OA_ptr<DataFlow::DataFlowSet>
00075 initializeNodeIN(OA_ptr<CallGraph::NodeInterface> n);
00076
00077 OA_ptr<DataFlow::DataFlowSet>
00078 initializeNodeOUT(OA_ptr<CallGraph::NodeInterface> n);
00079
00080
00081
00082 OA_ptr<DataFlow::DataFlowSet> initializeEdge(CallHandle call,
00083 ProcHandle caller,
00084 ProcHandle callee);
00088 OA_ptr<DataFlow::DataFlowSet> initializeEdge(CallHandle call,
00089 ProcHandle caller,
00090 SymHandle callee);
00091
00092
00093
00094
00095
00098 OA_ptr<DataFlow::DataFlowSet> meet(OA_ptr<DataFlow::DataFlowSet> set1,
00099 OA_ptr<DataFlow::DataFlowSet> set2);
00100
00102 OA_ptr<DataFlow::DataFlowSet>
00103 atCallGraphNode(OA_ptr<DataFlow::DataFlowSet> inSet, OA::ProcHandle proc);
00104
00107 OA_ptr<DataFlow::DataFlowSet>
00108 atCallGraphEdge(OA_ptr<DataFlow::DataFlowSet> inSet, OA::CallHandle call,
00109 ProcHandle caller, ProcHandle callee);
00111 OA_ptr<DataFlow::DataFlowSet>
00112 atCallGraphEdge(OA_ptr<DataFlow::DataFlowSet> inSet, CallHandle call,
00113 ProcHandle caller, SymHandle callee);
00114
00117 OA_ptr<DataFlow::DataFlowSet> nodeToEdge(ProcHandle proc,
00118 OA_ptr<DataFlow::DataFlowSet> procDFSet, CallHandle call)
00119 {
00120 return procDFSet;
00121 }
00122
00125 OA_ptr<DataFlow::DataFlowSet> edgeToNode(CallHandle call,
00126 OA_ptr<DataFlow::DataFlowSet> callDFSet, ProcHandle proc)
00127 {
00128 return callDFSet;
00129 }
00130
00131
00132 private:
00133 OA_ptr<InterSideEffectIRInterface> mIR;
00134 OA_ptr<Alias::InterAliasInterface> mInterAlias;
00135 OA_ptr<InterSideEffectStandard> mInterSideEffect;
00136 OA_ptr<DataFlow::ParamBindings> mParamBind;
00137 OA_ptr<ManagerSideEffectStandard> mIntraMan;
00138 OA_ptr<DataFlow::CallGraphDFSolver> mSolver;
00139
00140 };
00141
00142 }
00143 }
00144
00145 #endif