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 > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
