lenType := Types[TINT]
if n.Class == PAUTO && !n.Addrtaken() {
// Split this string up into two separate variables.
- p := e.namedAuto(n.Sym.Name+".ptr", ptrType)
- l := e.namedAuto(n.Sym.Name+".len", lenType)
+ p := e.namedAuto(n.Sym.Name+".ptr", ptrType, n.Pos)
+ l := e.namedAuto(n.Sym.Name+".len", lenType, n.Pos)
return ssa.LocalSlot{N: p, Type: ptrType, Off: 0}, ssa.LocalSlot{N: l, Type: lenType, Off: 0}
}
// Return the two parts of the larger variable.
if n.Type.IsEmptyInterface() {
f = ".type"
}
- c := e.namedAuto(n.Sym.Name+f, t)
- d := e.namedAuto(n.Sym.Name+".data", t)
+ c := e.namedAuto(n.Sym.Name+f, t, n.Pos)
+ d := e.namedAuto(n.Sym.Name+".data", t, n.Pos)
return ssa.LocalSlot{N: c, Type: t, Off: 0}, ssa.LocalSlot{N: d, Type: t, Off: 0}
}
// Return the two parts of the larger variable.
lenType := Types[TINT]
if n.Class == PAUTO && !n.Addrtaken() {
// Split this slice up into three separate variables.
- p := e.namedAuto(n.Sym.Name+".ptr", ptrType)
- l := e.namedAuto(n.Sym.Name+".len", lenType)
- c := e.namedAuto(n.Sym.Name+".cap", lenType)
+ p := e.namedAuto(n.Sym.Name+".ptr", ptrType, n.Pos)
+ l := e.namedAuto(n.Sym.Name+".len", lenType, n.Pos)
+ c := e.namedAuto(n.Sym.Name+".cap", lenType, n.Pos)
return ssa.LocalSlot{N: p, Type: ptrType, Off: 0}, ssa.LocalSlot{N: l, Type: lenType, Off: 0}, ssa.LocalSlot{N: c, Type: lenType, Off: 0}
}
// Return the three parts of the larger variable.
}
if n.Class == PAUTO && !n.Addrtaken() {
// Split this complex up into two separate variables.
- c := e.namedAuto(n.Sym.Name+".real", t)
- d := e.namedAuto(n.Sym.Name+".imag", t)
+ c := e.namedAuto(n.Sym.Name+".real", t, n.Pos)
+ d := e.namedAuto(n.Sym.Name+".imag", t, n.Pos)
return ssa.LocalSlot{N: c, Type: t, Off: 0}, ssa.LocalSlot{N: d, Type: t, Off: 0}
}
// Return the two parts of the larger variable.
}
if n.Class == PAUTO && !n.Addrtaken() {
// Split this int64 up into two separate variables.
- h := e.namedAuto(n.Sym.Name+".hi", t)
- l := e.namedAuto(n.Sym.Name+".lo", Types[TUINT32])
+ h := e.namedAuto(n.Sym.Name+".hi", t, n.Pos)
+ l := e.namedAuto(n.Sym.Name+".lo", Types[TUINT32], n.Pos)
return ssa.LocalSlot{N: h, Type: t, Off: 0}, ssa.LocalSlot{N: l, Type: Types[TUINT32], Off: 0}
}
// Return the two parts of the larger variable.
// Note: the _ field may appear several times. But
// have no fear, identically-named but distinct Autos are
// ok, albeit maybe confusing for a debugger.
- x := e.namedAuto(n.Sym.Name+"."+st.FieldName(i), ft)
+ x := e.namedAuto(n.Sym.Name+"."+st.FieldName(i), ft, n.Pos)
return ssa.LocalSlot{N: x, Type: ft, Off: 0}
}
return ssa.LocalSlot{N: n, Type: ft, Off: name.Off + st.FieldOff(i)}
}
et := at.ElemType()
if n.Class == PAUTO && !n.Addrtaken() {
- x := e.namedAuto(n.Sym.Name+"[0]", et)
+ x := e.namedAuto(n.Sym.Name+"[0]", et, n.Pos)
return ssa.LocalSlot{N: x, Type: et, Off: 0}
}
return ssa.LocalSlot{N: n, Type: et, Off: name.Off}
// namedAuto returns a new AUTO variable with the given name and type.
// These are exposed to the debugger.
-func (e *ssafn) namedAuto(name string, typ ssa.Type) ssa.GCNode {
+func (e *ssafn) namedAuto(name string, typ ssa.Type, pos src.XPos) ssa.GCNode {
t := typ.(*Type)
s := &Sym{Name: name, Pkg: localpkg}
- n := nod(ONAME, nil, nil)
+
+ n := new(Node)
+ n.Name = new(Name)
+ n.Op = ONAME
+ n.Pos = pos
+ n.Orig = n
+
s.Def = n
s.Def.SetUsed(true)
n.Sym = s
n.Class = PAUTO
n.SetAddable(true)
n.Esc = EscNever
- n.Xoffset = 0
n.Name.Curfn = e.curfn
e.curfn.Func.Dcl = append(e.curfn.Func.Dcl, n)