From 159976c271283abdcd18e36f02a51c074ffa2895 Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Tue, 15 Apr 2014 00:47:47 +0000 Subject: [PATCH] [Allocator] Add Deallocate support to the AllocatorBase CRTP class, along with templated overloads much like we have for Allocate. These will facilitate switching the Deallocate interface of all the Allocator classes to accept the size by pre-filling it from the type size where we can do so. I plan to convert several uses to the template variants in subsequent patches prior to adding the Size parameter. No functionality changed, WIP. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@206230 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/Allocator.h | 33 ++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/include/llvm/Support/Allocator.h b/include/llvm/Support/Allocator.h index 5eccbccbfc2..4da7acefb68 100644 --- a/include/llvm/Support/Allocator.h +++ b/include/llvm/Support/Allocator.h @@ -61,6 +61,23 @@ public: return static_cast(this)->Allocate(Size, Alignment); } + /// \brief Deallocate \a Ptr to \a Size bytes of memory allocated by this + /// allocator. + void Deallocate(const void *Ptr) { +#ifdef __clang__ + static_assert(static_cast( + &AllocatorBase::Deallocate) != + static_cast( + &DerivedT::Deallocate), + "Class derives from AllocatorBase without implementing the " + "core Deallocate(void *) overload!"); +#endif + return static_cast(this)->Deallocate(Ptr); + } + + // The rest of these methods are helpers that redirect to one of the above + // core methods. + /// \brief Allocate space for one object without constructing it. template T *Allocate() { return static_cast(Allocate(sizeof(T), AlignOf::Alignment)); @@ -78,6 +95,16 @@ public: size_t EltSize = (sizeof(T) + Alignment - 1) & (-Alignment); return static_cast(Allocate(Num * EltSize, Alignment)); } + + /// \brief Deallocate space for one object without destroying it. + template void Deallocate(T *Ptr) { + Deallocate(static_cast(Ptr)); + } + + /// \brief Allocate space for an array of objects without constructing them. + template void Deallocate(T *Ptr, size_t /*Num*/) { + Deallocate(static_cast(Ptr)); + } }; class MallocAllocator : public AllocatorBase { @@ -94,6 +121,9 @@ public: void Deallocate(const void *Ptr) { free(const_cast(Ptr)); } + // Pull in base class overloads. + using AllocatorBase::Deallocate; + void PrintStats() const {} }; @@ -226,6 +256,9 @@ public: void Deallocate(const void * /*Ptr*/) {} + // Pull in base class overloads. + using AllocatorBase::Deallocate; + size_t GetNumSlabs() const { return Slabs.size() + CustomSizedSlabs.size(); } size_t getTotalMemory() const { -- 2.34.1