}
// slicesym writes a static slice symbol {&arr, lencap, lencap} to n.
-func slicesym(n, arr, lencap *Node) {
+// arr must be an ONAME. slicesym does not modify n.
+func slicesym(n, arr *Node, lencap int64) {
+ s := n.Sym.Linksym()
base := n.Xoffset
- gdata(n, nod(OADDR, arr, nil), Widthptr)
- n.Xoffset = base + sliceLenOffset
- gdata(n, lencap, Widthptr)
- n.Xoffset = base + sliceCapOffset
- gdata(n, lencap, Widthptr)
+ if arr.Op != ONAME {
+ Fatalf("slicesym non-name arr %v", arr)
+ }
+ s.WriteAddr(Ctxt, base, Widthptr, arr.Sym.Linksym(), arr.Xoffset)
+ s.WriteInt(Ctxt, base+sliceLenOffset, Widthptr, lencap)
+ s.WriteInt(Ctxt, base+sliceCapOffset, Widthptr, lencap)
}
func gdata(nam *Node, nr *Node, wid int) {
case OSLICELIT:
// copy slice
a := s.inittemps[r]
-
- n := l.copy()
- slicesym(n, a, r.Right)
+ slicesym(l, a, r.Right.Int64())
return true
case OARRAYLIT, OSTRUCTLIT:
ta := types.NewArray(r.Type.Elem(), bound)
a := staticname(ta)
s.inittemps[r] = a
- n := l.copy()
- slicesym(n, a, r.Right)
-
+ slicesym(l, a, bound)
// Fall through to init underlying array.
l = a
fallthrough
if !stataddr(&nam, var_) || nam.Class() != PEXTERN {
Fatalf("slicelit: %v", var_)
}
-
- var v Node
- v.Type = types.Types[TINT]
- setintconst(&v, t.NumElem())
- slicesym(&nam, vstat, &v)
+ slicesym(&nam, vstat, t.NumElem())
return
}