]> Cypherpunks.ru repositories - gostls13.git/blobdiff - src/runtime/heapdump.go
runtime: implement experiment to replace heap bitmap with alloc headers
[gostls13.git] / src / runtime / heapdump.go
index 2394a3e9eb3a1522f2c6021afff7aff59fe00b7c..da9b8093ad61711b1222efae890f433cb965a79d 100644 (file)
@@ -14,6 +14,7 @@ package runtime
 import (
        "internal/abi"
        "internal/goarch"
+       "internal/goexperiment"
        "unsafe"
 )
 
@@ -737,16 +738,28 @@ func makeheapobjbv(p uintptr, size uintptr) bitvector {
        for i := uintptr(0); i < nptr/8+1; i++ {
                tmpbuf[i] = 0
        }
-
-       hbits := heapBitsForAddr(p, size)
-       for {
-               var addr uintptr
-               hbits, addr = hbits.next()
-               if addr == 0 {
-                       break
+       if goexperiment.AllocHeaders {
+               s := spanOf(p)
+               tp := s.typePointersOf(p, size)
+               for {
+                       var addr uintptr
+                       if tp, addr = tp.next(p + size); addr == 0 {
+                               break
+                       }
+                       i := (addr - p) / goarch.PtrSize
+                       tmpbuf[i/8] |= 1 << (i % 8)
+               }
+       } else {
+               hbits := heapBitsForAddr(p, size)
+               for {
+                       var addr uintptr
+                       hbits, addr = hbits.next()
+                       if addr == 0 {
+                               break
+                       }
+                       i := (addr - p) / goarch.PtrSize
+                       tmpbuf[i/8] |= 1 << (i % 8)
                }
-               i := (addr - p) / goarch.PtrSize
-               tmpbuf[i/8] |= 1 << (i % 8)
        }
        return bitvector{int32(nptr), &tmpbuf[0]}
 }