return
}
varname := varSym.Name
- dieSymName := dwarf.InfoPrefix + varname
- dieSym := ctxt.LookupInit(dieSymName, func(s *LSym) {
- s.Type = objabi.SDWARFVAR
- s.Set(AttrDuplicateOK, true) // needed for shared linkage
- ctxt.Data = append(ctxt.Data, s)
- })
+ dieSym := &LSym{
+ Type: objabi.SDWARFVAR,
+ }
+ varSym.NewVarInfo().dwarfInfoSym = dieSym
+ ctxt.Data = append(ctxt.Data, dieSym)
typeSym := ctxt.Lookup(dwarf.InfoPrefix + typename)
dwarf.PutGlobal(dwCtxt{ctxt}, dieSym, typeSym, varSym, varname)
}
P []byte
R []Reloc
- Extra *interface{} // *FuncInfo or *FileInfo, if present
+ Extra *interface{} // *FuncInfo, *VarInfo, or *FileInfo, if present
Pkg string
PkgIdx int32
return f
}
+type VarInfo struct {
+ dwarfInfoSym *LSym
+}
+
+// NewVarInfo allocates and returns a VarInfo for LSym.
+func (s *LSym) NewVarInfo() *VarInfo {
+ if s.Extra != nil {
+ panic(fmt.Sprintf("invalid use of LSym - NewVarInfo with Extra of type %T", *s.Extra))
+ }
+ f := new(VarInfo)
+ s.Extra = new(interface{})
+ *s.Extra = f
+ return f
+}
+
+// VarInfo returns the *VarInfo associated with s, or else nil.
+func (s *LSym) VarInfo() *VarInfo {
+ if s.Extra == nil {
+ return nil
+ }
+ f, _ := (*s.Extra).(*VarInfo)
+ return f
+}
+
// A FileInfo contains extra fields for SDATA symbols backed by files.
// (If LSym.Extra is a *FileInfo, LSym.P == nil.)
type FileInfo struct {
}
w.aux1(goobj.AuxWasmImport, fn.WasmImportSym)
}
+ } else if v := s.VarInfo(); v != nil {
+ if v.dwarfInfoSym != nil && v.dwarfInfoSym.Size != 0 {
+ w.aux1(goobj.AuxDwarfInfo, v.dwarfInfoSym)
+ }
}
}
}
n++
}
+ } else if v := s.VarInfo(); v != nil {
+ if v.dwarfInfoSym != nil && v.dwarfInfoSym.Size != 0 {
+ n++
+ }
}
return n
}
func writeAuxSymDebug(ctxt *Link, par *LSym, aux *LSym) {
// Most aux symbols (ex: funcdata) are not interesting--
// pick out just the DWARF ones for now.
- if aux.Type != objabi.SDWARFLOC &&
- aux.Type != objabi.SDWARFFCN &&
- aux.Type != objabi.SDWARFABSFCN &&
- aux.Type != objabi.SDWARFLINES &&
- aux.Type != objabi.SDWARFRANGE {
+ switch aux.Type {
+ case objabi.SDWARFLOC,
+ objabi.SDWARFFCN,
+ objabi.SDWARFABSFCN,
+ objabi.SDWARFLINES,
+ objabi.SDWARFRANGE,
+ objabi.SDWARFVAR:
+ default:
return
}
ctxt.writeSymDebugNamed(aux, "aux for "+par.Name)
fn(aux)
}
ctxt.traverseFuncAux(flag, s, f, files)
+ } else if v := s.VarInfo(); v != nil {
+ fnNoNil(v.dwarfInfoSym)
}
}
if flag&traversePcdata != 0 && s.Type == objabi.STEXT {
fn(s, s.Gotype)
}
}
- if s.Type != objabi.STEXT {
- continue
+ if s.Type == objabi.STEXT {
+ ctxt.traverseFuncAux(flag, s, fn, files)
+ } else if v := s.VarInfo(); v != nil && v.dwarfInfoSym != nil {
+ fn(s, v.dwarfInfoSym)
}
- ctxt.traverseFuncAux(flag, s, fn, files)
}
}
}
if d.ldr.IsFileLocal(idx) {
continue
}
- sn := d.ldr.SymName(idx)
- if sn == "" {
- // skip aux symbols
- continue
- }
// Find compiler-generated DWARF info sym for global in question,
// and tack it onto the appropriate unit. Note that there are
// circumstances under which we can't find the compiler-generated
// symbol-- this typically happens as a result of compiler options
// (e.g. compile package X with "-dwarf=0").
-
- // FIXME: use an aux sym or a relocation here instead of a
- // name lookup.
- varDIE := d.ldr.Lookup(dwarf.InfoPrefix+sn, 0)
+ varDIE := d.ldr.GetVarDwarfAuxSym(idx)
if varDIE != 0 {
unit := d.ldr.SymUnit(idx)
d.defgotype(gt)
return
}
+func (l *Loader) GetVarDwarfAuxSym(i Sym) Sym {
+ aux := l.aux1(i, goobj.AuxDwarfInfo)
+ if aux != 0 && l.SymType(aux) != sym.SDWARFVAR {
+ fmt.Println(l.SymName(i), l.SymType(i), l.SymType(aux), sym.SDWARFVAR)
+ panic("aux dwarf info sym with wrong type")
+ }
+ return aux
+}
+
// AddInteriorSym sets up 'interior' as an interior symbol of
// container/payload symbol 'container'. An interior symbol does not
// itself have data, but gives a name to a subrange of the data in its