[cfe-commits] r58837 - in /cfe/trunk: include/clang/Analysis/PathSensitive/GRExprEngine.h include/clang/Analysis/PathSensitive/GRState.h include/clang/Analysis/PathSensitive/Store.h lib/Analysis/BasicStore.cpp lib/Analysis/GRExprEngine.cpp lib/Analysis/GRState.cpp lib/Analysis/RegionStore.cpp
Ted Kremenek
kremenek at apple.com
Fri Nov 7 07:34:26 PST 2008
Awesome Zhongxing! Looks great.
On Nov 7, 2008, at 2:38 AM, Zhongxing Xu wrote:
> Author: zhongxingxu
> Date: Fri Nov 7 04:38:33 2008
> New Revision: 58837
>
> URL: http://llvm.org/viewvc/llvm-project?rev=58837&view=rev
> Log:
> Finish the implementation of VisitCompoundLiteralExpr. As
> VisitInitListExpr is
> available, things get much simplified.
>
> One addition is that CompoundLiteralExpr can appear both in rvalue
> and lvalue
> context.
>
> Modified:
> cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h
> cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h
> cfe/trunk/include/clang/Analysis/PathSensitive/Store.h
> cfe/trunk/lib/Analysis/BasicStore.cpp
> cfe/trunk/lib/Analysis/GRExprEngine.cpp
> cfe/trunk/lib/Analysis/GRState.cpp
> cfe/trunk/lib/Analysis/RegionStore.cpp
>
> Modified: cfe/trunk/include/clang/Analysis/PathSensitive/
> GRExprEngine.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h?rev=58837&r1=58836&r2=58837&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h
> (original)
> +++ cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h
> Fri Nov 7 04:38:33 2008
> @@ -505,7 +505,7 @@
>
> /// VisitCompoundLiteralExpr - Transfer function logic for
> compound literals.
> void VisitCompoundLiteralExpr(CompoundLiteralExpr* CL, NodeTy* Pred,
> - NodeSet& Dst);
> + NodeSet& Dst, bool asLValue);
>
> /// VisitDeclRefExpr - Transfer function logic for DeclRefExprs.
> void VisitDeclRefExpr(DeclRefExpr* DR, NodeTy* Pred, NodeSet& Dst,
>
> Modified: cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h?rev=58837&r1=58836&r2=58837&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h
> (original)
> +++ cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h Fri
> Nov 7 04:38:33 2008
> @@ -336,8 +336,7 @@
> /// for the compound literal and 'BegInit' and 'EndInit'
> represent an
> /// array of initializer values.
> const GRState* BindCompoundLiteral(const GRState* state,
> - const CompoundLiteralRegion* R,
> - const SVal* BegInit, const
> SVal* EndInit);
> + const CompoundLiteralExpr* CL,
> SVal V);
>
> const GRState* RemoveDeadBindings(const GRState* St, Stmt* Loc,
> const LiveVariables& Liveness,
> @@ -369,7 +368,11 @@
> SVal GetLValue(const GRState* St, const StringLiteral* E) {
> return StoreMgr->getLValueString(St, E);
> }
> -
> +
> + SVal GetLValue(const GRState* St, const CompoundLiteralExpr* CL) {
> + return StoreMgr->getLValueCompoundLiteral(St, CL);
> + }
> +
> // Get the lvalue for an ivar reference.
> SVal GetLValue(const GRState* St, const ObjCIvarDecl* D, SVal
> Base) {
> return StoreMgr->getLValueIvar(St, D, Base);
>
> Modified: cfe/trunk/include/clang/Analysis/PathSensitive/Store.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/Store.h?rev=58837&r1=58836&r2=58837&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/include/clang/Analysis/PathSensitive/Store.h (original)
> +++ cfe/trunk/include/clang/Analysis/PathSensitive/Store.h Fri Nov
> 7 04:38:33 2008
> @@ -52,9 +52,8 @@
> /// in 'store' plus the bindings for the CompoundLiteral. 'R' is
> the region
> /// for the compound literal and 'BegInit' and 'EndInit'
> represent an
> /// array of initializer values.
> - virtual Store BindCompoundLiteral(Store store, const
> CompoundLiteralRegion* R,
> - const SVal* BegInit,
> - const SVal* EndInit) = 0;
> + virtual Store BindCompoundLiteral(Store store, const
> CompoundLiteralExpr* CL,
> + SVal V) = 0;
>
> virtual Store getInitialStore() = 0;
> virtual MemRegionManager& getRegionManager() = 0;
> @@ -62,6 +61,9 @@
> virtual SVal getLValueVar(const GRState* St, const VarDecl* VD) = 0;
>
> virtual SVal getLValueString(const GRState* St, const
> StringLiteral* S) = 0;
> +
> + virtual SVal getLValueCompoundLiteral(const GRState* St,
> + const CompoundLiteralExpr*
> CL) = 0;
>
> virtual SVal getLValueIvar(const GRState* St, const ObjCIvarDecl* D,
> SVal Base) = 0;
>
> Modified: cfe/trunk/lib/Analysis/BasicStore.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/BasicStore.cpp?rev=58837&r1=58836&r2=58837&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/lib/Analysis/BasicStore.cpp (original)
> +++ cfe/trunk/lib/Analysis/BasicStore.cpp Fri Nov 7 04:38:33 2008
> @@ -46,13 +46,15 @@
> return loc::MemRegionVal(MRMgr.getVarRegion(VD));
> }
>
> - Store BindCompoundLiteral(Store store, const
> CompoundLiteralRegion* R,
> - const SVal* BegInit, const SVal*
> EndInit) {
> + Store BindCompoundLiteral(Store store, const CompoundLiteralExpr*
> CL,
> + SVal V) {
> return store;
> }
>
> SVal getLValueVar(const GRState* St, const VarDecl* VD);
> SVal getLValueString(const GRState* St, const StringLiteral* S);
> + SVal getLValueCompoundLiteral(const GRState* St,
> + const CompoundLiteralExpr* CL);
> SVal getLValueIvar(const GRState* St, const ObjCIvarDecl* D, SVal
> Base);
> SVal getLValueField(const GRState* St, SVal Base, const FieldDecl*
> D);
> SVal getLValueElement(const GRState* St, SVal Base, SVal Offset);
> @@ -99,7 +101,12 @@
> const StringLiteral* S) {
> return loc::MemRegionVal(MRMgr.getStringRegion(S));
> }
> -
> +
> +SVal BasicStoreManager::getLValueCompoundLiteral(const GRState* St,
> + const
> CompoundLiteralExpr* CL){
> + return loc::MemRegionVal(MRMgr.getCompoundLiteralRegion(CL));
> +}
> +
> SVal BasicStoreManager::getLValueIvar(const GRState* St, const
> ObjCIvarDecl* D,
> SVal Base) {
> return UnknownVal();
>
> Modified: cfe/trunk/lib/Analysis/GRExprEngine.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRExprEngine.cpp?rev=58837&r1=58836&r2=58837&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/lib/Analysis/GRExprEngine.cpp (original)
> +++ cfe/trunk/lib/Analysis/GRExprEngine.cpp Fri Nov 7 04:38:33 2008
> @@ -329,6 +329,10 @@
> case Stmt::CompoundAssignOperatorClass:
> VisitBinaryOperator(cast<BinaryOperator>(S), Pred, Dst);
> break;
> +
> + case Stmt::CompoundLiteralExprClass:
> + VisitCompoundLiteralExpr(cast<CompoundLiteralExpr>(S), Pred,
> Dst, false);
> + break;
>
> case Stmt::ConditionalOperatorClass: { // '?' operator
> ConditionalOperator* C = cast<ConditionalOperator>(S);
> @@ -435,7 +439,7 @@
> return;
>
> case Stmt::CompoundLiteralExprClass:
> - VisitCompoundLiteralExpr(cast<CompoundLiteralExpr>(Ex), Pred,
> Dst);
> + VisitCompoundLiteralExpr(cast<CompoundLiteralExpr>(Ex), Pred,
> Dst, true);
> return;
>
> case Stmt::ObjCPropertyRefExprClass:
> @@ -1575,31 +1579,21 @@
> }
>
> void GRExprEngine::VisitCompoundLiteralExpr(CompoundLiteralExpr* CL,
> - NodeTy* Pred, NodeSet&
> Dst) {
> -
> - // FIXME: Can getInitializer() be NULL?
> + NodeTy* Pred, NodeSet&
> Dst,
> + bool asLValue) {
> InitListExpr* ILE = cast<InitListExpr>(CL->getInitializer()-
> >IgnoreParens());
> NodeSet Tmp;
> Visit(ILE, Pred, Tmp);
>
> for (NodeSet::iterator I = Tmp.begin(), EI = Tmp.end(); I!=EI; +
> +I) {
> - // Retrieve the initializer values from the environment and
> store them
> - // into a vector that will then be handed off to the Store.
> - const GRState* St = GetState(*I);
> - llvm::SmallVector<SVal, 10> IVals;
> - IVals.reserve(ILE->getNumInits());
> -
> - for (Stmt::child_iterator J=ILE->child_begin(), EJ=ILE-
> >child_end();
> - J!=EJ; ++J)
> - IVals.push_back(GetSVal(St, cast<Expr>(*J)));
> -
> - const CompoundLiteralRegion* R =
> - StateMgr.getRegionManager().getCompoundLiteralRegion(CL);
> -
> - assert (!IVals.empty() && "Initializer cannot be empty.");
> + const GRState* St = GetState(*I);
> + SVal ILV = GetSVal(St, ILE);
> + St = StateMgr.BindCompoundLiteral(St, CL, ILV);
>
> - St = StateMgr.BindCompoundLiteral(St, R, &IVals[0],
> &IVals[0]+IVals.size());
> - MakeNode(Dst, CL, *I, BindExpr(St, CL, loc::MemRegionVal(R)));
> + if (asLValue)
> + MakeNode(Dst, CL, *I, BindExpr(St, CL, StateMgr.GetLValue(St,
> CL)));
> + else
> + MakeNode(Dst, CL, *I, BindExpr(St, CL, ILV));
> }
> }
>
>
> Modified: cfe/trunk/lib/Analysis/GRState.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRState.cpp?rev=58837&r1=58836&r2=58837&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/lib/Analysis/GRState.cpp (original)
> +++ cfe/trunk/lib/Analysis/GRState.cpp Fri Nov 7 04:38:33 2008
> @@ -96,11 +96,10 @@
> /// array of initializer values.
> const GRState*
> GRStateManager::BindCompoundLiteral(const GRState* state,
> - const CompoundLiteralRegion* R,
> - const SVal* BegInit, const
> SVal* EndInit) {
> + const CompoundLiteralExpr* CL,
> SVal ILV) {
>
> Store oldStore = state->getStore();
> - Store newStore = StoreMgr->BindCompoundLiteral(oldStore, R,
> BegInit, EndInit);
> + Store newStore = StoreMgr->BindCompoundLiteral(oldStore, CL, ILV);
>
> if (newStore == oldStore)
> return state;
>
> Modified: cfe/trunk/lib/Analysis/RegionStore.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/RegionStore.cpp?rev=58837&r1=58836&r2=58837&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/lib/Analysis/RegionStore.cpp (original)
> +++ cfe/trunk/lib/Analysis/RegionStore.cpp Fri Nov 7 04:38:33 2008
> @@ -46,17 +46,12 @@
> return Retrieve(St, loc::MemRegionVal(R));
> }
>
> - Store BindCompoundLiteral(Store store, const
> CompoundLiteralRegion* R,
> - const SVal* BegInit, const SVal*
> EndInit) {
> -
> - // FIXME: Let's discuss how we want to do the mapping in
> RegionStore
> - // from CompoundLiteralRegion to values.
> - assert (false && "Not yet implemented.");
> - return store;
> - }
> + Store BindCompoundLiteral(Store store, const CompoundLiteralExpr*
> CL, SVal V);
>
> SVal getLValueString(const GRState* St, const StringLiteral* S);
>
> + SVal getLValueCompoundLiteral(const GRState* St, const
> CompoundLiteralExpr*);
> +
> SVal getLValueVar(const GRState* St, const VarDecl* VD);
>
> SVal getLValueIvar(const GRState* St, const ObjCIvarDecl* D, SVal
> Base);
> @@ -137,7 +132,12 @@
> SVal RegionStoreManager::getLValueVar(const GRState* St, const
> VarDecl* VD) {
> return loc::MemRegionVal(MRMgr.getVarRegion(VD));
> }
> -
> +
> +SVal RegionStoreManager::getLValueCompoundLiteral(const GRState* St,
> + const
> CompoundLiteralExpr* CL) {
> + return loc::MemRegionVal(MRMgr.getCompoundLiteralRegion(CL));
> +}
> +
> SVal RegionStoreManager::getLValueIvar(const GRState* St, const
> ObjCIvarDecl* D,
> SVal Base) {
> return UnknownVal();
> @@ -424,6 +424,14 @@
> return store;
> }
>
> +Store RegionStoreManager::BindCompoundLiteral(Store store,
> + const
> CompoundLiteralExpr* CL,
> + SVal V) {
> + CompoundLiteralRegion* R = MRMgr.getCompoundLiteralRegion(CL);
> + store = Bind(store, loc::MemRegionVal(R), V);
> + return store;
> +}
> +
> void RegionStoreManager::print(Store store, std::ostream& Out,
> const char* nl, const char *sep) {
> llvm::raw_os_ostream OS(Out);
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list