diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-08-17 02:59:30 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-08-17 02:59:30 +0000 |
commit | e7aa9a13642f50101ac1718098b41f8788b115bc (patch) | |
tree | 319675c638e5fd3b0b13992d7beb975afadaa7cd | |
parent | dceb6a7244b2e730d0b883512aa7fc7a331a5429 (diff) |
Added GRStateTrait.h, which includes boilerplate code for creating specializations of GRStateTrait<>.
Modified GRStateTrait<ConstNotEq> in GRState to use the boilerplate in GRStateTrait<> for ImmutableMaps.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54859 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Analysis/PathSensitive/GRStateTrait.h | 67 | ||||
-rw-r--r-- | include/clang/Analysis/PathSensitive/GRWorkList.h | 2 | ||||
-rw-r--r-- | lib/Analysis/GRState.cpp | 42 |
3 files changed, 72 insertions, 39 deletions
diff --git a/include/clang/Analysis/PathSensitive/GRStateTrait.h b/include/clang/Analysis/PathSensitive/GRStateTrait.h new file mode 100644 index 0000000000..33c03227a0 --- /dev/null +++ b/include/clang/Analysis/PathSensitive/GRStateTrait.h @@ -0,0 +1,67 @@ +//==- GRStateTrait.h - Partial implementations of GRStateTrait -----*- C++ -*-// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines partial implementations of template specializations of +// the class GRStateTrait<>. GRStateTrait<> is used by GRState to implement +// set/get methods for mapulating a GRState's generic data map. +// +//===----------------------------------------------------------------------===// + + +#ifndef LLVM_CLANG_ANALYSIS_GRSTATETRAIT_H +#define LLVM_CLANG_ANALYSIS_GRSTATETRAIT_H + +namespace llvm { + class BumpPtrAllocator; + template <typename K, typename D, typename I> class ImmutableMap; +} + +namespace clang { + template <typename T> struct GRStatePartialTrait; + + template <typename Key, typename Data, typename Info> + struct GRStatePartialTrait< llvm::ImmutableMap<Key,Data,Info> > { + typedef llvm::ImmutableMap<Key,Data,Info> data_type; + typedef typename data_type::Factory& context_type; + typedef Key key_type; + typedef Data value_type; + typedef const value_type* lookup_type; + + static inline data_type MakeData(void* const* p) { + return p ? data_type((typename data_type::TreeTy*) *p) : data_type(0); + } + static inline void* MakeVoidPtr(data_type B) { + return B.getRoot(); + } + static lookup_type Lookup(data_type B, key_type K) { + return B.lookup(K); + } + static data_type Set(data_type B, key_type K, value_type E,context_type F){ + return F.Add(B, K, E); + } + + static data_type Remove(data_type B, key_type K, context_type F) { + return F.Remove(B, K); + } + + static inline context_type MakeContext(void* p) { + return *((typename data_type::Factory*) p); + } + + static inline void* CreateContext(llvm::BumpPtrAllocator& Alloc) { + return new typename data_type::Factory(Alloc); + } + + static inline void DeleteContext(void* Ctx) { + delete (typename data_type::Factory*) Ctx; + } + }; +} // end clang namespace + +#endif diff --git a/include/clang/Analysis/PathSensitive/GRWorkList.h b/include/clang/Analysis/PathSensitive/GRWorkList.h index 401e35042e..9455195283 100644 --- a/include/clang/Analysis/PathSensitive/GRWorkList.h +++ b/include/clang/Analysis/PathSensitive/GRWorkList.h @@ -1,4 +1,4 @@ -//==- GRWorkList.h - Worklist class used by GRCoreEngine ---------------*- C++ -*-// +//==- GRWorkList.h - Worklist class used by GRCoreEngine -----------*- C++ -*-// // // The LLVM Compiler Infrastructure // diff --git a/lib/Analysis/GRState.cpp b/lib/Analysis/GRState.cpp index 5522600d84..e5dd6788dc 100644 --- a/lib/Analysis/GRState.cpp +++ b/lib/Analysis/GRState.cpp @@ -11,6 +11,7 @@ // //===----------------------------------------------------------------------===// +#include "clang/Analysis/PathSensitive/GRStateTrait.h" #include "clang/Analysis/PathSensitive/GRState.h" #include "llvm/ADT/SmallSet.h" #include "clang/Analysis/PathSensitive/GRTransferFuncs.h" @@ -37,44 +38,9 @@ typedef llvm::ImmutableMap<SymbolID,GRState::IntSetTy> ConstNotEqTy; static int ConstNotEqTyIndex = 0; namespace clang { - template<> struct GRStateTrait<ConstNotEqTy> { - typedef ConstNotEqTy data_type; - typedef ConstNotEqTy::Factory& context_type; - typedef SymbolID key_type; - typedef GRState::IntSetTy value_type; - typedef const GRState::IntSetTy* lookup_type; - - static data_type MakeData(void* const* p) { - return p ? ConstNotEqTy((ConstNotEqTy::TreeTy*) *p) : ConstNotEqTy(0); - } - static void* MakeVoidPtr(ConstNotEqTy B) { - return B.getRoot(); - } - static void* GDMIndex() { - return &ConstNotEqTyIndex; - } - static lookup_type Lookup(ConstNotEqTy B, SymbolID K) { - return B.lookup(K); - } - static data_type Set(data_type B, key_type K, value_type E,context_type F){ - return F.Add(B, K, E); - } - - static data_type Remove(ConstNotEqTy B, SymbolID K, context_type F) { - return F.Remove(B, K); - } - - static context_type MakeContext(void* p) { - return *((ConstNotEqTy::Factory*) p); - } - - static void* CreateContext(llvm::BumpPtrAllocator& Alloc) { - return new ConstNotEqTy::Factory(Alloc); - } - - static void DeleteContext(void* Ctx) { - delete (ConstNotEqTy::Factory*) Ctx; - } + template<> + struct GRStateTrait<ConstNotEqTy> : public GRStatePartialTrait<ConstNotEqTy> { + static inline void* GDMIndex() { return &ConstNotEqTyIndex; } }; } |