From cbb9cd03f80c0487cee0adcfef9a2a5de9fe2cc1 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Mon, 13 Feb 2023 23:27:51 -0800 Subject: [PATCH] cmd/compile: ensure FuncForPC works on closures that start with NOPs A 0-sized no-op shouldn't prevent us from detecting that the first instruction is from an inlined callee. Update #58300 Change-Id: Ic5f6ed108c54a32c05e9b2264b516f2cc17e4619 Reviewed-on: https://go-review.googlesource.com/c/go/+/467977 Run-TryBot: Keith Randall Reviewed-by: Keith Randall Reviewed-by: David Chase TryBot-Result: Gopher Robot --- src/cmd/compile/internal/ssagen/ssa.go | 2 +- test/fixedbugs/issue58300b.go | 35 ++++++++++++++++++++++++++ test/fixedbugs/issue58300b.out | 2 ++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 test/fixedbugs/issue58300b.go create mode 100644 test/fixedbugs/issue58300b.out diff --git a/src/cmd/compile/internal/ssagen/ssa.go b/src/cmd/compile/internal/ssagen/ssa.go index 004806b029..6831da6908 100644 --- a/src/cmd/compile/internal/ssagen/ssa.go +++ b/src/cmd/compile/internal/ssagen/ssa.go @@ -7171,7 +7171,7 @@ func genssa(f *ssa.Func, pp *objw.Progs) { // This ensures that runtime.FuncForPC(uintptr(reflect.ValueOf(fn).Pointer())).Name() // returns the right answer. See issue 58300. for p := pp.Text; p != nil; p = p.Link { - if p.As == obj.AFUNCDATA || p.As == obj.APCDATA || p.As == obj.ATEXT { + if p.As == obj.AFUNCDATA || p.As == obj.APCDATA || p.As == obj.ATEXT || p.As == obj.ANOP { continue } if base.Ctxt.PosTable.Pos(p.Pos).Base().InliningIndex() >= 0 { diff --git a/test/fixedbugs/issue58300b.go b/test/fixedbugs/issue58300b.go new file mode 100644 index 0000000000..5192b3f0f4 --- /dev/null +++ b/test/fixedbugs/issue58300b.go @@ -0,0 +1,35 @@ +// run + +// Copyright 2023 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. + +package main + +import ( + "reflect" + "runtime" +) + +type T struct { + a, b int +} + +func f(t *T) int { + if t != nil { + return t.b + } + return 0 +} + +func g(t *T) int { + return f(t) + 5 +} + +func main() { + x(f) + x(g) +} +func x(v any) { + println(runtime.FuncForPC(reflect.ValueOf(v).Pointer()).Name()) +} diff --git a/test/fixedbugs/issue58300b.out b/test/fixedbugs/issue58300b.out new file mode 100644 index 0000000000..f347287480 --- /dev/null +++ b/test/fixedbugs/issue58300b.out @@ -0,0 +1,2 @@ +main.f +main.g