cmd/compile: remove gdata layer in slicesym

The previous change moved code around to create slicesym.
This change simplifies slicesym and its callsites
by accepting an int64 for lencap instead of a node,
and by removing all the calls to gdata.
It also stops modifying n,
which avoids the need to make a copy of it.

Passes toolstash-check.

Change-Id: I4d25454d11b4bb8941000244443e3c99eef4bdd0
Reviewed-on: https://go-review.googlesource.com/c/go/+/227550
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
Josh Bleecher Snyder 2020-04-08 13:51:25 -07:00
parent 7096b1700d
commit 0a18cbc2e6
2 changed files with 12 additions and 17 deletions

View file

@ -418,13 +418,16 @@ func dsymptrWeakOff(s *obj.LSym, off int, x *obj.LSym) int {
} }
// slicesym writes a static slice symbol {&arr, lencap, lencap} to n. // 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 base := n.Xoffset
gdata(n, nod(OADDR, arr, nil), Widthptr) if arr.Op != ONAME {
n.Xoffset = base + sliceLenOffset Fatalf("slicesym non-name arr %v", arr)
gdata(n, lencap, Widthptr) }
n.Xoffset = base + sliceCapOffset s.WriteAddr(Ctxt, base, Widthptr, arr.Sym.Linksym(), arr.Xoffset)
gdata(n, lencap, Widthptr) s.WriteInt(Ctxt, base+sliceLenOffset, Widthptr, lencap)
s.WriteInt(Ctxt, base+sliceCapOffset, Widthptr, lencap)
} }
func gdata(nam *Node, nr *Node, wid int) { func gdata(nam *Node, nr *Node, wid int) {

View file

@ -128,9 +128,7 @@ func (s *InitSchedule) staticcopy(l *Node, r *Node) bool {
case OSLICELIT: case OSLICELIT:
// copy slice // copy slice
a := s.inittemps[r] a := s.inittemps[r]
slicesym(l, a, r.Right.Int64())
n := l.copy()
slicesym(n, a, r.Right)
return true return true
case OARRAYLIT, OSTRUCTLIT: case OARRAYLIT, OSTRUCTLIT:
@ -221,9 +219,7 @@ func (s *InitSchedule) staticassign(l *Node, r *Node) bool {
ta := types.NewArray(r.Type.Elem(), bound) ta := types.NewArray(r.Type.Elem(), bound)
a := staticname(ta) a := staticname(ta)
s.inittemps[r] = a s.inittemps[r] = a
n := l.copy() slicesym(l, a, bound)
slicesym(n, a, r.Right)
// Fall through to init underlying array. // Fall through to init underlying array.
l = a l = a
fallthrough fallthrough
@ -600,11 +596,7 @@ func slicelit(ctxt initContext, n *Node, var_ *Node, init *Nodes) {
if !stataddr(&nam, var_) || nam.Class() != PEXTERN { if !stataddr(&nam, var_) || nam.Class() != PEXTERN {
Fatalf("slicelit: %v", var_) Fatalf("slicelit: %v", var_)
} }
slicesym(&nam, vstat, t.NumElem())
var v Node
v.Type = types.Types[TINT]
setintconst(&v, t.NumElem())
slicesym(&nam, vstat, &v)
return return
} }