aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/internal/obj
diff options
context:
space:
mode:
authorJosh Bleecher Snyder <josharian@gmail.com>2017-04-13 05:57:59 -0700
committerJosh Bleecher Snyder <josharian@gmail.com>2017-04-13 14:38:01 +0000
commit4e4e51c5c5a1cedf4d2e8fef59b61eeaddb10647 (patch)
tree7ebad4bee7deea653dd8291773e14f845893b902 /src/cmd/internal/obj
parent7fa3b79ce52a93d21beb7df0eb7b92148a9b79e5 (diff)
downloadgo-4e4e51c5c5a1cedf4d2e8fef59b61eeaddb10647.tar.xz
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>
Diffstat (limited to 'src/cmd/internal/obj')
-rw-r--r--src/cmd/internal/obj/objfile.go21
-rw-r--r--src/cmd/internal/obj/plist.go8
2 files changed, 20 insertions, 9 deletions
diff --git a/src/cmd/internal/obj/objfile.go b/src/cmd/internal/obj/objfile.go
index 6858143674..a4a9091bb9 100644
--- a/src/cmd/internal/obj/objfile.go
+++ b/src/cmd/internal/obj/objfile.go
@@ -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)
}
diff --git a/src/cmd/internal/obj/plist.go b/src/cmd/internal/obj/plist.go
index ebfd361021..7dc5b485b1 100644
--- a/src/cmd/internal/obj/plist.go
+++ b/src/cmd/internal/obj/plist.go
@@ -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) {