[cfe-commits] r68731 - in /cfe/trunk: include/clang/Analysis/PathSensitive/GRState.h include/clang/Analysis/PathSensitive/SVals.h include/clang/Analysis/PathSensitive/Store.h include/clang/Analysis/PathSensitive/ValueManager.h lib/Analysis/BasicStore.cpp lib/Analysis/CFRefCount.cpp lib/Analysis/GRExprEngine.cpp lib/Analysis/GRSimpleVals.cpp lib/Analysis/RegionStore.cpp lib/Analysis/SVals.cpp
Ted Kremenek
kremenek at apple.com
Thu Apr 9 15:22:45 PDT 2009
Author: kremenek
Date: Thu Apr 9 17:22:44 2009
New Revision: 68731
URL: http://llvm.org/viewvc/llvm-project?rev=68731&view=rev
Log:
- Move ownership of MemRegionManager into ValueManager.
- Pull SVal::GetConjuredSymbol() and friends into ValueManager. This greatly
simplifies the calling interface to clients.
Modified:
cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h
cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h
cfe/trunk/include/clang/Analysis/PathSensitive/Store.h
cfe/trunk/include/clang/Analysis/PathSensitive/ValueManager.h
cfe/trunk/lib/Analysis/BasicStore.cpp
cfe/trunk/lib/Analysis/CFRefCount.cpp
cfe/trunk/lib/Analysis/GRExprEngine.cpp
cfe/trunk/lib/Analysis/GRSimpleVals.cpp
cfe/trunk/lib/Analysis/RegionStore.cpp
cfe/trunk/lib/Analysis/SVals.cpp
Modified: cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h?rev=68731&r1=68730&r2=68731&view=diff
==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h Thu Apr 9 17:22:44 2009
@@ -310,9 +310,6 @@
Liveness(L) {
StoreMgr.reset((*CreateStoreManager)(*this));
ConstraintMgr.reset((*CreateConstraintManager)(*this));
-
- // FIXME: Have ValueMgr own the MemRegionManager, not StoreManager.
- ValueMgr.setRegionManager(StoreMgr->getRegionManager());
}
~GRStateManager();
Modified: cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h?rev=68731&r1=68730&r2=68731&view=diff
==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h Thu Apr 9 17:22:44 2009
@@ -72,15 +72,6 @@
return !(*this == R);
}
- /// GetRValueSymbolVal - make a unique symbol for value of R.
- static SVal GetRValueSymbolVal(SymbolManager& SymMgr, MemRegionManager& MRMgr,
- const MemRegion* R);
-
- static SVal GetConjuredSymbolVal(SymbolManager& SymMgr, MemRegionManager&,
- const Expr *E, unsigned Count);
- static SVal GetConjuredSymbolVal(SymbolManager &SymMgr, MemRegionManager&,
- const Expr* E, QualType T, unsigned Count);
-
inline bool isUnknown() const {
return getRawKind() == UnknownKind;
}
Modified: cfe/trunk/include/clang/Analysis/PathSensitive/Store.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/Store.h?rev=68731&r1=68730&r2=68731&view=diff
==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/Store.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/Store.h Thu Apr 9 17:22:44 2009
@@ -16,6 +16,7 @@
#include "clang/Analysis/PathSensitive/SVals.h"
#include "clang/Analysis/PathSensitive/MemRegion.h"
+#include "clang/Analysis/PathSensitive/ValueManager.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/DenseSet.h"
@@ -35,10 +36,13 @@
class StoreManager {
protected:
+ ValueManager &ValMgr;
+
/// MRMgr - Manages region objects associated with this StoreManager.
- MemRegionManager MRMgr;
+ MemRegionManager &MRMgr;
- StoreManager(llvm::BumpPtrAllocator& Alloc) : MRMgr(Alloc) {}
+ StoreManager(ValueManager &valMgr)
+ : ValMgr(valMgr), MRMgr(ValMgr.getRegionManager()) {}
public:
virtual ~StoreManager() {}
Modified: cfe/trunk/include/clang/Analysis/PathSensitive/ValueManager.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/ValueManager.h?rev=68731&r1=68730&r2=68731&view=diff
==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/ValueManager.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/ValueManager.h Thu Apr 9 17:22:44 2009
@@ -22,11 +22,9 @@
#include "clang/Analysis/PathSensitive/SymbolManager.h"
namespace llvm { class BumpPtrAllocator; }
-namespace clang { class GRStateManager; }
namespace clang {
class ValueManager {
- friend class GRStateManager;
ASTContext &Context;
BasicValueFactory BasicVals;
@@ -34,16 +32,14 @@
/// SymMgr - Object that manages the symbol information.
SymbolManager SymMgr;
- // FIXME: Eventually ValueManager will own this object.
- MemRegionManager *MemMgr;
- void setRegionManager(MemRegionManager& mm) { MemMgr = &mm; }
+ MemRegionManager MemMgr;
public:
ValueManager(llvm::BumpPtrAllocator &alloc, ASTContext &context)
: Context(context), BasicVals(Context, alloc),
SymMgr(Context, BasicVals, alloc),
- MemMgr(0) {}
+ MemMgr(alloc) {}
// Accessors to submanagers.
@@ -56,8 +52,8 @@
SymbolManager &getSymbolManager() { return SymMgr; }
const SymbolManager &getSymbolManager() const { return SymMgr; }
- MemRegionManager &getRegionManager() { return *MemMgr; }
- const MemRegionManager &getRegionManager() const { return *MemMgr; }
+ MemRegionManager &getRegionManager() { return MemMgr; }
+ const MemRegionManager &getRegionManager() const { return MemMgr; }
// Forwarding methods to SymbolManager.
@@ -75,11 +71,17 @@
// Aggregation methods that use multiple submanagers.
Loc makeRegionVal(SymbolRef Sym) {
- return Loc::MakeVal(MemMgr->getSymbolicRegion(Sym));
+ return Loc::MakeVal(MemMgr.getSymbolicRegion(Sym));
}
/// makeZeroVal - Construct an SVal representing '0' for the specified type.
SVal makeZeroVal(QualType T);
+
+ /// GetRValueSymbolVal - make a unique symbol for value of R.
+ SVal getRValueSymbolVal(const MemRegion* R);
+
+ SVal getConjuredSymbolVal(const Expr *E, unsigned Count);
+ SVal getConjuredSymbolVal(const Expr* E, QualType T, unsigned Count);
};
} // end clang namespace
#endif
Modified: cfe/trunk/lib/Analysis/BasicStore.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/BasicStore.cpp?rev=68731&r1=68730&r2=68731&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/BasicStore.cpp (original)
+++ cfe/trunk/lib/Analysis/BasicStore.cpp Thu Apr 9 17:22:44 2009
@@ -40,7 +40,7 @@
public:
BasicStoreManager(GRStateManager& mgr)
- : StoreManager(mgr.getAllocator()),
+ : StoreManager(mgr.getValueManager()),
VBFactory(mgr.getAllocator()),
StateMgr(mgr),
SelfRegion(0) {}
@@ -478,11 +478,8 @@
if (const DeclRefExpr *DR = dyn_cast<DeclRefExpr>(Base)) {
if (DR->getDecl() == SelfDecl) {
const MemRegion *IVR = MRMgr.getObjCIvarRegion(IV->getDecl(),
- SelfRegion);
-
- SVal X = SVal::GetRValueSymbolVal(StateMgr.getSymbolManager(),
- MRMgr, IVR);
-
+ SelfRegion);
+ SVal X = ValMgr.getRValueSymbolVal(IVR);
St = BindInternal(St, Loc::MakeVal(IVR), X);
}
}
@@ -538,7 +535,7 @@
const MemRegion *R = StateMgr.getRegion(VD);
SVal X = (VD->hasGlobalStorage() || isa<ParmVarDecl>(VD) ||
isa<ImplicitParamDecl>(VD))
- ? SVal::GetRValueSymbolVal(StateMgr.getSymbolManager(), MRMgr,R)
+ ? ValMgr.getRValueSymbolVal(R)
: UndefinedVal();
St = BindInternal(St, Loc::MakeVal(R), X);
Modified: cfe/trunk/lib/Analysis/CFRefCount.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFRefCount.cpp?rev=68731&r1=68730&r2=68731&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/CFRefCount.cpp (original)
+++ cfe/trunk/lib/Analysis/CFRefCount.cpp Thu Apr 9 17:22:44 2009
@@ -1760,8 +1760,8 @@
QualType T = R->getRValueType(Ctx);
if (Loc::IsLocType(T) || (T->isIntegerType() && T->isScalarType())){
- SVal V = SVal::GetConjuredSymbolVal(Eng.getSymbolManager(),
- Eng.getStoreManager().getRegionManager(), *I, T, Count);
+ ValueManager &ValMgr = Eng.getValueManager();
+ SVal V = ValMgr.getConjuredSymbolVal(*I, T, Count);
state = state.BindLoc(Loc::MakeVal(R), V);
}
else if (const RecordType *RT = T->getAsStructureType()) {
@@ -1787,13 +1787,10 @@
QualType FT = FD->getType();
if (Loc::IsLocType(FT) ||
- (FT->isIntegerType() && FT->isScalarType())) {
-
+ (FT->isIntegerType() && FT->isScalarType())) {
const FieldRegion* FR = MRMgr.getFieldRegion(FD, R);
-
- SVal V = SVal::GetConjuredSymbolVal(Eng.getSymbolManager(),
- Eng.getStoreManager().getRegionManager(), *I, FT, Count);
-
+ ValueManager &ValMgr = Eng.getValueManager();
+ SVal V = ValMgr.getConjuredSymbolVal(*I, FT, Count);
state = state.BindLoc(Loc::MakeVal(FR), V);
}
}
@@ -1857,8 +1854,8 @@
if (Loc::IsLocType(T) || (T->isIntegerType() && T->isScalarType())) {
unsigned Count = Builder.getCurrentBlockCount();
- SVal X = SVal::GetConjuredSymbolVal(Eng.getSymbolManager(),
- Eng.getStoreManager().getRegionManager(), Ex, T, Count);
+ ValueManager &ValMgr = Eng.getValueManager();
+ SVal X = ValMgr.getConjuredSymbolVal(Ex, T, Count);
state = state.BindExpr(Ex, X, false);
}
Modified: cfe/trunk/lib/Analysis/GRExprEngine.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRExprEngine.cpp?rev=68731&r1=68730&r2=68731&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/GRExprEngine.cpp (original)
+++ cfe/trunk/lib/Analysis/GRExprEngine.cpp Thu Apr 9 17:22:44 2009
@@ -2139,8 +2139,7 @@
// UnknownVal.
if (InitVal.isUnknown() ||
!getConstraintManager().canReasonAbout(InitVal)) {
- InitVal = SVal::GetConjuredSymbolVal(SymMgr,
- getStoreManager().getRegionManager(), InitEx, Count);
+ InitVal = ValMgr.getConjuredSymbolVal(InitEx, Count);
}
state = StateMgr.BindDecl(state, VD, InitVal);
@@ -2531,9 +2530,8 @@
// Conjure a new symbol if necessary to recover precision.
if (Result.isUnknown() || !getConstraintManager().canReasonAbout(Result))
- Result = SVal::GetConjuredSymbolVal(SymMgr,
- getStoreManager().getRegionManager(),Ex,
- Builder->getCurrentBlockCount());
+ Result = ValMgr.getConjuredSymbolVal(Ex,
+ Builder->getCurrentBlockCount());
state = BindExpr(state, U, U->isPostfix() ? V2 : Result);
@@ -2758,10 +2756,8 @@
!getConstraintManager().canReasonAbout(RightV))
&& (Loc::IsLocType(T) ||
(T->isScalarType() && T->isIntegerType()))) {
- unsigned Count = Builder->getCurrentBlockCount();
-
- RightV = SVal::GetConjuredSymbolVal(SymMgr,
- getStoreManager().getRegionManager(), B->getRHS(), Count);
+ unsigned Count = Builder->getCurrentBlockCount();
+ RightV = ValMgr.getConjuredSymbolVal(B->getRHS(), Count);
}
// Simulate the effects of a "store": bind the value of the RHS
@@ -2932,8 +2928,7 @@
// The symbolic value is actually for the type of the left-hand side
// expression, not the computation type, as this is the value the
// LValue on the LHS will bind to.
- LHSVal = SVal::GetConjuredSymbolVal(SymMgr,
- getStoreManager().getRegionManager(), B->getRHS(), LTy, Count);
+ LHSVal = ValMgr.getConjuredSymbolVal(B->getRHS(), LTy, Count);
// However, we need to convert the symbol to the computation type.
Result = (LTy == CTy) ? LHSVal : EvalCast(LHSVal,CTy);
Modified: cfe/trunk/lib/Analysis/GRSimpleVals.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRSimpleVals.cpp?rev=68731&r1=68730&r2=68731&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/GRSimpleVals.cpp (original)
+++ cfe/trunk/lib/Analysis/GRSimpleVals.cpp Thu Apr 9 17:22:44 2009
@@ -449,10 +449,7 @@
QualType T = CE->getType();
if (Loc::IsLocType(T) || (T->isIntegerType() && T->isScalarType())) {
unsigned Count = Builder.getCurrentBlockCount();
-
- SVal X = SVal::GetConjuredSymbolVal(Eng.getSymbolManager(),
- Eng.getStoreManager().getRegionManager(), CE, Count);
-
+ SVal X = Eng.getValueManager().getConjuredSymbolVal(CE, Count);
St = StateMgr.BindExpr(St, CE, X, Eng.getCFG().isBlkExpr(CE), false);
}
Modified: cfe/trunk/lib/Analysis/RegionStore.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/RegionStore.cpp?rev=68731&r1=68730&r2=68731&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/RegionStore.cpp (original)
+++ cfe/trunk/lib/Analysis/RegionStore.cpp Thu Apr 9 17:22:44 2009
@@ -148,7 +148,7 @@
public:
RegionStoreManager(GRStateManager& mgr)
- : StoreManager(mgr.getAllocator()),
+ : StoreManager(mgr.getValueManager()),
RBFactory(mgr.getAllocator()),
RVFactory(mgr.getAllocator()),
StateMgr(mgr), SelfRegion(0), SelfDecl(0) {
@@ -159,8 +159,6 @@
virtual ~RegionStoreManager() {}
- MemRegionManager& getRegionManager() { return MRMgr; }
-
SubRegionMap* getSubRegionMap(const GRState *state);
const GRState* BindCompoundLiteral(const GRState* St,
@@ -756,7 +754,7 @@
if (SR == SelfRegion) {
// FIXME: Do we need to handle the case where the super region
// has a view? We want to canonicalize the bindings.
- return SVal::GetRValueSymbolVal(getSymbolManager(), MRMgr, R);
+ return ValMgr.getRValueSymbolVal(R);
}
// Otherwise, we need a new symbol. For now return Unknown.
@@ -778,7 +776,7 @@
VD->hasGlobalStorage()) {
QualType VTy = VD->getType();
if (Loc::IsLocType(VTy) || VTy->isIntegerType())
- return SVal::GetRValueSymbolVal(getSymbolManager(), MRMgr, VR);
+ return ValMgr.getRValueSymbolVal(VR);
else
return UnknownVal();
}
@@ -794,7 +792,7 @@
// All other integer values are symbolic.
if (Loc::IsLocType(RTy) || RTy->isIntegerType())
- return SVal::GetRValueSymbolVal(getSymbolManager(), MRMgr, R);
+ return ValMgr.getRValueSymbolVal(R);
else
return UnknownVal();
}
@@ -833,7 +831,7 @@
if (MRMgr.onStack(FR) || MRMgr.onHeap(FR))
FieldValue = UndefinedVal();
else
- FieldValue = SVal::GetRValueSymbolVal(getSymbolManager(), MRMgr, FR);
+ FieldValue = ValMgr.getRValueSymbolVal(FR);
}
StructVal = getBasicVals().consVals(FieldValue, StructVal);
Modified: cfe/trunk/lib/Analysis/SVals.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/SVals.cpp?rev=68731&r1=68730&r2=68731&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/SVals.cpp (original)
+++ cfe/trunk/lib/Analysis/SVals.cpp Thu Apr 9 17:22:44 2009
@@ -280,15 +280,14 @@
return nonloc::CompoundVal(BasicVals.getCompoundValData(T, Vals));
}
-SVal SVal::GetRValueSymbolVal(SymbolManager& SymMgr, MemRegionManager& MRMgr,
- const MemRegion* R) {
+SVal ValueManager::getRValueSymbolVal(const MemRegion* R) {
SymbolRef sym = SymMgr.getRegionRValueSymbol(R);
if (const TypedRegion* TR = dyn_cast<TypedRegion>(R)) {
QualType T = TR->getRValueType(SymMgr.getContext());
if (Loc::IsLocType(T))
- return Loc::MakeVal(MRMgr.getSymbolicRegion(sym));
+ return Loc::MakeVal(MemMgr.getSymbolicRegion(sym));
// Only handle integers for now.
if (T->isIntegerType() && T->isScalarType())
@@ -298,13 +297,12 @@
return UnknownVal();
}
-SVal SVal::GetConjuredSymbolVal(SymbolManager &SymMgr, MemRegionManager& MRMgr,
- const Expr* E, unsigned Count) {
+SVal ValueManager::getConjuredSymbolVal(const Expr* E, unsigned Count) {
QualType T = E->getType();
SymbolRef sym = SymMgr.getConjuredSymbol(E, Count);
if (Loc::IsLocType(T))
- return Loc::MakeVal(MRMgr.getSymbolicRegion(sym));
+ return Loc::MakeVal(MemMgr.getSymbolicRegion(sym));
if (T->isIntegerType() && T->isScalarType())
return NonLoc::MakeVal(sym);
@@ -312,12 +310,13 @@
return UnknownVal();
}
-SVal SVal::GetConjuredSymbolVal(SymbolManager &SymMgr, MemRegionManager& MRMgr,
- const Expr* E, QualType T, unsigned Count) {
+SVal ValueManager::getConjuredSymbolVal(const Expr* E, QualType T,
+ unsigned Count) {
+
SymbolRef sym = SymMgr.getConjuredSymbol(E, T, Count);
if (Loc::IsLocType(T))
- return Loc::MakeVal(MRMgr.getSymbolicRegion(sym));
+ return Loc::MakeVal(MemMgr.getSymbolicRegion(sym));
if (T->isIntegerType() && T->isScalarType())
return NonLoc::MakeVal(sym);
More information about the cfe-commits
mailing list