[Support] Add SpecificBumpPtrAllocator::identifyObject (#100475)

This already exists in BumpPtrAllocatorImpl, but I would like to use it
from SpecificBumpPtrAllocator.

I also noticed there was no test for identifyObject so I added one.
This commit is contained in:
Alex Langford 2024-07-25 14:05:00 -07:00 committed by GitHub
parent 9720690f4e
commit 4aa4ee9090
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 28 additions and 0 deletions

View File

@ -435,6 +435,13 @@ public:
/// Allocate space for an array of objects without constructing them.
T *Allocate(size_t num = 1) { return Allocator.Allocate<T>(num); }
/// \return An index uniquely and reproducibly identifying
/// an input pointer \p Ptr in the given allocator.
/// Returns an empty optional if the pointer is not found in the allocator.
std::optional<int64_t> identifyObject(const void *Ptr) {
return Allocator.identifyObject(Ptr);
}
};
} // end namespace llvm

View File

@ -208,6 +208,27 @@ TEST(AllocatorTest, TestSlowerSlabGrowthDelay) {
EXPECT_EQ(SlabSize * GrowthDelay + SlabSize * 2, Alloc.getTotalMemory());
}
TEST(AllocatorTest, TestIdentifyObject) {
BumpPtrAllocator Alloc;
uint64_t *a = (uint64_t *)Alloc.Allocate(sizeof(uint64_t), alignof(uint64_t));
std::optional<int64_t> maybe_a_belongs = Alloc.identifyObject(a);
EXPECT_TRUE(maybe_a_belongs.has_value());
EXPECT_TRUE(*maybe_a_belongs >= 0);
uint64_t *b = nullptr;
std::optional<int64_t> maybe_b_belongs = Alloc.identifyObject(b);
EXPECT_FALSE(maybe_b_belongs);
// The default slab size is 4096 (or 512 uint64_t values). Custom slabs are
// allocated when the requested size is larger than the slab size.
uint64_t *c =
(uint64_t *)Alloc.Allocate(sizeof(uint64_t) * 1024, alignof(uint64_t));
std::optional<int64_t> maybe_c_belongs = Alloc.identifyObject(c);
EXPECT_TRUE(maybe_c_belongs.has_value());
EXPECT_TRUE(*maybe_c_belongs < 0);
}
// Mock slab allocator that returns slabs aligned on 4096 bytes. There is no
// easy portable way to do this, so this is kind of a hack.
class MockSlabAllocator {