From: Ted Kremenek Date: Sun, 17 Aug 2008 02:59:30 +0000 (+0000) Subject: Added GRStateTrait.h, which includes boilerplate code for creating specializations... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e7aa9a13642f50101ac1718098b41f8788b115bc;p=clang Added GRStateTrait.h, which includes boilerplate code for creating specializations of GRStateTrait<>. Modified GRStateTrait 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 --- 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 class ImmutableMap; +} + +namespace clang { + template struct GRStatePartialTrait; + + template + struct GRStatePartialTrait< llvm::ImmutableMap > { + typedef llvm::ImmutableMap 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 ConstNotEqTy; static int ConstNotEqTyIndex = 0; namespace clang { - template<> struct GRStateTrait { - 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 : public GRStatePartialTrait { + static inline void* GDMIndex() { return &ConstNotEqTyIndex; } }; }