From: Zhongxing Xu Date: Thu, 13 Nov 2008 07:58:20 +0000 (+0000) Subject: Lift the pointer to alloca'ed region to the pointer to its first element. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6d82f9d3383e7f0fae93418a9a98f0c8e9a2d05b;p=clang 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 --- 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(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()))); }