1e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman//==- llvm/Support/RecyclingAllocator.h - Recycling Allocator ----*- C++ -*-==// 2e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman// 3e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman// The LLVM Compiler Infrastructure 4e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman// 5e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman// This file is distributed under the University of Illinois Open Source 6e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman// License. See LICENSE.TXT for details. 7e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman// 8e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman//===----------------------------------------------------------------------===// 9e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman// 10e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman// This file defines the RecyclingAllocator class. See the doxygen comment for 11e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman// RecyclingAllocator for more details on the implementation. 12e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman// 13e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman//===----------------------------------------------------------------------===// 14e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman 15e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman#ifndef LLVM_SUPPORT_RECYCLINGALLOCATOR_H 16e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman#define LLVM_SUPPORT_RECYCLINGALLOCATOR_H 17e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman 18e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman#include "llvm/Support/Recycler.h" 19e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman 20e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohmannamespace llvm { 21e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman 22e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman/// RecyclingAllocator - This class wraps an Allocator, adding the 23e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman/// functionality of recycling deleted objects. 24e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman/// 25fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmantemplate<class AllocatorType, class T, 26fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman size_t Size = sizeof(T), size_t Align = AlignOf<T>::Alignment> 27e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohmanclass RecyclingAllocator { 28e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohmanprivate: 29e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman /// Base - Implementation details. 30e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman /// 31fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman Recycler<T, Size, Align> Base; 32e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman 33e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman /// Allocator - The wrapped allocator. 34e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman /// 35e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman AllocatorType Allocator; 36e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman 37e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohmanpublic: 38e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman ~RecyclingAllocator() { Base.clear(Allocator); } 39e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman 40e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman /// Allocate - Return a pointer to storage for an object of type 41e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman /// SubClass. The storage may be either newly allocated or recycled. 42e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman /// 43e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman template<class SubClass> 44fbe67f85b2e14bf0b9a4c2b6306ccbcefdb8956bDouglas Gregor SubClass *Allocate() { return Base.template Allocate<SubClass>(Allocator); } 45e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman 46e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman T *Allocate() { return Base.Allocate(Allocator); } 47e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman 48e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman /// Deallocate - Release storage for the pointed-to object. The 49e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman /// storage will be kept track of and may be recycled. 50e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman /// 51e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman template<class SubClass> 52e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman void Deallocate(SubClass* E) { return Base.Deallocate(Allocator, E); } 53e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman 54ba3500e4d2f7a8646ea0f5a1acfaed832f8e062eAndrew Trick void PrintStats() { 55ba3500e4d2f7a8646ea0f5a1acfaed832f8e062eAndrew Trick Allocator.PrintStats(); 56ba3500e4d2f7a8646ea0f5a1acfaed832f8e062eAndrew Trick Base.PrintStats(); 57ba3500e4d2f7a8646ea0f5a1acfaed832f8e062eAndrew Trick } 58e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman}; 59e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman 60e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman} 61e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman 629553188fccbf0ae9c5b6bef26d0d2bd5feff8b59Dan Gohmantemplate<class AllocatorType, class T, size_t Size, size_t Align> 639553188fccbf0ae9c5b6bef26d0d2bd5feff8b59Dan Gohmaninline void *operator new(size_t, 649553188fccbf0ae9c5b6bef26d0d2bd5feff8b59Dan Gohman llvm::RecyclingAllocator<AllocatorType, 659553188fccbf0ae9c5b6bef26d0d2bd5feff8b59Dan Gohman T, Size, Align> &Allocator) { 669553188fccbf0ae9c5b6bef26d0d2bd5feff8b59Dan Gohman return Allocator.Allocate(); 679553188fccbf0ae9c5b6bef26d0d2bd5feff8b59Dan Gohman} 689553188fccbf0ae9c5b6bef26d0d2bd5feff8b59Dan Gohman 69180c3d4edd1219832be8f2cf91f5f73f9757c36fBenjamin Kramertemplate<class AllocatorType, class T, size_t Size, size_t Align> 70180c3d4edd1219832be8f2cf91f5f73f9757c36fBenjamin Kramerinline void operator delete(void *E, 71180c3d4edd1219832be8f2cf91f5f73f9757c36fBenjamin Kramer llvm::RecyclingAllocator<AllocatorType, 72180c3d4edd1219832be8f2cf91f5f73f9757c36fBenjamin Kramer T, Size, Align> &A) { 73180c3d4edd1219832be8f2cf91f5f73f9757c36fBenjamin Kramer A.Deallocate(E); 74180c3d4edd1219832be8f2cf91f5f73f9757c36fBenjamin Kramer} 75180c3d4edd1219832be8f2cf91f5f73f9757c36fBenjamin Kramer 76e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman#endif 77