diff options
author | Keith Randall <khr@golang.org> | 2018-03-14 15:21:37 -0700 |
---|---|---|
committer | Keith Randall <khr@golang.org> | 2018-03-15 17:31:57 +0000 |
commit | 9d4215311ba573a5b676de85b053eec03e577478 (patch) | |
tree | 439397eba561aa95ee38129a61b5afe735b1f2b4 /src/runtime/symtab.go | |
parent | cd2cb6e3f57e4820d66dbefd7577048c38ee9e04 (diff) | |
download | go-9d4215311ba573a5b676de85b053eec03e577478.tar.gz go-9d4215311ba573a5b676de85b053eec03e577478.zip |
runtime: identify special functions by flag instead of address
When there are plugins, there may not be a unique copy of runtime
functions like goexit, mcall, etc. So identifying them by entry
address is problematic. Instead, keep track of each special function
using a field in the symbol table. That way, multiple copies of
the same runtime function will be treated identically.
Fixes #24351
Fixes #23133
Change-Id: Iea3232df8a6af68509769d9ca618f530cc0f84fd
Reviewed-on: https://go-review.googlesource.com/100739
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/runtime/symtab.go')
-rw-r--r-- | src/runtime/symtab.go | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/src/runtime/symtab.go b/src/runtime/symtab.go index 7d7c363b5b..91a8f8eb05 100644 --- a/src/runtime/symtab.go +++ b/src/runtime/symtab.go @@ -133,7 +133,7 @@ again: } se.pcExpander.init(ncallers[0], se.wasPanic) ncallers = ncallers[1:] - se.wasPanic = se.pcExpander.funcInfo.valid() && se.pcExpander.funcInfo.entry == sigpanicPC + se.wasPanic = se.pcExpander.funcInfo.valid() && se.pcExpander.funcInfo.funcID == funcID_sigpanic if se.skip > 0 { for ; se.skip > 0; se.skip-- { se.pcExpander.next() @@ -349,6 +349,35 @@ const ( _ArgsSizeUnknown = -0x80000000 ) +// A FuncID identifies particular functions that need to be treated +// specially by the runtime. +// Note that in some situations involving plugins, there may be multiple +// copies of a particular special runtime function. +// Note: this list must match the list in cmd/internal/objabi/funcid.go. +type funcID uint32 + +const ( + funcID_normal funcID = iota // not a special function + funcID_goexit + funcID_jmpdefer + funcID_mcall + funcID_morestack + funcID_mstart + funcID_rt0_go + funcID_asmcgocall + funcID_sigpanic + funcID_runfinq + funcID_bgsweep + funcID_forcegchelper + funcID_timerproc + funcID_gcBgMarkWorker + funcID_systemstack_switch + funcID_systemstack + funcID_cgocallback_gofunc + funcID_gogo + funcID_externalthreadhandler +) + // moduledata records information about the layout of the executable // image. It is written by the linker. Any changes here must be // matched changes to the code in cmd/internal/ld/symtab.go:symtab. @@ -648,7 +677,6 @@ func findfunc(pc uintptr) funcInfo { idx = uint32(len(datap.ftab) - 1) } if pc < datap.ftab[idx].entry { - // With multiple text sections, the idx might reference a function address that // is higher than the pc being searched, so search backward until the matching address is found. @@ -659,7 +687,6 @@ func findfunc(pc uintptr) funcInfo { throw("findfunc: bad findfunctab entry idx") } } else { - // linear search to find func with pc >= entry. for datap.ftab[idx+1].entry <= pc { idx++ |