From 04d6f982ae63c4026bf5f65891547b3353d3b63b Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Wed, 31 May 2017 10:08:51 -0700 Subject: [PATCH] runtime: remove link field from itab We don't use it any more, remove it. Change-Id: I76ce1a4c2e7048fdd13a37d3718b5abf39ed9d26 Reviewed-on: https://go-review.googlesource.com/44474 Reviewed-by: Josh Bleecher Snyder --- src/cmd/compile/internal/gc/reflect.go | 4 +--- src/cmd/compile/internal/gc/ssa.go | 2 +- src/cmd/compile/internal/gc/swt.go | 2 +- src/reflect/value.go | 1 - src/runtime/runtime2.go | 1 - 5 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/cmd/compile/internal/gc/reflect.go b/src/cmd/compile/internal/gc/reflect.go index 1b4198d03d..e3d8b1537e 100644 --- a/src/cmd/compile/internal/gc/reflect.go +++ b/src/cmd/compile/internal/gc/reflect.go @@ -1408,7 +1408,7 @@ func itabsym(it *obj.LSym, offset int64) *obj.LSym { } // keep this arithmetic in sync with *itab layout - methodnum := int((offset - 3*int64(Widthptr) - 8) / int64(Widthptr)) + methodnum := int((offset - 2*int64(Widthptr) - 8) / int64(Widthptr)) if methodnum >= len(syms) { return nil } @@ -1457,14 +1457,12 @@ func dumptabs() { // type itab struct { // inter *interfacetype // _type *_type - // _ uintptr TODO: remove // hash uint32 // _ [4]byte // fun [1]uintptr // variable sized // } o := dsymptr(i.lsym, 0, dtypesym(i.itype).Linksym(), 0) o = dsymptr(i.lsym, o, dtypesym(i.t).Linksym(), 0) - o = duintptr(i.lsym, o, 0) // unused o = duint32(i.lsym, o, typehash(i.t)) // copy of type hash o += 4 // skip unused field o += len(imethods(i.itype)) * Widthptr // skip fun method pointers diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index f018697fc1..932d1f2b70 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -3122,7 +3122,7 @@ func (s *state) call(n *Node, k callKind) *ssa.Value { if k != callNormal { s.nilCheck(itab) } - itabidx := fn.Xoffset + 3*int64(Widthptr) + 8 // offset of fun field in runtime.itab + itabidx := fn.Xoffset + 2*int64(Widthptr) + 8 // offset of fun field in runtime.itab itab = s.newValue1I(ssa.OpOffPtr, s.f.Config.Types.UintptrPtr, itabidx, itab) if k == callNormal { codeptr = s.newValue2(ssa.OpLoad, types.Types[TUINTPTR], itab, s.mem()) diff --git a/src/cmd/compile/internal/gc/swt.go b/src/cmd/compile/internal/gc/swt.go index 1b76650a7f..3051341b6a 100644 --- a/src/cmd/compile/internal/gc/swt.go +++ b/src/cmd/compile/internal/gc/swt.go @@ -757,7 +757,7 @@ func (s *typeSwitch) walk(sw *Node) { if cond.Right.Type.IsEmptyInterface() { h.Xoffset = int64(2 * Widthptr) // offset of hash in runtime._type } else { - h.Xoffset = int64(3 * Widthptr) // offset of hash in runtime.itab + h.Xoffset = int64(2 * Widthptr) // offset of hash in runtime.itab } h.SetBounded(true) // guaranteed not to fault a = nod(OAS, s.hashname, h) diff --git a/src/reflect/value.go b/src/reflect/value.go index 9cc68d610f..a6a7d84c3b 100644 --- a/src/reflect/value.go +++ b/src/reflect/value.go @@ -182,7 +182,6 @@ type nonEmptyInterface struct { itab *struct { ityp *rtype // static interface type typ *rtype // dynamic concrete type - _ uintptr hash uint32 // copy of typ.hash _ [4]byte fun [100000]unsafe.Pointer // method table diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go index ebcbe65820..21b1758af9 100644 --- a/src/runtime/runtime2.go +++ b/src/runtime/runtime2.go @@ -626,7 +626,6 @@ type _func struct { type itab struct { inter *interfacetype _type *_type - _ uintptr hash uint32 // copy of _type.hash. Used for type switches. _ [4]byte fun [1]uintptr // variable sized. fun[0]==0 means _type does not implement inter.