mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: re-use Linksym lookup in dtypesym
Passes toolstash-check. Change-Id: I1a5809f15c84f9d26064a567b45468fa56e6d5e9 Reviewed-on: https://go-review.googlesource.com/41408 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
parent
0d1e903c8a
commit
1dc3b60bd6
1 changed files with 62 additions and 63 deletions
|
|
@ -1098,36 +1098,37 @@ func dtypesym(t *types.Type) *types.Sym {
|
|||
|
||||
ok:
|
||||
ot := 0
|
||||
lsym := s.Linksym()
|
||||
switch t.Etype {
|
||||
default:
|
||||
ot = dcommontype(s.Linksym(), ot, t)
|
||||
ot = dextratype(s.Linksym(), ot, t, 0)
|
||||
ot = dcommontype(lsym, ot, t)
|
||||
ot = dextratype(lsym, ot, t, 0)
|
||||
|
||||
case TARRAY:
|
||||
// ../../../../runtime/type.go:/arrayType
|
||||
s1 := dtypesym(t.Elem())
|
||||
t2 := types.NewSlice(t.Elem())
|
||||
s2 := dtypesym(t2)
|
||||
ot = dcommontype(s.Linksym(), ot, t)
|
||||
ot = dsymptr(s.Linksym(), ot, s1.Linksym(), 0)
|
||||
ot = dsymptr(s.Linksym(), ot, s2.Linksym(), 0)
|
||||
ot = duintptr(s.Linksym(), ot, uint64(t.NumElem()))
|
||||
ot = dextratype(s.Linksym(), ot, t, 0)
|
||||
ot = dcommontype(lsym, ot, t)
|
||||
ot = dsymptr(lsym, ot, s1.Linksym(), 0)
|
||||
ot = dsymptr(lsym, ot, s2.Linksym(), 0)
|
||||
ot = duintptr(lsym, ot, uint64(t.NumElem()))
|
||||
ot = dextratype(lsym, ot, t, 0)
|
||||
|
||||
case TSLICE:
|
||||
// ../../../../runtime/type.go:/sliceType
|
||||
s1 := dtypesym(t.Elem())
|
||||
ot = dcommontype(s.Linksym(), ot, t)
|
||||
ot = dsymptr(s.Linksym(), ot, s1.Linksym(), 0)
|
||||
ot = dextratype(s.Linksym(), ot, t, 0)
|
||||
ot = dcommontype(lsym, ot, t)
|
||||
ot = dsymptr(lsym, ot, s1.Linksym(), 0)
|
||||
ot = dextratype(lsym, ot, t, 0)
|
||||
|
||||
case TCHAN:
|
||||
// ../../../../runtime/type.go:/chanType
|
||||
s1 := dtypesym(t.Elem())
|
||||
ot = dcommontype(s.Linksym(), ot, t)
|
||||
ot = dsymptr(s.Linksym(), ot, s1.Linksym(), 0)
|
||||
ot = duintptr(s.Linksym(), ot, uint64(t.ChanDir()))
|
||||
ot = dextratype(s.Linksym(), ot, t, 0)
|
||||
ot = dcommontype(lsym, ot, t)
|
||||
ot = dsymptr(lsym, ot, s1.Linksym(), 0)
|
||||
ot = duintptr(lsym, ot, uint64(t.ChanDir()))
|
||||
ot = dextratype(lsym, ot, t, 0)
|
||||
|
||||
case TFUNC:
|
||||
for _, t1 := range t.Recvs().Fields().Slice() {
|
||||
|
|
@ -1142,30 +1143,30 @@ ok:
|
|||
dtypesym(t1.Type)
|
||||
}
|
||||
|
||||
ot = dcommontype(s.Linksym(), ot, t)
|
||||
ot = dcommontype(lsym, ot, t)
|
||||
inCount := t.Recvs().NumFields() + t.Params().NumFields()
|
||||
outCount := t.Results().NumFields()
|
||||
if isddd {
|
||||
outCount |= 1 << 15
|
||||
}
|
||||
ot = duint16(s.Linksym(), ot, uint16(inCount))
|
||||
ot = duint16(s.Linksym(), ot, uint16(outCount))
|
||||
ot = duint16(lsym, ot, uint16(inCount))
|
||||
ot = duint16(lsym, ot, uint16(outCount))
|
||||
if Widthptr == 8 {
|
||||
ot += 4 // align for *rtype
|
||||
}
|
||||
|
||||
dataAdd := (inCount + t.Results().NumFields()) * Widthptr
|
||||
ot = dextratype(s.Linksym(), ot, t, dataAdd)
|
||||
ot = dextratype(lsym, ot, t, dataAdd)
|
||||
|
||||
// Array of rtype pointers follows funcType.
|
||||
for _, t1 := range t.Recvs().Fields().Slice() {
|
||||
ot = dsymptr(s.Linksym(), ot, dtypesym(t1.Type).Linksym(), 0)
|
||||
ot = dsymptr(lsym, ot, dtypesym(t1.Type).Linksym(), 0)
|
||||
}
|
||||
for _, t1 := range t.Params().Fields().Slice() {
|
||||
ot = dsymptr(s.Linksym(), ot, dtypesym(t1.Type).Linksym(), 0)
|
||||
ot = dsymptr(lsym, ot, dtypesym(t1.Type).Linksym(), 0)
|
||||
}
|
||||
for _, t1 := range t.Results().Fields().Slice() {
|
||||
ot = dsymptr(s.Linksym(), ot, dtypesym(t1.Type).Linksym(), 0)
|
||||
ot = dsymptr(lsym, ot, dtypesym(t1.Type).Linksym(), 0)
|
||||
}
|
||||
|
||||
case TINTER:
|
||||
|
|
@ -1176,21 +1177,20 @@ ok:
|
|||
}
|
||||
|
||||
// ../../../../runtime/type.go:/interfaceType
|
||||
ot = dcommontype(s.Linksym(), ot, t)
|
||||
ot = dcommontype(lsym, ot, t)
|
||||
|
||||
var tpkg *types.Pkg
|
||||
if t.Sym != nil && t != types.Types[t.Etype] && t != types.Errortype {
|
||||
tpkg = t.Sym.Pkg
|
||||
}
|
||||
ot = dgopkgpath(s.Linksym(), ot, tpkg)
|
||||
ot = dgopkgpath(lsym, ot, tpkg)
|
||||
|
||||
ot = dsymptr(s.Linksym(), ot, s.Linksym(), ot+Widthptr+2*Widthint+uncommonSize(t))
|
||||
ot = duintptr(s.Linksym(), ot, uint64(n))
|
||||
ot = duintptr(s.Linksym(), ot, uint64(n))
|
||||
ot = dsymptr(lsym, ot, lsym, ot+Widthptr+2*Widthint+uncommonSize(t))
|
||||
ot = duintptr(lsym, ot, uint64(n))
|
||||
ot = duintptr(lsym, ot, uint64(n))
|
||||
dataAdd := imethodSize() * n
|
||||
ot = dextratype(s.Linksym(), ot, t, dataAdd)
|
||||
ot = dextratype(lsym, ot, t, dataAdd)
|
||||
|
||||
lsym := s.Linksym()
|
||||
for _, a := range m {
|
||||
// ../../../../runtime/type.go:/imethod
|
||||
exported := exportname(a.name)
|
||||
|
|
@ -1210,37 +1210,37 @@ ok:
|
|||
s2 := dtypesym(t.Val())
|
||||
s3 := dtypesym(mapbucket(t))
|
||||
s4 := dtypesym(hmap(t))
|
||||
ot = dcommontype(s.Linksym(), ot, t)
|
||||
ot = dsymptr(s.Linksym(), ot, s1.Linksym(), 0)
|
||||
ot = dsymptr(s.Linksym(), ot, s2.Linksym(), 0)
|
||||
ot = dsymptr(s.Linksym(), ot, s3.Linksym(), 0)
|
||||
ot = dsymptr(s.Linksym(), ot, s4.Linksym(), 0)
|
||||
ot = dcommontype(lsym, ot, t)
|
||||
ot = dsymptr(lsym, ot, s1.Linksym(), 0)
|
||||
ot = dsymptr(lsym, ot, s2.Linksym(), 0)
|
||||
ot = dsymptr(lsym, ot, s3.Linksym(), 0)
|
||||
ot = dsymptr(lsym, ot, s4.Linksym(), 0)
|
||||
if t.Key().Width > MAXKEYSIZE {
|
||||
ot = duint8(s.Linksym(), ot, uint8(Widthptr))
|
||||
ot = duint8(s.Linksym(), ot, 1) // indirect
|
||||
ot = duint8(lsym, ot, uint8(Widthptr))
|
||||
ot = duint8(lsym, ot, 1) // indirect
|
||||
} else {
|
||||
ot = duint8(s.Linksym(), ot, uint8(t.Key().Width))
|
||||
ot = duint8(s.Linksym(), ot, 0) // not indirect
|
||||
ot = duint8(lsym, ot, uint8(t.Key().Width))
|
||||
ot = duint8(lsym, ot, 0) // not indirect
|
||||
}
|
||||
|
||||
if t.Val().Width > MAXVALSIZE {
|
||||
ot = duint8(s.Linksym(), ot, uint8(Widthptr))
|
||||
ot = duint8(s.Linksym(), ot, 1) // indirect
|
||||
ot = duint8(lsym, ot, uint8(Widthptr))
|
||||
ot = duint8(lsym, ot, 1) // indirect
|
||||
} else {
|
||||
ot = duint8(s.Linksym(), ot, uint8(t.Val().Width))
|
||||
ot = duint8(s.Linksym(), ot, 0) // not indirect
|
||||
ot = duint8(lsym, ot, uint8(t.Val().Width))
|
||||
ot = duint8(lsym, ot, 0) // not indirect
|
||||
}
|
||||
|
||||
ot = duint16(s.Linksym(), ot, uint16(mapbucket(t).Width))
|
||||
ot = duint8(s.Linksym(), ot, uint8(obj.Bool2int(isreflexive(t.Key()))))
|
||||
ot = duint8(s.Linksym(), ot, uint8(obj.Bool2int(needkeyupdate(t.Key()))))
|
||||
ot = dextratype(s.Linksym(), ot, t, 0)
|
||||
ot = duint16(lsym, ot, uint16(mapbucket(t).Width))
|
||||
ot = duint8(lsym, ot, uint8(obj.Bool2int(isreflexive(t.Key()))))
|
||||
ot = duint8(lsym, ot, uint8(obj.Bool2int(needkeyupdate(t.Key()))))
|
||||
ot = dextratype(lsym, ot, t, 0)
|
||||
|
||||
case TPTR32, TPTR64:
|
||||
if t.Elem().Etype == TANY {
|
||||
// ../../../../runtime/type.go:/UnsafePointerType
|
||||
ot = dcommontype(s.Linksym(), ot, t)
|
||||
ot = dextratype(s.Linksym(), ot, t, 0)
|
||||
ot = dcommontype(lsym, ot, t)
|
||||
ot = dextratype(lsym, ot, t, 0)
|
||||
|
||||
break
|
||||
}
|
||||
|
|
@ -1248,9 +1248,9 @@ ok:
|
|||
// ../../../../runtime/type.go:/ptrType
|
||||
s1 := dtypesym(t.Elem())
|
||||
|
||||
ot = dcommontype(s.Linksym(), ot, t)
|
||||
ot = dsymptr(s.Linksym(), ot, s1.Linksym(), 0)
|
||||
ot = dextratype(s.Linksym(), ot, t, 0)
|
||||
ot = dcommontype(lsym, ot, t)
|
||||
ot = dsymptr(lsym, ot, s1.Linksym(), 0)
|
||||
ot = dextratype(lsym, ot, t, 0)
|
||||
|
||||
// ../../../../runtime/type.go:/structType
|
||||
// for security, only the exported fields.
|
||||
|
|
@ -1262,7 +1262,7 @@ ok:
|
|||
n++
|
||||
}
|
||||
|
||||
ot = dcommontype(s.Linksym(), ot, t)
|
||||
ot = dcommontype(lsym, ot, t)
|
||||
pkg := localpkg
|
||||
if t.Sym != nil {
|
||||
pkg = t.Sym.Pkg
|
||||
|
|
@ -1276,18 +1276,18 @@ ok:
|
|||
break
|
||||
}
|
||||
}
|
||||
ot = dgopkgpath(s.Linksym(), ot, pkg)
|
||||
ot = dsymptr(s.Linksym(), ot, s.Linksym(), ot+Widthptr+2*Widthint+uncommonSize(t))
|
||||
ot = duintptr(s.Linksym(), ot, uint64(n))
|
||||
ot = duintptr(s.Linksym(), ot, uint64(n))
|
||||
ot = dgopkgpath(lsym, ot, pkg)
|
||||
ot = dsymptr(lsym, ot, lsym, ot+Widthptr+2*Widthint+uncommonSize(t))
|
||||
ot = duintptr(lsym, ot, uint64(n))
|
||||
ot = duintptr(lsym, ot, uint64(n))
|
||||
|
||||
dataAdd := n * structfieldSize()
|
||||
ot = dextratype(s.Linksym(), ot, t, dataAdd)
|
||||
ot = dextratype(lsym, ot, t, dataAdd)
|
||||
|
||||
for _, f := range t.Fields().Slice() {
|
||||
// ../../../../runtime/type.go:/structField
|
||||
ot = dnameField(s.Linksym(), ot, pkg, f)
|
||||
ot = dsymptr(s.Linksym(), ot, dtypesym(f.Type).Linksym(), 0)
|
||||
ot = dnameField(lsym, ot, pkg, f)
|
||||
ot = dsymptr(lsym, ot, dtypesym(f.Type).Linksym(), 0)
|
||||
offsetAnon := uint64(f.Offset) << 1
|
||||
if offsetAnon>>1 != uint64(f.Offset) {
|
||||
Fatalf("%v: bad field offset for %s", t, f.Sym.Name)
|
||||
|
|
@ -1295,12 +1295,12 @@ ok:
|
|||
if f.Embedded != 0 {
|
||||
offsetAnon |= 1
|
||||
}
|
||||
ot = duintptr(s.Linksym(), ot, offsetAnon)
|
||||
ot = duintptr(lsym, ot, offsetAnon)
|
||||
}
|
||||
}
|
||||
|
||||
ot = dextratypeData(s.Linksym(), ot, t)
|
||||
ggloblsym(s.Linksym(), int32(ot), int16(dupok|obj.RODATA))
|
||||
ot = dextratypeData(lsym, ot, t)
|
||||
ggloblsym(lsym, int32(ot), int16(dupok|obj.RODATA))
|
||||
|
||||
// The linker will leave a table of all the typelinks for
|
||||
// types in the binary, so the runtime can find them.
|
||||
|
|
@ -1319,8 +1319,7 @@ ok:
|
|||
keep = true
|
||||
}
|
||||
}
|
||||
// TODO(josharian): add lsym local variable above, use here instead of calling Linksym()
|
||||
s.Linksym().Set(obj.AttrMakeTypelink, keep)
|
||||
lsym.Set(obj.AttrMakeTypelink, keep)
|
||||
|
||||
return s
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue