[tsan] test the allocator with CompactSizeClassMap
authorKostya Serebryany <kcc@google.com>
Tue, 4 Dec 2012 14:39:51 +0000 (14:39 +0000)
committerKostya Serebryany <kcc@google.com>
Tue, 4 Dec 2012 14:39:51 +0000 (14:39 +0000)
llvm-svn: 169270

compiler-rt/lib/sanitizer_common/sanitizer_allocator64.h
compiler-rt/lib/sanitizer_common/tests/sanitizer_allocator64_test.cc

index 6870744..7686796 100644 (file)
@@ -161,8 +161,9 @@ class SizeClassAllocator64 {
   COMPILER_CHECK(sizeof(RegionInfo) == kCacheLineSize);
 
   static uptr AdditionalSize() {
-    uptr res = sizeof(RegionInfo) * kNumClasses;
-    CHECK_EQ(res % GetPageSizeCached(), 0);
+    uptr PageSize = GetPageSizeCached();
+    uptr res = Max(sizeof(RegionInfo) * kNumClasses, PageSize);
+    CHECK_EQ(res % PageSize, 0);
     return res;
   }
 
index 68b730d..eccf70b 100644 (file)
 static const uptr kAllocatorSpace = 0x700000000000ULL;
 static const uptr kAllocatorSize  = 0x010000000000ULL;  // 1T.
 
-typedef DefaultSizeClassMap SCMap;
-typedef
-  SizeClassAllocator64<kAllocatorSpace, kAllocatorSize, 16, SCMap> Allocator64;
+typedef SizeClassAllocator64<
+  kAllocatorSpace, kAllocatorSize, 16, DefaultSizeClassMap> Allocator64;
+
+typedef SizeClassAllocator64<
+  kAllocatorSpace, kAllocatorSize, 16, CompactSizeClassMap> Allocator64Compact;
 
 template <class SizeClassMap>
 void TestSizeClassMap() {
@@ -74,6 +76,7 @@ void TestSizeClassAllocator() {
     // Allocate a bunch of chunks.
     for (uptr s = 0; s < sizeof(sizes) /sizeof(sizes[0]); s++) {
       uptr size = sizes[s];
+      if (!a.CanAllocate(size, 1)) continue;
       // printf("s = %ld\n", size);
       uptr n_iter = std::max((uptr)2, 1000000 / size);
       for (uptr i = 0; i < n_iter; i++) {
@@ -82,7 +85,7 @@ void TestSizeClassAllocator() {
         CHECK(a.PointerIsMine(x));
         CHECK_GE(a.GetActuallyAllocatedSize(x), size);
         uptr class_id = a.GetSizeClass(x);
-        CHECK_EQ(class_id, SCMap::ClassID(size));
+        CHECK_EQ(class_id, Allocator::SizeClassMapT::ClassID(size));
         uptr *metadata = reinterpret_cast<uptr*>(a.GetMetaData(x));
         metadata[0] = reinterpret_cast<uptr>(x) + 1;
         metadata[1] = 0xABCD;
@@ -110,6 +113,10 @@ TEST(SanitizerCommon, SizeClassAllocator64) {
   TestSizeClassAllocator<Allocator64>();
 }
 
+TEST(SanitizerCommon, SizeClassAllocator64Compact) {
+  TestSizeClassAllocator<Allocator64Compact>();
+}
+
 template <class Allocator>
 void SizeClassAllocator64MetadataStress() {
   Allocator a;
@@ -139,6 +146,10 @@ TEST(SanitizerCommon, SizeClassAllocator64MetadataStress) {
   SizeClassAllocator64MetadataStress<Allocator64>();
 }
 
+TEST(SanitizerCommon, SizeClassAllocator64CompactMetadataStress) {
+  SizeClassAllocator64MetadataStress<Allocator64Compact>();
+}
+
 template<class Allocator>
 void FailInAssertionOnOOM() {
   Allocator a;
@@ -256,7 +267,6 @@ void TestCombinedAllocator() {
   a.TestOnlyUnmap();
 }
 
-
 TEST(SanitizerCommon, CombinedAllocator) {
   TestCombinedAllocator<Allocator64,
       LargeMmapAllocator,