Skip to content

Commit

Permalink
cmd/link: fix isStmt DWARF info
Browse files Browse the repository at this point in the history
When CL 147160 introduced function ABIs encoded as symbol versions in
the linker, it became slightly more complicated to look up derived
DWARF symbols. It fixed this by introducing a dwarfFuncSym function to
hide this logic, but missed one derived lookup that was done in the
object reader itself. As a result, we lost the isStmt tables from the
compiler, so every PC was marked as a statement in the DWARF info.

Fix this by moving this derived lookup out of the object reader and
into the DWARF code and calling dwarfFuncSym to get the correctly
versioned symbol.

Should fix the linux-amd64-longtest builder.

Updates #27539.

Change-Id: If40d5ba28bab1918ac4ad18fbb5103666b6d978b
Reviewed-on: https://go-review.googlesource.com/c/149605
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
  • Loading branch information
aclements committed Nov 14, 2018
1 parent 0a40d45 commit c7a4165
Show file tree
Hide file tree
Showing 3 changed files with 5 additions and 5 deletions.
7 changes: 5 additions & 2 deletions src/cmd/link/internal/ld/dwarf.go
Original file line number Diff line number Diff line change
Expand Up @@ -1219,11 +1219,14 @@ func writelines(ctxt *Link, unit *compilationUnit, ls *sym.Symbol) {

pciterinit(ctxt, &pcfile, &s.FuncInfo.Pcfile)
pciterinit(ctxt, &pcline, &s.FuncInfo.Pcline)
pciterinit(ctxt, &pcstmt, &sym.Pcdata{P: s.FuncInfo.IsStmtSym.P})

if pcstmt.done != 0 {
isStmtSym := dwarfFuncSym(ctxt, s, dwarf.IsStmtPrefix, false)
if isStmtSym != nil && len(isStmtSym.P) > 0 {
pciterinit(ctxt, &pcstmt, &sym.Pcdata{P: isStmtSym.P})
} else {
// Assembly files lack a pcstmt section, we assume that every instruction
// is a valid statement.
pcstmt.done = 1
pcstmt.value = 1
}

Expand Down
2 changes: 0 additions & 2 deletions src/cmd/link/internal/objfile/objfile.go
Original file line number Diff line number Diff line change
Expand Up @@ -320,8 +320,6 @@ overwrite:
pc.InlTree[i].Func = r.readSymIndex()
}

s.FuncInfo.IsStmtSym = r.syms.Lookup(dwarf.IsStmtPrefix+s.Name, int(s.Version))

if !dupok {
if s.Attr.OnList() {
log.Fatalf("symbol %s listed multiple times", s.Name)
Expand Down
1 change: 0 additions & 1 deletion src/cmd/link/internal/sym/symbol.go
Original file line number Diff line number Diff line change
Expand Up @@ -499,7 +499,6 @@ type FuncInfo struct {
Pcline Pcdata
Pcinline Pcdata
Pcdata []Pcdata
IsStmtSym *Symbol
Funcdata []*Symbol
Funcdataoff []int64
File []*Symbol
Expand Down

0 comments on commit c7a4165

Please sign in to comment.