diff options
| author | Josh Bleecher Snyder <josharian@gmail.com> | 2021-09-21 12:18:38 -0700 |
|---|---|---|
| committer | Josh Bleecher Snyder <josharian@gmail.com> | 2021-09-27 20:58:06 +0000 |
| commit | e54843f2f4c3b11b52b691eaa187871fb4355d4c (patch) | |
| tree | 486386d7e76e2a68ef8100f4ad77736f3554d563 /src | |
| parent | f961d8e5b10c317b86efca18e19ef0f238032c0a (diff) | |
| download | go-e54843f2f4c3b11b52b691eaa187871fb4355d4c.tar.xz | |
runtime: look up funcInfo by func pointer
runtime.Func.{Name,FileLine} need to be able to
go from a *_func to a funcInfo. The missing bit of
information is what module contains that *_func.
The existing implementation looked up the module
using the *_func's entry PC. A subsequent change will
store *_func's entry PC relative to the containing module.
Change the module lookup to instead for the module
whose pclntable contains the *_func,
cutting all dependencies on the contents of the *_func.
Change-Id: I2dbbfec043ebc2e9a6ef19bbdec623ac84353b10
Reviewed-on: https://go-review.googlesource.com/c/go/+/351458
Trust: Josh Bleecher Snyder <josharian@gmail.com>
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/runtime/symtab.go | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/runtime/symtab.go b/src/runtime/symtab.go index 87b4eeb220..6236643ceb 100644 --- a/src/runtime/symtab.go +++ b/src/runtime/symtab.go @@ -273,7 +273,22 @@ func (f *Func) raw() *_func { func (f *Func) funcInfo() funcInfo { fn := f.raw() - return funcInfo{fn, findmoduledatap(fn.entry)} + // Find the module containing fn. fn is located in the pclntable. + // The unsafe.Pointer to uintptr conversions and arithmetic + // are safe because we are working with module addresses. + ptr := uintptr(unsafe.Pointer(fn)) + var mod *moduledata + for datap := &firstmoduledata; datap != nil; datap = datap.next { + if len(datap.pclntable) == 0 { + continue + } + base := uintptr(unsafe.Pointer(&datap.pclntable[0])) + if base <= ptr && ptr < base+uintptr(len(datap.pclntable)) { + mod = datap + break + } + } + return funcInfo{fn, mod} } // PCDATA and FUNCDATA table indexes. |
