mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: use 1-bit pointer bitmaps in type representation
The type information in reflect.Type and the GC programs is now 1 bit per word, down from 2 bits. The in-memory unrolled type bitmap representation are now 1 bit per word, down from 4 bits. The conversion from the unrolled (now 1-bit) bitmap to the heap bitmap (still 4-bit) is not optimized. A followup CL will work on that, after the heap bitmap has been converted to 2-bit. The typeDead optimization, in which a special value denotes that there are no more pointers anywhere in the object, is lost in this CL. A followup CL will bring it back in the final form of heapBitsSetType. Change-Id: If61e67950c16a293b0b516a6fd9a1c755b6d5549 Reviewed-on: https://go-review.googlesource.com/9702 Reviewed-by: Austin Clements <austin@google.com>
This commit is contained in:
parent
7d9e16abc6
commit
6d8a147bef
10 changed files with 204 additions and 301 deletions
|
|
@ -4388,7 +4388,7 @@ func TestCallGC(t *testing.T) {
|
|||
type funcLayoutTest struct {
|
||||
rcvr, t Type
|
||||
size, argsize, retOffset uintptr
|
||||
stack []byte
|
||||
stack []byte // pointer bitmap: 1 is pointer, 0 is scalar (or uninitialized)
|
||||
gc []byte
|
||||
}
|
||||
|
||||
|
|
@ -4399,7 +4399,7 @@ func init() {
|
|||
var naclExtra []byte
|
||||
if runtime.GOARCH == "amd64p32" {
|
||||
argAlign = 2 * PtrSize
|
||||
naclExtra = append(naclExtra, BitsScalar)
|
||||
naclExtra = append(naclExtra, 0)
|
||||
}
|
||||
roundup := func(x uintptr, a uintptr) uintptr {
|
||||
return (x + a - 1) / a * a
|
||||
|
|
@ -4412,17 +4412,17 @@ func init() {
|
|||
6 * PtrSize,
|
||||
4 * PtrSize,
|
||||
4 * PtrSize,
|
||||
[]byte{BitsPointer, BitsScalar, BitsPointer},
|
||||
[]byte{BitsPointer, BitsScalar, BitsPointer, BitsScalar, BitsPointer, BitsScalar},
|
||||
[]byte{1, 0, 1},
|
||||
[]byte{1, 0, 1, 0, 1, 0},
|
||||
})
|
||||
|
||||
var r, s []byte
|
||||
if PtrSize == 4 {
|
||||
r = []byte{BitsScalar, BitsScalar, BitsScalar, BitsPointer}
|
||||
s = append([]byte{BitsScalar, BitsScalar, BitsScalar, BitsPointer, BitsScalar}, naclExtra...)
|
||||
r = []byte{0, 0, 0, 1}
|
||||
s = append([]byte{0, 0, 0, 1, 0}, naclExtra...)
|
||||
} else {
|
||||
r = []byte{BitsScalar, BitsScalar, BitsPointer}
|
||||
s = []byte{BitsScalar, BitsScalar, BitsPointer, BitsScalar}
|
||||
r = []byte{0, 0, 1}
|
||||
s = []byte{0, 0, 1, 0}
|
||||
}
|
||||
funcLayoutTests = append(funcLayoutTests,
|
||||
funcLayoutTest{
|
||||
|
|
@ -4442,8 +4442,8 @@ func init() {
|
|||
4 * PtrSize,
|
||||
4 * PtrSize,
|
||||
4 * PtrSize,
|
||||
[]byte{BitsPointer, BitsScalar, BitsPointer, BitsPointer},
|
||||
[]byte{BitsPointer, BitsScalar, BitsPointer, BitsPointer},
|
||||
[]byte{1, 0, 1, 1},
|
||||
[]byte{1, 0, 1, 1},
|
||||
})
|
||||
|
||||
type S struct {
|
||||
|
|
@ -4457,8 +4457,8 @@ func init() {
|
|||
4 * PtrSize,
|
||||
4 * PtrSize,
|
||||
4 * PtrSize,
|
||||
[]byte{BitsScalar, BitsScalar, BitsPointer, BitsPointer},
|
||||
[]byte{BitsScalar, BitsScalar, BitsPointer, BitsPointer},
|
||||
[]byte{0, 0, 1, 1},
|
||||
[]byte{0, 0, 1, 1},
|
||||
})
|
||||
|
||||
funcLayoutTests = append(funcLayoutTests,
|
||||
|
|
@ -4468,8 +4468,8 @@ func init() {
|
|||
roundup(3*PtrSize, argAlign),
|
||||
3 * PtrSize,
|
||||
roundup(3*PtrSize, argAlign),
|
||||
[]byte{BitsPointer, BitsScalar, BitsPointer},
|
||||
append([]byte{BitsPointer, BitsScalar, BitsPointer}, naclExtra...),
|
||||
[]byte{1, 0, 1},
|
||||
append([]byte{1, 0, 1}, naclExtra...),
|
||||
})
|
||||
|
||||
funcLayoutTests = append(funcLayoutTests,
|
||||
|
|
@ -4480,7 +4480,7 @@ func init() {
|
|||
PtrSize,
|
||||
roundup(PtrSize, argAlign),
|
||||
[]byte{},
|
||||
append([]byte{BitsScalar}, naclExtra...),
|
||||
append([]byte{0}, naclExtra...),
|
||||
})
|
||||
|
||||
funcLayoutTests = append(funcLayoutTests,
|
||||
|
|
@ -4491,7 +4491,7 @@ func init() {
|
|||
0,
|
||||
0,
|
||||
[]byte{},
|
||||
[]byte{BitsScalar},
|
||||
[]byte{0},
|
||||
})
|
||||
|
||||
funcLayoutTests = append(funcLayoutTests,
|
||||
|
|
@ -4501,8 +4501,8 @@ func init() {
|
|||
2 * PtrSize,
|
||||
2 * PtrSize,
|
||||
2 * PtrSize,
|
||||
[]byte{BitsPointer},
|
||||
[]byte{BitsPointer, BitsScalar},
|
||||
[]byte{1},
|
||||
[]byte{1, 0},
|
||||
// Note: this one is tricky, as the receiver is not a pointer. But we
|
||||
// pass the receiver by reference to the autogenerated pointer-receiver
|
||||
// version of the function.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue