[vm, gc] Also label committed regions of the compressed heap on Linux and Fuchsia.

TEST=/proc/pid/maps on sufficiently new kernel
Bug: https://github.com/dart-lang/sdk/issues/64873
Cq-Include-Trybots: luci.dart.try:vm-aot-android-debug-x64c-try,vm-aot-win-debug-x64c-try,vm-aot-linux-debug-x64c-try
Change-Id: I9b1cfa19547912c3d359aa13958d253130efd64c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/576200
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
diff --git a/runtime/vm/heap/page.cc b/runtime/vm/heap/page.cc
index 3ec4946..12e07a4 100644
--- a/runtime/vm/heap/page.cc
+++ b/runtime/vm/heap/page.cc
@@ -74,7 +74,7 @@
   if (memory == nullptr) {
     if (compressed) {
 #if defined(DART_COMPRESSED_POINTERS)
-      memory = cage->Allocate(size, kPageSize);
+      memory = cage->Allocate(size, kPageSize, name);
 #else
       UNREACHABLE();
 #endif
diff --git a/runtime/vm/virtual_memory.h b/runtime/vm/virtual_memory.h
index 29e181c..e90b9c5 100644
--- a/runtime/vm/virtual_memory.h
+++ b/runtime/vm/virtual_memory.h
@@ -167,7 +167,7 @@
   static bool FreeSubSegment(void* address, intptr_t size);
 
   static VirtualMemory* Reserve(intptr_t size, intptr_t alignment);
-  static void Commit(void* address, intptr_t size);
+  static void Commit(void* address, intptr_t size, const char* name);
   static void Decommit(void* address, intptr_t size);
 
 #if defined(DART_ENABLE_RX_WORKAROUNDS)
diff --git a/runtime/vm/virtual_memory_compressed.cc b/runtime/vm/virtual_memory_compressed.cc
index 857e1e4..393fb9e 100644
--- a/runtime/vm/virtual_memory_compressed.cc
+++ b/runtime/vm/virtual_memory_compressed.cc
@@ -55,7 +55,9 @@
   zx_vmar_destroy(outer_vmar_);
 }
 
-VirtualMemory* Cage::Allocate(intptr_t size, intptr_t alignment) {
+VirtualMemory* Cage::Allocate(intptr_t size,
+                              intptr_t alignment,
+                              const char* name) {
   const zx_vm_option_t align_flag = Utils::ShiftForPowerOfTwo(alignment)
                                     << ZX_VM_ALIGN_BASE;
   ASSERT((ZX_VM_ALIGN_1KB <= align_flag) && (align_flag <= ZX_VM_ALIGN_4GB));
@@ -69,6 +71,10 @@
           zx_status_get_string(status));
   }
 
+  if (name != nullptr) {
+    zx_object_set_property(vmo, ZX_PROP_NAME, name, strlen(name));
+  }
+
   const zx_vm_option_t region_options =
       ZX_VM_PERM_READ | ZX_VM_PERM_WRITE | align_flag;
   uword base;
@@ -177,7 +183,9 @@
   return reinterpret_cast<void*>(base_);
 }
 
-VirtualMemory* Cage::Allocate(intptr_t size, intptr_t alignment) {
+VirtualMemory* Cage::Allocate(intptr_t size,
+                              intptr_t alignment,
+                              const char* name) {
   ASSERT(alignment <= kCompressedHeapAlignment);
   const intptr_t allocated_size = Utils::RoundUp(size, kCompressedPageSize);
   uword pages = allocated_size / kCompressedPageSize;
@@ -227,7 +235,7 @@
   uword address = base_ + page_id * kCompressedPageSize;
   ASSERT(Utils::IsAligned(address, kCompressedPageSize));
   MemoryRegion region(reinterpret_cast<void*>(address), allocated_size);
-  VirtualMemory::Commit(region.pointer(), region.size());
+  VirtualMemory::Commit(region.pointer(), region.size(), name);
   return new VirtualMemory(region, region, this);
 }
 
diff --git a/runtime/vm/virtual_memory_compressed.h b/runtime/vm/virtual_memory_compressed.h
index 5533844..e62b494 100644
--- a/runtime/vm/virtual_memory_compressed.h
+++ b/runtime/vm/virtual_memory_compressed.h
@@ -36,7 +36,7 @@
   Cage();
   ~Cage();
 
-  VirtualMemory* Allocate(intptr_t size, intptr_t alignment);
+  VirtualMemory* Allocate(intptr_t size, intptr_t alignment, const char* name);
   void Free(void* address, intptr_t size);
 
   void* GetRegion();
diff --git a/runtime/vm/virtual_memory_posix.cc b/runtime/vm/virtual_memory_posix.cc
index 81b9386..c91def1 100644
--- a/runtime/vm/virtual_memory_posix.cc
+++ b/runtime/vm/virtual_memory_posix.cc
@@ -720,7 +720,7 @@
   return new VirtualMemory(region, region);
 }
 
-void VirtualMemory::Commit(void* address, intptr_t size) {
+void VirtualMemory::Commit(void* address, intptr_t size, const char* name) {
   ASSERT(Utils::IsAligned(address, PageSize()));
   ASSERT(Utils::IsAligned(size, PageSize()));
   void* result = mmap(address, size, PROT_READ | PROT_WRITE,
@@ -732,6 +732,9 @@
     FATAL("Failed to commit: %d (%s)", error,
           Utils::StrError(error, error_buf, kBufferSize));
   }
+#if defined(DART_HOST_OS_ANDROID) || defined(DART_HOST_OS_LINUX)
+  prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, address, size, name);
+#endif
 }
 
 void VirtualMemory::Decommit(void* address, intptr_t size) {
@@ -747,6 +750,9 @@
     FATAL("Failed to decommit: %d (%s)", error,
           Utils::StrError(error, error_buf, kBufferSize));
   }
+#if defined(DART_HOST_OS_ANDROID) || defined(DART_HOST_OS_LINUX)
+  prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, address, size, nullptr);
+#endif
 }
 
 VirtualMemory::~VirtualMemory() {
diff --git a/runtime/vm/virtual_memory_win.cc b/runtime/vm/virtual_memory_win.cc
index 86cb61c..b738858 100644
--- a/runtime/vm/virtual_memory_win.cc
+++ b/runtime/vm/virtual_memory_win.cc
@@ -127,7 +127,7 @@
   return new VirtualMemory(region, reserved);
 }
 
-void VirtualMemory::Commit(void* address, intptr_t size) {
+void VirtualMemory::Commit(void* address, intptr_t size, const char* name) {
   ASSERT(Utils::IsAligned(address, PageSize()));
   ASSERT(Utils::IsAligned(size, PageSize()));
   void* result = VirtualAlloc(address, size, MEM_COMMIT, PAGE_READWRITE);