mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile,runtime: redo mid-stack inlining tracebacks
Work involved in getting a stack trace is divided between runtime.Callers and runtime.CallersFrames. Before this CL, runtime.Callers returns a pc per runtime frame. runtime.CallersFrames is responsible for expanding a runtime frame into potentially multiple user frames. After this CL, runtime.Callers returns a pc per user frame. runtime.CallersFrames just maps those to user frame info. Entries in the result of runtime.Callers are now pcs of the calls (or of the inline marks), not of the instruction just after the call. Fixes #29007 Fixes #28640 Update #26320 Change-Id: I1c9567596ff73dc73271311005097a9188c3406f Reviewed-on: https://go-review.googlesource.com/c/152537 Run-TryBot: Keith Randall <khr@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: David Chase <drchase@google.com>
This commit is contained in:
parent
c043fc4f65
commit
69c2c56453
39 changed files with 340 additions and 386 deletions
|
|
@ -393,11 +393,12 @@ type LSym struct {
|
|||
|
||||
// A FuncInfo contains extra fields for STEXT symbols.
|
||||
type FuncInfo struct {
|
||||
Args int32
|
||||
Locals int32
|
||||
Text *Prog
|
||||
Autom []*Auto
|
||||
Pcln Pcln
|
||||
Args int32
|
||||
Locals int32
|
||||
Text *Prog
|
||||
Autom []*Auto
|
||||
Pcln Pcln
|
||||
InlMarks []InlMark
|
||||
|
||||
dwarfInfoSym *LSym
|
||||
dwarfLocSym *LSym
|
||||
|
|
@ -411,6 +412,23 @@ type FuncInfo struct {
|
|||
StackObjects *LSym
|
||||
}
|
||||
|
||||
type InlMark struct {
|
||||
// When unwinding from an instruction in an inlined body, mark
|
||||
// where we should unwind to.
|
||||
// id records the global inlining id of the inlined body.
|
||||
// p records the location of an instruction in the parent (inliner) frame.
|
||||
p *Prog
|
||||
id int32
|
||||
}
|
||||
|
||||
// Mark p as the instruction to set as the pc when
|
||||
// "unwinding" the inlining global frame id. Usually it should be
|
||||
// instruction with a file:line at the callsite, and occur
|
||||
// just before the body of the inlined function.
|
||||
func (fi *FuncInfo) AddInlMark(p *Prog, id int32) {
|
||||
fi.InlMarks = append(fi.InlMarks, InlMark{p: p, id: id})
|
||||
}
|
||||
|
||||
//go:generate stringer -type ABI
|
||||
|
||||
// ABI is the calling convention of a text symbol.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue