diff options
Diffstat (limited to 'lib/Analysis')
-rw-r--r-- | lib/Analysis/BasicStore.cpp | 34 | ||||
-rw-r--r-- | lib/Analysis/GRExprEngine.cpp | 2 |
2 files changed, 23 insertions, 13 deletions
diff --git a/lib/Analysis/BasicStore.cpp b/lib/Analysis/BasicStore.cpp index c2482bcd3b..f05a041179 100644 --- a/lib/Analysis/BasicStore.cpp +++ b/lib/Analysis/BasicStore.cpp @@ -11,25 +11,26 @@ // //===----------------------------------------------------------------------===// -#include "clang/Analysis/Analyses/LiveVariables.h" #include "clang/Analysis/PathSensitive/BasicStore.h" +#include "clang/Analysis/Analyses/LiveVariables.h" #include "clang/Analysis/PathSensitive/GRState.h" #include "llvm/ADT/ImmutableMap.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/Streams.h" using namespace clang; +using store::Region; +using store::RegionExtent; namespace { class VISIBILITY_HIDDEN BasicStoreManager : public StoreManager { typedef llvm::ImmutableMap<VarDecl*,RVal> VarBindingsTy; VarBindingsTy::Factory VBFactory; - ASTContext& C; + GRStateManager& StMgr; public: - BasicStoreManager(llvm::BumpPtrAllocator& A, ASTContext& c) - : VBFactory(A), C(c) {} + BasicStoreManager(GRStateManager& mgr) : StMgr(mgr) {} virtual ~BasicStoreManager() {} @@ -55,24 +56,33 @@ public: virtual void print(Store store, std::ostream& Out, const char* nl, const char *sep); - virtual RegionExtent getExtent(GRStateManager& SM, Region R); + virtual RegionExtent getExtent(Region R); }; } // end anonymous namespace -StoreManager* clang::CreateBasicStoreManager(llvm::BumpPtrAllocator& A, - ASTContext& C) { - return new BasicStoreManager(A, C); +StoreManager* clang::CreateBasicStoreManager(GRStateManager& StMgr) { + return new BasicStoreManager(StMgr); } -RegionExtent BasicStoreManager::getExtent(GRStateManager& SM, Region R) { - if (VarRegion *VR = dyn_cast<VarRegion>(&R)) - return VR->getExtent(SM.getBasicVals()); +RegionExtent BasicStoreManager::getExtent(Region R) { + VarDecl* VD = (VarDecl*) R; + QualType T = VD->getType(); - return UnknownExtent(); + // FIXME: Add support for VLAs. This may require passing in additional + // information, or tracking a different region type. + if (!T.getTypePtr()->isConstantSizeType()) + return store::UnknownExtent(); + + ASTContext& C = StMgr.getContext(); + assert (!T->isObjCInterfaceType()); // @interface not a possible VarDecl type. + assert (T != C.VoidTy); // void not a possible VarDecl type. + return store::IntExtent(StMgr.getBasicVals().getValue(C.getTypeSize(T), + C.VoidPtrTy)); } + RVal BasicStoreManager::GetRVal(Store St, LVal LV, QualType T) { if (isa<UnknownVal>(LV)) diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp index affb02a962..90ff435f86 100644 --- a/lib/Analysis/GRExprEngine.cpp +++ b/lib/Analysis/GRExprEngine.cpp @@ -120,7 +120,7 @@ GRExprEngine::GRExprEngine(CFG& cfg, Decl& CD, ASTContext& Ctx, G(CoreEngine.getGraph()), Liveness(L), Builder(NULL), - StateMgr(G.getContext(), CreateBasicStoreManager(G.getAllocator(), Ctx), + StateMgr(G.getContext(), CreateBasicStoreManager, CreateBasicConstraintManager, G.getAllocator(), G.getCFG(), L), SymMgr(StateMgr.getSymbolManager()), CurrentStmt(NULL), |