]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.link] cmd/compile, cmd/link: move DWARF info sym to anonymous aux data
authorThan McIntosh <thanm@google.com>
Mon, 16 Mar 2020 12:13:16 +0000 (08:13 -0400)
committerThan McIntosh <thanm@google.com>
Fri, 20 Mar 2020 16:19:15 +0000 (16:19 +0000)
Switch the primary subprogram die DWARF symbol emitted by the compiler
from named+dupOK to anonymous aux. This should help performance wise
by not having to add these symbols to the linker's symbol name lookup
tables.

Change-Id: Idf66662b8bf60b3dee9a55e6cd5137b24a9f5ab6
Reviewed-on: https://go-review.googlesource.com/c/go/+/223669
Run-TryBot: Than McIntosh <thanm@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/cmd/internal/obj/objfile.go
src/cmd/internal/obj/objfile2.go
src/cmd/internal/obj/plist.go
src/cmd/internal/obj/sym.go
src/cmd/link/internal/ld/dwarf.go
src/cmd/link/internal/loader/loader.go

index 717d471569c0e1bed8b29001161e29573bc16e56..8a8e0c47c319d2bd82e9f5e6a270d05370f4de56 100644 (file)
@@ -207,7 +207,9 @@ func (ctxt *Link) dwarfSym(s *LSym) (dwarfInfoSym, dwarfLocSym, dwarfRangesSym,
                ctxt.Diag("dwarfSym of non-TEXT %v", s)
        }
        if s.Func.dwarfInfoSym == nil {
-               s.Func.dwarfInfoSym = ctxt.LookupDerived(s, dwarf.InfoPrefix+s.Name)
+               s.Func.dwarfInfoSym = &LSym{
+                       Type: objabi.SDWARFINFO,
+               }
                if ctxt.Flag_locationlists {
                        s.Func.dwarfLocSym = &LSym{
                                Type: objabi.SDWARFLOC,
index d3e4bd4beaeff560ccad4fa3127c4677c93c6383..95f920eef5618e438ae2099e85d62b7265f01a84 100644 (file)
@@ -299,7 +299,7 @@ func (w *writer) Aux(s *LSym) {
                        o.Write(w.Writer)
                }
 
-               if s.Func.dwarfInfoSym != nil {
+               if s.Func.dwarfInfoSym != nil && s.Func.dwarfInfoSym.Size != 0 {
                        o := goobj2.Aux{
                                Type: goobj2.AuxDwarfInfo,
                                Sym:  makeSymRef(s.Func.dwarfInfoSym),
@@ -339,7 +339,7 @@ func nAuxSym(s *LSym) int {
        if s.Func != nil {
                // FuncInfo is an aux symbol, each Funcdata is an aux symbol
                n += 1 + len(s.Func.Pcln.Funcdata)
-               if s.Func.dwarfInfoSym != nil {
+               if s.Func.dwarfInfoSym != nil && s.Func.dwarfInfoSym.Size != 0 {
                        n++
                }
                if s.Func.dwarfLocSym != nil && s.Func.dwarfLocSym.Size != 0 {
@@ -419,7 +419,7 @@ func genFuncInfoSyms(ctxt *Link) {
                s.Func.FuncInfoSym = isym
                b.Reset()
 
-               dwsyms := []*LSym{s.Func.dwarfRangesSym, s.Func.dwarfLocSym, s.Func.dwarfDebugLinesSym}
+               dwsyms := []*LSym{s.Func.dwarfRangesSym, s.Func.dwarfLocSym, s.Func.dwarfDebugLinesSym, s.Func.dwarfInfoSym}
                for _, s := range dwsyms {
                        if s == nil || s.Size == 0 {
                                continue
index 917343ea576d97a4937585799f89851f2a831269..57438d57eaaabb7cd8c4d73711bab00d0cecd158 100644 (file)
@@ -139,10 +139,7 @@ func (ctxt *Link) InitTextSym(s *LSym, flag int) {
        ctxt.Text = append(ctxt.Text, s)
 
        // Set up DWARF entries for s.
-       info, _, _, _, _ := ctxt.dwarfSym(s)
-       info.Type = objabi.SDWARFINFO
-       info.Set(AttrDuplicateOK, s.DuplicateOK())
-       ctxt.Data = append(ctxt.Data, info)
+       ctxt.dwarfSym(s)
 }
 
 func (ctxt *Link) Globl(s *LSym, size int64, flag int) {
index ff5526ed45da82089f11011ba106699498c34f3e..ee97281f4dd4b313036915fffbebfef937ba0b03 100644 (file)
@@ -330,7 +330,7 @@ func (ctxt *Link) traverseFuncAux(flag traverseFlag, fsym *LSym, fn func(parent
                        fn(fsym, filesym)
                }
        }
-       dwsyms := []*LSym{fsym.Func.dwarfRangesSym, fsym.Func.dwarfLocSym, fsym.Func.dwarfDebugLinesSym}
+       dwsyms := []*LSym{fsym.Func.dwarfRangesSym, fsym.Func.dwarfLocSym, fsym.Func.dwarfDebugLinesSym, fsym.Func.dwarfInfoSym}
        for _, dws := range dwsyms {
                if dws == nil || dws.Size == 0 {
                        continue
index 9c583086d7958cbe5fdf0c543cfb60a1a797a825..0a8edcfd545109179d3b32d4ee298c67b42cbc12 100644 (file)
@@ -1912,6 +1912,9 @@ func dwarfGenerateDebugInfo(ctxt *Link) {
                        for _, s := range unit.Textp2 { // textp2 has been dead-code-eliminated already.
                                fnSym := loader.Sym(s)
                                infosym, _, rangesym, _ := d.ldr.GetFuncDwarfAuxSyms(fnSym)
+                               if infosym == 0 {
+                                       continue
+                               }
                                d.ldr.SetAttrNotInSymbolTable(infosym, true)
                                d.ldr.SetAttrReachable(infosym, true)
 
index 91798d470ae7b17debf6b6772d64cf4709908b08..6a068937af4d303f48f10cc8a17b79cad037905c 100644 (file)
@@ -2140,11 +2140,17 @@ func loadObjSyms(l *Loader, syms *sym.Symbols, r *oReader) int {
                osym := goobj2.Sym{}
                osym.Read(r.Reader, r.SymOff(i))
                name := strings.Replace(osym.Name, "\"\".", r.pkgprefix, -1)
-               if name == "" {
+               t := sym.AbiSymKindToSymKind[objabi.SymKind(osym.Type)]
+               // NB: for the test below, we can skip most anonymous symbols
+               // since they will never be turned into sym.Symbols (ex:
+               // funcdata), however DWARF subprogram DIE symbols (which are
+               // nameless) will eventually need to be turned into
+               // sym.Symbols (with relocations), so the simplest thing to do
+               // is include them as part of this loop.
+               if name == "" && t != sym.SDWARFINFO {
                        continue
                }
                ver := abiToVer(osym.ABI, r.version)
-               t := sym.AbiSymKindToSymKind[objabi.SymKind(osym.Type)]
                if t == sym.SXREF {
                        log.Fatalf("bad sxref")
                }