runtime/pprof: correct field alignment in machVMRegionBasicInfoData

The type machVMRegionBasicInfoData is generated from C type
vm_region_basic_info_data_64_t, which is a packed struct with a
64-bit field at offset 20. We cannot use uint64 as the field type
in the Go struct, as that will be aligned at offset 24, which does
not match the C struct. Change back to [8]byte (which is what the
cgo command generates), but keep the name Offset.

Updates #61707.
Updates #50891.

Change-Id: I2932328d7f9dfe9d79cff89752666c794d4d3788
Reviewed-on: https://go-review.googlesource.com/c/go/+/516156
Reviewed-by: Ian Lance Taylor <iant@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Cherry Mui <cherryyz@google.com>
This commit is contained in:
Cherry Mui 2023-08-04 16:30:40 -04:00
parent a4b6685c4c
commit a0c02df519
3 changed files with 8 additions and 3 deletions

View file

@ -9,7 +9,7 @@ type machVMRegionBasicInfoData struct {
Inheritance uint32
Shared uint32
Reserved uint32
Offset uint64 // This is hand-edited since godefs generates: Pad_cgo_0 [8]byte
Offset [8]byte // This is hand-edited since godefs generates: Pad_cgo_0 [8]byte. Cannot use uint64 due to alignment.
Behavior int32
User_wired_count uint16
Pad_cgo_1 [2]byte

View file

@ -9,7 +9,7 @@ type machVMRegionBasicInfoData struct {
Inheritance uint32
Shared int32
Reserved int32
Offset uint64 // This is hand-edited since godefs generates: Pad_cgo_0 [8]byte
Offset [8]byte // This is hand-edited since godefs generates: Pad_cgo_0 [8]byte. Cannot use uint64 due to alignment.
Behavior int32
User_wired_count uint16
Pad_cgo_1 [2]byte

View file

@ -39,7 +39,7 @@ func machVMInfo(addMapping func(lo, hi, offset uint64, file, buildID string)) bo
// offset is usually 0.
addMapping(addr,
addr+memRegionSize,
uint64(info.Offset),
read64(&info.Offset),
regionFilename(addr),
"")
added = true
@ -48,6 +48,11 @@ func machVMInfo(addMapping func(lo, hi, offset uint64, file, buildID string)) bo
}
}
func read64(p *[8]byte) uint64 {
// all supported darwin platforms are little endian
return uint64(p[0]) | uint64(p[1])<<8 | uint64(p[2])<<16 | uint64(p[3])<<24 | uint64(p[4])<<32 | uint64(p[5])<<40 | uint64(p[6])<<48 | uint64(p[7])<<56
}
func regionFilename(address uint64) string {
buf := make([]byte, _MAXPATHLEN)
r := proc_regionfilename(