forked from OSchip/llvm-project
Add 'MemRegion::getBaseRegion()', a utility method to strip ElementRegions with
index 0. This will be used for refinements to InvalidateRegion and CastRegion. llvm-svn: 77481
This commit is contained in:
parent
77268a56ff
commit
ccf3335939
|
@ -70,6 +70,8 @@ public:
|
|||
std::string getString() const;
|
||||
|
||||
const MemSpaceRegion *getMemorySpace() const;
|
||||
|
||||
const MemRegion *getBaseRegion() const;
|
||||
|
||||
bool hasStackStorage() const;
|
||||
|
||||
|
|
|
@ -371,6 +371,8 @@ public:
|
|||
return static_cast<MemRegion*>(Data);
|
||||
}
|
||||
|
||||
const MemRegion* getBaseRegion() const;
|
||||
|
||||
template <typename REGION>
|
||||
const REGION* getRegionAs() const {
|
||||
return llvm::dyn_cast<REGION>(getRegion());
|
||||
|
|
|
@ -398,3 +398,23 @@ const MemRegion *TypedViewRegion::removeViews() const {
|
|||
}
|
||||
return R;
|
||||
}
|
||||
|
||||
const MemRegion *MemRegion::getBaseRegion() const {
|
||||
const MemRegion *R = this;
|
||||
while (true) {
|
||||
if (const ElementRegion *ER = dyn_cast<ElementRegion>(R)) {
|
||||
// FIXME: generalize. Essentially we want to strip away ElementRegions
|
||||
// that were layered on a symbolic region because of casts. We only
|
||||
// want to strip away ElementRegions, however, where the index is 0.
|
||||
SVal index = ER->getIndex();
|
||||
if (nonloc::ConcreteInt *CI = dyn_cast<nonloc::ConcreteInt>(&index)) {
|
||||
if (CI->getValue().getZExtValue() == 0) {
|
||||
R = ER->getSuperRegion();
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
return R;
|
||||
}
|
||||
|
|
|
@ -72,7 +72,7 @@ const FunctionDecl* SVal::getAsFunctionDecl() const {
|
|||
// FIXME: should we consider SymbolRef wrapped in CodeTextRegion?
|
||||
SymbolRef SVal::getAsLocSymbol() const {
|
||||
if (const loc::MemRegionVal *X = dyn_cast<loc::MemRegionVal>(this)) {
|
||||
const MemRegion *R = X->getRegion();
|
||||
const MemRegion *R = X->getBaseRegion();
|
||||
|
||||
while (R) {
|
||||
// Blast through region views.
|
||||
|
@ -80,7 +80,6 @@ SymbolRef SVal::getAsLocSymbol() const {
|
|||
R = View->getSuperRegion();
|
||||
continue;
|
||||
}
|
||||
|
||||
if (const SymbolicRegion *SymR = dyn_cast<SymbolicRegion>(R))
|
||||
return SymR->getSymbol();
|
||||
|
||||
|
@ -121,6 +120,11 @@ const MemRegion *SVal::getAsRegion() const {
|
|||
return 0;
|
||||
}
|
||||
|
||||
const MemRegion *loc::MemRegionVal::getBaseRegion() const {
|
||||
const MemRegion *R = getRegion();
|
||||
return R ? R->getBaseRegion() : NULL;
|
||||
}
|
||||
|
||||
bool SVal::symbol_iterator::operator==(const symbol_iterator &X) const {
|
||||
return itr == X.itr;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue