Open64IRInterface.hpp

Go to the documentation of this file.
00001 // -*-Mode: C++;-*-
00015 #ifndef Open64IRInterface_H
00016 #define Open64IRInterface_H
00017 
00018 //************************** System Include Files ***************************
00019 
00020 #include <list>
00021 #include <map>
00022 #include <string>
00023 #include <algorithm>
00024 #include <cctype>
00025 #include <cassert>
00026 
00027 //************************ OpenAnalysis Include Files ***********************
00028 
00029 #include <OpenAnalysis/IRInterface/CallGraphIRInterface.hpp>
00030 #include <OpenAnalysis/IRInterface/CFGIRInterfaceDefault.hpp>
00031 #include <OpenAnalysis/IRInterface/AliasIRInterfaceDefault.hpp>
00032 #include <OpenAnalysis/IRInterface/ReachDefsIRInterface.hpp>
00033 #include <OpenAnalysis/IRInterface/UDDUChainsIRInterface.hpp>
00034 #include <OpenAnalysis/IRInterface/ConstValBasicInterface.hpp>
00035 #include <OpenAnalysis/IRInterface/ConstValIntInterface.hpp>
00036 #include <OpenAnalysis/IRInterface/ReachConstsIRInterface.hpp>
00037 #include <OpenAnalysis/IRInterface/XAIFIRInterface.hpp>
00038 #include <OpenAnalysis/IRInterface/SideEffectIRInterface.hpp>
00039 #include <OpenAnalysis/IRInterface/CallGraphDFProblemIRInterface.hpp>
00040 #include <OpenAnalysis/IRInterface/InterSideEffectIRInterfaceDefault.hpp>
00041 #include <OpenAnalysis/IRInterface/ActivityIRInterface.hpp>
00042 #include <OpenAnalysis/IRInterface/ParamBindingsIRInterface.hpp>
00043 #include <OpenAnalysis/IRInterface/ICFGIRInterface.hpp>
00044 #include <OpenAnalysis/IRInterface/LinearityIRInterface.hpp>
00045 
00046 
00048 #include <OpenAnalysis/IRInterface/DUGIRInterface.hpp>
00049 
00050 #include <OpenAnalysis/ExprTree/ExprTreeVisitor.hpp>
00051 #include <OpenAnalysis/ExprTree/EvalToMemRefVisitor.hpp>
00052 #include <OpenAnalysis/MemRefExpr/MemRefExpr.hpp>
00053 #include <OpenAnalysis/MemRefExpr/MemRefExprVisitor.hpp>
00054 
00055 // still needed for MemRefKludge
00056 //#include <OpenAnalysis/MemRefExpr/MemRefExprBasic.hpp>
00057 
00058 #include <OpenAnalysis/Utils/OA_ptr.hpp>
00059 #include "IntrinsicInfo.h"
00060 
00061 //************************** Open64 Include Files ***************************
00062 
00063 // IRInterface types: Use OA_IRHANDLETYPE_UL
00064 //   ProcHandle     - PU_Info*
00065 //   StmtHandle     - WN*
00066 //   ExprHandle     - WN*
00067 //   OpHandle       - WN*
00068 //   MemRefHandle   - WN*
00069 //   LeafHandle     - WN*
00070 //   StmtLabel      - INT32
00071 //   SymHandle      - ST*
00072 //   ConstSymHandle - ST*
00073 //   ConstValHandle - WN*
00074 
00075 #include "Open64BasicTypes.h"
00076 
00077 //*************************** User Include Files ****************************
00078 
00079 #include "WhirlGlobalStateUtils.h"
00080 #include "diagnostics.h"
00081 
00082 //typedef std::pair<char*,char*> fully_qualified_name;
00083 struct fully_qualified_name {
00084     std::string mVar;
00085     std::string mContext;
00086 
00087     fully_qualified_name() 
00088         : mVar("garbage", "garbage") {}
00089     fully_qualified_name(const char* var, const char *context) 
00090         : mVar(var), mContext(context) {}
00091 
00092     bool operator< (const  fully_qualified_name& other) const
00093     {
00094         if (mVar < other.mVar
00095             || (mVar == other.mVar && mContext < other.mContext) )
00096         { return true; }
00097         else {return false; }
00098     }
00099 
00100     bool operator== (const  fully_qualified_name& other) const
00101     {
00102         if (mVar == other.mVar && mContext == other.mContext) 
00103         { return true; }
00104         else {return false; }
00105     }
00106 
00107 };
00108 
00109 
00110 //***************************************************************************
00111 // Iterators, roughly organized by heirarchy (procedure, statement, etc.)
00112 //***************************************************************************
00113 
00115 class Open64IRProcIterator : public virtual OA::IRProcIterator {
00116 public:
00117   Open64IRProcIterator(PU_Info* pu_forest);
00118   virtual ~Open64IRProcIterator();
00119   
00120   virtual OA::ProcHandle current() const 
00121     { return (OA::irhandle_t)(*pulist_iter); }
00122   virtual bool isValid () const { return (pulist.end() != pulist_iter); }
00123   virtual void operator++();
00124   void operator++(int) { ++*this; }  // postfix
00125   
00126   virtual void reset();
00127 
00128 private:
00129   void prepare_current_pu();
00130 
00131   std::list<PU_Info*> pulist; // list of PUs (functions)
00132   std::list<PU_Info*>::iterator pulist_iter;
00133   void build_pu_list(PU_Info* pu);
00134 };
00135 
00136 
00138 class Open64IRRegionStmtIterator: public OA::IRRegionStmtIterator {
00139 public:
00140   Open64IRRegionStmtIterator(WN* wn) : start_wn(wn), curr_wn(NULL) { reset(); }
00141   virtual ~Open64IRRegionStmtIterator() { }
00142 
00143   virtual OA::StmtHandle current () const { return (OA::irhandle_t)curr_wn; }
00144   virtual bool isValid () const { return (curr_wn != 0); }
00145   virtual void operator++ () 
00146   { curr_wn = WN_next(curr_wn) ? WN_next(curr_wn) : 0; }
00147 
00148   virtual void reset() { curr_wn = start_wn; }
00149 
00150 private:
00151   WN* start_wn;
00152   WN*  curr_wn;
00153 };
00154 
00155 
00157 // This iterator DOES step into compound statements.
00158 // 
00159 // Note: control-flow statements are returned to represent any
00160 // condition *expression* that may be embedded within;
00161 // initialization/update statements will be part of the iteration as
00162 // will any statements that occur within blocks of the control-flow
00163 // statement.
00164 class Open64IRStmtIterator : public OA::IRStmtIterator {
00165 public:
00166   Open64IRStmtIterator(OA::ProcHandle h);
00167   Open64IRStmtIterator() { mValid = false; }
00168   virtual ~Open64IRStmtIterator();
00169 
00170   virtual OA::StmtHandle current() const ;
00171   virtual bool isValid() const { return (mValid && (mStmtIter != mEnd)); }
00172   virtual void operator++();
00173 
00174   virtual void reset();
00175 
00176 private:
00177   void create(OA::ProcHandle h);
00178 
00179 private:
00180   std::list<OA::StmtHandle> mStmtList;
00181 
00182   std::list<OA::StmtHandle>::iterator mEnd;
00183   std::list<OA::StmtHandle>::iterator mBegin;
00184   std::list<OA::StmtHandle>::iterator mStmtIter;
00185   bool mValid;
00186 };
00187 
00188 
00191 class Open64IRExprHandleIterator : public OA::ExprHandleIterator {
00192 public:
00193   Open64IRExprHandleIterator(OA::StmtHandle h);
00194   Open64IRExprHandleIterator() { mValid = false; }
00195   virtual ~Open64IRExprHandleIterator() { };
00196 
00197   virtual OA::ExprHandle current() const;
00198   virtual bool isValid() const
00199     { return (mValid && (mExprIter!=mEnd)); }
00200   virtual void operator++();
00201   virtual void reset();
00202 private:
00203   void create(OA::StmtHandle h);
00204 private:
00205   std::list<OA::ExprHandle> mExprList;
00206   std::list<OA::ExprHandle>::iterator mEnd;
00207   std::list<OA::ExprHandle>::iterator mBegin;
00208   std::list<OA::ExprHandle>::iterator mExprIter;
00209   bool mValid;
00210 
00211 };
00212 
00213 
00215 class Open64IRCallsiteIterator : public OA::IRCallsiteIterator {
00216 public:
00217   Open64IRCallsiteIterator(WN *wn);
00218   virtual ~Open64IRCallsiteIterator();
00219   
00220   virtual OA::CallHandle current() const  
00221     { return (OA::irhandle_t)(*wnlist_iter); }
00222   virtual bool isValid () const { return (wnlist.end() != wnlist_iter); }
00223   virtual void operator++() { ++wnlist_iter; }
00224 
00225   virtual void reset() { wnlist_iter = wnlist.begin(); }
00226   
00227 private:
00228   std::list<WN*> wnlist; // a list of function call nodes
00229   std::list<WN*>::iterator wnlist_iter;
00230   void build_func_call_list(WN* wn);
00231 };
00232 
00233 
00234 
00235 // Enumerate all (actual) parameters within a callsite
00236 // The iterator should contain the parameters in the same order in which
00237 // they appear within the call itself
00238 class Open64IRCallsiteParamIterator : public OA::IRCallsiteParamIterator {
00239 public:
00240   Open64IRCallsiteParamIterator(WN* wn);
00241   virtual ~Open64IRCallsiteParamIterator() { }
00242 
00243   virtual OA::ExprHandle current() const {   // Returns the current item.
00244     return (OA::irhandle_t)(*wnlist_iter); 
00245   }
00246 
00247   virtual bool isValid () const {        // False when all items are exhausted. 
00248     return (wnlist.end() != wnlist_iter); 
00249   }
00250 
00251   virtual void operator++() { ++wnlist_iter; }
00252   void operator++(int) { ++*this; } // what is this for??? -BK
00253 
00254   virtual void reset() {wnlist_iter = wnlist.begin(); }
00255 
00256 private:
00257   std::list<WN* > wnlist; // a list of function call nodes
00258   std::list<WN* >::iterator wnlist_iter;
00259 
00260 };
00261 
00264 class Open64IRMemRefIterator : public OA::MemRefHandleIterator {
00265 public:
00266   Open64IRMemRefIterator(OA::StmtHandle h);
00267   Open64IRMemRefIterator() { mValid = false; }
00268   virtual ~Open64IRMemRefIterator() { };
00269 
00270   virtual OA::MemRefHandle current() const; 
00271   virtual bool isValid() const 
00272     { return (mValid && (mMemRefIter!=mEnd)); }        
00273   virtual void operator++();
00274 
00275   virtual void reset();
00276 
00277 private:
00278   void create(OA::StmtHandle h);
00279 private:
00280   std::list<OA::MemRefHandle> mMemRefList;
00281   
00282   std::list<OA::MemRefHandle>::iterator mEnd;
00283   std::list<OA::MemRefHandle>::iterator mBegin;
00284   std::list<OA::MemRefHandle>::iterator mMemRefIter;
00285   bool mValid;
00286   
00287 };
00288 
00289 
00291 class Open64IRSymIterator : public OA::IRSymIterator {
00292 public:
00293   Open64IRSymIterator(PU_Info* pu);
00294   virtual ~Open64IRSymIterator() { }
00295   
00296   virtual OA::SymHandle current() const
00297     { return (OA::irhandle_t)(*symlist_iter); }
00298   virtual bool isValid () const { return (symlist.end() != symlist_iter); }
00299   virtual void operator++() { if (symlist_iter != symlist.end()) ++symlist_iter; }
00300   
00301   virtual void reset() { symlist_iter = symlist.begin(); }
00302 
00303 private:
00304   void create(PU_Info* pu);
00305   
00306 private:
00307   std::list<ST* > symlist; // a list of symbols
00308   std::list<ST* >::iterator symlist_iter;
00309 };
00310 
00311 /*
00313 class Open64PtrAssignPairStmtIterator 
00314     : public OA::Alias::PtrAssignPairStmtIterator 
00315 {
00316   public:
00317     Open64PtrAssignPairStmtIterator() {}
00318     ~Open64PtrAssignPairStmtIterator() {}
00319 
00321     OA::OA_ptr<OA::MemRefExpr> currentSource() const
00322       { OA::OA_ptr<OA::MemRefExpr> retval;  return retval; }
00324     OA::OA_ptr<OA::MemRefExpr> currentTarget() const
00325       { OA::OA_ptr<OA::MemRefExpr> retval;  return retval; }
00326 
00327     bool isValid() const  { return false; }
00328                     
00329     void operator++() {}
00330 };
00331 */
00332 
00333 
00334 class Open64PtrAssignPairStmtIterator
00335     : public OA::Alias::PtrAssignPairStmtIterator
00336 {
00337  public:
00338   Open64PtrAssignPairStmtIterator() : mValid(false) { }
00339   Open64PtrAssignPairStmtIterator(OA::StmtHandle stmt)
00340   { create(stmt); reset(); mValid = true; }
00341   virtual ~Open64PtrAssignPairStmtIterator() { };
00342 
00344   virtual OA::OA_ptr<OA::MemRefExpr> currentTarget() const { return (*mIter).first; }
00346   virtual OA::OA_ptr<OA::MemRefExpr> currentSource() const { return (*mIter).second; }
00347 
00348   virtual bool isValid() const {
00349     return ( mValid && ( mIter != mEnd ) );
00350   }
00351 
00352   virtual void operator++() { if (isValid()) mIter++; }
00353   virtual void reset();
00354 
00355  private:
00356   void create(OA::StmtHandle h);
00357 
00360   //void createPtrAssignPairsFromReturnStmt(SgReturnStmt *returnStmt);
00361 
00364   //SgExpression *createPtrAssignPairsFromAssignment(SgNode *assign);
00365 
00366   std::list<std::pair<OA::OA_ptr<OA::MemRefExpr>, OA::OA_ptr<OA::MemRefExpr> > > mMemRefList;
00367 
00368   std::list<std::pair<OA::OA_ptr<OA::MemRefExpr>, OA::OA_ptr<OA::MemRefExpr> > >::iterator mEnd;
00369   std::list<std::pair<OA::OA_ptr<OA::MemRefExpr>, OA::OA_ptr<OA::MemRefExpr> > >::iterator mBegin;
00370   std::list<std::pair<OA::OA_ptr<OA::MemRefExpr>, OA::OA_ptr<OA::MemRefExpr> > >::iterator mIter;
00371   bool mValid;
00372 };
00373 
00374 
00375 class Open64ParamBindPtrAssignIterator 
00376     : public OA::Alias::ParamBindPtrAssignIterator {
00377   public:
00378     Open64ParamBindPtrAssignIterator() { mIter = mPairList.begin(); }
00379     ~Open64ParamBindPtrAssignIterator() {}
00380 
00382     OA::OA_ptr<OA::MemRefExpr> currentActual() const
00383       { OA::OA_ptr<OA::MemRefExpr> retval;  
00384         if (isValid()) { retval = mIter->second; }
00385         return retval; 
00386       }
00388     int currentFormalId() const { 
00389         if (isValid()) { return mIter->first; }
00390         else { return -1; }
00391     }
00392 
00393     bool isValid() const { return (mIter!=mPairList.end()); }
00394 
00395     void operator++() { if (isValid()) { mIter++; } }
00396 
00397     void reset() { mIter = mPairList.begin(); }
00398 
00399     // construction methods
00400     void insertParamBindPair(int formalID ,OA::OA_ptr<OA::MemRefExpr> actual)
00401     {
00402         mPairList.push_back(
00403             std::pair<int,OA::OA_ptr<OA::MemRefExpr> >(formalID, actual) );
00404         reset();
00405     }
00406   private:
00407     std::list<std::pair<int,OA::OA_ptr<OA::MemRefExpr> > > mPairList;
00408     std::list<std::pair<int,OA::OA_ptr<OA::MemRefExpr> > >::iterator mIter;
00409 };
00410 
00411 
00412 
00413 typedef std::pair<OA::MemRefHandle,OA::ExprHandle> AssignPair;
00414 typedef std::list<AssignPair> AssignPairList;
00415 class Open64AssignPairIterator 
00416     : public OA::AssignPairIterator {
00417   public:
00418     Open64AssignPairIterator(OA::OA_ptr<AssignPairList> pAssignList) 
00419         : mAssignList(pAssignList) { reset(); }
00420     virtual ~Open64AssignPairIterator() {}
00421 
00423     OA::MemRefHandle currentTarget() const 
00424       { if (isValid()) { return mIter->first; } 
00425         else { return OA::MemRefHandle(0); } }
00427     OA::ExprHandle currentSource() const 
00428       { if (isValid()) { return mIter->second; } 
00429         else { return OA::ExprHandle(0); } }
00430 
00431     bool isValid() const { return mIter!=mAssignList->end(); }
00432                     
00433     void operator++() { if (isValid()) mIter++; }
00434     void operator++(int) { ++*this; }
00435 
00436     void reset() { mIter = mAssignList->begin(); }
00437   private:
00438     OA::OA_ptr<AssignPairList> mAssignList;
00439     AssignPairList::iterator mIter;
00440 };
00441 
00442 class Open64MemRefHandleIterator 
00443     : public OA::IRHandleListIterator<OA::MemRefHandle>,
00444       public virtual OA::MemRefHandleIterator
00445 {
00446   public:
00447     Open64MemRefHandleIterator (OA::OA_ptr<std::list<OA::MemRefHandle> > pList) 
00448         : OA::IRHandleListIterator<OA::MemRefHandle>(pList) {} 
00449     ~Open64MemRefHandleIterator () {}
00450 
00451     void operator ++ () 
00452         { OA::IRHandleListIterator<OA::MemRefHandle>::operator++(); }
00453                         
00455     bool isValid()  const
00456         { return OA::IRHandleListIterator<OA::MemRefHandle>::isValid(); }
00457                 
00459     OA::MemRefHandle current()  const
00460         { return OA::IRHandleListIterator<OA::MemRefHandle>::current(); }
00461 
00462     void reset()
00463         { return OA::IRHandleListIterator<OA::MemRefHandle>::reset(); }
00464 };
00465 
00466 class Open64MemRefExprIterator : public OA::MemRefExprIterator {
00467   public:
00468     Open64MemRefExprIterator(OA::OA_ptr<std::list<OA::OA_ptr<OA::MemRefExpr> > > pList)
00469         : mList(pList) { mIter = mList->begin(); }
00470     ~Open64MemRefExprIterator() {}
00471 
00472     OA::OA_ptr<OA::MemRefExpr> current() const 
00473       { return *mIter; } 
00474 
00475     bool isValid() const { return mIter!=mList->end(); }
00476                     
00477     void operator++() { if (isValid()) mIter++; }
00478     void operator++(int) { ++*this; }
00479     void reset() { mIter = mList->begin(); }
00480   private:
00481     OA::OA_ptr<std::list<OA::OA_ptr<OA::MemRefExpr> > > mList;
00482     std::list<OA::OA_ptr<OA::MemRefExpr> >::iterator mIter;
00483 };
00484 
00485 
00486 //***************************************************************************
00487 // 
00488 //***************************************************************************
00489 
00490 class Open64ConstVal : public virtual OA::ConstValBasicInterface {
00491   public:
00492     Open64ConstVal() {}
00493     virtual ~Open64ConstVal() {}
00494      
00495     // Methods needed by OA, default behavior
00496     virtual bool operator==(OA::ConstValBasicInterface& x) { return false; }
00497     //virtual bool operator!=(OA::ConstValBasicInterface& x) { return false; }
00498     virtual bool operator!=(OA::ConstValBasicInterface& x) { return true; }
00499     virtual std::string toString() { return ""; }
00500 
00501     // Methods used by source IR, default behavior
00502     virtual bool isaInteger() const { return false; }
00503     virtual int getIntegerVal() const { return 0; } // FIXME: THROW EXCEPTION?
00504     virtual bool isaDouble() const { return false; } 
00505     virtual double getDoubleVal() const { return 0.0; } // FIXME: EXCEPTION?
00506     virtual bool isaChar() const { return false; }
00507     virtual char getCharVal() const { return '0'; } // FIXME: THROW EXCEPTION?
00508     // bool isaComplex() { return false; }
00509     // ...
00510 
00511     // eval: Given an operator and two operands (one being the current
00512     // object), return a new object representing the result.
00513     virtual OA::OA_ptr<ConstValBasicInterface> 
00514     eval(OPERATOR opr, const OA::OA_ptr<OA::ConstValBasicInterface> op2) const;
00515 };  
00516 
00517 class Open64IntegerConstVal 
00518   : public Open64ConstVal, 
00519     public virtual OA::ConstValIntInterface {
00520   public:
00521     Open64IntegerConstVal() {}
00522     Open64IntegerConstVal(int aVal) : Open64ConstVal(), mVal(aVal) {}
00523     ~Open64IntegerConstVal() {}
00524 
00525     // Methods used by OpenAnalysis
00526     bool operator<(OA::ConstValBasicInterface& other)
00527         { Open64ConstVal& otherRecast = dynamic_cast<Open64ConstVal&>(other);
00528           if (otherRecast.isaInteger()) {
00529               return (otherRecast.getIntegerVal() < mVal);
00530           }
00531           return false;
00532     }
00533     
00534     // Methods used by OpenAnalysis
00535     bool operator==(OA::ConstValBasicInterface& other) 
00536         { Open64ConstVal& otherRecast = dynamic_cast<Open64ConstVal&>(other);
00537           if (otherRecast.isaInteger()) {
00538               return (otherRecast.getIntegerVal() == mVal); 
00539           }
00540           return false;
00541         }
00542     bool operator!=(OA::ConstValBasicInterface& other)
00543         { Open64ConstVal& otherRecast = dynamic_cast<Open64ConstVal&>(other);
00544           if (otherRecast.isaInteger()) {
00545               return (otherRecast.getIntegerVal() != mVal); 
00546           }
00547           return true;
00548         }
00549 
00550     std::string toString() 
00551         { std::ostringstream oss; oss << mVal; return oss.str(); }
00552 
00553   
00554     // Methods used by source IR specific to this data type
00555     bool isaInteger() const { return true; }
00556     int getIntegerVal() const { return mVal; }
00557 
00558     // eval: Given an operator and two operands (one being the current
00559     // object), return a new object representing the result.
00560     virtual OA::OA_ptr<ConstValBasicInterface> 
00561     eval(OPERATOR opr, const OA::OA_ptr<OA::ConstValBasicInterface> op2) const;
00562   
00563     
00564   private:
00565     int mVal;
00566 }; 
00567 
00568 
00569 //***************************************************************************
00570 // Abstract Interfaces
00571 //***************************************************************************
00572 
00573 class Open64IRInterface 
00574   : public virtual OA::IRHandlesIRInterface,
00575     public virtual OA::CallGraph::CallGraphIRInterface,
00576     public OA::CFG::CFGIRInterfaceDefault,
00577     public OA::Alias::AliasIRInterfaceDefault,
00578     public virtual OA::ReachDefs::ReachDefsIRInterface,
00579     public virtual OA::UDDUChains::UDDUChainsIRInterface,
00580     public virtual OA::ReachConsts::ReachConstsIRInterface,
00581     public virtual OA::XAIF::XAIFIRInterface,
00582     public virtual OA::SideEffect::SideEffectIRInterface,
00583     //public virtual OA::DataFlow::CallGraphDFProblemIRInterface,
00584     public OA::SideEffect::InterSideEffectIRInterfaceDefault,
00585     public virtual OA::DataFlow::ParamBindingsIRInterface,
00586     public virtual OA::ICFG::ICFGIRInterface,
00587     public virtual OA::Activity::ActivityIRInterface,
00588     public virtual OA::Linearity::LinearityIRInterface,
00589     public virtual OA::DUG::DUGIRInterface
00590 {
00591 public:
00592   Open64IRInterface();
00593   virtual ~Open64IRInterface();
00594 
00595   
00596   //-------------------------------------------------------------------------
00597   // IRHandlesIRInterface
00598   //-------------------------------------------------------------------------
00599 
00600   // create a string for the given handle, should be succinct
00601   // and there should be no newlines
00602   std::string toString(const OA::ProcHandle h);
00603   std::string toString(const OA::StmtHandle h);
00604   std::string toString(const OA::ExprHandle h);
00605   std::string toString(const OA::OpHandle h);
00606   std::string toString(const OA::MemRefHandle h);
00607   std::string toString(const OA::SymHandle h);
00608   std::string toString(const OA::ConstSymHandle h);
00609   std::string toString(const OA::ConstValHandle h);
00610   std::string toString(const OA::CallHandle h);
00611 
00612   // Given a statement, pretty-print it to the output stream os.
00613   void dump(OA::StmtHandle stmt, std::ostream& os);
00614   
00615   // Given a memory reference, pretty-print it to the output stream os.
00616   void dump(OA::MemRefHandle h, std::ostream& os);
00617 
00618   //-------------------------------------------------------------------------
00619   // CallGraphIRInterface
00620   //-------------------------------------------------------------------------
00621 
00624   OA::OA_ptr<OA::IRStmtIterator> getStmtIterator(OA::ProcHandle h);
00625 
00627   OA::OA_ptr<OA::IRCallsiteIterator> getCallsites(OA::StmtHandle h);
00628   
00629   OA::SymHandle getProcSymHandle(OA::ProcHandle h);
00630   
00631   /*
00632   OA::SymHandle getSymHandle(OA::ExprHandle h) {
00633     WN* wn = (WN*)h.hval(); 
00634     ST* st = NULL;
00635     if (wn) {
00636       st = ((OPERATOR_has_sym(WN_operator(wn))) ? WN_st(wn) : NULL);
00637     }
00638     return (OA::irhandle_t)st;
00639   }
00640   */
00641 
00642  
00643 
00644 
00645   //-------------------------------------------------------------------------
00646   // CallGraphDFProblemIRInterface
00647   //-------------------------------------------------------------------------
00648   // !Get IRCallsiteParamIterator for a callsite.
00649   // !Don't assume parameters are visited in any particular order
00650   OA::OA_ptr<OA::IRCallsiteParamIterator> getCallsiteParams(OA::CallHandle h);
00651 
00652   //-------------------------------------------------------------------------
00653   // CFGIRInterface
00654   //-------------------------------------------------------------------------
00655   
00658   OA::OA_ptr<OA::IRRegionStmtIterator> procBody(OA::ProcHandle h);
00659 
00660   // Statements: General
00661   //--------------------------------------------------------
00662 
00664   bool returnStatementsAllowed() { return true; }
00665 
00667   OA::CFG::IRStmtType getCFGStmtType(OA::StmtHandle h);
00668 
00669   OA::StmtLabel getLabel(OA::StmtHandle h);
00670 
00671   OA::OA_ptr<OA::IRRegionStmtIterator> getFirstInCompound(OA::StmtHandle h);
00672 
00673   // Loops
00674   //--------------------------------------------------------
00675   OA::OA_ptr<OA::IRRegionStmtIterator> loopBody(OA::StmtHandle h);
00676   OA::StmtHandle loopHeader(OA::StmtHandle h);
00677   OA::StmtHandle getLoopIncrement(OA::StmtHandle h);
00678   bool loopIterationsDefinedAtEntry(OA::StmtHandle h);
00679   OA::ExprHandle getLoopCondition(OA::StmtHandle h); //resurrected, used in
00680                                                      // MPICFGIRInterface
00681 
00682   // Structured two-way conditionals
00683   //--------------------------------------------------------
00684   OA::OA_ptr<OA::IRRegionStmtIterator> trueBody (OA::StmtHandle h);
00685   OA::OA_ptr<OA::IRRegionStmtIterator> elseBody (OA::StmtHandle h);
00686   OA::ExprHandle getCondition(OA::StmtHandle h); // resurrected, used in
00687                                                  // MPICFGIRInterface
00688   
00689   // Structured multiway conditionals
00690   //--------------------------------------------------------
00691   int numMultiCases(OA::StmtHandle h);
00692   OA::OA_ptr<OA::IRRegionStmtIterator> multiBody(OA::StmtHandle h, int bodyIndex);
00693   bool isBreakImplied(OA::StmtHandle multicond);
00694   bool isCatchAll(OA::StmtHandle h, int bodyIndex);
00695   OA::OA_ptr<OA::IRRegionStmtIterator> getMultiCatchall(OA::StmtHandle h);
00696   OA::ExprHandle getSMultiCondition (OA::StmtHandle h, int bodyIndex);
00697   OA::ExprHandle getSMultiTest(OA::StmtHandle h);  // used in MPICFGIRInterface
00698 
00699   // Unstructured two-way conditionals
00700   //--------------------------------------------------------
00701   OA::StmtLabel getTargetLabel(OA::StmtHandle h, int n);
00702   
00703   // Unstructured multi-way conditionals
00704   //--------------------------------------------------------
00705   int numUMultiTargets(OA::StmtHandle h);
00706   OA::StmtLabel getUMultiTargetLabel(OA::StmtHandle h, int targetIndex);
00707   OA::StmtLabel getUMultiCatchallLabel(OA::StmtHandle h);
00708   OA::ExprHandle getUMultiCondition(OA::StmtHandle h, int targetIndex);
00709   OA::ExprHandle getUMultiTest(OA::StmtHandle h);  // used in MPICFGInterface
00710 
00711   //-------------------------------------------------------------------------
00712   // AliasIRInterface
00713   //-------------------------------------------------------------------------
00714 
00715   class FindUseMREVisitor : public OA::MemRefExprVisitor {
00716       public:
00717 
00718          FindUseMREVisitor();
00719          ~FindUseMREVisitor();
00720          OA::OA_ptr<std::list<OA::OA_ptr<OA::MemRefExpr> > > getAllUseMREs();
00721          void visitNamedRef(OA::NamedRef& ref);
00722          void visitUnnamedRef(OA::UnnamedRef& ref);
00723          void visitUnknownRef(OA::UnknownRef& ref);
00724          void visitDeref(OA::Deref& ref);
00725          void visitAddressOf(OA::AddressOf& ref);
00726          void visitSubSetRef(OA::SubSetRef& ref);
00727 
00728       private:
00729          bool do_not_add_mre;
00730          OA::OA_ptr<std::list<OA::OA_ptr<OA::MemRefExpr> > > retList;
00731   };
00732 
00734   OA::OA_ptr<OA::MemRefExprIterator> getUseMREs(OA::StmtHandle stmt);
00735 
00737   OA::OA_ptr<OA::MemRefExprIterator> getDefMREs(OA::StmtHandle stmt);
00738 
00740   OA::OA_ptr<OA::MemRefExprIterator> getDiffUseMREs(OA::StmtHandle stmt);
00741 
00744   OA::OA_ptr<OA::MemRefExprIterator> 
00745     getMemRefExprIterator(OA::MemRefHandle h);
00746  
00748   OA::SymHandle getSymHandle(OA::ProcHandle h) { return getProcSymHandle(h); }
00749 
00750   /*
00754   OA::OA_ptr<OA::Alias::PtrAssignPairStmtIterator> 
00755       getPtrAssignStmtPairIterator(OA::StmtHandle stmt)
00756     {   OA::OA_ptr<OA::Alias::PtrAssignPairStmtIterator> retval;
00757         retval = new Open64PtrAssignPairStmtIterator;
00758         return retval;
00759     }
00760   */ 
00761 
00762 
00765   OA::OA_ptr<OA::Alias::PtrAssignPairStmtIterator>
00766   getPtrAssignStmtPairIterator(OA::StmtHandle stmt);
00767 
00768   
00772   OA::OA_ptr<OA::Alias::ParamBindPtrAssignIterator>
00773       getParamBindPtrAssignIterator(OA::CallHandle call);
00774 
00781   OA::SymHandle getFormalSym(OA::ProcHandle,int);
00782 
00786   OA::OA_ptr<OA::MemRefExpr> getCallMemRefExpr(OA::CallHandle h);
00787 
00788 
00792   OA::OA_ptr<OA::Location> getLocation(OA::ProcHandle p, OA::SymHandle s);
00793 
00794   //-------------------------------------------------------------------------
00795   // ActivityIRInterface
00796   //-------------------------------------------------------------------------
00797   
00798   // Return an iterator over all independent locations for given proc
00799   //OA::OA_ptr<OA::LocIterator> getIndepLocIter(OA::ProcHandle h);
00801   OA::OA_ptr<OA::MemRefExprIterator> getIndepMemRefExprIter(OA::ProcHandle h);
00802   
00803   // Return an iterator over all dependent locations for given proc
00804   //OA::OA_ptr<OA::LocIterator> getDepLocIter(OA::ProcHandle h);
00806   OA::OA_ptr<OA::MemRefExprIterator> getDepMemRefExprIter(OA::ProcHandle h);
00807  
00809   int getSizeInBytes(OA::SymHandle h);
00810 
00811   //-------------------------------------------------------------------------
00812   // ReachDefsIRInterface
00813   //-------------------------------------------------------------------------
00814 
00817   //OA::OA_ptr<OA::IRSymIterator> getVisibleSymIterator(OA::ProcHandle h);
00818 
00821   OA::OA_ptr<OA::IRSymIterator> getRefSymIterator(OA::ProcHandle h);
00822 
00823   // getStmtIterator(ProcHandle h)
00824 
00827   OA::OA_ptr<OA::MemRefHandleIterator> getAllMemRefs(OA::StmtHandle stmt);
00828 
00831   OA::OA_ptr<OA::MemRefHandleIterator> getDefMemRefs(OA::StmtHandle stmt);
00832 
00833   //-------------------------------------------------------------------------
00834   // UDDUChainsIRInterface
00835   //-------------------------------------------------------------------------
00836 
00839   OA::OA_ptr<OA::MemRefHandleIterator> getUseMemRefs(OA::StmtHandle stmt);
00840 
00841   //-------------------------------------------------------------------------
00842   // ReachConstsIRInterface
00843   //-------------------------------------------------------------------------
00844 
00848   OA::OA_ptr<OA::AssignPairIterator> 
00849       getAssignPairIterator(OA::StmtHandle h); 
00850  
00851   // Iterator over Expressions in the given Statement
00852   OA::OA_ptr<OA::ExprHandleIterator>
00853       getExprHandleIterator(OA::StmtHandle stmt);
00854       
00858   OA::OA_ptr<OA::ConstValBasicInterface> evalOp(OA::OpHandle op, 
00859       OA::OA_ptr<OA::ConstValBasicInterface> operand1, 
00860       OA::OA_ptr<OA::ConstValBasicInterface> operand2);
00861   
00864   OA::OA_ptr<OA::ConstValBasicInterface> getConstValBasic(OA::ConstSymHandle c);
00865   
00869   OA::OA_ptr<OA::ConstValBasicInterface> getConstValBasic(OA::ConstValHandle c);
00870   
00872   OA::StmtHandle getStmtFromMemRef(OA::MemRefHandle h);
00873 
00875   std::string toString(OA::OA_ptr<OA::ConstValBasicInterface> cvPtr);
00876 
00878   // Given an unsigned int, return a ConstValBAsicInterface for it
00879   OA::OA_ptr<OA::ConstValBasicInterface> getConstValBasic (unsigned int val);
00880 
00883   int returnOpEnumValInt(OA::OpHandle op);
00884 
00885   //---------------------------------------------------------------------------
00886   // LinearityIRInterface.hpp
00887   //---------------------------------------------------------------------------
00888 
00890   OA::Linearity::LinOpType getLinearityOpType(OA::OpHandle op);
00891 
00892   //-------------------------------------------------------------------------
00893   // InterSideEffectIRInterface
00894   //-------------------------------------------------------------------------
00895 
00896   OA::OA_ptr<OA::SideEffect::SideEffectStandard> 
00897       getSideEffect(OA::ProcHandle callerProc, OA::SymHandle calleeSym);
00898 
00899   //-------------------------------------------------------------------------
00900   // ParamBindingsIRInterface
00901   //-------------------------------------------------------------------------
00902 
00904   OA::OA_ptr<OA::ExprTree> getExprTree(OA::ExprHandle h);
00905   
00907   bool isParam(OA::SymHandle);
00908   
00909   //-------------------------------------------------------------------------
00910   // ICFGIRInterface
00911   //-------------------------------------------------------------------------
00913   OA::ProcHandle getProcHandle(OA::SymHandle sym);
00914   
00915   //-------------------------------------------------------------------------
00916   // XAIFIRInterface
00917   //-------------------------------------------------------------------------
00918 
00919   //-------------------------------------------------------------------------
00920 
00921   // for Activity lookup
00922   OA::OA_ptr<OA::MemRefExpr>
00923    convertSymToMemRefExpr(OA::SymHandle sym);
00924 
00925   //***************************************************************************
00926   // Helpers
00927   //***************************************************************************
00928   static void DumpWN(WN* wn, ostream& os);
00929 
00930 private:
00931   
00932   // assumption is that StmtHandles and MemRefHandles are unique across
00933   // different program and procedure contexts for which analysis is being
00934   // currently performed
00935   static std::map<OA::StmtHandle,std::set<OA::MemRefHandle> > 
00936       sStmt2allMemRefsMap;
00937 
00938   static std::map<OA::StmtHandle,std::set<OA::ExprHandle> >
00939       mStmt2allExprsMap;
00940 
00941   static std::map<OA::MemRefHandle,OA::StmtHandle> sMemRef2StmtMap;
00942 
00943   static std::map<OA::MemRefHandle,set<OA::OA_ptr<OA::MemRefExpr> > > 
00944       sMemref2mreSetMap;
00945 
00946   // mapping of call symbols to procedure handles
00947   static std::map<OA::SymHandle,OA::ProcHandle> sCallSymToProc;
00948 
00949   // mapping of fully qualified global variable names to a set of SymHandles
00950   // that all have that fully qualified name
00951   // the first symbol in the set will be used to represent all the others
00952   static std::map<fully_qualified_name,std::set<OA::SymHandle> > sGlobalVarMap;
00953   // the fully qualified name and procedure mapped to the localy symbol
00954   // for the particular procedure
00955   static std::map<fully_qualified_name,std::map<OA::ProcHandle,OA::SymHandle> >
00956       sFQNToProcToLocalSymMap;
00957   // mapping of each symbol handle to its fully qualified name
00958   static std::map<OA::SymHandle,fully_qualified_name> sSymToFQNMap;
00959 
00960   // mapping of symbol handles to strings used in getSideEffect
00961   static std::map<OA::SymHandle,std::string> sSymToVarStringMap;
00962 
00963   // mapping of actual params (PR_PARMs WNs) to CallHandles
00964   static std::map<OA::ExprHandle,OA::CallHandle> sParamToCallMap;
00965 
00966   // mapping of proc handles to a set of referenced symbols
00967   static std::map<OA::ProcHandle,std::set<OA::SymHandle> > 
00968      sProcToSymRefSetMap;
00969 
00970 public:  
00974   OA::OA_ptr<OA::MemRefHandleIterator> getMemRefIterator(OA::StmtHandle h); 
00975 
00976 private:
00977   // helper functions for getMemRefIterator
00978   void findAllMemRefsAndMapToMemRefExprs(OA::StmtHandle stmt,
00979     WN* wn, unsigned lvl);
00980 
00981   /*
00982   void createAndMapDerefs(OA::StmtHandle stmt, WN* wn, WN* subMemRef, 
00983                           bool isAddrOf, bool fullAccuracy, 
00984                           OA::MemRefExpr::MemRefType hty);
00985   void createAndMapNamedRef(OA::StmtHandle stmt, WN* wn, ST*, bool isAddrOf,
00986     bool fullAccuracy, OA::MemRefExpr::MemRefType hty);
00987     */
00988 
00989   void createAndMapNamedRef(OA::StmtHandle stmt, WN* wn,
00990                             ST* st, OA::MemRefExpr::MemRefType hty);
00991 
00992   void createAndMapDerefs(OA::StmtHandle stmt, WN* wn, WN* subMemRef);
00993 
00994   bool isPassByReference(WN*);
00995   ST* findBaseSymbol(WN*);
00996 
00997   void currentProc(OA::ProcHandle p) {
00998     assert(p!=OA::ProcHandle(0));
00999     PU_Info* pu = (PU_Info*)p.hval();
01000     PU_SetGlobalState(pu);
01001   }
01002 
01004   static const char* createCharStarForST(ST*);
01005 
01006   static void DumpWNMemRef(WN* wn, ostream& os);
01007 
01008   static void DumpWNLeaf(WN* wn, ostream & os);
01009 
01010   static void DumpWNMemRefLeaf(WN* wn, ostream& os);
01011 
01012   OA::MemRefHandle findTopMemRefHandle(WN *wn);
01013 
01014   bool ExprTree_hack_for_MPI(OA::MemRefHandle h, OA::OA_ptr<OA::ExprTree> tree);
01015 
01016   OA::OA_ptr<OA::ExprTree> createExprTree(WN* wn);
01017 
01018   OA::OA_ptr<OA::ExprTree::Node> 
01019   createExprTree(OA::OA_ptr<OA::ExprTree> tree, WN* wn);
01020 
01021 //  OA::OA_ptr<OA::AssignPairIterator> findAssignPairs(WN* wn);
01022 
01023   OA::OA_ptr<OA::ConstValBasicInterface> getConstValBasicFromST(ST* st);
01024 
01025   // maintaining the context of all handles in terms of Program and Procedure
01026   // For now just allowing one program context
01027   static std::map<OA::IRHandle,OA::ProcHandle> sProcContext;
01028   static PU_Info* sProgContext;
01029   //static PU_Info* sCurrentProc; // current proc context in Open64 datastructures
01030   static bool sContextInit;
01031   static void initProcContext(PU_Info* pu_forest, 
01032                               Open64IRProcIterator &procIter);
01033   static void setCurrentProcToProcContext(OA::IRHandle h);
01034   static OA::ProcHandle getCurrentProcContext();
01035   static void setCurrentProcContext(OA::ProcHandle);
01036 
01037   static fully_qualified_name create_fqn(OA::SymHandle sym);
01038 
01039   // mapping of calls to procs
01040   static void initCallSymToProcMap(Open64IRProcIterator &procIter);
01041 
01042   // getting set of symbols that are referenced within a particul procedure
01043   static void initProcToSymRefSetMap(Open64IRProcIterator &procIter);
01044 
01045   // context information is initialized and used within some of the iterators
01046   // so they need to be friends
01047   friend class Open64IRProcIterator;
01048   friend class Open64IRMemRefIterator;
01049   friend class Open64IRExprHandleIterator;
01050   friend class InitContextVisitor;
01051 
01052 private:
01053 
01054   // if this is true we do not supply  
01055   // call handles or statement handles 
01056   // for any calls to black box routines
01057   static bool ourIgnoreBlackBoxRoutines; 
01058  
01059 public:
01060 
01061   static void setIgnoreBlackBoxRoutines(); 
01062 
01063   static bool ignoreBlackBoxRoutines(); 
01064 
01065   // true if the passed in WN 
01066   // is a call node for which we 
01067   // have a definition in sCallSymToProc
01068   static bool haveDefinition(WN* wn);
01069 
01073   // BK: I need this to stay public for use in ManagerMPI_ICFG
01074   OA::SymHandle getFormalForActual(OA::ProcHandle caller, OA::CallHandle call, 
01075                                    OA::ProcHandle callee, OA::ExprHandle param);
01078   // BK: I need this to stay public for use in ManagerMPI_ICFG
01079   OA::SymHandle getSymHandle(OA::CallHandle h);
01080 
01082   // JU: I need this to stay public because I use it in FortTk
01083   bool isRefParam(OA::SymHandle);
01084                
01086   // the Open64IRProcIterator
01087   static void initContextState(PU_Info* pu_forest);
01088 
01091   static void setContext(OA::IRHandle h, OA::ProcHandle proc) {
01092       sProcContext[h] = proc;
01093   }
01094 
01095 };  
01096 
01097 
01098 
01099 #endif
01100 

Generated on Fri Jul 24 04:29:05 2009 for OpenADFortTk (extended to Open64) by  doxygen 1.5.7.1