mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: plumb prologueEnd into DWARF
This marks the first instruction after the prologue for consumption by debuggers, specifically Delve, who asked for it. gdb appears to ignore it, lldb appears to use it. The bits for end-of-prologue and beginning-of-epilogue are added to Pos (reducing maximum line number by 4x, to 1048575). They're added in cmd/internal/obj/<ARCH>.go (currently x86 only), so the compiler-proper need not deal with them. The linker currently does nothing with beginning-of-epilogue, but the plumbing exists to make it easier in the future. This also upgrades the line number table to DWARF version 3. This CL includes a regression in the coverage for testdata/i22558.gdb-dbg.nexts, this appears to be a gdb artifact but the fix would be in the preceding CL in the stack. Change-Id: I3bda5f46a0ed232d137ad48f65a14835c742c506 Reviewed-on: https://go-review.googlesource.com/110416 Run-TryBot: David Chase <drchase@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Austin Clements <austin@google.com>
This commit is contained in:
parent
c2c1822b12
commit
7bac2a95f6
6 changed files with 127 additions and 16 deletions
|
|
@ -33,6 +33,7 @@ package x86
|
|||
import (
|
||||
"cmd/internal/obj"
|
||||
"cmd/internal/objabi"
|
||||
"cmd/internal/src"
|
||||
"cmd/internal/sys"
|
||||
"math"
|
||||
"strings"
|
||||
|
|
@ -676,6 +677,10 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
|
|||
p = stacksplit(ctxt, cursym, p, newprog, autoffset, int32(textarg)) // emit split check
|
||||
}
|
||||
|
||||
// Delve debugger would like the next instruction to be noted as the end of the function prologue.
|
||||
// TODO: are there other cases (e.g., wrapper functions) that need marking?
|
||||
markedPrologue := false
|
||||
|
||||
if autoffset != 0 {
|
||||
if autoffset%int32(ctxt.Arch.RegSize) != 0 {
|
||||
ctxt.Diag("unaligned stack size %d", autoffset)
|
||||
|
|
@ -685,6 +690,8 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
|
|||
p.From.Type = obj.TYPE_CONST
|
||||
p.From.Offset = int64(autoffset)
|
||||
p.Spadj = autoffset
|
||||
p.Pos = p.Pos.WithXlogue(src.PosPrologueEnd)
|
||||
markedPrologue = true
|
||||
}
|
||||
|
||||
deltasp := autoffset
|
||||
|
|
@ -700,6 +707,9 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
|
|||
p.To.Reg = REG_SP
|
||||
p.To.Scale = 1
|
||||
p.To.Offset = int64(autoffset) - int64(bpsize)
|
||||
if !markedPrologue {
|
||||
p.Pos = p.Pos.WithXlogue(src.PosPrologueEnd)
|
||||
}
|
||||
|
||||
// Move current frame to BP
|
||||
p = obj.Appendp(p, newprog)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue