Commit 836fe697 authored by Alessandro Arzilli's avatar Alessandro Arzilli Committed by David Chase

cmd/link: let writelines work when pcstmt symbol doesn't exist

The assembler does not produce pcstmt symbols, writeline should be able
to work even if no pcstmt symbol exists for a given function.

Fixes #25216, #25191

Change-Id: I41e16df1e7c8ca59d27e7514537609e309a51c51
Reviewed-on: https://go-review.googlesource.com/110816Reviewed-by: 's avatarDavid Chase <drchase@google.com>
parent fc9c69a6
......@@ -1249,9 +1249,15 @@ func writelines(ctxt *Link, lib *sym.Library, textp []*sym.Symbol, ls *sym.Symbo
pciterinit(ctxt, &pcline, &s.FuncInfo.Pcline)
pciterinit(ctxt, &pcstmt, &pctostmtData)
if pcstmt.done != 0 {
// Assembly files lack a pcstmt section, we assume that every instruction
// is a valid statement.
pcstmt.value = 1
}
var thispc uint32
// TODO this loop looks like it could exit with work remaining.
for pcfile.done == 0 && pcline.done == 0 && pcstmt.done == 0 {
for pcfile.done == 0 && pcline.done == 0 {
// Only changed if it advanced
if int32(file) != pcfile.value {
ls.AddUint8(dwarf.DW_LNS_set_file)
......@@ -1280,14 +1286,14 @@ func writelines(ctxt *Link, lib *sym.Library, textp []*sym.Symbol, ls *sym.Symbo
if pcline.nextpc < thispc {
thispc = pcline.nextpc
}
if pcstmt.nextpc < thispc {
if pcstmt.done == 0 && pcstmt.nextpc < thispc {
thispc = pcstmt.nextpc
}
if pcfile.nextpc == thispc {
pciternext(&pcfile)
}
if pcstmt.nextpc == thispc {
if pcstmt.done == 0 && pcstmt.nextpc == thispc {
pciternext(&pcstmt)
}
if pcline.nextpc == thispc {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment