aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/symtab.go
diff options
context:
space:
mode:
authorKeith Randall <khr@google.com>2019-01-07 12:24:01 -0800
committerKeith Randall <khr@golang.org>2019-01-08 18:24:50 +0000
commit232c9793092115870a430ef3c9ef9ae04f9e25c9 (patch)
tree31a4c66eb18b2909705b3cbdebe2e30dab1ddf3c /src/runtime/symtab.go
parenta1d5e8adfa4d2f1043f4617fe20994ddbb7cc25c (diff)
downloadgo-232c9793092115870a430ef3c9ef9ae04f9e25c9.tar.gz
go-232c9793092115870a430ef3c9ef9ae04f9e25c9.zip
runtime: store incremented PC in result of runtime.Callers
In 1.11 we stored "return addresses" in the result of runtime.Callers. I changed that behavior in CL 152537 to store an address in the call instruction itself. This CL reverts that part of 152537. The change in 152537 was made because we now store pcs of inline marks in the result of runtime.Callers as well. This CL will now store the address of the inline mark + 1 in the results of runtime.Callers, so that the subsequent -1 done in CallersFrames will pick out the correct inline mark instruction. This CL means that the results of runtime.Callers can be passed to runtime.FuncForPC as they were before. There are a bunch of packages in the wild that take the results of runtime.Callers, subtract 1, and then call FuncForPC. This CL keeps that pattern working as it did in 1.11. The changes to runtime/pprof in this CL are exactly a revert of the changes to that package in 152537 (except the locForPC comment). Update #29582 Change-Id: I04d232000fb482f0f0ff6277f8d7b9c72e97eb48 Reviewed-on: https://go-review.googlesource.com/c/156657 Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/runtime/symtab.go')
-rw-r--r--src/runtime/symtab.go7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/runtime/symtab.go b/src/runtime/symtab.go
index 0fd4330944..245a7e6b01 100644
--- a/src/runtime/symtab.go
+++ b/src/runtime/symtab.go
@@ -87,6 +87,13 @@ func (ci *Frames) Next() (frame Frame, more bool) {
}
f := funcInfo._Func()
entry := f.Entry()
+ if pc > entry {
+ // We store the pc of the start of the instruction following
+ // the instruction in question (the call or the inline mark).
+ // This is done for historical reasons, and to make FuncForPC
+ // work correctly for entries in the result of runtime.Callers.
+ pc--
+ }
name := funcname(funcInfo)
file, line := funcline1(funcInfo, pc, false)
if inldata := funcdata(funcInfo, _FUNCDATA_InlTree); inldata != nil {