зеркало из https://github.com/microsoft/clang-1.git
Remove another dependency on GRStateRef.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@73667 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
c19ee3eb08
Коммит
3a77203689
|
@ -159,6 +159,10 @@ public:
|
|||
BasicValueFactory &getBasicVals() const;
|
||||
SymbolManager &getSymbolManager() const;
|
||||
|
||||
const GRState *bind(Loc location, SVal V) const;
|
||||
|
||||
const GRState *bind(SVal location, SVal V) const;
|
||||
|
||||
SVal getLValue(const VarDecl* VD) const;
|
||||
|
||||
SVal getSVal(Expr* Ex) const;
|
||||
|
@ -173,6 +177,8 @@ public:
|
|||
|
||||
SVal getSValAsScalarOrLoc(const MemRegion *R) const;
|
||||
|
||||
template <typename CB> CB scanReachableSymbols(SVal val) const;
|
||||
|
||||
// Trait based GDM dispatch.
|
||||
void* const* FindGDM(void* K) const;
|
||||
|
||||
|
@ -195,6 +201,14 @@ public:
|
|||
template <typename T>
|
||||
typename GRStateTrait<T>::context_type get_context() const;
|
||||
|
||||
|
||||
template<typename T>
|
||||
const GRState *remove(typename GRStateTrait<T>::key_type K) const;
|
||||
|
||||
template<typename T>
|
||||
const GRState *remove(typename GRStateTrait<T>::key_type K,
|
||||
typename GRStateTrait<T>::context_type C) const;
|
||||
|
||||
template<typename T>
|
||||
const GRState *set(typename GRStateTrait<T>::data_type D) const;
|
||||
|
||||
|
@ -717,6 +731,14 @@ public:
|
|||
// Out-of-line method definitions for GRState.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
inline const GRState *GRState::bind(Loc LV, SVal V) const {
|
||||
return Mgr->BindLoc(this, LV, V);
|
||||
}
|
||||
|
||||
inline const GRState *GRState::bind(SVal LV, SVal V) const {
|
||||
return !isa<Loc>(LV) ? this : bind(cast<Loc>(LV), V);
|
||||
}
|
||||
|
||||
inline SVal GRState::getLValue(const VarDecl* VD) const {
|
||||
return Mgr->GetLValue(this, VD);
|
||||
}
|
||||
|
@ -763,6 +785,17 @@ typename GRStateTrait<T>::context_type GRState::get_context() const {
|
|||
return Mgr->get_context<T>();
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
const GRState *GRState::remove(typename GRStateTrait<T>::key_type K) const {
|
||||
return Mgr->remove<T>(this, K, get_context<T>());
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
const GRState *GRState::remove(typename GRStateTrait<T>::key_type K,
|
||||
typename GRStateTrait<T>::context_type C) const {
|
||||
return Mgr->remove<T>(this, K, C);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
const GRState *GRState::set(typename GRStateTrait<T>::data_type D) const {
|
||||
return Mgr->set<T>(this, D);
|
||||
|
@ -781,6 +814,13 @@ const GRState *GRState::set(typename GRStateTrait<T>::key_type K,
|
|||
return Mgr->set<T>(this, K, E, C);
|
||||
}
|
||||
|
||||
template <typename CB>
|
||||
CB GRState::scanReachableSymbols(SVal val) const {
|
||||
CB cb(this);
|
||||
Mgr->scanReachableSymbols(val, this, cb);
|
||||
return cb;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// GRStateRef - A "fat" reference to GRState that also bundles GRStateManager.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -3114,17 +3114,15 @@ void CFRefCount::EvalObjCMessageExpr(ExplodedNodeSet<GRState>& Dst,
|
|||
|
||||
namespace {
|
||||
class VISIBILITY_HIDDEN StopTrackingCallback : public SymbolVisitor {
|
||||
GRStateRef state;
|
||||
const GRState *state;
|
||||
public:
|
||||
StopTrackingCallback(GRStateRef st) : state(st) {}
|
||||
GRStateRef getState() { return state; }
|
||||
StopTrackingCallback(const GRState *st) : state(st) {}
|
||||
const GRState *getState() const { return state; }
|
||||
|
||||
bool VisitSymbol(SymbolRef sym) {
|
||||
state = state.remove<RefBindings>(sym);
|
||||
state = state->remove<RefBindings>(sym);
|
||||
return true;
|
||||
}
|
||||
|
||||
const GRState* getState() const { return state.getState(); }
|
||||
};
|
||||
} // end anonymous namespace
|
||||
|
||||
|
@ -3139,7 +3137,7 @@ void CFRefCount::EvalBind(GRStmtNodeBuilderRef& B, SVal location, SVal val) {
|
|||
// (2) we are binding to a memregion that does not have stack storage
|
||||
// (3) we are binding to a memregion with stack storage that the store
|
||||
// does not understand.
|
||||
GRStateRef state = B.getState();
|
||||
const GRState *state = B.getState();
|
||||
|
||||
if (!isa<loc::MemRegionVal>(location))
|
||||
escapes = true;
|
||||
|
@ -3151,7 +3149,7 @@ void CFRefCount::EvalBind(GRStmtNodeBuilderRef& B, SVal location, SVal val) {
|
|||
// To test (3), generate a new state with the binding removed. If it is
|
||||
// the same state, then it escapes (since the store cannot represent
|
||||
// the binding).
|
||||
escapes = (state == (state.BindLoc(cast<Loc>(location), UnknownVal())));
|
||||
escapes = (state == (state->bind(cast<Loc>(location), UnknownVal())));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3163,10 +3161,9 @@ void CFRefCount::EvalBind(GRStmtNodeBuilderRef& B, SVal location, SVal val) {
|
|||
|
||||
// Otherwise, find all symbols referenced by 'val' that we are tracking
|
||||
// and stop tracking them.
|
||||
B.MakeNode(state.scanReachableSymbols<StopTrackingCallback>(val).getState());
|
||||
B.MakeNode(state->scanReachableSymbols<StopTrackingCallback>(val).getState());
|
||||
}
|
||||
|
||||
|
||||
// Return statements.
|
||||
|
||||
void CFRefCount::EvalReturn(ExplodedNodeSet<GRState>& Dst,
|
||||
|
|
Загрузка…
Ссылка в новой задаче