aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlessandro Arzilli <alessandro.arzilli@gmail.com>2018-05-02 12:45:47 +0200
committerDavid Chase <drchase@google.com>2018-05-02 15:58:52 +0000
commit836fe697c4ec34fb30fcba65052cb42822edf752 (patch)
tree66c8bf397d05ab5e5fbd977db3e43af8e74ab970 /src
parentfc9c69a693fb3defcb95a16549bddcf3cac1421e (diff)
downloadgo-836fe697c4ec34fb30fcba65052cb42822edf752.tar.xz
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/110816 Reviewed-by: David Chase <drchase@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/cmd/link/internal/ld/dwarf.go12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go
index c90609feef..e06d1493e0 100644
--- a/src/cmd/link/internal/ld/dwarf.go
+++ b/src/cmd/link/internal/ld/dwarf.go
@@ -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 {