On Nov 5, 2012, at 8:58 AM, Jordan Rose <[email protected]> wrote:
> Author: jrose > Date: Mon Nov 5 10:58:00 2012 > New Revision: 167385 > > URL: http://llvm.org/viewvc/llvm-project?rev=167385&view=rev > Log: > [analyzer] Move convenience REGISTER_*_WITH_PROGRAMSTATE to CheckerContext.h > > As Anna pointed out, ProgramStateTrait.h is a relatively obscure header, > and checker writers may not know to look there to add their own custom > state. > > The base macro that specializes the template remains in ProgramStateTrait.h > (REGISTER_TRAIT_WITH_PROGRAMSTATE), which allows the analyzer core to keep > using it. > > Modified: > cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h > > cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramStateTrait.h > cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp > cfe/trunk/lib/StaticAnalyzer/Core/ProgramState.cpp > cfe/trunk/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp > > Modified: > cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h?rev=167385&r1=167384&r2=167385&view=diff > ============================================================================== > --- > cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h > (original) > +++ > cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h > Mon Nov 5 10:58:00 2012 > @@ -16,10 +16,37 @@ > #define LLVM_CLANG_SA_CORE_PATHSENSITIVE_CHECKERCONTEXT > > #include "clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h" > +#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramStateTrait.h" > > namespace clang { > namespace ento { > > + /// Declares an immutable map of type \p NameTy, suitable for placement > into > + /// the ProgramState. > + /// > + /// The macro should not be used inside namespaces, or for traits that must > + /// be accessible from more than one translation unit. Should we document how the map should be used? Ex: adding/removing a value, getting the whole map? (Similarly to what we do in the upcoming talk.) > + #define REGISTER_MAP_WITH_PROGRAMSTATE(Name, Key, Value) \ > + REGISTER_TRAIT_WITH_PROGRAMSTATE(Name, \ > + CLANG_ENTO_PROGRAMSTATE_MAP(Key, Value)) > + > + /// Declares an immutable list of type \p NameTy, suitable for placement > into > + /// the ProgramState. > + /// > + /// The macro should not be used inside namespaces, or for traits that must > + /// be accessible from more than one translation unit. > + #define REGISTER_SET_WITH_PROGRAMSTATE(Name, Elem) \ > + REGISTER_TRAIT_WITH_PROGRAMSTATE(Name, llvm::ImmutableSet<Elem>) > + > + /// Declares an immutable list of type \p NameTy, suitable for placement > into > + /// the ProgramState. > + /// > + /// The macro should not be used inside namespaces, or for traits that must > + /// be accessible from more than one translation unit. > + #define REGISTER_LIST_WITH_PROGRAMSTATE(Name, Elem) \ > + REGISTER_TRAIT_WITH_PROGRAMSTATE(Name, llvm::ImmutableList<Elem>) > + > + > class CheckerContext { > ExprEngine &Eng; > /// The current exploded(symbolic execution) graph node. > > Modified: > cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramStateTrait.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramStateTrait.h?rev=167385&r1=167384&r2=167385&view=diff > ============================================================================== > --- > cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramStateTrait.h > (original) > +++ > cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramStateTrait.h > Mon Nov 5 10:58:00 2012 > @@ -91,17 +91,15 @@ > } > }; > > - /// Helper for REGISTER_MAP_WITH_PROGRAMSTATE. > + /// Helper for registering a map trait. > + /// > + /// If the map type were written directly in the invocation of > + /// REGISTER_TRAIT_WITH_PROGRAMSTATE, the comma in the template arguments > + /// would be treated as a macro argument separator, which is wrong. > + /// This allows the user to specify a map type in a way that the > preprocessor > + /// can deal with. > #define CLANG_ENTO_PROGRAMSTATE_MAP(Key, Value) llvm::ImmutableMap<Key, > Value> > > - /// Declares an immutable map of type \p NameTy, suitable for placement > into > - /// the ProgramState. > - /// The macro should not be used inside namespaces, or for traits that must > - /// be accessible from more than one translation unit. > - #define REGISTER_MAP_WITH_PROGRAMSTATE(Name, Key, Value) \ > - REGISTER_TRAIT_WITH_PROGRAMSTATE(Name, \ > - CLANG_ENTO_PROGRAMSTATE_MAP(Key, Value)) > - > > // Partial-specialization for ImmutableSet. > > @@ -144,13 +142,6 @@ > } > }; > > - /// Declares an immutable list of type \p NameTy, suitable for placement > into > - /// the ProgramState. > - /// The macro should not be used inside namespaces, or for traits that must > - /// be accessible from more than one translation unit. > - #define REGISTER_SET_WITH_PROGRAMSTATE(Name, Elem) \ > - REGISTER_TRAIT_WITH_PROGRAMSTATE(Name, llvm::ImmutableSet<Elem>) > - > > // Partial-specialization for ImmutableList. > > @@ -189,13 +180,6 @@ > delete (typename data_type::Factory*) Ctx; > } > }; > - > - /// Declares an immutable list of type \p NameTy, suitable for placement > into > - /// the ProgramState. > - /// The macro should not be used inside namespaces, or for traits that must > - /// be accessible from more than one translation unit. > - #define REGISTER_LIST_WITH_PROGRAMSTATE(Name, Elem) \ > - REGISTER_TRAIT_WITH_PROGRAMSTATE(Name, llvm::ImmutableList<Elem>) > > > // Partial specialization for bool. > > Modified: cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp?rev=167385&r1=167384&r2=167385&view=diff > ============================================================================== > --- cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp (original) > +++ cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp Mon Nov 5 > 10:58:00 2012 > @@ -450,8 +450,9 @@ > DynamicDispatchModeConservative > }; > } > -REGISTER_MAP_WITH_PROGRAMSTATE(DynamicDispatchBifurcationMap, > - const MemRegion *, unsigned) > +REGISTER_TRAIT_WITH_PROGRAMSTATE(DynamicDispatchBifurcationMap, > + CLANG_ENTO_PROGRAMSTATE_MAP(const MemRegion > *, > + unsigned)) > > bool ExprEngine::inlineCall(const CallEvent &Call, const Decl *D, > NodeBuilder &Bldr, ExplodedNode *Pred, > > Modified: cfe/trunk/lib/StaticAnalyzer/Core/ProgramState.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ProgramState.cpp?rev=167385&r1=167384&r2=167385&view=diff > ============================================================================== > --- cfe/trunk/lib/StaticAnalyzer/Core/ProgramState.cpp (original) > +++ cfe/trunk/lib/StaticAnalyzer/Core/ProgramState.cpp Mon Nov 5 10:58:00 > 2012 > @@ -714,9 +714,9 @@ > > /// The GDM component containing the dynamic type info. This is a map from a > /// symbol to its most likely type. > -REGISTER_MAP_WITH_PROGRAMSTATE(DynamicTypeMap, > - const MemRegion *, > - DynamicTypeInfo) > +REGISTER_TRAIT_WITH_PROGRAMSTATE(DynamicTypeMap, > + CLANG_ENTO_PROGRAMSTATE_MAP(const MemRegion > *, > + > DynamicTypeInfo)) > > DynamicTypeInfo ProgramState::getDynamicTypeInfo(const MemRegion *Reg) const { > Reg = Reg->StripCasts(); > > Modified: cfe/trunk/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp?rev=167385&r1=167384&r2=167385&view=diff > ============================================================================== > --- cfe/trunk/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp (original) > +++ cfe/trunk/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp Mon Nov 5 > 10:58:00 2012 > @@ -277,7 +277,9 @@ > }; > } // end anonymous namespace > > -REGISTER_MAP_WITH_PROGRAMSTATE(ConstraintRange, SymbolRef, RangeSet) > +REGISTER_TRAIT_WITH_PROGRAMSTATE(ConstraintRange, > + CLANG_ENTO_PROGRAMSTATE_MAP(SymbolRef, > + RangeSet)) > > namespace { > class RangeConstraintManager : public SimpleConstraintManager{ > > > _______________________________________________ > 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
