From: Austin Clements Date: Wed, 14 Nov 2018 20:45:27 +0000 (-0500) Subject: cmd/link: fix isStmt DWARF info X-Git-Tag: go1.12beta1~350 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=8dba66dfeb8eb19b075d45a84dae9bcdddb347d6;p=gostls13.git cmd/link: fix isStmt DWARF info 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 TryBot-Result: Gobot Gobot Reviewed-by: David Chase --- diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index d10f4ab3c3..a150306df9 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -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 } diff --git a/src/cmd/link/internal/objfile/objfile.go b/src/cmd/link/internal/objfile/objfile.go index 77c3a7f914..a85ba1ebee 100644 --- a/src/cmd/link/internal/objfile/objfile.go +++ b/src/cmd/link/internal/objfile/objfile.go @@ -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) diff --git a/src/cmd/link/internal/sym/symbol.go b/src/cmd/link/internal/sym/symbol.go index 5e5fca467d..a1af4670a2 100644 --- a/src/cmd/link/internal/sym/symbol.go +++ b/src/cmd/link/internal/sym/symbol.go @@ -499,7 +499,6 @@ type FuncInfo struct { Pcline Pcdata Pcinline Pcdata Pcdata []Pcdata - IsStmtSym *Symbol Funcdata []*Symbol Funcdataoff []int64 File []*Symbol