diff options
author | Zhongxing Xu <xuzhongxing@gmail.com> | 2008-11-13 07:58:20 +0000 |
---|---|---|
committer | Zhongxing Xu <xuzhongxing@gmail.com> | 2008-11-13 07:58:20 +0000 |
commit | 6d82f9d3383e7f0fae93418a9a98f0c8e9a2d05b (patch) | |
tree | 94036748e45e23880747fad82d615d00ff36eabf /lib/Analysis/GRExprEngine.cpp | |
parent | 56af9773056eb064937c872845c0da6e3d46d4b4 (diff) |
Lift the pointer to alloca'ed region to the pointer to its first element.
This is required by some operations, e.g., *p = 1; p[0] = 1;.
Also set the AllocaRegion's type during the cast.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59232 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/GRExprEngine.cpp')
-rw-r--r-- | lib/Analysis/GRExprEngine.cpp | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp index 5ef2524964..76e356be4d 100644 --- a/lib/Analysis/GRExprEngine.cpp +++ b/lib/Analysis/GRExprEngine.cpp @@ -1277,7 +1277,7 @@ void GRExprEngine::VisitCallRec(CallExpr* CE, NodeTy* Pred, // FIXME: Refactor into StoreManager itself? MemRegionManager& RM = getStateManager().getRegionManager(); const MemRegion* R = - RM.getAllocaRegion(CE, Builder->getCurrentBlockCount()); + RM.getAllocaRegion(CE, Builder->getCurrentBlockCount()); MakeNode(Dst, CE, *DI, BindExpr(St, CE, loc::MemRegionVal(R))); continue; } @@ -1681,6 +1681,26 @@ void GRExprEngine::VisitCast(Expr* CastE, Expr* Ex, NodeTy* Pred, NodeSet& Dst){ continue; } + // Cast alloca'ed pointer to typed pointer. + if (isa<loc::MemRegionVal>(V)) { + if (const AllocaRegion* AR = + dyn_cast<AllocaRegion>(cast<loc::MemRegionVal>(V).getRegion())) { + + // Set the AllocaRegion's type. + const_cast<AllocaRegion*>(AR)->setType(T); + + // Set the CastExpr's value to a pointer to the first element. + MemRegionManager& RM = getStateManager().getRegionManager(); + + llvm::APSInt Zero(llvm::APInt::getNullValue(32), false); + SVal ZeroIdx(nonloc::ConcreteInt(getBasicVals().getValue(Zero))); + const ElementRegion* ER = RM.getElementRegion(ZeroIdx, AR); + + MakeNode(Dst, CastE, N, BindExpr(St, CastE, loc::MemRegionVal(ER))); + continue; + } + } + // All other cases. MakeNode(Dst, CastE, N, BindExpr(St, CastE, EvalCast(V, CastE->getType()))); } |