1 //===--- Allocator.cpp - Simple memory allocation abstraction -------------===//
3 // The LLVM Compiler Infrastructure
5 // This file was developed by Chris Lattner and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the BumpPtrAllocator interface.
12 //===----------------------------------------------------------------------===//
14 #include "llvm/Support/Allocator.h"
15 #include "llvm/Support/DataTypes.h"
16 #include "llvm/Support/Streams.h"
20 //===----------------------------------------------------------------------===//
21 // MemRegion class implementation
22 //===----------------------------------------------------------------------===//
25 /// MemRegion - This is one chunk of the BumpPtrAllocator.
31 void Init(unsigned size
, unsigned Alignment
, MemRegion
*next
) {
34 NextPtr
= (char*)(this+1);
37 NextPtr
= (char*)((intptr_t)(NextPtr
+Alignment
-1) &
38 ~(intptr_t)(Alignment
-1));
41 const MemRegion
*getNext() const { return Next
; }
42 unsigned getNumBytesAllocated() const {
43 return NextPtr
-(const char*)this;
46 /// Allocate - Allocate and return at least the specified number of bytes.
48 void *Allocate(unsigned AllocSize
, unsigned Alignment
, MemRegion
**RegPtr
) {
49 // Round size up to an even multiple of the alignment.
50 AllocSize
= (AllocSize
+Alignment
-1) & ~(Alignment
-1);
52 // If there is space in this region, return it.
53 if (unsigned(NextPtr
+AllocSize
-(char*)this) <= RegionSize
) {
54 void *Result
= NextPtr
;
59 // Otherwise, we have to allocate a new chunk. Create one twice as big as
61 MemRegion
*NewRegion
= (MemRegion
*)malloc(RegionSize
*2);
62 NewRegion
->Init(RegionSize
*2, Alignment
, this);
64 // Update the current "first region" pointer to point to the new region.
67 // Try allocating from it now.
68 return NewRegion
->Allocate(AllocSize
, Alignment
, RegPtr
);
71 /// Deallocate - Release all memory for this region to the system.
74 MemRegion
*next
= Next
;
82 //===----------------------------------------------------------------------===//
83 // BumpPtrAllocator class implementation
84 //===----------------------------------------------------------------------===//
86 BumpPtrAllocator::BumpPtrAllocator() {
87 TheMemory
= malloc(4096);
88 ((MemRegion
*)TheMemory
)->Init(4096, 1, 0);
91 BumpPtrAllocator::~BumpPtrAllocator() {
92 ((MemRegion
*)TheMemory
)->Deallocate();
95 void *BumpPtrAllocator::Allocate(unsigned Size
, unsigned Align
) {
96 MemRegion
*MRP
= (MemRegion
*)TheMemory
;
97 void *Ptr
= MRP
->Allocate(Size
, Align
, &MRP
);
102 void BumpPtrAllocator::PrintStats() const {
103 unsigned BytesUsed
= 0;
104 unsigned NumRegions
= 0;
105 const MemRegion
*R
= (MemRegion
*)TheMemory
;
106 for (; R
; R
= R
->getNext(), ++NumRegions
)
107 BytesUsed
+= R
->getNumBytesAllocated();
109 cerr
<< "\nNumber of memory regions: " << NumRegions
<< "\n";
110 cerr
<< "Bytes allocated: " << BytesUsed
<< "\n";