elems := makefield("elems", arr)
field = append(field, elems)
- // Make sure the overflow pointer is the last memory in the struct,
- // because the runtime assumes it can use size-ptrSize as the
- // offset of the overflow pointer. We double-check that property
- // below once the offsets and size are computed.
- //
- // BUCKETSIZE is 8, so the struct is aligned to 64 bits to this point.
- // On 32-bit systems, the max alignment is 32-bit, and the
- // overflow pointer will add another 32-bit field, and the struct
- // will end with no padding.
- // On 64-bit systems, the max alignment is 64-bit, and the
- // overflow pointer will add another 64-bit field, and the struct
- // will end with no padding.
- // On nacl/amd64p32, however, the max alignment is 64-bit,
- // but the overflow pointer will add only a 32-bit field,
- // so if the struct needs 64-bit padding (because a key or elem does)
- // then it would end with an extra 32-bit padding field.
- // Preempt that by emitting the padding here.
- if int(elemtype.Align) > Widthptr || int(keytype.Align) > Widthptr {
- field = append(field, makefield("pad", types.Types[TUINTPTR]))
- }
-
// If keys and elems have no pointers, the map implementation
// can keep a list of overflow pointers on the side so that
// buckets can be marked as having no pointers.
}
// Double-check that overflow field is final memory in struct,
- // with no padding at end. See comment above.
+ // with no padding at end.
if overflow.Offset != bucket.Width-int64(Widthptr) {
Fatalf("bad offset of overflow in bmap for %v", t)
}