1
0
mirror of https://github.com/golang/go synced 2024-11-26 09:18:07 -07:00

cmd/compile: debug trace output for -N variable location gen

Add some rudimentary debug trace output for -N location list
generation if "-d=ssa/locationlists" is set.

Updates #45948.

Change-Id: If1a95730538a6e7def7ebe1ece1a71da8e5f0975
Reviewed-on: https://go-review.googlesource.com/c/go/+/317089
Trust: Than McIntosh <thanm@google.com>
Run-TryBot: Than McIntosh <thanm@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
This commit is contained in:
Than McIntosh 2021-05-04 20:38:24 -04:00
parent 66ce8aa88d
commit caf4c9434b

View File

@ -1356,6 +1356,12 @@ func BuildFuncDebugNoOptimized(ctxt *obj.Link, f *Func, loggingEnabled bool, sta
return &fd return &fd
} }
state := debugState{f: f}
if loggingEnabled {
state.logf("generating -N reg param loc lists for func %q\n", f.Name)
}
// Allocate location lists. // Allocate location lists.
fd.LocationLists = make([][]byte, numRegParams) fd.LocationLists = make([][]byte, numRegParams)
@ -1383,6 +1389,9 @@ func BuildFuncDebugNoOptimized(ctxt *obj.Link, f *Func, loggingEnabled bool, sta
// loops such as that in issue 45948. In such cases, leave // loops such as that in issue 45948. In such cases, leave
// the var/slot set up for the param, but don't try to // the var/slot set up for the param, but don't try to
// emit a location list. // emit a location list.
if loggingEnabled {
state.logf("locatePrologEnd failed, skipping %v\n", n)
}
pidx++ pidx++
continue continue
} }
@ -1396,6 +1405,9 @@ func BuildFuncDebugNoOptimized(ctxt *obj.Link, f *Func, loggingEnabled bool, sta
pidx++ pidx++
continue continue
} }
if loggingEnabled {
state.logf("param %v:\n [<entry>, %d]:\n", n, afterPrologVal)
}
rtypes, _ := inp.RegisterTypesAndOffsets() rtypes, _ := inp.RegisterTypesAndOffsets()
padding := make([]uint64, 0, 32) padding := make([]uint64, 0, 32)
padding = inp.ComputePadding(padding) padding = inp.ComputePadding(padding)
@ -1408,15 +1420,24 @@ func BuildFuncDebugNoOptimized(ctxt *obj.Link, f *Func, loggingEnabled bool, sta
list = append(list, dwarf.DW_OP_regx) list = append(list, dwarf.DW_OP_regx)
list = dwarf.AppendUleb128(list, uint64(dwreg)) list = dwarf.AppendUleb128(list, uint64(dwreg))
} }
if loggingEnabled {
state.logf(" piece %d -> dwreg %d", k, dwreg)
}
if len(inp.Registers) > 1 { if len(inp.Registers) > 1 {
list = append(list, dwarf.DW_OP_piece) list = append(list, dwarf.DW_OP_piece)
ts := rtypes[k].Width ts := rtypes[k].Width
list = dwarf.AppendUleb128(list, uint64(ts)) list = dwarf.AppendUleb128(list, uint64(ts))
if padding[k] > 0 { if padding[k] > 0 {
if loggingEnabled {
state.logf(" [pad %d bytes]", padding[k])
}
list = append(list, dwarf.DW_OP_piece) list = append(list, dwarf.DW_OP_piece)
list = dwarf.AppendUleb128(list, padding[k]) list = dwarf.AppendUleb128(list, padding[k])
} }
} }
if loggingEnabled {
state.logf("\n")
}
} }
// fill in length of location expression element // fill in length of location expression element
ctxt.Arch.ByteOrder.PutUint16(list[sizeIdx:], uint16(len(list)-sizeIdx-2)) ctxt.Arch.ByteOrder.PutUint16(list[sizeIdx:], uint16(len(list)-sizeIdx-2))
@ -1436,6 +1457,10 @@ func BuildFuncDebugNoOptimized(ctxt *obj.Link, f *Func, loggingEnabled bool, sta
list = append(list, dwarf.DW_OP_fbreg) list = append(list, dwarf.DW_OP_fbreg)
list = dwarf.AppendSleb128(list, int64(soff)) list = dwarf.AppendSleb128(list, int64(soff))
} }
if loggingEnabled {
state.logf(" [%d, <end>): stackOffset=%d\n", afterPrologVal, soff)
}
// fill in size // fill in size
ctxt.Arch.ByteOrder.PutUint16(list[sizeIdx:], uint16(len(list)-sizeIdx-2)) ctxt.Arch.ByteOrder.PutUint16(list[sizeIdx:], uint16(len(list)-sizeIdx-2))