[Allocator] Pass the size to the deallocation function. This, on some
authorChandler Carruth <chandlerc@gmail.com>
Tue, 15 Apr 2014 08:59:52 +0000 (08:59 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Tue, 15 Apr 2014 08:59:52 +0000 (08:59 +0000)
allocation libraries, may allow more efficient allocation and
deallocation. It at least makes the interface implementable by the JIT
memory manager.

However, this highlights problematic overloading between the void* and
the T* deallocation functions. I'm looking into a better way to do this,
but as it happens, it comes up rarely in the codebase.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@206265 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/StringMap.h
include/llvm/Support/Allocator.h
include/llvm/Support/YAMLParser.h

index d4daf53178289845f4d6297b890dd228e89f2095..f7f940944cfcb56f566e1185e71ebcddeb3f6027 100644 (file)
@@ -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.
index 617ab9fd7a3da6962d6324633145505c0d4264b6..5565c1ccf129686623f36448b593362ee031a9c6 100644 (file)
@@ -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;
index 6b1d4eaf6a3375c208589a297f322ab2db0c95a3..c39874cbd2c5088165d875ab6a9e3e3a86668308 100644 (file)
@@ -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: