dwarf/line: remove foundFile "optimization" from LineToPC

There is no guarantee that files will end up stored contiguously in the
debug_line section which makes this optimization wrong in the general
case.
In particular with recent versions of go1.11 and a go.mod file present
the go compiler seems to sometimes produce executables that actually
violate this assumption.
This commit is contained in:
aarzilli 2018-07-23 17:54:50 +02:00 committed by Derek Parker
parent 86120a3b40
commit 368cbeb0bc
2 changed files with 7 additions and 16 deletions

@ -264,10 +264,7 @@ func (lineInfo *DebugLineInfo) LineToPC(filename string, lineno int) uint64 {
return 0 return 0
} }
var ( sm := newStateMachine(lineInfo, lineInfo.Instructions)
foundFile bool
sm = newStateMachine(lineInfo, lineInfo.Instructions)
)
// if no instruction marked is_stmt is found fallback to the first // if no instruction marked is_stmt is found fallback to the first
// instruction assigned to the filename:line. // instruction assigned to the filename:line.
@ -280,17 +277,11 @@ func (lineInfo *DebugLineInfo) LineToPC(filename string, lineno int) uint64 {
} }
break break
} }
if foundFile && sm.file != filename { if sm.line == lineno && sm.file == filename && sm.valid {
break if sm.isStmt {
} return sm.address
if sm.line == lineno && sm.file == filename { } else if fallbackPC == 0 {
foundFile = true fallbackPC = sm.address
if sm.valid {
if sm.isStmt {
return sm.address
} else if fallbackPC == 0 {
fallbackPC = sm.address
}
} }
} }
} }

@ -640,7 +640,7 @@ func FirstPCAfterPrologue(p Process, fn *Function, sameline bool) (uint64, error
// breakpoint with file:line and with the function name always result on // breakpoint with file:line and with the function name always result on
// the same instruction being selected. // the same instruction being selected.
entryFile, entryLine := fn.cu.lineInfo.PCToLine(fn.Entry, fn.Entry) entryFile, entryLine := fn.cu.lineInfo.PCToLine(fn.Entry, fn.Entry)
if pc, _, err := p.BinInfo().LineToPC(entryFile, entryLine); err == nil { if pc, _, err := p.BinInfo().LineToPC(entryFile, entryLine); err == nil && pc >= fn.Entry && pc < fn.End {
return pc, nil return pc, nil
} }
} }