mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/link: propagate UsedInIface through method descriptor
The linker prunes methods that are not directly reachable if the receiver type is never converted to interface. A type can be converted to interface using reflection through other types. The linker already takes this into consideration but it missed the case that the intermediate is a method descriptor. Handle this case. Change-Id: I590efc5da163c326db8d43583908a2ef67f65d9d Reviewed-on: https://go-review.googlesource.com/c/go/+/255858 Trust: Cherry Zhang <cherryyz@google.com> Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Than McIntosh <thanm@google.com> Reviewed-by: Jeremy Faller <jeremy@golang.org>
This commit is contained in:
parent
bf9800c793
commit
789d77a87e
3 changed files with 49 additions and 0 deletions
|
|
@ -130,6 +130,19 @@ func (d *deadcodePass) flood() {
|
|||
}
|
||||
if usedInIface {
|
||||
methods = append(methods, methodref{src: symIdx, r: i})
|
||||
// The method descriptor is itself a type descriptor, and
|
||||
// it can be used to reach other types, e.g. by using
|
||||
// reflect.Type.Method(i).Type.In(j). We need to traverse
|
||||
// its child types with UsedInIface set. (See also the
|
||||
// comment below.)
|
||||
rs := r.Sym()
|
||||
if !d.ldr.AttrUsedInIface(rs) {
|
||||
d.ldr.SetAttrUsedInIface(rs, true)
|
||||
if d.ldr.AttrReachable(rs) {
|
||||
d.ldr.SetAttrReachable(rs, false)
|
||||
d.mark(rs, symIdx)
|
||||
}
|
||||
}
|
||||
}
|
||||
i += 2
|
||||
continue
|
||||
|
|
@ -215,9 +228,15 @@ func (d *deadcodePass) mark(symIdx, parent loader.Sym) {
|
|||
if *flagDumpDep {
|
||||
to := d.ldr.SymName(symIdx)
|
||||
if to != "" {
|
||||
if d.ldr.AttrUsedInIface(symIdx) {
|
||||
to += " <UsedInIface>"
|
||||
}
|
||||
from := "_"
|
||||
if parent != 0 {
|
||||
from = d.ldr.SymName(parent)
|
||||
if d.ldr.AttrUsedInIface(parent) {
|
||||
from += " <UsedInIface>"
|
||||
}
|
||||
}
|
||||
fmt.Printf("%s -> %s\n", from, to)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue