aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJosh Bleecher Snyder <josharian@gmail.com>2021-09-21 12:18:38 -0700
committerJosh Bleecher Snyder <josharian@gmail.com>2021-09-27 20:58:06 +0000
commite54843f2f4c3b11b52b691eaa187871fb4355d4c (patch)
tree486386d7e76e2a68ef8100f4ad77736f3554d563 /src
parentf961d8e5b10c317b86efca18e19ef0f238032c0a (diff)
downloadgo-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.go17
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.