diff options
| author | Cherry Zhang <cherryyz@google.com> | 2020-09-21 20:44:53 -0400 |
|---|---|---|
| committer | Cherry Zhang <cherryyz@google.com> | 2020-09-29 16:30:26 +0000 |
| commit | 39dde09126be02f5f8c38ddf7590ae8f9825fcaa (patch) | |
| tree | f8c66e4386c0226c376d7287dd639f0287b79feb /src/cmd/link/internal/ld/testdata/deadcode | |
| parent | 39a426d35615da2ef594cd72ea5de54a543305e1 (diff) | |
| download | go-39dde09126be02f5f8c38ddf7590ae8f9825fcaa.tar.xz | |
cmd/link: retain only used interface methods
Currently, in the linker's deadcode pass, when an interface type
is live, the linker thinks all its methods are live, and uses
them to match methods on concrete types. The interface method may
never be used, though.
This CL changes it to only keep used interface methods, for
matching concrete type methods. To do that, when an interface
method is used, the compiler generates a mark relocation. The
linker uses the marker relocations to mark used interface
methods, and only the used ones.
binary size before after
cmd/compile 18887400 18812200
cmd/go 13470652 13470492
Change-Id: I3cfd9df4a53783330ba87735853f2a0ec3c42802
Reviewed-on: https://go-review.googlesource.com/c/go/+/256798
Trust: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Than McIntosh <thanm@google.com>
Reviewed-by: Jeremy Faller <jeremy@golang.org>
Diffstat (limited to 'src/cmd/link/internal/ld/testdata/deadcode')
| -rw-r--r-- | src/cmd/link/internal/ld/testdata/deadcode/ifacemethod4.go | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/cmd/link/internal/ld/testdata/deadcode/ifacemethod4.go b/src/cmd/link/internal/ld/testdata/deadcode/ifacemethod4.go new file mode 100644 index 0000000000..52ee2e3d86 --- /dev/null +++ b/src/cmd/link/internal/ld/testdata/deadcode/ifacemethod4.go @@ -0,0 +1,23 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Test that a live type's method is not live even if +// it matches an interface method, as long as the interface +// method is not used. + +package main + +type T int + +func (T) M() {} + +type I interface{ M() } + +var p *T +var pp *I + +func main() { + p = new(T) // use type T + pp = new(I) // use type I +} |
