Allocator.h revision fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7
19f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner//===--- Allocator.h - Simple memory allocation abstraction -----*- C++ -*-===// 29f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner// 39f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner// The LLVM Compiler Infrastructure 49f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner// 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details. 79f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner// 89f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner//===----------------------------------------------------------------------===// 99f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner// 109f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner// This file defines the MallocAllocator and BumpPtrAllocator interfaces. 119f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner// 129f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner//===----------------------------------------------------------------------===// 139f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner 149f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner#ifndef LLVM_SUPPORT_ALLOCATOR_H 159f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner#define LLVM_SUPPORT_ALLOCATOR_H 169f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner 17869a3344f17975f57a328dcc8bacf6775344c045Ted Kremenek#include "llvm/Support/AlignOf.h" 189f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner#include <cstdlib> 199f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner 209f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattnernamespace llvm { 21fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 229f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattnerclass MallocAllocator { 239f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattnerpublic: 249f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner MallocAllocator() {} 259f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner ~MallocAllocator() {} 26fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 27188b5224fd9c8573713665c77f9d2f415bcc4ff1Evan Cheng void Reset() {} 28f4dc289cea5dbfa272b54a8436a6bda6b226cee2Dan Gohman 298032020cf209721bc104648f28b1c4b45fb88691Bill Wendling void *Allocate(size_t Size, size_t /*Alignment*/) { return malloc(Size); } 30fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 31869a3344f17975f57a328dcc8bacf6775344c045Ted Kremenek template <typename T> 32f4dc289cea5dbfa272b54a8436a6bda6b226cee2Dan Gohman T *Allocate() { return static_cast<T*>(malloc(sizeof(T))); } 33fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 3407c2a78c2b9bf2500ece856c2df2dc043db9acb6Ted Kremenek template <typename T> 35fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman T *Allocate(size_t Num) { 3607c2a78c2b9bf2500ece856c2df2dc043db9acb6Ted Kremenek return static_cast<T*>(malloc(sizeof(T)*Num)); 3707c2a78c2b9bf2500ece856c2df2dc043db9acb6Ted Kremenek } 38fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 393f4c81de0ac7ff75e538dd68ef4ecfa204760bc9Ted Kremenek void Deallocate(const void *Ptr) { free(const_cast<void*>(Ptr)); } 40f4dc289cea5dbfa272b54a8436a6bda6b226cee2Dan Gohman 419f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner void PrintStats() const {} 429f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner}; 439f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner 449f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner/// BumpPtrAllocator - This allocator is useful for containers that need very 459f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner/// simple memory allocation strategies. In particular, this just keeps 469f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner/// allocating memory, and never deletes it until the entire block is dead. This 479f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner/// makes allocation speedy, but must only be used when the trade-off is ok. 489f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattnerclass BumpPtrAllocator { 497698252750b29bbd8de20f5404241953221470f4Dan Gohman BumpPtrAllocator(const BumpPtrAllocator &); // do not implement 507698252750b29bbd8de20f5404241953221470f4Dan Gohman void operator=(const BumpPtrAllocator &); // do not implement 517698252750b29bbd8de20f5404241953221470f4Dan Gohman 529f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner void *TheMemory; 539f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattnerpublic: 549f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner BumpPtrAllocator(); 559f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner ~BumpPtrAllocator(); 56fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 57188b5224fd9c8573713665c77f9d2f415bcc4ff1Evan Cheng void Reset(); 58f4dc289cea5dbfa272b54a8436a6bda6b226cee2Dan Gohman 5934cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng void *Allocate(size_t Size, size_t Alignment); 60869a3344f17975f57a328dcc8bacf6775344c045Ted Kremenek 61603884021010e227db6cc3fcc4c7f5e555e4a8dcChris Lattner /// Allocate space, but do not construct, one object. 62603884021010e227db6cc3fcc4c7f5e555e4a8dcChris Lattner /// 63869a3344f17975f57a328dcc8bacf6775344c045Ted Kremenek template <typename T> 64fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman T *Allocate() { 65f4dc289cea5dbfa272b54a8436a6bda6b226cee2Dan Gohman return static_cast<T*>(Allocate(sizeof(T),AlignOf<T>::Alignment)); 66869a3344f17975f57a328dcc8bacf6775344c045Ted Kremenek } 67fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 68603884021010e227db6cc3fcc4c7f5e555e4a8dcChris Lattner /// Allocate space for an array of objects. This does not construct the 69603884021010e227db6cc3fcc4c7f5e555e4a8dcChris Lattner /// objects though. 70e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman template <typename T> 71fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman T *Allocate(size_t Num) { 72e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman return static_cast<T*>(Allocate(Num * sizeof(T), AlignOf<T>::Alignment)); 73e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman } 74fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 75603884021010e227db6cc3fcc4c7f5e555e4a8dcChris Lattner /// Allocate space for a specific count of elements and with a specified 76603884021010e227db6cc3fcc4c7f5e555e4a8dcChris Lattner /// alignment. 77603884021010e227db6cc3fcc4c7f5e555e4a8dcChris Lattner template <typename T> 78fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman T *Allocate(size_t Num, unsigned Alignment) { 79603884021010e227db6cc3fcc4c7f5e555e4a8dcChris Lattner // Round EltSize up to the specified alignment. 80603884021010e227db6cc3fcc4c7f5e555e4a8dcChris Lattner unsigned EltSize = (sizeof(T)+Alignment-1)&~Alignment; 81603884021010e227db6cc3fcc4c7f5e555e4a8dcChris Lattner return static_cast<T*>(Allocate(Num * EltSize, Alignment)); 82603884021010e227db6cc3fcc4c7f5e555e4a8dcChris Lattner } 833f4c81de0ac7ff75e538dd68ef4ecfa204760bc9Ted Kremenek 843f4c81de0ac7ff75e538dd68ef4ecfa204760bc9Ted Kremenek void Deallocate(const void * /*Ptr*/) {} 85f4dc289cea5dbfa272b54a8436a6bda6b226cee2Dan Gohman 869f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner void PrintStats() const; 879f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner}; 889f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner 89abb8bf131c8542ff25964b69797558d425ed93c8Dan Gohman} // end namespace llvm 909f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner 919f617d64c5f3f2a0949f359f63b1cb3bff4b3a9bChris Lattner#endif 92