Skip to content

Commit 4e8c6af

Browse files
committed
cmd/link, cmd/internal/obj: use aux symbol for global variable DWARF info
Currently, for a global variable, its debug info symbol is a named symbol with the variable's name with a special prefix. And the linker looks it up by name. This CL makes the debug info symbol an aux symbol of the variable symbol. Change-Id: I55614d0ef2af9c53eb40144ad80e09339bf3cbee Reviewed-on: https://go-review.googlesource.com/c/go/+/490816 Run-TryBot: Cherry Mui <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Reviewed-by: Than McIntosh <[email protected]>
1 parent 04f059f commit 4e8c6af

File tree

6 files changed

+62
-24
lines changed

6 files changed

+62
-24
lines changed

src/cmd/internal/obj/dwarf.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -412,12 +412,11 @@ func (ctxt *Link) DwarfGlobal(myimportpath, typename string, varSym *LSym) {
412412
return
413413
}
414414
varname := varSym.Name
415-
dieSymName := dwarf.InfoPrefix + varname
416-
dieSym := ctxt.LookupInit(dieSymName, func(s *LSym) {
417-
s.Type = objabi.SDWARFVAR
418-
s.Set(AttrDuplicateOK, true) // needed for shared linkage
419-
ctxt.Data = append(ctxt.Data, s)
420-
})
415+
dieSym := &LSym{
416+
Type: objabi.SDWARFVAR,
417+
}
418+
varSym.NewVarInfo().dwarfInfoSym = dieSym
419+
ctxt.Data = append(ctxt.Data, dieSym)
421420
typeSym := ctxt.Lookup(dwarf.InfoPrefix + typename)
422421
dwarf.PutGlobal(dwCtxt{ctxt}, dieSym, typeSym, varSym, varname)
423422
}

src/cmd/internal/obj/link.go

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ type LSym struct {
465465
P []byte
466466
R []Reloc
467467

468-
Extra *interface{} // *FuncInfo or *FileInfo, if present
468+
Extra *interface{} // *FuncInfo, *VarInfo, or *FileInfo, if present
469469

470470
Pkg string
471471
PkgIdx int32
@@ -537,6 +537,30 @@ func (s *LSym) Func() *FuncInfo {
537537
return f
538538
}
539539

540+
type VarInfo struct {
541+
dwarfInfoSym *LSym
542+
}
543+
544+
// NewVarInfo allocates and returns a VarInfo for LSym.
545+
func (s *LSym) NewVarInfo() *VarInfo {
546+
if s.Extra != nil {
547+
panic(fmt.Sprintf("invalid use of LSym - NewVarInfo with Extra of type %T", *s.Extra))
548+
}
549+
f := new(VarInfo)
550+
s.Extra = new(interface{})
551+
*s.Extra = f
552+
return f
553+
}
554+
555+
// VarInfo returns the *VarInfo associated with s, or else nil.
556+
func (s *LSym) VarInfo() *VarInfo {
557+
if s.Extra == nil {
558+
return nil
559+
}
560+
f, _ := (*s.Extra).(*VarInfo)
561+
return f
562+
}
563+
540564
// A FileInfo contains extra fields for SDATA symbols backed by files.
541565
// (If LSym.Extra is a *FileInfo, LSym.P == nil.)
542566
type FileInfo struct {

src/cmd/internal/obj/objfile.go

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,10 @@ func (w *writer) Aux(s *LSym) {
615615
}
616616
w.aux1(goobj.AuxWasmImport, fn.WasmImportSym)
617617
}
618+
} else if v := s.VarInfo(); v != nil {
619+
if v.dwarfInfoSym != nil && v.dwarfInfoSym.Size != 0 {
620+
w.aux1(goobj.AuxDwarfInfo, v.dwarfInfoSym)
621+
}
618622
}
619623
}
620624

