using namespace clang;
-typedef llvm::ImmutableMap<const VarDecl*,SVal> VarBindingsTy;
+typedef llvm::ImmutableMap<const MemRegion*,SVal> VarBindingsTy;
namespace {
Store store = state->getStore();
VarBindingsTy B = GetVarBindings(store);
- VarBindingsTy::data_type* T = B.lookup(R->getDecl());
+ VarBindingsTy::data_type* T = B.lookup(R);
return T ? *T : UnknownVal();
}
VarBindingsTy B = GetVarBindings(store);
return V.isUnknown()
- ? VBFactory.Remove(B, R->getDecl()).getRoot()
- : VBFactory.Add(B, R->getDecl(), V).getRoot();
+ ? VBFactory.Remove(B, R).getRoot()
+ : VBFactory.Add(B, R, V).getRoot();
}
default:
assert ("SetSVal for given Loc type not yet implemented.");
return store;
VarBindingsTy B = GetVarBindings(store);
- return VBFactory.Remove(B,R->getDecl()).getRoot();
+ return VBFactory.Remove(B, R).getRoot();
}
default:
assert ("Remove for given Loc type not yet implemented.");
typedef SVal::symbol_iterator symbol_iterator;
// Iterate over the variable bindings.
- for (VarBindingsTy::iterator I=B.begin(), E=B.end(); I!=E ; ++I)
- if (SymReaper.isLive(Loc, I.getKey())) {
- RegionRoots.push_back(MRMgr.getVarRegion(I.getKey()));
+ for (VarBindingsTy::iterator I=B.begin(), E=B.end(); I!=E ; ++I) {
+ const VarRegion *VR = cast<VarRegion>(I.getKey());
+ if (SymReaper.isLive(Loc, VR->getDecl())) {
+ RegionRoots.push_back(VR);
SVal X = I.getData();
for (symbol_iterator SI=X.symbol_begin(), SE=X.symbol_end(); SI!=SE; ++SI)
SymReaper.markLive(*SI);
}
+ }
// Scan for live variables and live symbols.
llvm::SmallPtrSet<const VarRegion*, 10> Marked;
// Remove dead variable bindings.
for (VarBindingsTy::iterator I=B.begin(), E=B.end(); I!=E ; ++I) {
- const VarRegion* R = cast<VarRegion>(MRMgr.getVarRegion(I.getKey()));
+ const VarRegion* R = cast<VarRegion>(I.getKey());
if (!Marked.count(R)) {
store = Remove(store, Loc::MakeVal(R));
return store;
}
-void BasicStoreManager::print(Store store, std::ostream& Out,
+void BasicStoreManager::print(Store store, std::ostream& O,
const char* nl, const char *sep) {
+ llvm::raw_os_ostream Out(O);
VarBindingsTy B = GetVarBindings(store);
Out << "Variables:" << nl;
if (isFirst) isFirst = false;
else Out << nl;
- Out << ' ' << I.getKey()->getNameAsString() << " : ";
+ Out << ' ' << I.getKey() << " : ";
I.getData().print(Out);
}
}
void BasicStoreManager::iterBindings(Store store, BindingsHandler& f) {
VarBindingsTy B = GetVarBindings(store);
- for (VarBindingsTy::iterator I=B.begin(), E=B.end(); I != E; ++I) {
+ for (VarBindingsTy::iterator I=B.begin(), E=B.end(); I != E; ++I)
+ f.HandleBinding(*this, store, I.getKey(), I.getData());
- f.HandleBinding(*this, store, MRMgr.getVarRegion(I.getKey()),I.getData());
- }
}
StoreManager::BindingsHandler::~BindingsHandler() {}
PathDiagnostic& pd, BugReporter& br)
: Sym(sym), PrevSt(prevst), S(s), VMgr(vmgr), Pred(pred), PD(pd), BR(br) {}
- bool HandleBinding(StoreManager& SMgr, Store store, MemRegion* R, SVal V) {
+ bool HandleBinding(StoreManager& SMgr, Store store,
+ const MemRegion* R, SVal V) {
SymbolRef ScanSym;
PathDiagnostic& pd)
: N(n), S(s), BR(br), PD(pd) {}
- bool HandleBinding(StoreManager& SMgr, Store store, MemRegion* R, SVal V) {
+ bool HandleBinding(StoreManager& SMgr, Store store,
+ const MemRegion* R, SVal V) {
SymbolRef ScanSym;
if (loc::SymbolVal* SV = dyn_cast<loc::SymbolVal>(&V))
class VISIBILITY_HIDDEN FindUniqueBinding :
public StoreManager::BindingsHandler {
SymbolRef Sym;
- MemRegion* Binding;
+ const MemRegion* Binding;
bool First;
public:
FindUniqueBinding(SymbolRef sym) : Sym(sym), Binding(0), First(true) {}
- bool HandleBinding(StoreManager& SMgr, Store store, MemRegion* R, SVal val) {
+ bool HandleBinding(StoreManager& SMgr, Store store, const MemRegion* R,
+ SVal val) {
SymbolRef SymV = val.getAsSymbol();
if (!SymV.isValid() || SymV != Sym)
}
operator bool() { return First && Binding; }
- MemRegion* getRegion() { return Binding; }
+ const MemRegion* getRegion() { return Binding; }
};
}