From dce26bdbc1d031ae8058035516f6c76f0d709147 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 20 Apr 2020 12:06:07 -0400 Subject: [PATCH] [dev.link] cmd/oldlink: update with recent linker changes Port CL 228792, CL 228877, and CL 228881 to old linker. Change-Id: Id3fdc413a9f7b38887ae8cc7bca5904933be93de Reviewed-on: https://go-review.googlesource.com/c/go/+/229001 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- src/cmd/oldlink/internal/ld/deadcode.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/cmd/oldlink/internal/ld/deadcode.go b/src/cmd/oldlink/internal/ld/deadcode.go index 1bdac31f12..6a6813aa58 100644 --- a/src/cmd/oldlink/internal/ld/deadcode.go +++ b/src/cmd/oldlink/internal/ld/deadcode.go @@ -27,7 +27,8 @@ import ( // // 1. direct call // 2. through a reachable interface type -// 3. reflect.Value.Call, .Method, or reflect.Method.Func +// 3. reflect.Value.Method (or MethodByName), or reflect.Type.Method +// (or MethodByName) // // The first case is handled by the flood fill, a directly called method // is marked as reachable. @@ -38,9 +39,9 @@ import ( // as reachable. This is extremely conservative, but easy and correct. // // The third case is handled by looking to see if any of: -// - reflect.Value.Call is reachable -// - reflect.Value.Method is reachable -// - reflect.Type.Method or MethodByName is called. +// - reflect.Value.Method or MethodByName is reachable +// - reflect.Type.Method or MethodByName is called (through the +// REFLECTMETHOD attribute marked by the compiler). // If any of these happen, all bets are off and all exported methods // of reachable types are marked reachable. // @@ -65,8 +66,8 @@ func deadcode(ctxt *Link) { d.init() d.flood() - callSym := ctxt.Syms.ROLookup("reflect.Value.Call", sym.SymVerABIInternal) methSym := ctxt.Syms.ROLookup("reflect.Value.Method", sym.SymVerABIInternal) + methByNameSym := ctxt.Syms.ROLookup("reflect.Value.MethodByName", sym.SymVerABIInternal) reflectSeen := false if ctxt.DynlinkingGo() { @@ -77,7 +78,7 @@ func deadcode(ctxt *Link) { for { if !reflectSeen { - if d.reflectMethod || (callSym != nil && callSym.Attr.Reachable()) || (methSym != nil && methSym.Attr.Reachable()) { + if d.reflectMethod || (methSym != nil && methSym.Attr.Reachable()) || (methByNameSym != nil && methByNameSym.Attr.Reachable()) { // Methods might be called via reflection. Give up on // static analysis, mark all exported methods of // all reachable types as reachable. -- 2.48.1