00001
00015 #ifndef MemRefExpr_H
00016 #define MemRefExpr_H
00017
00018 #include <iostream>
00019 #include <cassert>
00020 #include <OpenAnalysis/Utils/OA_ptr.hpp>
00021 #include <OpenAnalysis/IRInterface/IRHandles.hpp>
00022 #include <OpenAnalysis/OABase/Annotation.hpp>
00023
00024 namespace OA {
00025
00026 class MemRefExpr;
00027 class IdxExprAccess;
00028 class MemRefExpr;
00029 class NamedRef;
00030 class UnnamedRef;
00031 class UnknownRef;
00032 class RefOp;
00033 class Deref;
00034 class SubSetRef;
00035 class IdxAccess;
00036 class IdxExprAccess;
00037 class FieldAccess;
00038
00039 class MemRefExprVisitor;
00040
00041
00042 template<class T>
00043 class MREIteratorClass {
00044 public:
00045 MREIteratorClass() { }
00046 virtual ~MREIteratorClass() { }
00047
00048
00049 virtual OA_ptr<T> current() const = 0;
00050
00051
00052 virtual bool isValid() const = 0;
00053
00054 virtual void operator++() = 0;
00055 void operator++(int) { ++*this; } ;
00056
00057 virtual void reset() = 0;
00058 };
00059
00060 typedef MREIteratorClass<MemRefExpr> MemRefExprIterator;
00061 typedef MREIteratorClass<NamedRef> NamedRefIterator;
00062 typedef MREIteratorClass<UnnamedRef> UnnamedRefIterator;
00063 typedef MREIteratorClass<UnknownRef> UnknownRefIterator;
00064 typedef MREIteratorClass<RefOp> RefOpIterator;
00065 typedef MREIteratorClass<Deref> DerefIterator;
00066 typedef MREIteratorClass<SubSetRef> SubSetRefIterator;
00067 typedef MREIteratorClass<IdxAccess> IdxAccessIterator;
00068 typedef MREIteratorClass<IdxExprAccess> IdxExprAccessIterator;
00069 typedef MREIteratorClass<FieldAccess> FieldAccessIterator;
00070
00071
00072
00076 class MemRefExpr : public Annotation {
00077 public:
00078 typedef enum {
00079 USE,
00080 DEF,
00081 USEDEF,
00082
00083 DEFUSE
00084
00085 } MemRefType;
00086
00087 MemRefExpr(MemRefType mrType) : mMemRefType(mrType) {}
00088
00090 MemRefExpr(MemRefExpr &mre) : mMemRefType(mre.mMemRefType) {}
00091
00092 virtual ~MemRefExpr() {}
00093
00094 virtual void acceptVisitor(MemRefExprVisitor& pVisitor) = 0;
00095
00096
00097 virtual OA_ptr<MemRefExpr> clone() = 0;
00098
00099
00100
00101
00102 virtual bool isaNamed() { return false; }
00103 virtual bool isaUnnamed() { return false; }
00104 virtual bool isaUnknown() { return false; }
00105 virtual bool isaRefOp() { return false; }
00106
00107 virtual bool isaDeref() { return false; }
00108 virtual bool isaAddressOf() { return false; }
00109
00110 virtual bool isaSubSetRef() { return false; }
00111 virtual bool isaIdxAccess() { return false; }
00112 virtual bool isaIdxExprAccess() { return false; }
00113 virtual bool isaFieldAccess() { return false; }
00114
00115
00116
00117
00118
00120 MemRefType getMRType() { return mMemRefType; }
00121
00123 bool isDef() { return (mMemRefType==DEF
00124 || mMemRefType == USEDEF || mMemRefType == DEFUSE); }
00125
00127 bool isUse() { return (mMemRefType==USE
00128 || mMemRefType == USEDEF || mMemRefType == DEFUSE); }
00129
00131 bool isDefUse() { return (mMemRefType==DEFUSE); }
00132
00134 bool isUseDef() { return (mMemRefType==USEDEF); }
00135
00136
00137
00138
00139
00141 void setMemRefType(MemRefExpr::MemRefType mrType) { mMemRefType = mrType; }
00142
00143
00144
00145
00146
00148 virtual bool operator<(MemRefExpr & other);
00149
00152 virtual bool operator==(MemRefExpr& other);
00153
00156 bool operator!=(MemRefExpr& other) { return ! ((*this)==other); }
00157
00158
00159
00160
00161 void output(IRHandlesIRInterface& ir);
00162
00163
00164 virtual std::string typeString() { return "MemRefExpr"; }
00165 std::string toString(MemRefType);
00166
00167
00168
00169
00170 virtual void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> pIR);
00171 virtual void dump(std::ostream& os, IRHandlesIRInterface& pIR);
00172 virtual void dump(std::ostream& os);
00173
00174 virtual int getOrder() { assert(0); return sOrder; }
00175
00176 private:
00177 static const int sOrder = -100;
00178 MemRefType mMemRefType;
00179 };
00180
00185 class NamedRef: public MemRefExpr {
00186 public:
00187
00188 NamedRef(MemRefType mrType, SymHandle sh)
00189 : MemRefExpr(mrType), mSymHandle(sh) { }
00190
00192 NamedRef(NamedRef &mre) : MemRefExpr(mre), mSymHandle(mre.mSymHandle) { }
00193
00194 NamedRef(MemRefExpr &mre, SymHandle sh) : MemRefExpr(mre), mSymHandle(sh) {}
00195
00196 ~NamedRef() { }
00197
00198 void acceptVisitor(MemRefExprVisitor& pVisitor);
00199
00201 OA_ptr<MemRefExpr> clone();
00202
00203
00204
00205
00206 bool isaNamed() { return true; }
00207
00208
00209
00210
00211 SymHandle getSymHandle() { return mSymHandle; }
00212 virtual std::string typeString() { return "NamedRef"; }
00213
00214
00215
00216
00217
00218 bool operator<(MemRefExpr & other);
00219
00222 bool operator==(MemRefExpr& other);
00223
00224
00225
00226
00227 void output(IRHandlesIRInterface& ir);
00228
00229
00230
00231
00232 virtual void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> pIR);
00233 virtual void dump(std::ostream& os, IRHandlesIRInterface& pIR);
00234 virtual void dump(std::ostream& os);
00235
00236 virtual int getOrder() { return sOrder; }
00237
00238 private:
00239 static const int sOrder = 100;
00240 SymHandle mSymHandle;
00241 };
00242
00247 class UnnamedRef: public MemRefExpr {
00248 public:
00249
00250 UnnamedRef(MemRefType mrType, ExprHandle sh, ProcHandle proc)
00251 : MemRefExpr(mrType), mExprHandle(sh), mLocal(true), mProcHandle(proc) { }
00252
00253
00254 UnnamedRef(MemRefType mrType, ExprHandle sh)
00255 : MemRefExpr(mrType), mExprHandle(sh), mLocal(false) { }
00256
00257
00259 UnnamedRef(UnnamedRef &mre) : MemRefExpr(mre),
00260 mExprHandle(mre.mExprHandle),
00261 mLocal(mre.mLocal),
00262 mProcHandle(mre.mProcHandle) {}
00263
00264 UnnamedRef(MemRefExpr &mre, ExprHandle s, ProcHandle p)
00265 : MemRefExpr(mre), mExprHandle(s), mLocal(true), mProcHandle(p) {}
00266
00267
00268 UnnamedRef(MemRefExpr &mre, ExprHandle s)
00269 : MemRefExpr(mre), mExprHandle(s), mLocal(false) {}
00270
00271
00272 ~UnnamedRef() { }
00273
00274 void acceptVisitor(MemRefExprVisitor& pVisitor);
00275
00277 OA_ptr<MemRefExpr> clone();
00278
00279
00280
00281
00282 bool isaUnnamed() { return true; }
00283
00284
00285
00286
00287 ExprHandle getExprHandle() { return mExprHandle; }
00288
00289 bool isLocal() { return mLocal; }
00290
00291 ProcHandle getProcHandle() { return mProcHandle; }
00292
00293
00294
00295
00296
00297 bool operator<(MemRefExpr & other);
00298
00301 bool operator==(MemRefExpr& other);
00302
00303
00304
00305
00306 void output(IRHandlesIRInterface& ir);
00307 virtual std::string typeString() { return "UnnamedRef"; }
00308
00309
00310
00311
00312 virtual void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> pIR);
00313 virtual void dump(std::ostream& os, IRHandlesIRInterface& pIR);
00314 virtual void dump(std::ostream& os);
00315
00316 virtual int getOrder() { return sOrder; }
00317
00318 private:
00319 static const int sOrder = 200;
00320 ExprHandle mExprHandle;
00321 bool mLocal;
00322 ProcHandle mProcHandle;
00323 };
00324
00330 class UnknownRef: public MemRefExpr {
00331 public:
00332
00333 UnknownRef(MemRefType mrType)
00334 : MemRefExpr(mrType) { }
00335
00337 UnknownRef(UnknownRef &mre) : MemRefExpr(mre) {}
00338
00339 ~UnknownRef() { }
00340
00341 void acceptVisitor(MemRefExprVisitor& pVisitor);
00342
00344 OA_ptr<MemRefExpr> clone();
00345
00346
00347
00348
00349 bool isaUnknown() { return true; }
00350
00351
00352
00353
00354
00355 bool operator<(MemRefExpr & other);
00356
00359 bool operator==(MemRefExpr& other);
00360
00361
00362
00363
00364 void output(IRHandlesIRInterface& ir);
00365 virtual std::string typeString() { return "UnknownRef"; }
00366
00367
00368
00369
00370 virtual void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> pIR);
00371 virtual void dump(std::ostream& os, IRHandlesIRInterface& pIR);
00372 virtual void dump(std::ostream& os);
00373
00374 virtual int getOrder() { return sOrder; }
00375
00376 private:
00377 static const int sOrder = 100000000;
00378 };
00379
00380
00387 class RefOp: public MemRefExpr {
00388 public:
00389
00390 RefOp( MemRefType mrType, OA_ptr<MemRefExpr> mre)
00391 : MemRefExpr(mrType), mMRE(mre) { }
00392
00393
00395 RefOp(RefOp & mre) : MemRefExpr(mre), mMRE(mre.mMRE) { }
00396
00397 virtual ~RefOp() { }
00398
00399
00400
00401
00402 bool isaRefOp() { return true; }
00403
00404
00405
00406
00409 SymHandle getBaseSym();
00410
00411 virtual std::string typeString() { return "RefOp"; }
00412
00415 OA_ptr<MemRefExpr> getBase();
00416
00418 OA_ptr<MemRefExpr> getMemRefExpr() { return mMRE; }
00419
00420
00421
00422
00423
00424
00425
00426
00427
00429 virtual OA_ptr<MemRefExpr> composeWith(OA_ptr<MemRefExpr> mre) = 0;
00430
00431
00432
00433
00434 virtual void output(IRHandlesIRInterface& ir);
00435
00436
00437 private:
00438 OA_ptr<MemRefExpr> mMRE;
00439
00440 };
00441
00442
00443
00444 class AddressOf: public RefOp {
00445 public:
00446
00447 AddressOf(MemRefType mrType, OA_ptr<MemRefExpr> mre)
00448 : RefOp(mrType, mre) { }
00449
00451 AddressOf(AddressOf & mre) : RefOp(mre) { }
00452
00453 ~AddressOf() { }
00454
00455 void acceptVisitor(MemRefExprVisitor& pVisitor);
00456
00458 OA_ptr<MemRefExpr> clone();
00459
00460 virtual std::string typeString() { return "AddressOf"; }
00461
00462
00463
00464
00465 bool isaAddressOf() { return true; }
00466
00467
00468
00469
00470
00471 bool operator<(MemRefExpr & other);
00472
00475 bool operator==(MemRefExpr& other);
00476
00477
00478
00479
00481 OA_ptr<MemRefExpr> composeWith(OA_ptr<MemRefExpr> mre);
00482
00483
00484
00485
00486 void output(IRHandlesIRInterface& ir);
00487
00488
00489
00490
00491 virtual void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> pIR);
00492 virtual void dump(std::ostream& os, IRHandlesIRInterface& pIR);
00493 virtual void dump(std::ostream& os);
00494
00495 virtual int getOrder() { return sOrder; }
00496
00497 private:
00498 static const int sOrder = 350;
00499 };
00500
00501
00506 class Deref: public RefOp {
00507 public:
00508
00509 Deref(MemRefType mrType, OA_ptr<MemRefExpr> mre,
00510 int numDeref)
00511 : RefOp(mrType, mre), mNumDeref(numDeref) { }
00512
00513
00514
00515 Deref(MemRefType mrType, OA_ptr<MemRefExpr> mre)
00516 : RefOp(mrType, mre), mNumDeref(1) { }
00517
00518
00520 Deref(Deref &mre) : RefOp(mre), mNumDeref(mre.mNumDeref) {}
00521
00522 ~Deref() { }
00523
00524 void acceptVisitor(MemRefExprVisitor& pVisitor);
00525
00527 OA_ptr<MemRefExpr> clone();
00528
00529
00530
00531
00532 bool isaDeref() { return true; }
00533
00534
00535
00536
00537 int getNumDerefs() { return mNumDeref; }
00538 virtual std::string typeString() { return "Deref"; }
00539
00540
00541
00542
00543
00544 bool operator<(MemRefExpr & other);
00545
00548 bool operator==(MemRefExpr& other);
00549
00550
00551
00552
00553
00555 OA_ptr<MemRefExpr> composeWith(OA_ptr<MemRefExpr> mre);
00556
00557
00558
00559
00560 void output(IRHandlesIRInterface& ir);
00561
00562
00563
00564
00565 virtual void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> pIR);
00566 virtual void dump(std::ostream& os, IRHandlesIRInterface& pIR);
00567 virtual void dump(std::ostream& os);
00568
00569 virtual int getOrder() { return sOrder; }
00570
00571 private:
00572 static const int sOrder = 300;
00573 int mNumDeref;
00574 };
00575
00583 class SubSetRef: public RefOp {
00584 public:
00585
00586 SubSetRef( MemRefType mrType, OA_ptr<MemRefExpr> mre)
00587 : RefOp(mrType, mre) {}
00588
00590 SubSetRef(SubSetRef & mre) : RefOp(mre) { }
00591
00592 virtual ~SubSetRef() { }
00593
00594 void acceptVisitor(MemRefExprVisitor& pVisitor);
00595
00597 OA_ptr<MemRefExpr> clone();
00598
00599
00600
00601
00602 virtual bool isaSubSetRef() { return true; }
00603 virtual bool isSubClassOfSubSetRef() { return false; }
00604
00605
00606
00607
00608
00609 virtual bool operator<(MemRefExpr & other);
00610
00613 virtual bool operator==(MemRefExpr& other);
00614
00615
00616
00617
00618
00620 OA_ptr<MemRefExpr> composeWith(OA_ptr<MemRefExpr> mre);
00621
00622
00623
00624
00625 void output(IRHandlesIRInterface& ir);
00626 virtual std::string typeString() { return "SubSetRef"; }
00627
00628
00629
00630
00631 virtual void dump(std::ostream& os,
00632 OA_ptr<IRHandlesIRInterface> pIR);
00633
00634 virtual void dump(std::ostream& os, IRHandlesIRInterface& pIR);
00635 virtual void dump(std::ostream& os);
00636 virtual int getOrder() { return sOrder; }
00637
00638 private:
00639 static const int sOrder = 600;
00640
00641 };
00642
00643
00647 class IdxAccess: public SubSetRef {
00648 public:
00649
00650 IdxAccess(MemRefType mrType, OA_ptr<MemRefExpr> mre, int idx)
00651 : SubSetRef(mrType,mre), mIdx(idx) { }
00652
00654 IdxAccess(IdxAccess &mre) : SubSetRef(mre), mIdx(mre.mIdx) {}
00655
00656 ~IdxAccess() { }
00657
00658 void acceptVisitor(MemRefExprVisitor& pVisitor);
00659
00661 OA_ptr<MemRefExpr> clone();
00662
00663
00664
00665
00666 bool isaIdxAccess() { return true; }
00667 bool isSubClassOfSubSetRef() { return true; }
00668
00669
00670
00671
00672 int getIdx() { return mIdx; }
00673 virtual std::string typeString() { return "IdxAccess"; }
00674
00675
00676
00677
00678
00679 bool operator<(MemRefExpr & other);
00680
00683 bool operator==(MemRefExpr& other);
00684
00685
00686
00687
00688 void output(IRHandlesIRInterface& ir);
00689
00690
00691
00692
00693 virtual void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> pIR);
00694 virtual void dump(std::ostream& os, IRHandlesIRInterface& pIR);
00695 virtual void dump(std::ostream& os);
00696
00697 virtual int getOrder() { return sOrder; }
00698
00699 private:
00700 static const int sOrder = 400;
00701 int mIdx;
00702 };
00703
00710 class IdxExprAccess : public SubSetRef {
00711 public:
00712
00713 IdxExprAccess( MemRefType mrType, OA_ptr<MemRefExpr> mre,
00714 MemRefHandle hExpr)
00715 : SubSetRef( mrType, mre)
00716 {
00717 mhExpr = hExpr;
00718 }
00719
00721 IdxExprAccess(IdxExprAccess &mre)
00722 : SubSetRef(mre),
00723 mhExpr(mre.mhExpr)
00724 {
00725 }
00726
00727 ~IdxExprAccess() { }
00728
00729 virtual void acceptVisitor(MemRefExprVisitor& pVisitor);
00730
00732 OA_ptr<MemRefExpr> clone();
00733
00734
00735
00736
00737 bool isaIdxExprAccess() { return true; }
00738 bool isSubClassOfSubSetRef() { return true; }
00739
00740
00741
00742
00743 MemRefHandle getExpr() { return mhExpr; }
00744 virtual std::string typeString() { return "IdxExprAccess"; }
00745
00746
00747
00748
00749 bool operator<(MemRefExpr & other);
00750
00753 bool operator==(MemRefExpr& other);
00754
00755
00756
00757
00758 void output(IRHandlesIRInterface& ir);
00759
00760
00761
00762
00763 virtual void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> pIR);
00764 virtual void dump(std::ostream& os, IRHandlesIRInterface& pIR);
00765 virtual void dump(std::ostream& os);
00766
00767 virtual int getOrder() { return sOrder; }
00768
00769 private:
00770 static const int sOrder = 450;
00771 MemRefHandle mhExpr;
00772 };
00773
00778 class FieldAccess: public SubSetRef {
00779 public:
00780
00781 FieldAccess( MemRefType mrType,
00782 OA_ptr<MemRefExpr> mre, std::string field)
00783 : SubSetRef(mrType,mre), mFieldName(field) { }
00784
00785
00787 FieldAccess(FieldAccess &mre) : SubSetRef(mre), mFieldName(mre.mFieldName) {}
00788
00789 ~FieldAccess() { }
00790
00791 void acceptVisitor(MemRefExprVisitor& pVisitor);
00792
00794 OA_ptr<MemRefExpr> clone();
00795
00796
00797
00798
00799 bool isaFieldAccess() { return true; }
00800 bool isSubClassOfSubSetRef() { return true; }
00801
00802
00803
00804
00805 std::string getFieldName() { return mFieldName; }
00806 virtual std::string typeString() { return "FieldAccess"; }
00807
00808
00809
00810
00811
00812 bool operator<(MemRefExpr & other);
00813
00816 bool operator==(MemRefExpr& other);
00817
00818
00819
00820
00821 void output(IRHandlesIRInterface& ir);
00822
00823
00824
00825
00826 virtual void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> pIR);
00827 virtual void dump(std::ostream& os, IRHandlesIRInterface& pIR);
00828 virtual void dump(std::ostream& os);
00829
00830 virtual int getOrder() { return sOrder; }
00831
00832 private:
00833 static const int sOrder = 500;
00834 std::string mFieldName;
00835 };
00836
00837
00838 }
00839
00840 #endif
00841