|
OpenADFortTk (basic)
|
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