]> Cypherpunks repositories - gostls13.git/commit
[dev.link] cmd/compile, cmd/link: remove dead methods if type is not used in interface
authorCherry Zhang <cherryyz@google.com>
Mon, 8 Jun 2020 22:38:59 +0000 (18:38 -0400)
committerCherry Zhang <cherryyz@google.com>
Thu, 11 Jun 2020 22:32:49 +0000 (22:32 +0000)
commit95848fc5c64cde2e0fc95348a861e3cab98feaa7
treee8007638bbd2a336045c338c326e596f9f29ed9a
parent3187b05b87e39231202bf2a9bf89905649472b6c
[dev.link] cmd/compile, cmd/link: remove dead methods if type is not used in interface

Currently, a method of a reachable type is live if it matches a
method of a reachable interface. In fact, we only need to retain
the method if the type is actually converted to an interface. If
the type is never converted to an interface, there is no way to
call the method through an interface method call (but the type
descriptor could still be used, e.g. in calling
runtime.newobject).

A type can be used in an interface in two ways:
- directly converted to interface. (Any interface counts, as it
  is possible to convert one interface to another.)
- obtained by reflection from a related type (e.g. obtaining an
  interface of T from []T).

For the former, we let the compiler emit a marker on the type
descriptor symbol when it is converted to an interface. In the
linker, we only need to check methods of marked types.

For the latter, when the linker visits a marked type, it needs to
visit all its "child" types as marked (i.e. potentially could be
converted to interface).

This reduces binary size:
cmd/compile 18792016 18706096 (-0.5%)
cmd/go 14120572 13398948 (-5.1%)

Change-Id: I4465c7eeabf575f4dc84017214c610fa05ae31fd
Reviewed-on: https://go-review.googlesource.com/c/go/+/237298
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
Reviewed-by: Jeremy Faller <jeremy@golang.org>
src/cmd/compile/internal/gc/sinit.go
src/cmd/compile/internal/gc/walk.go
src/cmd/internal/goobj2/objfile.go
src/cmd/internal/obj/link.go
src/cmd/internal/obj/objfile2.go
src/cmd/link/internal/ld/deadcode.go
src/cmd/link/internal/ld/deadcode_test.go
src/cmd/link/internal/ld/testdata/deadcode/ifacemethod.go [new file with mode: 0644]
src/cmd/link/internal/ld/testdata/deadcode/ifacemethod2.go [new file with mode: 0644]
src/cmd/link/internal/loader/loader.go
src/net/http/http_test.go