decls, dwarfVars := createDwarfVars(fnsym, fn.Func, apdecls)
- // For each type referenced by the functions auto vars, attach a
- // dummy relocation to the function symbol to insure that the type
- // included in DWARF processing during linking.
+ // For each type referenced by the functions auto vars but not
+ // already referenced by a dwarf var, attach a dummy relocation to
+ // the function symbol to insure that the type included in DWARF
+ // processing during linking.
typesyms := []*obj.LSym{}
for t, _ := range fnsym.Func.Autot {
typesyms = append(typesyms, t)
// createSimpleVars creates a DWARF entry for every variable declared in the
// function, claiming that they are permanently on the stack.
-func createSimpleVars(apDecls []*Node) ([]*Node, []*dwarf.Var, map[*Node]bool) {
+func createSimpleVars(fnsym *obj.LSym, apDecls []*Node) ([]*Node, []*dwarf.Var, map[*Node]bool) {
var vars []*dwarf.Var
var decls []*Node
selected := make(map[*Node]bool)
}
decls = append(decls, n)
- vars = append(vars, createSimpleVar(n))
+ vars = append(vars, createSimpleVar(fnsym, n))
selected[n] = true
}
return decls, vars, selected
}
-func createSimpleVar(n *Node) *dwarf.Var {
+func createSimpleVar(fnsym *obj.LSym, n *Node) *dwarf.Var {
var abbrev int
offs := n.Xoffset
}
typename := dwarf.InfoPrefix + typesymname(n.Type)
+ delete(fnsym.Func.Autot, ngotype(n).Linksym())
inlIndex := 0
if genDwarfInline > 1 {
if n.Name.InlFormal() || n.Name.InlLocal() {
// createComplexVars creates recomposed DWARF vars with location lists,
// suitable for describing optimized code.
-func createComplexVars(fn *Func) ([]*Node, []*dwarf.Var, map[*Node]bool) {
+func createComplexVars(fnsym *obj.LSym, fn *Func) ([]*Node, []*dwarf.Var, map[*Node]bool) {
debugInfo := fn.DebugInfo
// Produce a DWARF variable entry for each user variable.
ssaVars[debugInfo.Slots[slot].N.(*Node)] = true
}
- if dvar := createComplexVar(fn, ssa.VarID(varID)); dvar != nil {
+ if dvar := createComplexVar(fnsym, fn, ssa.VarID(varID)); dvar != nil {
decls = append(decls, n)
vars = append(vars, dvar)
}
var decls []*Node
var selected map[*Node]bool
if Ctxt.Flag_locationlists && Ctxt.Flag_optimize && fn.DebugInfo != nil {
- decls, vars, selected = createComplexVars(fn)
+ decls, vars, selected = createComplexVars(fnsym, fn)
} else {
- decls, vars, selected = createSimpleVars(apDecls)
+ decls, vars, selected = createSimpleVars(fnsym, apDecls)
}
dcl := apDecls
// Args not of SSA-able type are treated here; they
// are homed on the stack in a single place for the
// entire call.
- vars = append(vars, createSimpleVar(n))
+ vars = append(vars, createSimpleVar(fnsym, n))
decls = append(decls, n)
continue
}
}
// createComplexVar builds a single DWARF variable entry and location list.
-func createComplexVar(fn *Func, varID ssa.VarID) *dwarf.Var {
+func createComplexVar(fnsym *obj.LSym, fn *Func, varID ssa.VarID) *dwarf.Var {
debug := fn.DebugInfo
n := debug.Vars[varID].(*Node)
}
gotype := ngotype(n).Linksym()
+ delete(fnsym.Func.Autot, gotype)
typename := dwarf.InfoPrefix + gotype.Name[len("type."):]
inlIndex := 0
if genDwarfInline > 1 {