aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/type.go
diff options
context:
space:
mode:
authorDavid Crawshaw <crawshaw@golang.org>2016-02-20 22:54:15 -0500
committerDavid Crawshaw <crawshaw@golang.org>2016-03-08 23:23:13 +0000
commita24b3ed7538dd2eb013005fb1e153468f486857a (patch)
tree1984c416b16989a003a8adbdd2356fde7cffb7f2 /src/runtime/type.go
parent0321cabdfacc5472d2bc650de3e36ca10131b60a (diff)
downloadgo-a24b3ed7538dd2eb013005fb1e153468f486857a.tar.gz
go-a24b3ed7538dd2eb013005fb1e153468f486857a.zip
cmd/compile: remove rtype *uncommonType field
Instead of a pointer on every rtype, use a bit flag to indicate that the contents of uncommonType directly follows the rtype value when it is needed. This requires a bit of juggling in the compiler's rtype encoder. The backing arrays for fields in the rtype are presently encoded directly after the slice header. This packing requires separating the encoding of the uncommonType slice headers from their backing arrays. Reduces binary size of godoc by ~180KB (1.5%). No measurable change in all.bash time. For #6853. Change-Id: I60205948ceb5c0abba76fdf619652da9c465a597 Reviewed-on: https://go-review.googlesource.com/19790 Reviewed-by: Russ Cox <rsc@golang.org> Run-TryBot: David Crawshaw <crawshaw@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/runtime/type.go')
-rw-r--r--src/runtime/type.go70
1 files changed, 68 insertions, 2 deletions
diff --git a/src/runtime/type.go b/src/runtime/type.go
index 2312f819ea..9c9b5fb8cc 100644
--- a/src/runtime/type.go
+++ b/src/runtime/type.go
@@ -8,6 +8,11 @@ package runtime
import "unsafe"
+// tflag is documented in ../reflect/type.go.
+type tflag uint8
+
+const tflagUncommon tflag = 1
+
// Needs to be in sync with ../cmd/compile/internal/ld/decodesym.go:/^func.commonsize,
// ../cmd/compile/internal/gc/reflect.go:/^func.dcommontype and
// ../reflect/type.go:/^type.rtype.
@@ -15,7 +20,7 @@ type _type struct {
size uintptr
ptrdata uintptr // size of memory prefix holding all pointers
hash uint32
- _unused uint8
+ tflag tflag
align uint8
fieldalign uint8
kind uint8
@@ -25,7 +30,68 @@ type _type struct {
// Otherwise it is a ptrmask bitmap. See mbitmap.go for details.
gcdata *byte
_string string
- x *uncommontype
+}
+
+func (t *_type) uncommon() *uncommontype {
+ if t.tflag&tflagUncommon == 0 {
+ return nil
+ }
+ switch t.kind & kindMask {
+ case kindStruct:
+ type u struct {
+ structtype
+ u uncommontype
+ }
+ return &(*u)(unsafe.Pointer(t)).u
+ case kindPtr:
+ type u struct {
+ ptrtype
+ u uncommontype
+ }
+ return &(*u)(unsafe.Pointer(t)).u
+ case kindFunc:
+ type u struct {
+ functype
+ u uncommontype
+ }
+ return &(*u)(unsafe.Pointer(t)).u
+ case kindSlice:
+ type u struct {
+ slicetype
+ u uncommontype
+ }
+ return &(*u)(unsafe.Pointer(t)).u
+ case kindArray:
+ type u struct {
+ arraytype
+ u uncommontype
+ }
+ return &(*u)(unsafe.Pointer(t)).u
+ case kindChan:
+ type u struct {
+ chantype
+ u uncommontype
+ }
+ return &(*u)(unsafe.Pointer(t)).u
+ case kindMap:
+ type u struct {
+ maptype
+ u uncommontype
+ }
+ return &(*u)(unsafe.Pointer(t)).u
+ case kindInterface:
+ type u struct {
+ interfacetype
+ u uncommontype
+ }
+ return &(*u)(unsafe.Pointer(t)).u
+ default:
+ type u struct {
+ _type
+ u uncommontype
+ }
+ return &(*u)(unsafe.Pointer(t)).u
+ }
}
func hasPrefix(s, prefix string) bool {