diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-08-25 19:33:03 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-08-25 19:33:03 +0000 |
commit | d0c4b28aa9e1a0754d71dc61c37cda94bc8d27ed (patch) | |
tree | 132e38f1aaaff8d10d9e3c5ca67092fee2bb0eb3 /lib/Analysis/BasicStore.cpp | |
parent | 1fe379f0fa6fbc0a6057e8966253aea2957ca953 (diff) |
Added 'extents' for Regions.
Added 'getExtent()' to StoreManager.
Implemented 'getExtent()' for BasicStoreManager.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55321 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/BasicStore.cpp')
-rw-r--r-- | lib/Analysis/BasicStore.cpp | 43 |
1 files changed, 17 insertions, 26 deletions
diff --git a/lib/Analysis/BasicStore.cpp b/lib/Analysis/BasicStore.cpp index 2ed89c6f7d..c2482bcd3b 100644 --- a/lib/Analysis/BasicStore.cpp +++ b/lib/Analysis/BasicStore.cpp @@ -25,9 +25,12 @@ namespace { class VISIBILITY_HIDDEN BasicStoreManager : public StoreManager { typedef llvm::ImmutableMap<VarDecl*,RVal> VarBindingsTy; VarBindingsTy::Factory VBFactory; + ASTContext& C; public: - BasicStoreManager(llvm::BumpPtrAllocator& A) : VBFactory(A) {} + BasicStoreManager(llvm::BumpPtrAllocator& A, ASTContext& c) + : VBFactory(A), C(c) {} + virtual ~BasicStoreManager() {} virtual RVal GetRVal(Store St, LVal LV, QualType T); @@ -51,13 +54,23 @@ public: virtual void print(Store store, std::ostream& Out, const char* nl, const char *sep); + + virtual RegionExtent getExtent(GRStateManager& SM, Region R); }; } // end anonymous namespace -StoreManager* clang::CreateBasicStoreManager(llvm::BumpPtrAllocator& A) { - return new BasicStoreManager(A); +StoreManager* clang::CreateBasicStoreManager(llvm::BumpPtrAllocator& A, + ASTContext& C) { + return new BasicStoreManager(A, C); +} + +RegionExtent BasicStoreManager::getExtent(GRStateManager& SM, Region R) { + if (VarRegion *VR = dyn_cast<VarRegion>(&R)) + return VR->getExtent(SM.getBasicVals()); + + return UnknownExtent(); } RVal BasicStoreManager::GetRVal(Store St, LVal LV, QualType T) { @@ -75,30 +88,8 @@ RVal BasicStoreManager::GetRVal(Store St, LVal LV, QualType T) { return T ? *T : UnknownVal(); } - case lval::SymbolValKind: { - - // FIXME: This is a broken representation of memory, and is prone - // to crashing the analyzer when addresses to symbolic values are - // passed through casts. We need a better representation of symbolic - // memory (or just memory in general); probably we should do this - // as a plugin class (similar to GRTransferFuncs). - -#if 0 - const lval::SymbolVal& SV = cast<lval::SymbolVal>(LV); - assert (T.getTypePtr()); - - // Punt on "symbolic" function pointers. - if (T->isFunctionType()) - return UnknownVal(); - - if (T->isPointerType()) - return lval::SymbolVal(SymMgr.getContentsOfSymbol(SV.getSymbol())); - else - return nonlval::SymbolVal(SymMgr.getContentsOfSymbol(SV.getSymbol())); -#endif - + case lval::SymbolValKind: return UnknownVal(); - } case lval::ConcreteIntKind: // Some clients may call GetRVal with such an option simply because |