Initial support for pointer arithmetic. Only support concrete indexes and

offsets for now.

llvm-svn: 65814
This commit is contained in:
Zhongxing Xu
2009-03-02 07:52:23 +00:00
parent b3921bf12e
commit e7d1493216
3 changed files with 36 additions and 1 deletions

View File

@@ -170,6 +170,8 @@ public:
CastResult CastRegion(const GRState* state, const MemRegion* R,
QualType CastToTy);
SVal EvalBinOp(BinaryOperator::Opcode Op, Loc L, NonLoc R);
/// The high level logic for this method is this:
/// Retrieve (L)
/// if L has binding
@@ -551,6 +553,33 @@ RegionStoreManager::CastRegion(const GRState* state, const MemRegion* R,
return CastResult(AddRegionView(state, ViewR, R), ViewR);
}
SVal RegionStoreManager::EvalBinOp(BinaryOperator::Opcode Op, Loc L, NonLoc R) {
// Assume the base location is MemRegionVal(ElementRegion).
if (!isa<loc::MemRegionVal>(L)) {
return UnknownVal();
}
const MemRegion* MR = cast<loc::MemRegionVal>(L).getRegion();
const ElementRegion* ER = cast<ElementRegion>(MR);
SVal Idx = ER->getIndex();
nonloc::ConcreteInt* Base = dyn_cast<nonloc::ConcreteInt>(&Idx);
nonloc::ConcreteInt* Offset = dyn_cast<nonloc::ConcreteInt>(&R);
// Only support concrete integer indexes for now.
if (Base && Offset) {
SVal NewIdx = Base->EvalBinOp(getBasicVals(), Op, *Offset);
const MemRegion* NewER = MRMgr.getElementRegion(NewIdx,
ER->getArrayRegion());
return Loc::MakeVal(NewER);
} else
return UnknownVal();
}
SVal RegionStoreManager::Retrieve(const GRState* St, Loc L, QualType T) {
assert(!isa<UnknownVal>(L) && "location unknown");
assert(!isa<UndefinedVal>(L) && "location undefined");