]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj: generate function DWARF symbols early
authorJosh Bleecher Snyder <josharian@gmail.com>
Thu, 13 Apr 2017 12:57:59 +0000 (05:57 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Thu, 13 Apr 2017 14:38:01 +0000 (14:38 +0000)
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>
src/cmd/internal/obj/objfile.go
src/cmd/internal/obj/plist.go

index 6858143674684ae0e51d63acfda3498b01832b2b..a4a9091bb91e063b965287596c30426d376096b2 100644 (file)
@@ -555,19 +555,24 @@ func (c dwCtxt) AddSectionOffset(s dwarf.Sym, size int, t interface{}, ofs int64
        r.Type = R_DWARFREF
 }
 
-// makeFuncDebugEntry makes a DWARF Debugging Information Entry
-// for TEXT symbol s.
-func makeFuncDebugEntry(ctxt *Link, curfn interface{}, s *LSym) {
-       dsym := ctxt.Lookup(dwarf.InfoPrefix+s.Name, int(s.Version))
+// dwarfSym returns the DWARF symbol for TEXT symbol.
+func (ctxt *Link) dwarfSym(s *LSym) *LSym {
+       if s.Type != STEXT {
+               ctxt.Diag("dwarfSym of non-TEXT %v", s)
+       }
+       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 {
-               return
+               ctxt.Diag("makeFuncDebugEntry double process %v", s)
        }
-       dsym.Type = SDWARFINFO
-       dsym.Set(AttrDuplicateOK, s.DuplicateOK())
        var vars []*dwarf.Var
        if ctxt.DebugInfo != nil {
                vars = ctxt.DebugInfo(s, curfn)
        }
        dwarf.PutFunc(dwCtxt{ctxt}, dsym, s.Name, s.Version == 0, s, s.Size, vars)
-       ctxt.Data = append(ctxt.Data, dsym)
 }
index ebfd3610212fc07e6d67a42f8048dd1d1119cdb3..7dc5b485b178f07344238499b544cdf140d7f408 100644 (file)
@@ -105,7 +105,7 @@ func Flushplist(ctxt *Link, plist *Plist, newprog ProgAlloc) {
                ctxt.Arch.Preprocess(ctxt, s, newprog)
                ctxt.Arch.Assemble(ctxt, s, newprog)
                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.Type = STEXT
        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) {