]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: look up funcInfo by func pointer
authorJosh Bleecher Snyder <josharian@gmail.com>
Tue, 21 Sep 2021 19:18:38 +0000 (12:18 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Mon, 27 Sep 2021 20:58:06 +0000 (20:58 +0000)
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>
src/runtime/symtab.go

index 87b4eeb22057d18daa1f1c73d1bf961665f49b87..6236643cebc7b641b9f769daab68c258a2a52e3e 100644 (file)
@@ -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.