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,
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),
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 {
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
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) {
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
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)
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")
}