//
// The LLVM Compiler Infrastructure
//
-// This file was developed by Chris Lattner and is distributed under
-// the University of Illinois Open Source License. See LICENSE.TXT for details.
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
#include <cstdlib>
namespace llvm {
-
+
class MallocAllocator {
public:
MallocAllocator() {}
~MallocAllocator() {}
-
+
void Reset() {}
- void *Allocate(unsigned Size, unsigned Alignment) { return malloc(Size); }
-
+
+ void *Allocate(size_t Size, size_t /*Alignment*/) { return malloc(Size); }
+
+ template <typename T>
+ T *Allocate() { return static_cast<T*>(malloc(sizeof(T))); }
+
template <typename T>
- void *Allocate() { return reinterpret_cast<T*>(malloc(sizeof(T))); }
-
- void Deallocate(void *Ptr) { free(Ptr); }
+ T *Allocate(size_t Num) {
+ return static_cast<T*>(malloc(sizeof(T)*Num));
+ }
+
+ void Deallocate(const void *Ptr) { free(const_cast<void*>(Ptr)); }
+
void PrintStats() const {}
};
/// allocating memory, and never deletes it until the entire block is dead. This
/// makes allocation speedy, but must only be used when the trade-off is ok.
class BumpPtrAllocator {
+ BumpPtrAllocator(const BumpPtrAllocator &); // do not implement
+ void operator=(const BumpPtrAllocator &); // do not implement
+
void *TheMemory;
public:
BumpPtrAllocator();
~BumpPtrAllocator();
-
+
void Reset();
- void *Allocate(unsigned Size, unsigned Alignment);
+ void *Allocate(size_t Size, size_t Alignment);
+
+ /// Allocate space, but do not construct, one object.
+ ///
+ template <typename T>
+ T *Allocate() {
+ return static_cast<T*>(Allocate(sizeof(T),AlignOf<T>::Alignment));
+ }
+
+ /// Allocate space for an array of objects. This does not construct the
+ /// objects though.
template <typename T>
- void *Allocate() {
- return reinterpret_cast<T*>(Allocate(sizeof(T),AlignOf<T>::Alignment));
+ T *Allocate(size_t Num) {
+ return static_cast<T*>(Allocate(Num * sizeof(T), AlignOf<T>::Alignment));
}
-
- void Deallocate(void *Ptr) {}
+ /// Allocate space for a specific count of elements and with a specified
+ /// alignment.
+ template <typename T>
+ T *Allocate(size_t Num, size_t Alignment) {
+ // Round EltSize up to the specified alignment.
+ size_t EltSize = (sizeof(T)+Alignment-1)&(-Alignment);
+ return static_cast<T*>(Allocate(Num * EltSize, Alignment));
+ }
+
+ void Deallocate(const void * /*Ptr*/) {}
+
void PrintStats() const;
};
-} // end namespace clang
+} // end namespace llvm
#endif