MemRefExpr.cpp

Go to the documentation of this file.
00001 
00015 #include "MemRefExpr.hpp"
00016 
00017 // included here instead of in hpp file to remove circular reference
00018 #include <OpenAnalysis/MemRefExpr/MemRefExprVisitor.hpp>
00019 
00020 namespace OA {
00021 
00022 
00023 //*****************************************************************
00024 // MemRefExpr methods
00025 //*****************************************************************
00026 
00030 bool MemRefExpr::operator<(MemRefExpr& other) 
00031 {
00032     bool retval = false;
00033     if(getOrder() < other.getOrder()) { retval = true; }
00034     return retval;
00035 }
00036 
00037 bool MemRefExpr::operator==(MemRefExpr& other) 
00038 {
00039     bool retval = false;
00040     if(getOrder() == other.getOrder()) { retval = true; }
00041     return retval;
00042 }
00043 
00044 void MemRefExpr::output(IRHandlesIRInterface& pIR)
00045 {
00046     sOutBuild->field("mMemRefType", toString(mMemRefType) );
00047 }
00048 
00049 void MemRefExpr::dump(std::ostream& os, IRHandlesIRInterface& pIR)
00050 {
00051     MemRefExpr::dump(os);
00052 }
00053 
00054 
00055 void MemRefExpr::dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> pIR)
00056 {
00057     MemRefExpr::dump(os);
00058 }
00059 
00060 void MemRefExpr::dump(std::ostream& os)
00061 {
00062     os << "MemRefExpr(this=" << this 
00063        << ", type = " << toString(mMemRefType) << ")\t";
00064 }
00065 
00066 std::string MemRefExpr::toString(MemRefType type) 
00067 {
00068     std::ostringstream oss;
00069     switch (mMemRefType) {
00070       case USE: oss << "USE"; break;
00071       case DEF: oss << "DEF"; break;
00072       case USEDEF: oss << "USEDEF"; break;
00073       case DEFUSE: oss << "DEFUSE"; break;
00074     }
00075     return oss.str();
00076 }
00077 
00078 //*****************************************************************
00079 // NamedRef methods
00080 //*****************************************************************
00081 
00082 void NamedRef::acceptVisitor(MemRefExprVisitor& pVisitor)
00083 {
00084     pVisitor.visitNamedRef(*this);
00085 }
00086 
00087 OA_ptr<MemRefExpr>  NamedRef::clone()
00088 {
00089     OA_ptr<MemRefExpr> retval;
00090     retval = new NamedRef(*this);
00091     return retval;
00092 }
00093 
00101 bool NamedRef::operator<(MemRefExpr& other)
00102 {
00103     if(getOrder() < other.getOrder()) { return true; }
00104     else if(getOrder() > other.getOrder()) { return false; }
00105 
00106     // execution will reach here of two NamedRef objects are being compared
00107     NamedRef& ref = static_cast<NamedRef&>(other);
00108 
00109     if( getSymHandle() < ref.getSymHandle() )
00110     {
00111         return true;
00112     } else {
00113         return false;
00114     }
00115 } 
00116 
00117 bool NamedRef::operator==(MemRefExpr& other)
00118 {
00119     if(getOrder() != other.getOrder()) { return false; }
00120 
00121     // execution reaches here if two NamedRef objects are being compared
00122     NamedRef& ref = static_cast<NamedRef&>(other);
00123 
00124     if( getSymHandle() == ref.getSymHandle() ) 
00125     {
00126         return true;
00127     } else {
00128         return false;
00129     }
00130 } 
00131 
00132 void NamedRef::output(IRHandlesIRInterface& pIR)
00133 {
00134     sOutBuild->objStart("NamedRef");
00135     MemRefExpr::output(pIR);
00136     sOutBuild->fieldStart("mSymHandle");
00137     sOutBuild->outputIRHandle(mSymHandle,pIR);
00138     sOutBuild->fieldEnd("mSymHandle");
00139     sOutBuild->objEnd("NamedRef");
00140 }
00141 
00142 void NamedRef::dump(std::ostream& os)
00143 {
00144     MemRefExpr::dump(os);
00145     os << "NamedRef(this=" << this << ", mSymHandle.hval()=" 
00146        << mSymHandle.hval() << ")";
00147     os << std::endl;
00148 }
00149 
00150 void NamedRef::dump(std::ostream& os, IRHandlesIRInterface& pIR)
00151 {
00152     // string for mSymHandle
00153     MemRefExpr::dump(os,pIR);
00154     os << "NamedRef(this=" << this << ", mSymHandle.hval()=" 
00155        << mSymHandle.hval() << "): "
00156        << pIR.toString(mSymHandle);
00157     os << std::endl;
00158 }
00159 
00160 
00161 void NamedRef::dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> pIR)
00162 {
00163     dump(os,*pIR);
00164 }
00165 
00166 //*****************************************************************
00167 // UnnamedRef methods
00168 //*****************************************************************
00169 
00170 void UnnamedRef::acceptVisitor(MemRefExprVisitor& pVisitor)
00171 {
00172     pVisitor.visitUnnamedRef(*this);
00173 }
00174 
00175 OA_ptr<MemRefExpr>  UnnamedRef::clone()
00176 {
00177     OA_ptr<MemRefExpr> retval;
00178     retval = new UnnamedRef(*this);
00179     return retval;
00180 }
00181 
00189 bool UnnamedRef::operator<(MemRefExpr& other)
00190 {
00191     if(getOrder() < other.getOrder()) { return true; }
00192     else if(getOrder() > other.getOrder()) { return false; }
00193 
00194     // execution will reach here of two UnnamedRef objects are being compared
00195     UnnamedRef& ref = static_cast<UnnamedRef&>(other);
00196 
00197     if( getExprHandle() < ref.getExprHandle() )
00198     {
00199         return true;
00200     } else {
00201         return false;
00202     }
00203 }  
00204 
00205 bool UnnamedRef::operator==(MemRefExpr& other)
00206 {
00207     if(getOrder() != other.getOrder()) { return false; }
00208 
00209     // execution reaches here if two UnnamedRef objects are being compared
00210     UnnamedRef& ref = static_cast<UnnamedRef&>(other);
00211 
00212     if( getExprHandle() == ref.getExprHandle() ) 
00213     {
00214         return true;
00215     } else {
00216         return false;
00217     }
00218 }   
00219 
00220 void UnnamedRef::output(IRHandlesIRInterface& pIR)
00221 {
00222     sOutBuild->objStart("UnnamedRef");
00223     MemRefExpr::output(pIR);
00224     sOutBuild->fieldStart("mExprHandle");
00225     sOutBuild->outputIRHandle(mExprHandle,pIR);
00226     sOutBuild->fieldEnd("mExprHandle");
00227     sOutBuild->field("mLocal", bool2string(mLocal));
00228     if(isLocal() == true) {
00229        sOutBuild->fieldStart("mProcHandle");
00230        sOutBuild->outputIRHandle(mProcHandle,pIR);
00231        sOutBuild->fieldEnd("mProcHandle");
00232     }
00233     sOutBuild->objEnd("UnnamedRef");
00234 }
00235 
00236 
00237 void UnnamedRef::dump(std::ostream& os)
00238 {
00239     MemRefExpr::dump(os);
00240     os << "UnnamedRef(this=" << this << ", mExprHandle.hval()="
00241        << mExprHandle.hval() << ", mLocal=" << mLocal;
00242     if( isLocal() == true) {
00243         os << ", mProcHandle.hval()=" << mProcHandle.hval();
00244     }
00245     os << ")";
00246     os << std::endl;
00247 }
00248 
00249 void UnnamedRef::dump(std::ostream& os, IRHandlesIRInterface& pIR)
00250 {
00251     MemRefExpr::dump(os,pIR);
00252     os << "UnnamedRef(this=" << this << ", mExprHandle.hval()="
00253        << mExprHandle.hval() << "): "
00254        << pIR.toString(mExprHandle);
00255     os << std::endl;
00256 }
00257 
00258 void UnnamedRef::dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> pIR)
00259 {
00260     dump(os,*pIR);
00261 }
00262 
00263 //*****************************************************************
00264 // UnknownRef methods
00265 //*****************************************************************
00266 
00267 void UnknownRef::acceptVisitor(MemRefExprVisitor& pVisitor)
00268 {
00269     pVisitor.visitUnknownRef(*this);
00270 }
00271 
00272 OA_ptr<MemRefExpr>  UnknownRef::clone()
00273 {
00274     OA_ptr<MemRefExpr> retval;
00275     retval = new UnknownRef(*this);
00276     return retval;
00277 }
00278 
00279 bool UnknownRef::operator<(MemRefExpr& other) 
00280 {
00281     if(getOrder() < other.getOrder()) { return true; }
00282     else if(getOrder() > other.getOrder()) { return false; }
00283 
00284     // execution will reach here of two UnknownRef objects are being compared
00285     return false;
00286 }
00287     
00288 bool UnknownRef::operator==(MemRefExpr& other)
00289 {
00290     if(getOrder() != other.getOrder()) { return false; }
00291     else { return true; }
00292 }
00293 
00294 void UnknownRef::output(IRHandlesIRInterface& pIR)
00295 {
00296     sOutBuild->objStart("UnknownRef");
00297     MemRefExpr::output(pIR);
00298     sOutBuild->objEnd("UnknownRef");
00299 }
00300 
00301 
00302 void UnknownRef::dump(std::ostream& os)
00303 {
00304     MemRefExpr::dump(os);
00305     os << "UnknownRef";
00306     os << std::endl;
00307 }
00308 
00309 void UnknownRef::dump(std::ostream& os, IRHandlesIRInterface& pIR)
00310 {
00311     MemRefExpr::dump(os,pIR);
00312     os << "UnknownRef";
00313     os << std::endl;
00314 }
00315 void UnknownRef::dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> pIR)
00316 {
00317     dump(os,*pIR);
00318 }
00319 
00320 //*****************************************************************
00321 // RefOp methods
00322 //*****************************************************************
00323 SymHandle RefOp::getBaseSym()
00324 {
00325     OA_ptr<MemRefExpr> m = mMRE; // Stupid Sun CC 5.4
00326 
00327     // if our mre is another RefOp then call recursively
00328     if (mMRE->isaRefOp()) {
00329         OA_ptr<RefOp> refOp = m.convert<RefOp>();
00330         return refOp->getBaseSym();
00331     }
00332 
00333     // otherwise should be a named ref
00334     assert(mMRE->isaNamed());
00335     OA_ptr<NamedRef> namedRef = m.convert<NamedRef>();
00336     return namedRef->getSymHandle();
00337 }
00338 
00339 OA_ptr<MemRefExpr> RefOp::getBase() {
00340     OA_ptr<MemRefExpr> m = mMRE; // Stupid Sun CC 5.4
00341 
00342     // if our mre is another RefOp then call recursively
00343     if (mMRE->isaRefOp()) {
00344         OA_ptr<RefOp> refOp = m.convert<RefOp>();
00345         return refOp->getBase();
00346     }
00347 
00348     // otherwise should be a named ref
00349     assert(mMRE->isaNamed());
00350     OA_ptr<NamedRef> namedRef = m.convert<NamedRef>();
00351     return namedRef;
00352 }
00353 
00354 void RefOp::output(IRHandlesIRInterface& ir)
00355 {
00356     MemRefExpr::output(ir);
00357 
00358     if (! mMRE.ptrEqual(0) ) {
00359         sOutBuild->fieldStart("mMRE");
00360         mMRE->output(ir);
00361         sOutBuild->fieldEnd("mMRE");
00362     } else {
00363         sOutBuild->field("mMRE", "<null MRE>");
00364     }
00365         
00366 }
00367 
00368 
00369 //*****************************************************************
00370 // AddressOf methods
00371 //*****************************************************************
00372 
00373 void AddressOf::acceptVisitor(MemRefExprVisitor& pVisitor)
00374 {
00375     pVisitor.visitAddressOf(*this);
00376 }
00377 
00378 OA_ptr<MemRefExpr> AddressOf::clone()
00379 {
00380     OA_ptr<MemRefExpr> retval;
00381     retval = new AddressOf(*this);
00382     return retval;
00383 }
00384 
00385 bool AddressOf::operator<(MemRefExpr& other)
00386 {
00387     if(getOrder() < other.getOrder()) { return true; }
00388     else if(getOrder() > other.getOrder()) { return false; }
00389 
00390     // execution will reach here of two AddressOf objects are being compared
00391     AddressOf& ref = static_cast<AddressOf&>(other);
00392 
00393     if( getMemRefExpr() < ref.getMemRefExpr() )
00394     {
00395         return true;
00396     } else {
00397         return false;
00398     }
00399 }
00400 
00401 bool AddressOf::operator==(MemRefExpr& other)
00402 {
00403     if(getOrder() != other.getOrder()) { return false; }
00404 
00405     // execution reaches here if two AddressOf objects are being compared
00406     AddressOf& ref = static_cast<AddressOf&>(other);
00407 
00408     if( getMemRefExpr() == ref.getMemRefExpr() )
00409     {
00410         return true;
00411     } else {
00412         return false;
00413     }
00414 }
00415 
00416 
00417 OA_ptr<MemRefExpr> AddressOf::composeWith(OA_ptr<MemRefExpr> mre)
00418 {
00419     OA_ptr<MemRefExpr> retval;
00420     OA_ptr<MemRefExpr> clone_mre ;
00421     clone_mre = mre->clone();
00422 
00423    if(clone_mre->isaRefOp()) {
00424 
00425        OA_ptr<RefOp> ref = clone_mre.convert<RefOp>();
00426 
00427        if (ref->isaDeref()) {
00428            OA_ptr<MemRefExpr> child_mre = ref->getMemRefExpr();
00429            return child_mre;
00430        }
00431        if (ref->isaAddressOf()) {
00432            return clone_mre;
00433        }
00434    }
00435 
00436    retval = new AddressOf(this->getMRType(), clone_mre);
00437    return retval;
00438 }
00439 
00440 
00441 
00442 void AddressOf::output(IRHandlesIRInterface& pIR)
00443 {
00444     sOutBuild->objStart("AddressOf");
00445     RefOp::output(pIR);
00446     sOutBuild->objEnd("AddressOf");
00447 }
00448 
00449 
00450 void AddressOf::dump(std::ostream& os)
00451 {
00452     MemRefExpr::dump(os);
00453     os << "AddressOf(this=" << this << ", mMemRefExpr=";
00454     getMemRefExpr()->dump(os);
00455     os << std::endl;
00456 }
00457 
00458 void AddressOf::dump(std::ostream& os, IRHandlesIRInterface& pIR)
00459 {
00460     MemRefExpr::dump(os,pIR);
00461     os << "AddressOf(this=" << this << ", mMemRefExpr=";
00462     getMemRefExpr()->dump(os,pIR);
00463     os << std::endl;
00464 }
00465 
00466 void AddressOf::dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> pIR)
00467 {
00468     dump(os,*pIR);
00469 }
00470 
00471 
00472 //*****************************************************************
00473 // Deref methods
00474 //*****************************************************************
00475 
00476 void Deref::acceptVisitor(MemRefExprVisitor& pVisitor)
00477 {
00478     pVisitor.visitDeref(*this);
00479 }
00480 
00481 OA_ptr<MemRefExpr>  Deref::clone()
00482 {
00483     OA_ptr<MemRefExpr> retval;
00484     retval = new Deref(*this);
00485     return retval;
00486 }
00487 
00497 bool Deref::operator<(MemRefExpr& other)
00498 {
00499     if(getOrder() < other.getOrder()) { return true; }
00500     else if(getOrder() > other.getOrder()) { return false; }
00501 
00502     // execution will reach here of two Deref objects are being compared
00503     Deref& ref = static_cast<Deref&>(other);
00504 
00505 
00506     if( (getMemRefExpr() < ref.getMemRefExpr() ||
00507           (getMemRefExpr() == ref.getMemRefExpr()
00508             && getNumDerefs() < ref.getNumDerefs()) ) )
00509     {
00510         return true;
00511     } else { 
00512         return false;
00513     }
00514 }   
00515 
00516 bool Deref::operator==(MemRefExpr& other)
00517 {
00518     if(getOrder() != other.getOrder()) { return false; }
00519 
00520     // execution reaches here if two Deref objects are being compared
00521     Deref& ref = static_cast<Deref&>(other);
00522 
00523 
00524     // check if deref count is equal and underlying memref is equal
00525     // have to check that our MemRefExpr fields like fullAccuracy are
00526     // equal because accuracy can change at any level
00527     if( getNumDerefs() == ref.getNumDerefs()
00528         && getMemRefExpr() == ref.getMemRefExpr() )
00529     {
00530         return true;
00531     } else {
00532         return false;
00533     }
00534 }
00535 
00536 
00537 
00538 OA_ptr<MemRefExpr> Deref::composeWith(OA_ptr<MemRefExpr> mre)
00539 {
00540     OA_ptr<MemRefExpr> retval;
00541     OA_ptr<MemRefExpr> clone_mre = mre->clone();      
00542 
00543     if( clone_mre->isaRefOp() ) {
00544       OA_ptr<RefOp> ref = clone_mre.convert<RefOp>();
00545 
00546       if (ref->isaAddressOf()) {
00547           OA_ptr<MemRefExpr> child_mre = ref->getMemRefExpr();
00548           retval = child_mre;
00549           return retval;
00550       }
00551     }   
00552           
00553     retval = new Deref(this->getMRType(), clone_mre, 1);
00554 
00555     return retval;
00556 }
00557 
00558 void Deref::output(IRHandlesIRInterface& pIR)
00559 {
00560     sOutBuild->objStart("Deref");
00561     RefOp::output(pIR);
00562     sOutBuild->field("mNumDeref", int2string(mNumDeref));
00563     sOutBuild->objEnd("Deref");
00564 }
00565 
00566 
00567 void Deref::dump(std::ostream& os)
00568 {
00569     MemRefExpr::dump(os);
00570     os << "Deref(this=" << this << ", mMemRefExpr=";
00571     getMemRefExpr()->dump(os);
00572     os << "\tmNumDerefs = " << getNumDerefs() << " )"; 
00573     os << std::endl;
00574 }
00575 
00576 void Deref::dump(std::ostream& os, IRHandlesIRInterface& pIR)
00577 {
00578     MemRefExpr::dump(os,pIR);
00579     os << "Deref(this=" << this << ", mMemRefExpr=";
00580     getMemRefExpr()->dump(os,pIR);
00581     os << "\tmNumDerefs = " << getNumDerefs() << " )"; 
00582     os << std::endl;
00583 }
00584 
00585 void Deref::dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> pIR)
00586 {
00587     dump(os,*pIR);
00588 }
00589 
00590 //*****************************************************************
00591 // SubSetRef methods
00592 //*****************************************************************
00593 OA_ptr<MemRefExpr>  SubSetRef::clone()
00594 {
00595     OA_ptr<MemRefExpr> retval;
00596     retval = new SubSetRef(*this);
00597     return retval;
00598 }
00599 
00600 void SubSetRef::acceptVisitor(MemRefExprVisitor& pVisitor)
00601 {
00602     pVisitor.visitSubSetRef(*this);
00603 }
00604 
00605 
00606 
00607 OA_ptr<MemRefExpr> SubSetRef::composeWith(OA_ptr<MemRefExpr> mre)
00608 {
00609     OA_ptr<MemRefExpr> clone_mre = mre->clone();
00610     OA_ptr<MemRefExpr> retval;
00611 
00612     retval = new SubSetRef(clone_mre->getMRType(), clone_mre);
00613     return retval;
00614 }
00615 
00616 
00617 
00618 void SubSetRef::output(IRHandlesIRInterface& pIR)
00619 {
00620     sOutBuild->objStart("SubSetRef");
00621     RefOp::output(pIR);
00622     sOutBuild->objEnd("SubSetRef");
00623 }
00624 
00625 
00626 
00627 bool SubSetRef::operator<(MemRefExpr& other)
00628 {
00629    if(getOrder() < other.getOrder()) { return true; }
00630    else if(getOrder() > other.getOrder()) { return false; }
00631    SubSetRef& ref = static_cast<SubSetRef&>(other);
00632    if( getMemRefExpr() < ref.getMemRefExpr() ) 
00633    {
00634        return true;
00635    } else {
00636        return false;
00637    }
00638 }
00639 
00640 
00641 bool SubSetRef::operator==(MemRefExpr& other)
00642 {
00643     if(getOrder() != other.getOrder()) { return false; }
00644     // execution reaches here if two Deref objects are being compared
00645     SubSetRef& ref = static_cast<SubSetRef&>(other);
00646     if( getMemRefExpr() == ref.getMemRefExpr() )
00647     {
00648         return true;
00649     } else {
00650         return false;
00651     }
00652 }
00653 
00654 
00655 void SubSetRef::dump(std::ostream& os)
00656 {
00657     MemRefExpr::dump(os);
00658     os << "SubSetRef(this=" << this << ", mMemRefExpr=";
00659     getMemRefExpr()->dump(os);
00660     os << " )";
00661     os << std::endl;
00662 }
00663 
00664 void SubSetRef::dump(std::ostream& os, IRHandlesIRInterface& pIR)
00665 {
00666     MemRefExpr::dump(os,pIR);
00667     os << "SubSetRef(this=" << this << ", mMemRefExpr=";
00668     getMemRefExpr()->dump(os,pIR);
00669     os << " )";
00670     os << std::endl;
00671 }
00672 
00673 void SubSetRef::dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> pIR)
00674 {
00675     dump(os,*pIR);
00676 }
00677 
00678 //*****************************************************************
00679 // IdxAccess methods
00680 //*****************************************************************
00681 
00682 void IdxAccess::acceptVisitor(MemRefExprVisitor& pVisitor)
00683 {
00684     pVisitor.visitIdxAccess(*this);
00685 }
00686 
00687 OA_ptr<MemRefExpr>  IdxAccess::clone()
00688 {
00689     OA_ptr<MemRefExpr> retval;
00690     retval = new IdxAccess(*this);
00691     return retval;
00692 }
00693 
00707 bool IdxAccess::operator<(MemRefExpr& other)
00708 {
00709     if(getOrder() < other.getOrder()) { return true; }
00710     else if(getOrder() > other.getOrder()) { return false; }
00711 
00712     // execution will reach here of two IdxAccess objects are being compared
00713     IdxAccess& ref = static_cast<IdxAccess&>(other);
00714 
00715     if( getMemRefExpr() < ref.getMemRefExpr() ||
00716           (getMemRefExpr() == ref.getMemRefExpr()
00717             && getIdx() < ref.getIdx()) )
00718     {
00719         return true;
00720     } else {
00721         return false;
00722     }
00723 }  
00724 
00725 bool IdxAccess::operator==(MemRefExpr& other)
00726 {
00727     if(getOrder() != other.getOrder()) { return false; }
00728 
00729     // execution reaches here if two IdxAccess objects are being compared
00730     IdxAccess& ref = static_cast<IdxAccess&>(other);
00731 
00732 
00733     if( getMemRefExpr() == ref.getMemRefExpr()
00734          && getIdx() == ref.getIdx() )
00735     {
00736         return true;
00737     } else {
00738         return false;
00739     }
00740 }
00741 
00742 void IdxAccess::output(IRHandlesIRInterface& pIR)
00743 {
00744     sOutBuild->objStart("IdxAccess");
00745     RefOp::output(pIR);
00746     sOutBuild->field("mIdx", int2string(mIdx));
00747     sOutBuild->objEnd("IdxAccess");
00748 }
00749 
00750 
00751 void IdxAccess::dump(std::ostream& os)
00752 {
00753     MemRefExpr::dump(os);
00754     os << "IdxAccess(this=" << this << ", mMemRefExpr=";
00755     getMemRefExpr()->dump(os);
00756     os << "\tmIdx=" << getIdx() << " )"; 
00757     os << std::endl;
00758 }
00759 
00760 void IdxAccess::dump(std::ostream& os, IRHandlesIRInterface& pIR)
00761 {
00762     MemRefExpr::dump(os,pIR);
00763     os << "IdxAccess(this=" << this << ", mMemRefExpr=";
00764     getMemRefExpr()->dump(os,pIR);
00765     os << "\tmIdx=" << getIdx() << " )"; 
00766     os << std::endl;
00767 }
00768 
00769 void IdxAccess::dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> pIR)
00770 {
00771     dump(os,*pIR);
00772 }
00773 
00774 
00775 //*****************************************************************
00776 // IdxExprAccess methods
00777 //*****************************************************************
00778 void IdxExprAccess::acceptVisitor(MemRefExprVisitor& pVisitor) {
00779     pVisitor.visitIdxExprAccess(*this);
00780 }
00781 
00782 OA_ptr<MemRefExpr> IdxExprAccess::clone() {
00783     OA_ptr<MemRefExpr> retval;
00784     retval = new IdxExprAccess(*this);
00785     return retval;
00786 }
00787 
00790 bool IdxExprAccess::operator<(MemRefExpr & other) {
00791     if(getOrder() < other.getOrder()) { return true; }
00792     else if(getOrder() > other.getOrder()) { return false; }
00793 
00794     // execution will reach here of two FieldAccess objects are being compared
00795     IdxExprAccess& ref = static_cast<IdxExprAccess&>(other);
00796 
00797     if( (getMemRefExpr() < ref.getMemRefExpr()) ||
00798             (getMemRefExpr() == ref.getMemRefExpr()
00799              && getExpr() < ref.getExpr()) )
00800     {
00801         return true;
00802     } else {
00803         return false;
00804     }
00805 }
00806 
00807 bool IdxExprAccess::operator==(MemRefExpr& other) {
00808     if(getOrder() != other.getOrder()) { return false; }
00809 
00810     // execution reaches here if two IdxExprAccess objects are being compared
00811     IdxExprAccess& ref = static_cast<IdxExprAccess&>(other);
00812 
00813 
00814     if( getMemRefExpr() == ref.getMemRefExpr() 
00815          && getExpr() == ref.getExpr() )
00816     {
00817         return true;
00818     } else {
00819         return false;
00820     }
00821 }
00822 
00823 void IdxExprAccess::output(IRHandlesIRInterface& ir) {
00824     sOutBuild->objStart("IdxExprAccess");
00825     RefOp::output(ir);
00826     sOutBuild->outputIRHandle(mhExpr, ir);
00827     sOutBuild->objEnd("IdxExprAccess");
00828 }
00829 
00830 void IdxExprAccess::dump(std::ostream& os)
00831 {
00832     MemRefExpr::dump(os);
00833     os << "IdxExprAccess(this=" << this << ", mMemRefExpr=";
00834     getMemRefExpr()->dump(os);
00835     os << "\tmhExpr=" << mhExpr.hval () << " )";
00836     os << std::endl;
00837 }
00838 
00839 void IdxExprAccess::dump(std::ostream& os, IRHandlesIRInterface& pIR)
00840 {
00841     MemRefExpr::dump(os,pIR);
00842     os << "IdxExprAccess(this=" << this << ", mMemRefExpr="; 
00843     getMemRefExpr()->dump(os,pIR);
00844     os << "\tmhExpr=" << mhExpr.hval() << " ) ";
00845     os << std::endl;
00846 }
00847 
00848 void IdxExprAccess::dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> pIR) 
00849 {
00850     dump(os,*pIR);
00851 }
00852 
00853 
00854 //*****************************************************************
00855 // FieldAccess methods
00856 //*****************************************************************
00857 
00858 void FieldAccess::acceptVisitor(MemRefExprVisitor& pVisitor)
00859 {
00860     pVisitor.visitFieldAccess(*this);
00861 }
00862 
00863 OA_ptr<MemRefExpr>  FieldAccess::clone()
00864 {
00865     OA_ptr<MemRefExpr> retval;
00866     retval = new FieldAccess(*this);
00867     return retval;
00868 }
00869 
00878 bool FieldAccess::operator<(MemRefExpr& other)
00879 {
00880     if(getOrder() < other.getOrder()) { return true; }
00881     else if(getOrder() > other.getOrder()) { return false; }
00882 
00883     // execution will reach here of two FieldAccess objects are being compared
00884     FieldAccess& ref = static_cast<FieldAccess&>(other);
00885 
00886     if( getMemRefExpr() < ref.getMemRefExpr() ||
00887          (getMemRefExpr() == ref.getMemRefExpr()
00888             && getFieldName() < ref.getFieldName()) ) 
00889     {
00890         return true;
00891     } else {
00892         return false;
00893     }
00894 }  
00895 
00896 bool FieldAccess::operator==(MemRefExpr& other)
00897 {
00898     if(getOrder() != other.getOrder()) { return false; }
00899 
00900     // execution reaches here if two FieldAccess objects are being compared
00901     FieldAccess& ref = static_cast<FieldAccess&>(other);
00902 
00903     if( getMemRefExpr() == ref.getMemRefExpr()
00904          && getFieldName() == ref.getFieldName() )
00905     {
00906         return true;
00907     } else {
00908         return false;
00909     }
00910 }
00911  
00912 void FieldAccess::output(IRHandlesIRInterface& pIR)
00913 {
00914     sOutBuild->objStart("FieldAccess");
00915 
00916     RefOp::output(pIR);
00917 
00918     //    sOutBuild->fieldStart("mFieldName");
00919     //    sOutBuild->outputIRHandle(mFieldName,pIR);
00920     //    sOutBuild->fieldEnd("mFieldName");
00921     sOutBuild->field("mFieldName",mFieldName);
00922 
00923     sOutBuild->objEnd("FieldAccess");
00924 }
00925 
00926 void FieldAccess::dump(std::ostream& os)
00927 {
00928     MemRefExpr::dump(os);
00929     os << "FieldAccess(this=" << this << ", mMemRefExpr=";
00930     getMemRefExpr()->dump(os);
00931     //    os << "\tmFieldName.hval()=" << mFieldName.hval() << " )"; 
00932     os << "\tmFieldName=" << mFieldName << " )"; 
00933     os << std::endl;
00934 }
00935 
00936 void FieldAccess::dump(std::ostream& os, IRHandlesIRInterface& pIR)
00937 {
00938     MemRefExpr::dump(os,pIR);
00939     os << "FieldAccess(this=" << this << ", mMemRefExpr=";
00940     getMemRefExpr()->dump(os,pIR);
00941     //    os << "\tmFieldName()=" << mFieldName.hval() << " ): " << pIR.toString(mFieldName); 
00942     os << "\tmFieldName()=" << mFieldName << " ) ";
00943     os << std::endl;
00944 }
00945 
00946 void FieldAccess::dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> pIR)
00947 {
00948     dump(os,*pIR);
00949 }
00950 
00951 
00952 
00953 } // end of OA namespace
00954