[sanitizer] fix LargeMmapAllocator::GetBlockBegin
llvm-svn: 170434
This commit is contained in:
parent
44e1beaee6
commit
12676268fa
|
|
@ -674,17 +674,11 @@ class LargeMmapAllocator {
|
|||
}
|
||||
|
||||
bool PointerIsMine(void *p) {
|
||||
// Fast check.
|
||||
if ((reinterpret_cast<uptr>(p) & (page_size_ - 1))) return false;
|
||||
SpinMutexLock l(&mutex_);
|
||||
for (Header *l = list_; l; l = l->next) {
|
||||
if (GetUser(l) == p) return true;
|
||||
}
|
||||
return false;
|
||||
return GetBlockBegin(p) != 0;
|
||||
}
|
||||
|
||||
uptr GetActuallyAllocatedSize(void *p) {
|
||||
return RoundUpMapSize(GetHeader(p)->size) - page_size_;
|
||||
return RoundUpTo(GetHeader(p)->size, page_size_);
|
||||
}
|
||||
|
||||
// At least page_size_/2 metadata bytes is available.
|
||||
|
|
@ -692,12 +686,12 @@ class LargeMmapAllocator {
|
|||
return GetHeader(p) + 1;
|
||||
}
|
||||
|
||||
void *GetBlockBegin(void *p) {
|
||||
void *GetBlockBegin(void *ptr) {
|
||||
uptr p = reinterpret_cast<uptr>(ptr);
|
||||
SpinMutexLock l(&mutex_);
|
||||
for (Header *l = list_; l; l = l->next) {
|
||||
void *b = GetUser(l);
|
||||
if (p >= b && p < (u8*)b + l->size)
|
||||
return b;
|
||||
if (p >= l->map_beg && p < l->map_beg + l->map_size)
|
||||
return GetUser(l);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -106,6 +106,8 @@ void TestSizeClassAllocator() {
|
|||
CHECK_EQ(x, a->GetBlockBegin(x));
|
||||
CHECK_EQ(x, a->GetBlockBegin(x + size - 1));
|
||||
CHECK(a->PointerIsMine(x));
|
||||
CHECK(a->PointerIsMine(x + size - 1));
|
||||
CHECK(a->PointerIsMine(x + size / 2));
|
||||
CHECK_GE(a->GetActuallyAllocatedSize(x), size);
|
||||
uptr class_id = a->GetSizeClass(x);
|
||||
CHECK_EQ(class_id, Allocator::SizeClassMapT::ClassID(size));
|
||||
|
|
@ -265,16 +267,16 @@ TEST(SanitizerCommon, LargeMmapAllocator) {
|
|||
a.Init();
|
||||
|
||||
static const int kNumAllocs = 100;
|
||||
void *allocated[kNumAllocs];
|
||||
char *allocated[kNumAllocs];
|
||||
static const uptr size = 1000;
|
||||
// Allocate some.
|
||||
for (int i = 0; i < kNumAllocs; i++) {
|
||||
allocated[i] = a.Allocate(size, 1);
|
||||
allocated[i] = (char *)a.Allocate(size, 1);
|
||||
}
|
||||
// Deallocate all.
|
||||
CHECK_GT(a.TotalMemoryUsed(), size * kNumAllocs);
|
||||
for (int i = 0; i < kNumAllocs; i++) {
|
||||
void *p = allocated[i];
|
||||
char *p = allocated[i];
|
||||
CHECK(a.PointerIsMine(p));
|
||||
a.Deallocate(p);
|
||||
}
|
||||
|
|
@ -283,7 +285,7 @@ TEST(SanitizerCommon, LargeMmapAllocator) {
|
|||
|
||||
// Allocate some more, also add metadata.
|
||||
for (int i = 0; i < kNumAllocs; i++) {
|
||||
void *x = a.Allocate(size, 1);
|
||||
char *x = (char *)a.Allocate(size, 1);
|
||||
CHECK_GE(a.GetActuallyAllocatedSize(x), size);
|
||||
uptr *meta = reinterpret_cast<uptr*>(a.GetMetaData(x));
|
||||
*meta = i;
|
||||
|
|
@ -293,7 +295,7 @@ TEST(SanitizerCommon, LargeMmapAllocator) {
|
|||
// Deallocate all in reverse order.
|
||||
for (int i = 0; i < kNumAllocs; i++) {
|
||||
int idx = kNumAllocs - i - 1;
|
||||
void *p = allocated[idx];
|
||||
char *p = allocated[idx];
|
||||
uptr *meta = reinterpret_cast<uptr*>(a.GetMetaData(p));
|
||||
CHECK_EQ(*meta, idx);
|
||||
CHECK(a.PointerIsMine(p));
|
||||
|
|
@ -304,9 +306,11 @@ TEST(SanitizerCommon, LargeMmapAllocator) {
|
|||
for (uptr alignment = 8; alignment <= max_alignment; alignment *= 2) {
|
||||
for (int i = 0; i < kNumAllocs; i++) {
|
||||
uptr size = ((i % 10) + 1) * 4096;
|
||||
allocated[i] = a.Allocate(size, alignment);
|
||||
char *p = allocated[i] = (char *)a.Allocate(size, alignment);
|
||||
CHECK_EQ(p, a.GetBlockBegin(p));
|
||||
CHECK_EQ(p, a.GetBlockBegin(p + size - 1));
|
||||
CHECK_EQ(p, a.GetBlockBegin(p + size / 2));
|
||||
CHECK_EQ(0, (uptr)allocated[i] % alignment);
|
||||
char *p = (char*)allocated[i];
|
||||
p[0] = p[size - 1] = 0;
|
||||
}
|
||||
for (int i = 0; i < kNumAllocs; i++) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue