[cfe-commits] r149311 - in /cfe/trunk: include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState_Fwd.h lib/StaticAnalyzer/Core/Checker.cpp lib/StaticAnalyzer/Core/ExprEngine.cpp lib/StaticAnalyzer/Core/ProgramState.cpp
Argyrios Kyrtzidis
kyrtzidis at apple.com
Mon Jan 30 18:18:48 PST 2012
This was failing to compile, did you miss including a header ?
Reverted in r149336.
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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list