From 0dbeeaa886733e454531705ca17d0e8445dd529a Mon Sep 17 00:00:00 2001 From: Zhongxing Xu Date: Thu, 13 Nov 2008 07:58:20 +0000 Subject: [PATCH] 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. llvm-svn: 59232 --- clang/lib/Analysis/GRExprEngine.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/clang/lib/Analysis/GRExprEngine.cpp b/clang/lib/Analysis/GRExprEngine.cpp index 5ef2524964bf..76e356be4d3d 100644 --- a/clang/lib/Analysis/GRExprEngine.cpp +++ b/clang/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(V)) { + if (const AllocaRegion* AR = + dyn_cast(cast(V).getRegion())) { + + // Set the AllocaRegion's type. + const_cast(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()))); }