@@ -721,6 +725,10 @@ func nAuxSym(s *LSym) int {
721725
}
722726
n++
723727
}
728+
} else if v := s.VarInfo(); v != nil {
729+
if v.dwarfInfoSym != nil && v.dwarfInfoSym.Size != 0 {
730+
n++
731+
}
724732
}
725733
return n
726734
}
@@ -795,11 +803,14 @@ func genFuncInfoSyms(ctxt *Link) {
795803
func writeAuxSymDebug(ctxt *Link, par *LSym, aux *LSym) {
796804
// Most aux symbols (ex: funcdata) are not interesting--
797805
// pick out just the DWARF ones for now.
798-
if aux.Type != objabi.SDWARFLOC &&
799-
aux.Type != objabi.SDWARFFCN &&
800-
aux.Type != objabi.SDWARFABSFCN &&
801-
aux.Type != objabi.SDWARFLINES &&
802-
aux.Type != objabi.SDWARFRANGE {
806+
switch aux.Type {
807+
case objabi.SDWARFLOC,
808+
objabi.SDWARFFCN,
809+
objabi.SDWARFABSFCN,
810+
objabi.SDWARFLINES,
811+
objabi.SDWARFRANGE,
812+
objabi.SDWARFVAR:
813+
default:
803814
return
804815
}
805816
ctxt.writeSymDebugNamed(aux, "aux for "+par.Name)

src/cmd/internal/obj/sym.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,8 @@ func (ctxt *Link) traverseSyms(flag traverseFlag, fn func(*LSym)) {
367367
fn(aux)
368368
}
369369
ctxt.traverseFuncAux(flag, s, f, files)
370+
} else if v := s.VarInfo(); v != nil {
371+
fnNoNil(v.dwarfInfoSym)
370372
}
371373
}
372374
if flag&traversePcdata != 0 && s.Type == objabi.STEXT {
@@ -443,10 +445,11 @@ func (ctxt *Link) traverseAuxSyms(flag traverseFlag, fn func(parent *LSym, aux *
443445
fn(s, s.Gotype)
444446
}
445447
}
446-
if s.Type != objabi.STEXT {
447-
continue
448+
if s.Type == objabi.STEXT {
449+
ctxt.traverseFuncAux(flag, s, fn, files)
450+
} else if v := s.VarInfo(); v != nil && v.dwarfInfoSym != nil {
451+
fn(s, v.dwarfInfoSym)
448452
}
449-
ctxt.traverseFuncAux(flag, s, fn, files)
450453
}
451454
}
452455
}

src/cmd/link/internal/ld/dwarf.go

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1936,21 +1936,13 @@ func dwarfGenerateDebugInfo(ctxt *Link) {
19361936
if d.ldr.IsFileLocal(idx) {
19371937
continue
19381938
}
1939-
sn := d.ldr.SymName(idx)
1940-
if sn == "" {
1941-
// skip aux symbols
1942-
continue
1943-
}
19441939

19451940
// Find compiler-generated DWARF info sym for global in question,
19461941
// and tack it onto the appropriate unit. Note that there are
19471942
// circumstances under which we can't find the compiler-generated
19481943
// symbol-- this typically happens as a result of compiler options
19491944
// (e.g. compile package X with "-dwarf=0").
1950-
1951-
// FIXME: use an aux sym or a relocation here instead of a
1952-
// name lookup.
1953-
varDIE := d.ldr.Lookup(dwarf.InfoPrefix+sn, 0)
1945+
varDIE := d.ldr.GetVarDwarfAuxSym(idx)
19541946
if varDIE != 0 {
19551947
unit := d.ldr.SymUnit(idx)
19561948
d.defgotype(gt)

src/cmd/link/internal/loader/loader.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1685,6 +1685,15 @@ func (l *Loader) GetFuncDwarfAuxSyms(fnSymIdx Sym) (auxDwarfInfo, auxDwarfLoc, a
16851685
return
16861686
}
16871687

1688+
func (l *Loader) GetVarDwarfAuxSym(i Sym) Sym {
1689+
aux := l.aux1(i, goobj.AuxDwarfInfo)
1690+
if aux != 0 && l.SymType(aux) != sym.SDWARFVAR {
1691+
fmt.Println(l.SymName(i), l.SymType(i), l.SymType(aux), sym.SDWARFVAR)
1692+
panic("aux dwarf info sym with wrong type")
1693+
}
1694+
return aux
1695+
}
1696+
16881697
// AddInteriorSym sets up 'interior' as an interior symbol of
16891698
// container/payload symbol 'container'. An interior symbol does not
16901699
// itself have data, but gives a name to a subrange of the data in its

0 commit comments

Comments
 (0)