mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: adjust is-statement on Pos's to improve debugging
Stores to auto tmp variables can be hoisted to places where the line numbers make debugging look "jumpy". Turning those instructions into ones with is_stmt = 0 in the DWARF (accomplished by marking ssa nodes with NotStmt) makes debugging look better while still attributing the instructions with the correct line number. The same is true for certain register allocator spills and reloads. Change-Id: I97a394eb522d4911cc40b4bf5bf76d3d7221f6c0 Reviewed-on: https://go-review.googlesource.com/98415 Run-TryBot: David Chase <drchase@google.com> Reviewed-by: Cherry Zhang <cherryyz@google.com> Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
dead03b794
commit
b9a365681f
4 changed files with 34 additions and 38 deletions
|
|
@ -444,7 +444,7 @@ func (s *regAllocState) makeSpill(v *Value, b *Block) *Value {
|
|||
// *Value which is either v or a copy of v allocated to the chosen register.
|
||||
func (s *regAllocState) allocValToReg(v *Value, mask regMask, nospill bool, pos src.XPos) *Value {
|
||||
vi := &s.values[v.ID]
|
||||
|
||||
pos = pos.WithNotStmt()
|
||||
// Check if v is already in a requested register.
|
||||
if mask&vi.regs != 0 {
|
||||
r := pickReg(mask & vi.regs)
|
||||
|
|
@ -1893,18 +1893,20 @@ func (e *edgeState) process() {
|
|||
fmt.Printf("breaking cycle with v%d in %s:%s\n", vid, loc, c)
|
||||
}
|
||||
e.erase(r)
|
||||
pos := d.pos.WithNotStmt()
|
||||
if _, isReg := loc.(*Register); isReg {
|
||||
c = e.p.NewValue1(d.pos, OpCopy, c.Type, c)
|
||||
c = e.p.NewValue1(pos, OpCopy, c.Type, c)
|
||||
} else {
|
||||
c = e.p.NewValue1(d.pos, OpLoadReg, c.Type, c)
|
||||
c = e.p.NewValue1(pos, OpLoadReg, c.Type, c)
|
||||
}
|
||||
e.set(r, vid, c, false, d.pos)
|
||||
e.set(r, vid, c, false, pos)
|
||||
}
|
||||
}
|
||||
|
||||
// processDest generates code to put value vid into location loc. Returns true
|
||||
// if progress was made.
|
||||
func (e *edgeState) processDest(loc Location, vid ID, splice **Value, pos src.XPos) bool {
|
||||
pos = pos.WithNotStmt()
|
||||
occupant := e.contents[loc]
|
||||
if occupant.vid == vid {
|
||||
// Value is already in the correct place.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue