InterSideEffectStandard.hpp
Go to the documentation of this file.00001
00015 #ifndef InterSideEffectStandard_hpp
00016 #define InterSideEffectStandard_hpp
00017
00018 #include <set>
00019 #include <map>
00020 #include <OpenAnalysis/Utils/OA_ptr.hpp>
00021 #include <OpenAnalysis/IRInterface/IRHandles.hpp>
00022 #include <OpenAnalysis/SideEffect/InterSideEffectInterface.hpp>
00023 #include <OpenAnalysis/SideEffect/SideEffectStandard.hpp>
00024 #include <OpenAnalysis/OABase/Annotation.hpp>
00025 #include <OpenAnalysis/Utils/GenOutputTool.hpp>
00026
00027
00028 namespace OA {
00029 namespace SideEffect {
00030
00031
00032
00033
00034 class InterSideEffectStandard : public InterSideEffectInterface,
00035 public virtual Annotation
00036 {
00037 public:
00038 InterSideEffectStandard();
00039 ~InterSideEffectStandard() {}
00040
00041
00042
00043
00044
00047 OA_ptr<ProcIterator> getKnownProcIterator();
00048
00049
00050
00055 OA_ptr<LocIterator> getLMODIterator(CallHandle call);
00056
00060 OA_ptr<LocIterator> getMODIterator(CallHandle call);
00061
00066 OA_ptr<LocIterator> getLDEFIterator(CallHandle call);
00067
00071 OA_ptr<LocIterator> getDEFIterator(CallHandle call);
00072
00078 OA_ptr<LocIterator> getLUSEIterator(CallHandle call);
00079
00083 OA_ptr<LocIterator> getUSEIterator(CallHandle call);
00084
00089 OA_ptr<LocIterator> getLREFIterator(CallHandle call);
00090
00094 OA_ptr<LocIterator> getREFIterator(CallHandle call);
00095
00096
00097
00102 OA_ptr<LocIterator> getLMODIterator(ProcHandle p);
00103
00107 OA_ptr<LocIterator> getMODIterator(ProcHandle p);
00108
00113 OA_ptr<LocIterator> getLDEFIterator(ProcHandle p);
00114
00118 OA_ptr<LocIterator> getDEFIterator(ProcHandle p);
00119
00125 OA_ptr<LocIterator> getLUSEIterator(ProcHandle p);
00126
00130 OA_ptr<LocIterator> getUSEIterator(ProcHandle p);
00131
00136 OA_ptr<LocIterator> getLREFIterator(ProcHandle p);
00137
00141 OA_ptr<LocIterator> getREFIterator(ProcHandle p);
00142
00143
00144
00145
00146
00149 void mapProcToSideEffect(ProcHandle proc,
00150 OA_ptr<OA::SideEffect::SideEffectStandard> sideEffect);
00151
00153 OA_ptr<OA::SideEffect::SideEffectStandard>
00154 getSideEffectResults(ProcHandle proc);
00155
00158 void mapCallToSideEffect(CallHandle call,
00159 OA_ptr<OA::SideEffect::SideEffectStandard> sideEffect);
00160
00161
00163 int getLocCount(ProcHandle proc);
00164
00166 void insertLMOD(CallHandle call, OA_ptr<Location> loc);
00167
00169 void insertMOD(CallHandle call, OA_ptr<Location> loc);
00170
00172 void insertLDEF(CallHandle call, OA_ptr<Location> loc);
00173
00175 void insertDEF(CallHandle call, OA_ptr<Location> loc);
00176
00178 void insertLUSE(CallHandle call, OA_ptr<Location> loc);
00179
00181 void insertUSE(CallHandle call, OA_ptr<Location> loc);
00182
00184 void insertLREF(CallHandle call, OA_ptr<Location> loc);
00185
00187 void insertREF(CallHandle call, OA_ptr<Location> loc);
00188
00191 void initCallSideEffect(CallHandle call);
00192
00193
00194
00195
00196
00197 public:
00198
00200 void output(IRHandlesIRInterface& ir);
00201
00202 void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir);
00203
00204 private:
00205
00206 OUTPUT
00207
00208 GENOUT typedef std::map<ProcHandle,OA_ptr<OA::SideEffect::SideEffectStandard> >
00209 ProcToSideEffectMap;
00210 GENOUT typedef std::map<CallHandle,OA_ptr<OA::SideEffect::SideEffectStandard> >
00211 CallToSideEffectMap;
00212
00213
00214 GENOUT ProcToSideEffectMap mProcToSideEffectMap;
00215
00216
00217 GENOUT CallToSideEffectMap mCallToSideEffectMap;
00218
00219
00220 OA_ptr<OA::SideEffect::Interface> mDefaultSideEffect;
00221
00223 class InterSideEffectProcIter : public virtual ProcIterator,
00224 public IRHandleSetIterator<ProcHandle>
00225 {
00226 public:
00227 InterSideEffectProcIter(OA_ptr<std::set<ProcHandle> > pSet )
00228 : IRHandleSetIterator<ProcHandle>(pSet) {}
00229 ~InterSideEffectProcIter() { }
00230
00231 ProcHandle current() const
00232 { return IRHandleSetIterator<ProcHandle>::current(); }
00233 bool isValid() const
00234 { return IRHandleSetIterator<ProcHandle>::isValid(); }
00235 void operator++() { IRHandleSetIterator<ProcHandle>::operator++(); }
00236 void reset() { IRHandleSetIterator<ProcHandle>::reset(); }
00237 };
00238
00239
00240 };
00241
00242
00243 }
00244 }
00245
00246 #endif
00247