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