From edd9a180501875bd096c2ed8644f15d0de4ec52b Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Sun, 17 Aug 2008 02:59:30 +0000 Subject: [PATCH] Added GRStateTrait.h, which includes boilerplate code for creating specializations of GRStateTrait<>. Modified GRStateTrait in GRState to use the boilerplate in GRStateTrait<> for ImmutableMaps. llvm-svn: 54859 --- .../Analysis/PathSensitive/GRStateTrait.h | 67 +++++++++++++++++++ .../clang/Analysis/PathSensitive/GRWorkList.h | 2 +- clang/lib/Analysis/GRState.cpp | 42 ++---------- 3 files changed, 72 insertions(+), 39 deletions(-) create mode 100644 clang/include/clang/Analysis/PathSensitive/GRStateTrait.h diff --git a/clang/include/clang/Analysis/PathSensitive/GRStateTrait.h b/clang/include/clang/Analysis/PathSensitive/GRStateTrait.h new file mode 100644 index 000000000000..33c03227a0e3 --- /dev/null +++ b/clang/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/clang/include/clang/Analysis/PathSensitive/GRWorkList.h b/clang/include/clang/Analysis/PathSensitive/GRWorkList.h index 401e35042e73..9455195283e3 100644 --- a/clang/include/clang/Analysis/PathSensitive/GRWorkList.h +++ b/clang/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/clang/lib/Analysis/GRState.cpp b/clang/lib/Analysis/GRState.cpp index 5522600d8491..e5dd6788dcf3 100644 --- a/clang/lib/Analysis/GRState.cpp +++ b/clang/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; } }; }