Skip to content

Commit b0da26a

Browse files
committed
cmd/link: stop checking reflect.Value.Call in deadcode pass
In the linker's deadcode pass, we need to keep a method live if it can be reached through reflection. We do this by marking all exported method live if reflect.Value.Method or reflect.Type.Method is used. Currently we also check for reflect.Value.Call, which is unnecessary because in order to call a method through reflection, the method must be obtained through reflect.Value.Method or reflect.Type.Method, which we already check. Per discussion in https://groups.google.com/d/msg/golang-dev/eG9It63-Bxg/_bnoVy-eAwAJ Thanks Brad, Russ, and Ian for bringing this up. Change-Id: I8e9529a224bb898dbf5752674cc9d155db386c14 Reviewed-on: https://go-review.googlesource.com/c/go/+/228792 Reviewed-by: Brad Fitzpatrick <[email protected]>
1 parent 4d9ecde commit b0da26a

File tree

1 file changed

+1
-2
lines changed

1 file changed

+1
-2
lines changed

src/cmd/link/internal/ld/deadcode2.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,6 @@ func deadcode2(ctxt *Link) {
219219
d.init()
220220
d.flood()
221221

222-
callSym := ldr.Lookup("reflect.Value.Call", sym.SymVerABIInternal)
223222
methSym := ldr.Lookup("reflect.Value.Method", sym.SymVerABIInternal)
224223
if ctxt.DynlinkingGo() {
225224
// Exported methods may satisfy interfaces we don't know
@@ -231,7 +230,7 @@ func deadcode2(ctxt *Link) {
231230
// Methods might be called via reflection. Give up on
232231
// static analysis, mark all exported methods of
233232
// all reachable types as reachable.
234-
d.reflectSeen = d.reflectSeen || (callSym != 0 && ldr.AttrReachable(callSym)) || (methSym != 0 && ldr.AttrReachable(methSym))
233+
d.reflectSeen = d.reflectSeen || (methSym != 0 && ldr.AttrReachable(methSym))
235234

236235
// Mark all methods that could satisfy a discovered
237236
// interface as reachable. We recheck old marked interfaces

0 commit comments

Comments
 (0)