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     // Interface Implementation
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     // Construction methods
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     // Output
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     // mappings of procedures to various sets
00214     GENOUT ProcToSideEffectMap mProcToSideEffectMap;
00215 
00216     // mapping function calls to various sets
00217     GENOUT CallToSideEffectMap mCallToSideEffectMap;
00218 
00219     // default SideEffect results
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   } // end of SideEffect namespace
00244 } // end of OA namespace
00245 
00246 #endif
00247 

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