18 #ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_PROGRAMSTATETRAIT_H
19 #define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_PROGRAMSTATETRAIT_H
21 #include "llvm/Support/Allocator.h"
22 #include "llvm/Support/DataTypes.h"
34 template <
typename T>
struct ProgramStatePartialTrait;
40 #define REGISTER_TRAIT_WITH_PROGRAMSTATE(Name, Type) \
43 typedef Type Name ## Ty; \
48 struct ProgramStateTrait<Name> \
49 : public ProgramStatePartialTrait<Name ## Ty> { \
50 static void *GDMIndex() { static int Index; return &Index; } \
58 template <
typename Key,
typename Data,
typename Info>
67 return p ?
data_type((
typename data_type::TreeTy*) *p)
77 return F.add(B, K, E);
81 return F.remove(B, K);
85 return *((
typename data_type::Factory*) p);
89 return new typename data_type::Factory(Alloc);
93 delete (
typename data_type::Factory*) Ctx;
104 #define CLANG_ENTO_PROGRAMSTATE_MAP(Key, Value) llvm::ImmutableMap<Key, Value>
109 template <
typename Key,
typename Info>
116 return p ?
data_type((
typename data_type::TreeTy*) *p)
117 : data_type(
nullptr);
129 return F.remove(B, K);
133 return B.contains(K);
137 return *((
typename data_type::Factory*) p);
141 return new typename data_type::Factory(Alloc);
145 delete (
typename data_type::Factory*) Ctx;
152 template <
typename T>
163 return L.contains(K);
168 : data_type(
nullptr);
176 return *((
typename data_type::Factory*) p);
180 return new typename data_type::Factory(Alloc);
184 delete (
typename data_type::Factory*) Ctx;
198 return (
void*) (uintptr_t) d;
211 return (
void*) (uintptr_t) d;
233 return p ? *p : data_type();
237 return const_cast<void *
>(d);
static context_type MakeContext(void *p)
static bool Contains(data_type L, key_type K)
static void * CreateContext(llvm::BumpPtrAllocator &Alloc)
static void * MakeVoidPtr(data_type B)
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)
llvm::ImmutableMap< Key, Data, Info > data_type
const value_type * lookup_type
static void * CreateContext(llvm::BumpPtrAllocator &Alloc)
static data_type Remove(data_type B, key_type K, context_type F)
data_type::Factory & context_type
static data_type MakeData(void *const *p)
static void * CreateContext(llvm::BumpPtrAllocator &Alloc)
llvm::ImmutableList< T > data_type
static context_type MakeContext(void *p)
static data_type MakeData(void *const *p)
llvm::ImmutableSet< Key, Info > data_type
static data_type MakeData(void *const *p)
static void DeleteContext(void *Ctx)
static void * MakeVoidPtr(data_type B)
static context_type MakeContext(void *p)
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)
static void DeleteContext(void *Ctx)
static __inline__ uint32_t volatile uint32_t * p
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)
data_type::Factory & context_type
static void * MakeVoidPtr(data_type d)
data_type::Factory & context_type
static void * MakeVoidPtr(data_type d)
static data_type MakeData(void *const *p)