am f929b1f2: Merge "Fix valgrind support for dlmalloc space."

* commit 'f929b1f270a880e1f98c7a3913a5a5468a2a2368':
  Fix valgrind support for dlmalloc space.
diff --git a/runtime/gc/space/dlmalloc_space.cc b/runtime/gc/space/dlmalloc_space.cc
index a42e880..d539aa2 100644
--- a/runtime/gc/space/dlmalloc_space.cc
+++ b/runtime/gc/space/dlmalloc_space.cc
@@ -20,8 +20,8 @@
 #include "thread.h"
 #include "utils.h"
 
-// #include <valgrind/memcheck.h>
 #include <valgrind.h>
+#include <../memcheck/memcheck.h>
 
 namespace art {
 namespace gc {
@@ -47,71 +47,63 @@
 class ValgrindDlMallocSpace : public DlMallocSpace {
  public:
   virtual mirror::Object* AllocWithGrowth(Thread* self, size_t num_bytes) {
-    void* obj_with_rdz = DlMallocSpace::AllocWithGrowth(self, num_bytes + (2 * kValgrindRedZoneBytes));
-    if (obj_with_rdz != NULL) {
-      // VALGRIND_MAKE_MEM_UNDEFINED();
-      mirror::Object* result = reinterpret_cast<mirror::Object*>(reinterpret_cast<byte*>(obj_with_rdz) +
-                                                                 kValgrindRedZoneBytes);
-      VALGRIND_MEMPOOL_ALLOC(GetMspace(), result, num_bytes);
-      LOG(INFO) << "AllocWithGrowth on " << self << " = " << obj_with_rdz
-          << " of size " << num_bytes;
-      return result;
-    } else {
+    void* obj_with_rdz = DlMallocSpace::AllocWithGrowth(self, num_bytes + 2 * kValgrindRedZoneBytes);
+    if (obj_with_rdz == NULL) {
       return NULL;
     }
+    mirror::Object* result = reinterpret_cast<mirror::Object*>(
+        reinterpret_cast<byte*>(obj_with_rdz) + kValgrindRedZoneBytes);
+    // Make redzones as no access.
+    VALGRIND_MAKE_MEM_NOACCESS(obj_with_rdz, kValgrindRedZoneBytes);
+    VALGRIND_MAKE_MEM_NOACCESS(reinterpret_cast<byte*>(result) + num_bytes, kValgrindRedZoneBytes);
+    return result;
   }
 
   virtual mirror::Object* Alloc(Thread* self, size_t num_bytes) {
-    void* obj_with_rdz = DlMallocSpace::Alloc(self, num_bytes + (2 * kValgrindRedZoneBytes));
-    if (obj_with_rdz != NULL) {
-      mirror::Object* result = reinterpret_cast<mirror::Object*>(reinterpret_cast<byte*>(obj_with_rdz) +
-                                                                 kValgrindRedZoneBytes);
-      VALGRIND_MEMPOOL_ALLOC(GetMspace(), result, num_bytes);
-      LOG(INFO) << "Alloc on " << self << " = " << obj_with_rdz
-          << " of size " << num_bytes;
-      return result;
-    } else {
-      return NULL;
+    void* obj_with_rdz = DlMallocSpace::Alloc(self, num_bytes + 2 * kValgrindRedZoneBytes);
+    if (obj_with_rdz == NULL) {
+     return NULL;
     }
+    mirror::Object* result = reinterpret_cast<mirror::Object*>(
+        reinterpret_cast<byte*>(obj_with_rdz) + kValgrindRedZoneBytes);
+    // Make redzones as no access.
+    VALGRIND_MAKE_MEM_NOACCESS(obj_with_rdz, kValgrindRedZoneBytes);
+    VALGRIND_MAKE_MEM_NOACCESS(reinterpret_cast<byte*>(result) + num_bytes, kValgrindRedZoneBytes);
+    return result;
   }
 
   virtual size_t AllocationSize(const mirror::Object* obj) {
-    const void* obj_after_rdz = reinterpret_cast<const void*>(obj);
-    size_t result = DlMallocSpace::AllocationSize(
-        reinterpret_cast<const mirror::Object*>(reinterpret_cast<const byte*>(obj_after_rdz) -
-                                                kValgrindRedZoneBytes));
-    return result - (2 * kValgrindRedZoneBytes);
+    size_t result = DlMallocSpace::AllocationSize(reinterpret_cast<const mirror::Object*>(
+        reinterpret_cast<const byte*>(obj) - kValgrindRedZoneBytes));
+    return result - 2 * kValgrindRedZoneBytes;
   }
 
   virtual size_t Free(Thread* self, mirror::Object* ptr) {
     void* obj_after_rdz = reinterpret_cast<void*>(ptr);
     void* obj_with_rdz = reinterpret_cast<byte*>(obj_after_rdz) - kValgrindRedZoneBytes;
-    LOG(INFO) << "Free on " << self << " of " << obj_with_rdz;
+    // Make redzones undefined.
+    size_t allocation_size = DlMallocSpace::AllocationSize(
+        reinterpret_cast<mirror::Object*>(obj_with_rdz));
+    VALGRIND_MAKE_MEM_UNDEFINED(obj_with_rdz, allocation_size);
     size_t freed = DlMallocSpace::Free(self, reinterpret_cast<mirror::Object*>(obj_with_rdz));
-    VALGRIND_MEMPOOL_FREE(GetMspace(), obj_after_rdz);
-    return freed - (2 * kValgrindRedZoneBytes);
+    return freed - 2 * kValgrindRedZoneBytes;
   }
 
   virtual size_t FreeList(Thread* self, size_t num_ptrs, mirror::Object** ptrs) {
     size_t freed = 0;
     for (size_t i = 0; i < num_ptrs; i++) {
-      void* obj_after_rdz = reinterpret_cast<void*>(ptrs[i]);
-      void* obj_with_rdz = reinterpret_cast<byte*>(obj_after_rdz) - kValgrindRedZoneBytes;
-      LOG(INFO) << "FreeList on " << self << " of " << obj_with_rdz;
-      freed += DlMallocSpace::Free(self, reinterpret_cast<mirror::Object*>(obj_with_rdz));
-      VALGRIND_MEMPOOL_FREE(GetMspace(), obj_after_rdz);
+      freed += Free(self, ptrs[i]);
     }
-    return freed - (2 * kValgrindRedZoneBytes * num_ptrs);
+    return freed;
   }
 
   ValgrindDlMallocSpace(const std::string& name, MemMap* mem_map, void* mspace, byte* begin,
-                        byte* end, size_t growth_limit) :
+                        byte* end, size_t growth_limit, size_t initial_size) :
       DlMallocSpace(name, mem_map, mspace, begin, end, growth_limit) {
-    VALGRIND_CREATE_MEMPOOL(GetMspace(), kValgrindRedZoneBytes, true);
+    VALGRIND_MAKE_MEM_UNDEFINED(mem_map->Begin() + initial_size, mem_map->Size() - initial_size);
   }
 
   virtual ~ValgrindDlMallocSpace() {
-    VALGRIND_DESTROY_MEMPOOL(GetMspace());
   }
 
  private:
@@ -182,8 +174,8 @@
   growth_limit = RoundUp(growth_limit, kPageSize);
   capacity = RoundUp(capacity, kPageSize);
 
-  UniquePtr<MemMap> mem_map(MemMap::MapAnonymous(name.c_str(), requested_begin,
-                                                 capacity, PROT_READ | PROT_WRITE));
+  UniquePtr<MemMap> mem_map(MemMap::MapAnonymous(name.c_str(), requested_begin, capacity,
+                                                 PROT_READ | PROT_WRITE));
   if (mem_map.get() == NULL) {
     LOG(ERROR) << "Failed to allocate pages for alloc space (" << name << ") of size "
         << PrettySize(capacity);
@@ -207,7 +199,7 @@
   DlMallocSpace* space;
   if (RUNNING_ON_VALGRIND > 0) {
     space = new ValgrindDlMallocSpace(name, mem_map_ptr, mspace, mem_map_ptr->Begin(), end,
-                                      growth_limit);
+                                      growth_limit, initial_size);
   } else {
     space = new DlMallocSpace(name, mem_map_ptr, mspace, mem_map_ptr->Begin(), end, growth_limit);
   }
@@ -249,7 +241,7 @@
       CHECK(Contains(result)) << "Allocation (" << reinterpret_cast<void*>(result)
             << ") not in bounds of allocation space " << *this;
     }
-    size_t allocation_size = AllocationSize(result);
+    size_t allocation_size = InternalAllocationSize(result);
     num_bytes_allocated_ += allocation_size;
     total_bytes_allocated_ += allocation_size;
     ++total_objects_allocated_;