17 #ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_PROGRAMSTATETRAIT_H 18 #define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_PROGRAMSTATETRAIT_H 20 #include "llvm/ADT/ImmutableList.h" 21 #include "llvm/ADT/ImmutableMap.h" 22 #include "llvm/ADT/ImmutableSet.h" 23 #include "llvm/Support/Allocator.h" 29 template <
typename T>
struct ProgramStatePartialTrait;
34 #define REGISTER_TRAIT_WITH_PROGRAMSTATE(Name, Type) \ 37 using Name ## Ty = Type; \ 42 struct ProgramStateTrait<Name> \ 43 : public ProgramStatePartialTrait<Name ## Ty> { \ 44 static void *GDMIndex() { static int Index; return &Index; } \ 53 #define REGISTER_FACTORY_WITH_PROGRAMSTATE(Type) \ 57 struct ProgramStateTrait<Type> \ 58 : public ProgramStatePartialTrait<Type> { \ 59 static void *GDMIndex() { static int Index; return &Index; } \ 71 #define CLANG_ENTO_PROGRAMSTATE_MAP(Key, Value) llvm::ImmutableMap<Key, Value> 85 #define REGISTER_MAP_WITH_PROGRAMSTATE(Name, Key, Value) \ 86 REGISTER_TRAIT_WITH_PROGRAMSTATE(Name, \ 87 CLANG_ENTO_PROGRAMSTATE_MAP(Key, Value)) 93 #define REGISTER_MAP_FACTORY_WITH_PROGRAMSTATE(Name, Key, Value) \ 94 using Name = llvm::ImmutableMap<Key, Value>; \ 95 REGISTER_FACTORY_WITH_PROGRAMSTATE(Name) 110 #define REGISTER_SET_WITH_PROGRAMSTATE(Name, Elem) \ 111 REGISTER_TRAIT_WITH_PROGRAMSTATE(Name, llvm::ImmutableSet<Elem>) 117 #define REGISTER_SET_FACTORY_WITH_PROGRAMSTATE(Name, Elem) \ 118 using Name = llvm::ImmutableSet<Elem>; \ 119 REGISTER_FACTORY_WITH_PROGRAMSTATE(Name) 133 #define REGISTER_LIST_WITH_PROGRAMSTATE(Name, Elem) \ 134 REGISTER_TRAIT_WITH_PROGRAMSTATE(Name, llvm::ImmutableList<Elem>) 140 #define REGISTER_LIST_FACTORY_WITH_PROGRAMSTATE(Name, Elem) \ 141 using Name = llvm::ImmutableList<Elem>; \ 142 REGISTER_FACTORY_WITH_PROGRAMSTATE(Name) 146 template <
typename Key,
typename Data,
typename Info>
155 return p ?
data_type((
typename data_type::TreeTy *) *p)
156 : data_type(
nullptr);
169 return F.add(B, K, E);
173 return F.remove(B, K);
177 return B.contains(K);
181 return *((
typename data_type::Factory *) p);
185 return new typename data_type::Factory(Alloc);
189 delete (
typename data_type::Factory *) Ctx;
194 template <
typename Key,
typename Info>
201 return p ?
data_type((
typename data_type::TreeTy *) *p)
202 : data_type(
nullptr);
214 return F.remove(B, K);
218 return B.contains(K);
222 return *((
typename data_type::Factory *) p);
226 return new typename data_type::Factory(Alloc);
230 delete (
typename data_type::Factory *) Ctx;
235 template <
typename T>
246 return L.contains(K);
250 return p ?
data_type((
const llvm::ImmutableListImpl<T> *) *p)
251 : data_type(
nullptr);
255 return const_cast<llvm::ImmutableListImpl<T> *
>(D.getInternalPointer());
259 return *((
typename data_type::Factory *) p);
263 return new typename data_type::Factory(Alloc);
267 delete (
typename data_type::Factory *) Ctx;
322 return const_cast<void *
>(d);
329 #endif // LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_PROGRAMSTATETRAIT_H
static context_type MakeContext(void *p)
static bool Contains(data_type L, key_type K)
static void * CreateContext(llvm::BumpPtrAllocator &Alloc)
llvm::ImmutableMap< Key, Data, Info > data_type
static void * MakeVoidPtr(data_type B)
DominatorTree GraphTraits specialization so the DominatorTree can be iterable by generic graph iterat...
static void * MakeVoidPtr(data_type d)
static data_type Add(data_type L, key_type K, context_type F)
static data_type MakeData(void *const *p)
static void * CreateContext(llvm::BumpPtrAllocator &Alloc)
static data_type Remove(data_type B, key_type K, context_type F)
typename data_type::Factory & context_type
static data_type MakeData(void *const *p)
const value_type * lookup_type
typename data_type::Factory & context_type
static void * CreateContext(llvm::BumpPtrAllocator &Alloc)
static context_type MakeContext(void *p)
typename data_type::Factory & context_type
static data_type MakeData(void *const *p)
static data_type MakeData(void *const *p)
static void DeleteContext(void *Ctx)
static void * MakeVoidPtr(data_type B)
static context_type MakeContext(void *p)
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
static void DeleteContext(void *Ctx)
static bool Contains(data_type B, key_type K)
static data_type MakeData(void *const *p)
static data_type Set(data_type B, key_type K, value_type E, context_type F)
static void * MakeVoidPtr(data_type D)
static data_type Remove(data_type B, key_type K, context_type F)
llvm::ImmutableList< T > data_type
Dataflow Directional Tag Classes.
static void DeleteContext(void *Ctx)
static data_type MakeData(void *const *p)
static void * MakeVoidPtr(data_type d)
static data_type Add(data_type B, key_type K, context_type F)
static lookup_type Lookup(data_type B, key_type K)
static void * MakeVoidPtr(data_type d)
static bool Contains(data_type B, key_type K)
static void * MakeVoidPtr(data_type d)
static data_type MakeData(void *const *p)
llvm::ImmutableSet< Key, Info > data_type