diff options
-rw-r--r-- | include/llvm/ADT/StringMap.h | 4 | ||||
-rw-r--r-- | include/llvm/Support/Allocator.h | 22 | ||||
-rw-r--r-- | include/llvm/Support/YAMLParser.h | 4 |
3 files changed, 17 insertions, 13 deletions
diff --git a/include/llvm/ADT/StringMap.h b/include/llvm/ADT/StringMap.h index d4daf53178..f7f940944c 100644 --- a/include/llvm/ADT/StringMap.h +++ b/include/llvm/ADT/StringMap.h @@ -198,8 +198,10 @@ public: template<typename AllocatorTy> void Destroy(AllocatorTy &Allocator) { // Free memory referenced by the item. + unsigned AllocSize = + static_cast<unsigned>(sizeof(StringMapEntry)) + getKeyLength() + 1; this->~StringMapEntry(); - Allocator.Deallocate(this); + Allocator.Deallocate(static_cast<void *>(this), AllocSize); } /// Destroy this object, releasing memory back to the malloc allocator. diff --git a/include/llvm/Support/Allocator.h b/include/llvm/Support/Allocator.h index 617ab9fd7a..5565c1ccf1 100644 --- a/include/llvm/Support/Allocator.h +++ b/include/llvm/Support/Allocator.h @@ -63,16 +63,16 @@ public: /// \brief Deallocate \a Ptr to \a Size bytes of memory allocated by this /// allocator. - void Deallocate(const void *Ptr) { + void Deallocate(const void *Ptr, size_t Size) { #ifdef __clang__ - static_assert(static_cast<void (AllocatorBase::*)(const void *)>( + static_assert(static_cast<void (AllocatorBase::*)(const void *, size_t)>( &AllocatorBase::Deallocate) != - static_cast<void (DerivedT::*)(const void *)>( + static_cast<void (DerivedT::*)(const void *, size_t)>( &DerivedT::Deallocate), "Class derives from AllocatorBase without implementing the " "core Deallocate(void *) overload!"); #endif - return static_cast<DerivedT *>(this)->Deallocate(Ptr); + return static_cast<DerivedT *>(this)->Deallocate(Ptr, Size); } // The rest of these methods are helpers that redirect to one of the above @@ -101,15 +101,15 @@ public: typename std::enable_if< !std::is_same<typename std::remove_cv<T>::type, void>::value, void>::type Deallocate(T *Ptr) { - Deallocate(static_cast<const void *>(Ptr)); + Deallocate(static_cast<const void *>(Ptr), sizeof(T)); } /// \brief Allocate space for an array of objects without constructing them. template <typename T> typename std::enable_if< !std::is_same<typename std::remove_cv<T>::type, void>::value, void>::type - Deallocate(T *Ptr, size_t /*Num*/) { - Deallocate(static_cast<const void *>(Ptr)); + Deallocate(T *Ptr, size_t Num) { + Deallocate(static_cast<const void *>(Ptr), Num * sizeof(T)); } }; @@ -125,7 +125,9 @@ public: // Pull in base class overloads. using AllocatorBase<MallocAllocator>::Allocate; - void Deallocate(const void *Ptr) { free(const_cast<void *>(Ptr)); } + void Deallocate(const void *Ptr, size_t /*Size*/) { + free(const_cast<void *>(Ptr)); + } // Pull in base class overloads. using AllocatorBase<MallocAllocator>::Deallocate; @@ -143,7 +145,7 @@ class MallocSlabAllocator { public: void *Allocate(size_t Size) { return Allocator.Allocate(Size, 0); } - void Deallocate(void *Slab, size_t Size) { Allocator.Deallocate(Slab); } + void Deallocate(void *Slab, size_t Size) { Allocator.Deallocate(Slab, Size); } }; namespace detail { @@ -260,7 +262,7 @@ public: // Pull in base class overloads. using AllocatorBase<BumpPtrAllocatorImpl>::Allocate; - void Deallocate(const void * /*Ptr*/) {} + void Deallocate(const void * /*Ptr*/, size_t /*Size*/) {} // Pull in base class overloads. using AllocatorBase<BumpPtrAllocatorImpl>::Deallocate; diff --git a/include/llvm/Support/YAMLParser.h b/include/llvm/Support/YAMLParser.h index 6b1d4eaf6a..c39874cbd2 100644 --- a/include/llvm/Support/YAMLParser.h +++ b/include/llvm/Support/YAMLParser.h @@ -150,8 +150,8 @@ public: return Alloc.Allocate(Size, Alignment); } - void operator delete(void *Ptr, BumpPtrAllocator &Alloc, size_t) throw() { - Alloc.Deallocate(Ptr); + void operator delete(void *Ptr, BumpPtrAllocator &Alloc, size_t Size) throw() { + Alloc.Deallocate(Ptr, Size); } protected: |