mirror of
https://github.com/golang/go
synced 2024-11-19 09:54:49 -07:00
cmd/internal/obj: generate function DWARF symbols early
This removes a concurrent access of ctxt.Data. Updates #15756 Change-Id: Id017e90e47e093cd8825907f3853bb3d3bf8280d Reviewed-on: https://go-review.googlesource.com/40507 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
parent
7fa3b79ce5
commit
4e4e51c5c5
@ -555,19 +555,24 @@ func (c dwCtxt) AddSectionOffset(s dwarf.Sym, size int, t interface{}, ofs int64
|
|||||||
r.Type = R_DWARFREF
|
r.Type = R_DWARFREF
|
||||||
}
|
}
|
||||||
|
|
||||||
// makeFuncDebugEntry makes a DWARF Debugging Information Entry
|
// dwarfSym returns the DWARF symbol for TEXT symbol.
|
||||||
// for TEXT symbol s.
|
func (ctxt *Link) dwarfSym(s *LSym) *LSym {
|
||||||
func makeFuncDebugEntry(ctxt *Link, curfn interface{}, s *LSym) {
|
if s.Type != STEXT {
|
||||||
dsym := ctxt.Lookup(dwarf.InfoPrefix+s.Name, int(s.Version))
|
ctxt.Diag("dwarfSym of non-TEXT %v", s)
|
||||||
if dsym.Size != 0 {
|
}
|
||||||
return
|
return ctxt.Lookup(dwarf.InfoPrefix+s.Name, int(s.Version))
|
||||||
|
}
|
||||||
|
|
||||||
|
// populateDWARF fills in the DWARF Debugging Information Entry for TEXT symbol s.
|
||||||
|
// The DWARF symbol must already have been initialized in InitTextSym.
|
||||||
|
func (ctxt *Link) populateDWARF(curfn interface{}, s *LSym) {
|
||||||
|
dsym := ctxt.dwarfSym(s)
|
||||||
|
if dsym.Size != 0 {
|
||||||
|
ctxt.Diag("makeFuncDebugEntry double process %v", s)
|
||||||
}
|
}
|
||||||
dsym.Type = SDWARFINFO
|
|
||||||
dsym.Set(AttrDuplicateOK, s.DuplicateOK())
|
|
||||||
var vars []*dwarf.Var
|
var vars []*dwarf.Var
|
||||||
if ctxt.DebugInfo != nil {
|
if ctxt.DebugInfo != nil {
|
||||||
vars = ctxt.DebugInfo(s, curfn)
|
vars = ctxt.DebugInfo(s, curfn)
|
||||||
}
|
}
|
||||||
dwarf.PutFunc(dwCtxt{ctxt}, dsym, s.Name, s.Version == 0, s, s.Size, vars)
|
dwarf.PutFunc(dwCtxt{ctxt}, dsym, s.Name, s.Version == 0, s, s.Size, vars)
|
||||||
ctxt.Data = append(ctxt.Data, dsym)
|
|
||||||
}
|
}
|
||||||
|
@ -105,7 +105,7 @@ func Flushplist(ctxt *Link, plist *Plist, newprog ProgAlloc) {
|
|||||||
ctxt.Arch.Preprocess(ctxt, s, newprog)
|
ctxt.Arch.Preprocess(ctxt, s, newprog)
|
||||||
ctxt.Arch.Assemble(ctxt, s, newprog)
|
ctxt.Arch.Assemble(ctxt, s, newprog)
|
||||||
linkpcln(ctxt, s)
|
linkpcln(ctxt, s)
|
||||||
makeFuncDebugEntry(ctxt, plist.Curfn, s)
|
ctxt.populateDWARF(plist.Curfn, s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -133,6 +133,12 @@ func (ctxt *Link) InitTextSym(s *LSym, flag int) {
|
|||||||
s.Set(AttrNoFrame, flag&NOFRAME != 0)
|
s.Set(AttrNoFrame, flag&NOFRAME != 0)
|
||||||
s.Type = STEXT
|
s.Type = STEXT
|
||||||
ctxt.Text = append(ctxt.Text, s)
|
ctxt.Text = append(ctxt.Text, s)
|
||||||
|
|
||||||
|
// Set up DWARF entry for s.
|
||||||
|
dsym := ctxt.dwarfSym(s)
|
||||||
|
dsym.Type = SDWARFINFO
|
||||||
|
dsym.Set(AttrDuplicateOK, s.DuplicateOK())
|
||||||
|
ctxt.Data = append(ctxt.Data, dsym)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ctxt *Link) Globl(s *LSym, size int64, flag int) {
|
func (ctxt *Link) Globl(s *LSym, size int64, flag int) {
|
||||||
|
Loading…
Reference in New Issue
Block a user