]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.22] cmd/compile: bail PGO method lookup on interface types
authorMichael Pratt <mpratt@google.com>
Wed, 24 Apr 2024 15:19:17 +0000 (11:19 -0400)
committerJoedian Reid <joedian@google.com>
Fri, 26 Apr 2024 16:29:48 +0000 (16:29 +0000)
Interface types don't have concrete method implementations, so it does
not make sense to attempt a lookup.

An interface method would not normally appear in a PGO profile as it has
no symbol in the final binary. However it can appear if the method was
concrete when the profile was collected and it has since been refactored
to an interface method in the code being compiled.

The guards here (OTYPE, !Alias, !IsInterface) now match
noder.linker.relocObj, which does a similar iteration of all methods.

For #67016.
Fixes #67017.

Change-Id: I858c58929c890ac0b2019fbd7c99f683ab63f8bb
Reviewed-on: https://go-review.googlesource.com/c/go/+/581436
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
(cherry picked from commit 508e76197842792f87504d9f031ce4f7bf453c4f)
Reviewed-on: https://go-review.googlesource.com/c/go/+/581438

src/cmd/compile/internal/noder/unified.go

index 492b00d256610da8ee0ae045fda8da574236a929..562b2e63140db8dbc356d7b9ce61748b6dc4e991 100644 (file)
@@ -120,6 +120,9 @@ func lookupMethod(pkg *types.Pkg, symName string) (*ir.Func, error) {
        if name.Alias() {
                return nil, fmt.Errorf("type sym %v refers to alias", typ)
        }
+       if name.Type().IsInterface() {
+               return nil, fmt.Errorf("type sym %v refers to interface type", typ)
+       }
 
        for _, m := range name.Type().Methods() {
                if m.Sym == meth {