1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 03:02:36 +01:00

BumpPtrAllocator: Make sure threshold cannot be initialized with a value smaller than the slab size.

This replaces r151834 with a simpler fix.

llvm-svn: 151842
This commit is contained in:
Benjamin Kramer 2012-03-01 22:10:16 +00:00
parent 5bca3bef43
commit 88e1073516
2 changed files with 7 additions and 12 deletions

View File

@ -22,8 +22,8 @@ namespace llvm {
BumpPtrAllocator::BumpPtrAllocator(size_t size, size_t threshold,
SlabAllocator &allocator)
: SlabSize(size), SizeThreshold(threshold), Allocator(allocator),
CurSlab(0), BytesAllocated(0) { }
: SlabSize(size), SizeThreshold(std::min(size, threshold)),
Allocator(allocator), CurSlab(0), BytesAllocated(0) { }
BumpPtrAllocator::~BumpPtrAllocator() {
DeallocateSlabs(CurSlab);
@ -87,21 +87,15 @@ void BumpPtrAllocator::Reset() {
/// Allocate - Allocate space at the specified alignment.
///
void *BumpPtrAllocator::Allocate(size_t Size, size_t Alignment) {
// 0-byte alignment means 1-byte alignment.
if (Alignment == 0) Alignment = 1;
size_t PaddedSize = Size + sizeof(MemSlab) + Alignment - 1;
// If requested size exceeds slab size, increase slab size.
while (PaddedSize > SlabSize)
SlabSize *= 2;
if (!CurSlab) // Start a new slab if we haven't allocated one already.
StartNewSlab();
// Keep track of how many bytes we've allocated.
BytesAllocated += Size;
// 0-byte alignment means 1-byte alignment.
if (Alignment == 0) Alignment = 1;
// Allocate the aligned space, going forwards from CurPtr.
char *Ptr = AlignPtr(CurPtr, Alignment);
@ -112,6 +106,7 @@ void *BumpPtrAllocator::Allocate(size_t Size, size_t Alignment) {
}
// If Size is really big, allocate a separate slab for it.
size_t PaddedSize = Size + sizeof(MemSlab) + Alignment - 1;
if (PaddedSize > SizeThreshold) {
MemSlab *NewSlab = Allocator.Allocate(PaddedSize);

View File

@ -98,7 +98,7 @@ TEST(AllocatorTest, TestSmallSlabSize) {
BumpPtrAllocator Alloc(128);
Alloc.Allocate(200, 0);
EXPECT_EQ(1U, Alloc.GetNumSlabs());
EXPECT_EQ(2U, Alloc.GetNumSlabs());
}
// Mock slab allocator that returns slabs aligned on 4096 bytes. There is no