diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-11-12 19:18:35 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-11-12 19:18:35 +0000 |
commit | 42577d145e2c6c3f77731645d442faa716f4c852 (patch) | |
tree | 628f564ac0c50efee088c8c215d4973d47be5e45 /lib/Analysis/BasicStore.cpp | |
parent | eb8f3063257a392f15aea48d42fb73ec51afc548 (diff) |
StoreManager::BindDecl now takes an SVal* for the initialization value instead of an Expr* (which can be null). Lazy symbolication of conjured symbols is now the sole responsibility of GRExprEngine.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59151 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/BasicStore.cpp')
-rw-r--r-- | lib/Analysis/BasicStore.cpp | 27 |
1 files changed, 8 insertions, 19 deletions
diff --git a/lib/Analysis/BasicStore.cpp b/lib/Analysis/BasicStore.cpp index be9f4fdd12..16c35ea7ac 100644 --- a/lib/Analysis/BasicStore.cpp +++ b/lib/Analysis/BasicStore.cpp @@ -76,8 +76,7 @@ public: void iterBindings(Store store, BindingsHandler& f); - Store BindDecl(Store store, const VarDecl* VD, Expr* Ex, - SVal InitVal = UndefinedVal(), unsigned Count = 0); + Store BindDecl(Store store, const VarDecl* VD, SVal* InitVal, unsigned Count); static inline VarBindingsTy GetVarBindings(Store store) { return VarBindingsTy(static_cast<const VarBindingsTy::TreeTy*>(store)); @@ -358,11 +357,11 @@ Store BasicStoreManager::getInitialStore() { return St; } -Store BasicStoreManager::BindDecl(Store store, const VarDecl* VD, Expr* Ex, - SVal InitVal, unsigned Count) { +Store BasicStoreManager::BindDecl(Store store, const VarDecl* VD, + SVal* InitVal, unsigned Count) { + BasicValueFactory& BasicVals = StateMgr.getBasicVals(); - SymbolManager& SymMgr = StateMgr.getSymbolManager(); - + // BasicStore does not model arrays and structs. if (VD->getType()->isArrayType() || VD->getType()->isStructureType()) return store; @@ -386,7 +385,7 @@ Store BasicStoreManager::BindDecl(Store store, const VarDecl* VD, Expr* Ex, // —if it has pointer type, it is initialized to a null pointer; // —if it has arithmetic type, it is initialized to (positive or // unsigned) zero; - if (!Ex) { + if (!InitVal) { QualType T = VD->getType(); if (Loc::IsLocType(T)) store = Bind(store, getLoc(VD), @@ -398,24 +397,14 @@ Store BasicStoreManager::BindDecl(Store store, const VarDecl* VD, Expr* Ex, // assert(0 && "ignore other types of variables"); } } else { - store = Bind(store, getLoc(VD), InitVal); + store = Bind(store, getLoc(VD), *InitVal); } } } else { // Process local scalar variables. QualType T = VD->getType(); if (Loc::IsLocType(T) || T->isIntegerType()) { - SVal V = Ex ? InitVal : UndefinedVal(); - - if (Ex && InitVal.isUnknown()) { - // EXPERIMENTAL: "Conjured" symbols. - SymbolID Sym = SymMgr.getConjuredSymbol(Ex, Count); - - V = Loc::IsLocType(Ex->getType()) - ? cast<SVal>(loc::SymbolVal(Sym)) - : cast<SVal>(nonloc::SymbolVal(Sym)); - } - + SVal V = InitVal ? *InitVal : UndefinedVal(); store = Bind(store, getLoc(VD), V); } } |