]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.link] cmd/oldlink: update with recent linker changes
authorCherry Zhang <cherryyz@google.com>
Mon, 20 Apr 2020 16:06:07 +0000 (12:06 -0400)
committerCherry Zhang <cherryyz@google.com>
Mon, 20 Apr 2020 16:51:00 +0000 (16:51 +0000)
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 <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Jeremy Faller <jeremy@golang.org>
src/cmd/oldlink/internal/ld/deadcode.go

index 1bdac31f125c47285320f86303c0aeb2fbeceaff..6a6813aa585dac669474258ff3583bd3e94f1187 100644 (file)
@@ -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.