internal/gocore: handle unsafe.pointer case for sync.entry.p in sync.map

Change-Id: I8c75440d8557d48cff039d228ba8a87f0fd215f2
GitHub-Last-Rev: 9448ffbeb3a1fd1cfa61bb1ed79640e41a432921
GitHub-Pull-Request: golang/debug#12
Reviewed-on: https://go-review.googlesource.com/c/debug/+/419177
Run-TryBot: Hyang-Ah Hana Kim <hyangah@gmail.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Michael Pratt <mpratt@google.com>
diff --git a/internal/gocore/type.go b/internal/gocore/type.go
index 6190b13..05d15b9 100644
--- a/internal/gocore/type.go
+++ b/internal/gocore/type.go
@@ -661,6 +661,17 @@
 		}
 		// TODO: also special case for channels?
 		for _, f := range t.Fields {
+			// sync.entry.p(in sync.map) is an unsafe.pointer to an empty interface.
+			if t.Name == "sync.entry" && f.Name == "p" && f.Type.Kind == KindPtr && f.Type.Elem == nil {
+				ptr := r.ReadPtr(a.Add(f.Off))
+				if ptr != 0 {
+					typ := &Type{
+						Name: "sync.entry<interface{}>",
+						Kind: KindEface,
+					}
+					add(ptr, typ, 1)
+				}
+			}
 			p.typeObject(a.Add(f.Off), f.Type, r, add)
 		}
 	default: