[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