diff options
| author | Zhongxing Xu <xuzhongxing@gmail.com> | 2008-10-22 13:44:38 +0000 |
|---|---|---|
| committer | Zhongxing Xu <xuzhongxing@gmail.com> | 2008-10-22 13:44:38 +0000 |
| commit | 2fbc35443d572fd1f4800f63e9d18ee566aa4a73 (patch) | |
| tree | 397e98785342f6a871ddeac233269c2cc64b0d08 | |
| parent | e38d542d89aa5d494a879e197193814f6001dd59 (diff) | |
| download | bcm5719-llvm-2fbc35443d572fd1f4800f63e9d18ee566aa4a73.tar.gz bcm5719-llvm-2fbc35443d572fd1f4800f63e9d18ee566aa4a73.zip | |
Add a bunch of getLValue* methods to RegionStore.
llvm-svn: 57977
| -rw-r--r-- | clang/lib/Analysis/RegionStore.cpp | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/clang/lib/Analysis/RegionStore.cpp b/clang/lib/Analysis/RegionStore.cpp index 9efcc48c518..9183fd782ff 100644 --- a/clang/lib/Analysis/RegionStore.cpp +++ b/clang/lib/Analysis/RegionStore.cpp @@ -38,7 +38,14 @@ public: virtual ~RegionStoreManager() {} + SVal getLValueVar(const GRState* St, const VarDecl* VD); + + SVal getLValueIvar(const GRState* St, const ObjCIvarDecl* D, SVal Base); + + SVal getLValueField(const GRState* St, SVal Base, const FieldDecl* D); + SVal Retrieve(Store S, Loc L, QualType T); + Store Bind(Store St, Loc LV, SVal V); Store getInitialStore(); @@ -65,6 +72,53 @@ Loc RegionStoreManager::getElementLoc(const VarDecl* VD, SVal Idx) { return loc::MemRegionVal(ER); } +SVal RegionStoreManager::getLValueVar(const GRState* St, const VarDecl* VD) { + return loc::MemRegionVal(MRMgr.getVarRegion(VD)); +} + +SVal RegionStoreManager::getLValueIvar(const GRState* St, const ObjCIvarDecl* D, + SVal Base) { + return UnknownVal(); +} + +SVal RegionStoreManager::getLValueField(const GRState* St, SVal Base, + const FieldDecl* D) { + if (Base.isUnknownOrUndef()) + return Base; + + Loc BaseL = cast<Loc>(Base); + const MemRegion* BaseR = 0; + + switch (BaseL.getSubKind()) { + case loc::MemRegionKind: + BaseR = cast<loc::MemRegionVal>(BaseL).getRegion(); + break; + + case loc::SymbolValKind: + BaseR = MRMgr.getSymbolicRegion(cast<loc::SymbolVal>(&BaseL)->getSymbol()); + break; + + case loc::GotoLabelKind: + case loc::FuncValKind: + // These are anormal cases. Flag an undefined value. + return UndefinedVal(); + + case loc::ConcreteIntKind: + case loc::StringLiteralValKind: + // While these seem funny, this can happen through casts. + // FIXME: What we should return is the field offset. For example, + // add the field offset to the integer value. That way funny things + // like this work properly: &(((struct foo *) 0xa)->f) + return Base; + + default: + assert("Unhandled Base."); + return Base; + } + + return loc::MemRegionVal(MRMgr.getFieldRegion(D, BaseR)); +} + SVal RegionStoreManager::Retrieve(Store S, Loc L, QualType T) { assert(!isa<UnknownVal>(L) && "location unknown"); assert(!isa<UndefinedVal>(L) && "location undefined"); |

