From e54843f2f4c3b11b52b691eaa187871fb4355d4c Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Tue, 21 Sep 2021 12:18:38 -0700 Subject: [PATCH] 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 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Go Bot Reviewed-by: Cherry Mui --- src/runtime/symtab.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) 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. -- 2.50.0