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