On Jan 30, 2012, at 6:18 PM, Argyrios Kyrtzidis wrote: > This was failing to compile, did you miss including a header ? > Reverted in r149336.
Oops, apologies, I hadn't checked with updated llvm; the revert has now been reverted! > > On Jan 30, 2012, at 4:57 PM, Ted Kremenek wrote: > >> Author: kremenek >> Date: Mon Jan 30 18:57:20 2012 >> New Revision: 149311 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=149311&view=rev >> Log: >> Convert ProgramStateRef to a smart pointer for managing the reference counts >> of ProgramStates. This leads to a slight memory >> improvement, and a simplification of the logic for managing ProgramState >> objects. >> >> Modified: >> cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h >> cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h >> >> cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState_Fwd.h >> cfe/trunk/lib/StaticAnalyzer/Core/Checker.cpp >> cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp >> cfe/trunk/lib/StaticAnalyzer/Core/ProgramState.cpp >> >> Modified: >> cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h?rev=149311&r1=149310&r2=149311&view=diff >> ============================================================================== >> --- >> cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h >> (original) >> +++ >> cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h >> Mon Jan 30 18:57:20 2012 >> @@ -119,14 +119,11 @@ >> explicit ExplodedNode(const ProgramPoint &loc, ProgramStateRef state, >> bool IsSink) >> : Location(loc), State(state) { >> - const_cast<ProgramState*>(State)->incrementReferenceCount(); >> if (IsSink) >> Succs.setFlag(); >> } >> >> - ~ExplodedNode() { >> - const_cast<ProgramState*>(State)->decrementReferenceCount(); >> - } >> + ~ExplodedNode() {} >> >> /// getLocation - Returns the edge associated with the given node. >> ProgramPoint getLocation() const { return Location; } >> @@ -156,7 +153,7 @@ >> ProgramStateRef state, >> bool IsSink) { >> ID.Add(Loc); >> - ID.AddPointer(state); >> + ID.AddPointer(state.getPtr()); >> ID.AddBoolean(IsSink); >> } >> >> >> Modified: >> cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h?rev=149311&r1=149310&r2=149311&view=diff >> ============================================================================== >> --- cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h >> (original) >> +++ cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h >> Mon Jan 30 18:57:20 2012 >> @@ -93,7 +93,6 @@ >> void setStore(const StoreRef &storeRef); >> >> public: >> - >> /// This ctor is used when creating the first ProgramState object. >> ProgramState(ProgramStateManager *mgr, const Environment& env, >> StoreRef st, GenericDataMap gdm); >> @@ -107,9 +106,6 @@ >> /// Return the ProgramStateManager associated with this state. >> ProgramStateManager &getStateManager() const { return *stateMgr; } >> >> - /// Return true if this state is referenced by a persistent ExplodedNode. >> - bool referencedByExplodedNode() const { return refCount > 0; } >> - >> /// getEnvironment - Return the environment associated with this state. >> /// The environment is the mapping from expressions to values. >> const Environment& getEnvironment() const { return Env; } >> @@ -127,7 +123,7 @@ >> /// Profile - Profile the contents of a ProgramState object for use in a >> /// FoldingSet. Two ProgramState objects are considered equal if they >> /// have the same Environment, Store, and GenericDataMap. >> - static void Profile(llvm::FoldingSetNodeID& ID, ProgramStateRef V) { >> + static void Profile(llvm::FoldingSetNodeID& ID, const ProgramState *V) { >> V->Env.Profile(ID); >> ID.AddPointer(V->store); >> V->GDM.Profile(ID); >> @@ -376,14 +372,8 @@ >> void dumpTaint() const; >> >> private: >> - /// Increments the number of times this state is referenced by >> ExplodeNodes. >> - void incrementReferenceCount() { ++refCount; } >> - >> - /// Decrement the number of times this state is referenced by >> ExplodeNodes. >> - void decrementReferenceCount() { >> - assert(refCount > 0); >> - --refCount; >> - } >> + friend void ProgramStateRetain(const ProgramState *state); >> + friend void ProgramStateRelease(const ProgramState *state); >> >> ProgramStateRef >> invalidateRegionsImpl(ArrayRef<const MemRegion *> Regions, >> @@ -392,45 +382,13 @@ >> const CallOrObjCMessage *Call) const; >> }; >> >> -class ProgramStateSet { >> - typedef llvm::SmallPtrSet<ProgramStateRef,5> ImplTy; >> - ImplTy Impl; >> -public: >> - ProgramStateSet() {} >> - >> - inline void Add(ProgramStateRef St) { >> - Impl.insert(St); >> - } >> - >> - typedef ImplTy::const_iterator iterator; >> - >> - inline unsigned size() const { return Impl.size(); } >> - inline bool empty() const { return Impl.empty(); } >> - >> - inline iterator begin() const { return Impl.begin(); } >> - inline iterator end() const { return Impl.end(); } >> - >> - class AutoPopulate { >> - ProgramStateSet &S; >> - unsigned StartSize; >> - ProgramStateRef St; >> - public: >> - AutoPopulate(ProgramStateSet &s, ProgramStateRef st) >> - : S(s), StartSize(S.size()), St(st) {} >> - >> - ~AutoPopulate() { >> - if (StartSize == S.size()) >> - S.Add(St); >> - } >> - }; >> -}; >> - >> //===----------------------------------------------------------------------===// >> // ProgramStateManager - Factory object for ProgramStates. >> //===----------------------------------------------------------------------===// >> >> class ProgramStateManager { >> friend class ProgramState; >> + friend void ProgramStateRelease(const ProgramState *state); >> private: >> /// Eng - The SubEngine that owns this state manager. >> SubEngine *Eng; /* Can be null. */ >> @@ -453,10 +411,6 @@ >> >> /// A BumpPtrAllocator to allocate states. >> llvm::BumpPtrAllocator &Alloc; >> - >> - /// A vector of recently allocated ProgramStates that can potentially be >> - /// reused. >> - std::vector<ProgramState *> recentlyAllocatedStates; >> >> /// A vector of ProgramStates that we can reuse. >> std::vector<ProgramState *> freeStates; >> @@ -563,10 +517,6 @@ >> return S1->store == S2->store; >> } >> >> - /// Periodically called by ExprEngine to recycle ProgramStates that were >> - /// created but never used for creating an ExplodedNode. >> - void recycleUnusedStates(); >> - >> >> //==---------------------------------------------------------------------==// >> // Generic Data Map methods. >> >> //==---------------------------------------------------------------------==// >> >> Modified: >> cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState_Fwd.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState_Fwd.h?rev=149311&r1=149310&r2=149311&view=diff >> ============================================================================== >> --- >> cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState_Fwd.h >> (original) >> +++ >> cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState_Fwd.h >> Mon Jan 30 18:57:20 2012 >> @@ -10,11 +10,31 @@ >> #ifndef LLVM_CLANG_PROGRAMSTATE_FWD_H >> #define LLVM_CLANG_PROGRAMSTATE_FWD_H >> >> +#include "llvm/ADT/IntrusiveRefCntPtr.h" >> + >> namespace clang { >> namespace ento { >> class ProgramState; >> class ProgramStateManager; >> - typedef const ProgramState* ProgramStateRef; >> + void ProgramStateRetain(const ProgramState *state); >> + void ProgramStateRelease(const ProgramState *state); >> +} >> +} >> + >> +namespace llvm { >> + template <> struct IntrusiveRefCntPtrInfo<const >> clang::ento::ProgramState> { >> + static void retain(const clang::ento::ProgramState *state) { >> + clang::ento::ProgramStateRetain(state); >> + } >> + static void release(const clang::ento::ProgramState *state) { >> + clang::ento::ProgramStateRelease(state); >> + } >> + }; >> +} >> + >> +namespace clang { >> +namespace ento { >> + typedef llvm::IntrusiveRefCntPtr<const ProgramState> ProgramStateRef; >> } >> } >> >> >> Modified: cfe/trunk/lib/StaticAnalyzer/Core/Checker.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/Checker.cpp?rev=149311&r1=149310&r2=149311&view=diff >> ============================================================================== >> --- cfe/trunk/lib/StaticAnalyzer/Core/Checker.cpp (original) >> +++ cfe/trunk/lib/StaticAnalyzer/Core/Checker.cpp Mon Jan 30 18:57:20 2012 >> @@ -11,6 +11,7 @@ >> // >> //===----------------------------------------------------------------------===// >> >> +#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h" >> #include "clang/StaticAnalyzer/Core/Checker.h" >> >> using namespace clang; >> >> Modified: cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp?rev=149311&r1=149310&r2=149311&view=diff >> ============================================================================== >> --- cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp (original) >> +++ cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp Mon Jan 30 18:57:20 2012 >> @@ -238,13 +238,8 @@ >> >> void ExprEngine::ProcessStmt(const CFGStmt S, >> ExplodedNode *Pred) { >> - // TODO: Use RAII to remove the unnecessary, tagged nodes. >> - //RegisterCreatedNodes registerCreatedNodes(getGraph()); >> - >> // Reclaim any unnecessary nodes in the ExplodedGraph. >> G.reclaimRecentlyAllocatedNodes(); >> - // Recycle any unused states in the ProgramStateManager. >> - StateMgr.recycleUnusedStates(); >> >> currentStmt = S.getStmt(); >> PrettyStackTraceLoc CrashInfo(getContext().getSourceManager(), >> @@ -1856,7 +1851,7 @@ >> } >> >> ProgramStateRef state = N->getState(); >> - Out << "\\|StateID: " << (void*) state >> + Out << "\\|StateID: " << (void*) state.getPtr() >> << " NodeID: " << (void*) N << "\\|"; >> state->printDOT(Out); >> >> >> Modified: cfe/trunk/lib/StaticAnalyzer/Core/ProgramState.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ProgramState.cpp?rev=149311&r1=149310&r2=149311&view=diff >> ============================================================================== >> --- cfe/trunk/lib/StaticAnalyzer/Core/ProgramState.cpp (original) >> +++ cfe/trunk/lib/StaticAnalyzer/Core/ProgramState.cpp Mon Jan 30 18:57:20 >> 2012 >> @@ -25,6 +25,26 @@ >> // FIXME: Move this elsewhere. >> ConstraintManager::~ConstraintManager() {} >> >> +namespace clang { namespace ento { >> +/// Increments the number of times this state is referenced. >> + >> +void ProgramStateRetain(const ProgramState *state) { >> + ++const_cast<ProgramState*>(state)->refCount; >> +} >> + >> +/// Decrement the number of times this state is referenced. >> +void ProgramStateRelease(const ProgramState *state) { >> + assert(state->refCount > 0); >> + ProgramState *s = const_cast<ProgramState*>(state); >> + if (--s->refCount == 0) { >> + ProgramStateManager &Mgr = s->getStateManager(); >> + Mgr.StateSet.RemoveNode(s); >> + s->~ProgramState(); >> + Mgr.freeStates.push_back(s); >> + } >> +} >> +}} >> + >> ProgramState::ProgramState(ProgramStateManager *mgr, const Environment& env, >> StoreRef st, GenericDataMap gdm) >> : stateMgr(mgr), >> @@ -328,23 +348,10 @@ >> return getPersistentState(State); >> } >> >> -void ProgramStateManager::recycleUnusedStates() { >> - for (std::vector<ProgramState*>::iterator i = >> recentlyAllocatedStates.begin(), >> - e = recentlyAllocatedStates.end(); i != e; ++i) { >> - ProgramState *state = *i; >> - if (state->referencedByExplodedNode()) >> - continue; >> - StateSet.RemoveNode(state); >> - freeStates.push_back(state); >> - state->~ProgramState(); >> - } >> - recentlyAllocatedStates.clear(); >> -} >> - >> ProgramStateRef ProgramStateManager::getPersistentStateWithGDM( >> ProgramStateRef >> FromState, >> ProgramStateRef >> GDMState) { >> - ProgramState NewState = *FromState; >> + ProgramState NewState(*FromState); >> NewState.GDM = GDMState->GDM; >> return getPersistentState(NewState); >> } >> @@ -368,12 +375,11 @@ >> } >> new (newState) ProgramState(State); >> StateSet.InsertNode(newState, InsertPos); >> - recentlyAllocatedStates.push_back(newState); >> return newState; >> } >> >> ProgramStateRef ProgramState::makeWithStore(const StoreRef &store) const { >> - ProgramState NewSt = *this; >> + ProgramState NewSt(*this); >> NewSt.setStore(store); >> return getStateManager().getPersistentState(NewSt); >> } >> >> >> _______________________________________________ >> 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
