00001
00015 #ifndef Open64IRInterface_H
00016 #define Open64IRInterface_H
00017
00018
00019
00020 #include <list>
00021 #include <map>
00022 #include <string>
00023 #include <algorithm>
00024 #include <cctype>
00025 #include <cassert>
00026
00027
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
00056
00057
00058 #include <OpenAnalysis/Utils/OA_ptr.hpp>
00059 #include "IntrinsicInfo.h"
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075 #include "Open64BasicTypes.h"
00076
00077
00078
00079 #include "WhirlGlobalStateUtils.h"
00080 #include "diagnostics.h"
00081
00082
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
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; }
00125
00126 virtual void reset();
00127
00128 private:
00129 void prepare_current_pu();
00130
00131 std::list<PU_Info*> pulist;
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
00158
00159
00160
00161
00162
00163
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;
00229 std::list<WN*>::iterator wnlist_iter;
00230 void build_func_call_list(WN* wn);
00231 };
00232
00233
00234
00235
00236
00237
00238 class Open64IRCallsiteParamIterator : public OA::IRCallsiteParamIterator {
00239 public:
00240 Open64IRCallsiteParamIterator(WN* wn);
00241 virtual ~Open64IRCallsiteParamIterator() { }
00242
00243 virtual OA::ExprHandle current() const {
00244 return (OA::irhandle_t)(*wnlist_iter);
00245 }
00246
00247 virtual bool isValid () const {
00248 return (wnlist.end() != wnlist_iter);
00249 }
00250
00251 virtual void operator++() { ++wnlist_iter; }
00252 void operator++(int) { ++*this; }
00253
00254 virtual void reset() {wnlist_iter = wnlist.begin(); }
00255
00256 private:
00257 std::list<WN* > wnlist;
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;
00308 std::list<ST* >::iterator symlist_iter;
00309 };
00310
00311
00313
00314
00315
00316
00317
00318
00319
00321
00322
00324
00325
00326
00327
00328
00329
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
00361
00364
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
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
00496 virtual bool operator==(OA::ConstValBasicInterface& x) { return false; }
00497
00498 virtual bool operator!=(OA::ConstValBasicInterface& x) { return true; }
00499 virtual std::string toString() { return ""; }
00500
00501
00502 virtual bool isaInteger() const { return false; }
00503 virtual int getIntegerVal() const { return 0; }
00504 virtual bool isaDouble() const { return false; }
00505 virtual double getDoubleVal() const { return 0.0; }
00506 virtual bool isaChar() const { return false; }
00507 virtual char getCharVal() const { return '0'; }
00508
00509
00510
00511
00512
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
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
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
00555 bool isaInteger() const { return true; }
00556 int getIntegerVal() const { return mVal; }
00557
00558
00559
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
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
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
00598
00599
00600
00601
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
00613 void dump(OA::StmtHandle stmt, std::ostream& os);
00614
00615
00616 void dump(OA::MemRefHandle h, std::ostream& os);
00617
00618
00619
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
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649
00650 OA::OA_ptr<OA::IRCallsiteParamIterator> getCallsiteParams(OA::CallHandle h);
00651
00652
00653
00654
00655
00658 OA::OA_ptr<OA::IRRegionStmtIterator> procBody(OA::ProcHandle h);
00659
00660
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
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);
00680
00681
00682
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);
00687
00688
00689
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);
00698
00699
00700
00701 OA::StmtLabel getTargetLabel(OA::StmtHandle h, int n);
00702
00703
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);
00710
00711
00712
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
00755
00756
00757
00758
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
00796
00797
00798
00799
00801 OA::OA_ptr<OA::MemRefExprIterator> getIndepMemRefExprIter(OA::ProcHandle h);
00802
00803
00804
00806 OA::OA_ptr<OA::MemRefExprIterator> getDepMemRefExprIter(OA::ProcHandle h);
00807
00809 int getSizeInBytes(OA::SymHandle h);
00810
00811
00812
00813
00814
00817
00818
00821 OA::OA_ptr<OA::IRSymIterator> getRefSymIterator(OA::ProcHandle h);
00822
00823
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
00835
00836
00839 OA::OA_ptr<OA::MemRefHandleIterator> getUseMemRefs(OA::StmtHandle stmt);
00840
00841
00842
00843
00844
00848 OA::OA_ptr<OA::AssignPairIterator>
00849 getAssignPairIterator(OA::StmtHandle h);
00850
00851
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
00879 OA::OA_ptr<OA::ConstValBasicInterface> getConstValBasic (unsigned int val);
00880
00883 int returnOpEnumValInt(OA::OpHandle op);
00884
00885
00886
00887
00888
00890 OA::Linearity::LinOpType getLinearityOpType(OA::OpHandle op);
00891
00892
00893
00894
00895
00896 OA::OA_ptr<OA::SideEffect::SideEffectStandard>
00897 getSideEffect(OA::ProcHandle callerProc, OA::SymHandle calleeSym);
00898
00899
00900
00901
00902
00904 OA::OA_ptr<OA::ExprTree> getExprTree(OA::ExprHandle h);
00905
00907 bool isParam(OA::SymHandle);
00908
00909
00910
00911
00913 OA::ProcHandle getProcHandle(OA::SymHandle sym);
00914
00915
00916
00917
00918
00919
00920
00921
00922 OA::OA_ptr<OA::MemRefExpr>
00923 convertSymToMemRefExpr(OA::SymHandle sym);
00924
00925
00926
00927
00928 static void DumpWN(WN* wn, ostream& os);
00929
00930 private:
00931
00932
00933
00934
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
00947 static std::map<OA::SymHandle,OA::ProcHandle> sCallSymToProc;
00948
00949
00950
00951
00952 static std::map<fully_qualified_name,std::set<OA::SymHandle> > sGlobalVarMap;
00953
00954
00955 static std::map<fully_qualified_name,std::map<OA::ProcHandle,OA::SymHandle> >
00956 sFQNToProcToLocalSymMap;
00957
00958 static std::map<OA::SymHandle,fully_qualified_name> sSymToFQNMap;
00959
00960
00961 static std::map<OA::SymHandle,std::string> sSymToVarStringMap;
00962
00963
00964 static std::map<OA::ExprHandle,OA::CallHandle> sParamToCallMap;
00965
00966
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
00978 void findAllMemRefsAndMapToMemRefExprs(OA::StmtHandle stmt,
00979 WN* wn, unsigned lvl);
00980
00981
00982
00983
00984
00985
00986
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
01022
01023 OA::OA_ptr<OA::ConstValBasicInterface> getConstValBasicFromST(ST* st);
01024
01025
01026
01027 static std::map<OA::IRHandle,OA::ProcHandle> sProcContext;
01028 static PU_Info* sProgContext;
01029
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
01040 static void initCallSymToProcMap(Open64IRProcIterator &procIter);
01041
01042
01043 static void initProcToSymRefSetMap(Open64IRProcIterator &procIter);
01044
01045
01046
01047 friend class Open64IRProcIterator;
01048 friend class Open64IRMemRefIterator;
01049 friend class Open64IRExprHandleIterator;
01050 friend class InitContextVisitor;
01051
01052 private:
01053
01054
01055
01056
01057 static bool ourIgnoreBlackBoxRoutines;
01058
01059 public:
01060
01061 static void setIgnoreBlackBoxRoutines();
01062
01063 static bool ignoreBlackBoxRoutines();
01064
01065
01066
01067
01068 static bool haveDefinition(WN* wn);
01069
01073
01074 OA::SymHandle getFormalForActual(OA::ProcHandle caller, OA::CallHandle call,
01075 OA::ProcHandle callee, OA::ExprHandle param);
01078
01079 OA::SymHandle getSymHandle(OA::CallHandle h);
01080
01082
01083 bool isRefParam(OA::SymHandle);
01084
01086
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