[asan/msan] add GetBlockBegin to the 32-bit allocator (+test)

llvm-svn: 169499
This commit is contained in:
Kostya Serebryany 2012-12-06 13:13:58 +00:00
parent b69d3da00b
commit 9f84eecc9e
2 changed files with 14 additions and 1 deletions

View File

@ -354,7 +354,7 @@ class SizeClassAllocator32 {
u32 offset = mem - beg;
uptr n = offset / (u32)size; // 32-bit division
uptr meta = (beg + kRegionSize) - (n + 1) * kMetadataSize;
return (void*)meta;
return reinterpret_cast<void*>(meta);
}
bool PointerIsMine(void *p) {
@ -365,6 +365,17 @@ class SizeClassAllocator32 {
return possible_regions_[ComputeRegionId(reinterpret_cast<uptr>(p))] - 1;
}
void *GetBlockBegin(void *p) {
CHECK(PointerIsMine(p));
uptr mem = reinterpret_cast<uptr>(p);
uptr beg = ComputeRegionBeg(mem);
uptr size = SizeClassMap::Size(GetSizeClass(p));
u32 offset = mem - beg;
u32 n = offset / (u32)size; // 32-bit division
uptr res = beg + (n * (u32)size);
return reinterpret_cast<void*>(res);
}
uptr GetActuallyAllocatedSize(void *p) {
CHECK(PointerIsMine(p));
return SizeClassMap::Size(GetSizeClass(p));

View File

@ -96,6 +96,8 @@ void TestSizeClassAllocator() {
for (uptr i = 0; i < n_iter; i++) {
void *x = a->Allocate(size, 1);
allocated.push_back(x);
CHECK_EQ(x, a->GetBlockBegin(x));
CHECK_EQ(x, a->GetBlockBegin((char*)x + size - 1));
CHECK(a->PointerIsMine(x));
CHECK_GE(a->GetActuallyAllocatedSize(x), size);
uptr class_id = a->GetSizeClass(x);