]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: refactor static slice symbol creation
authorJosh Bleecher Snyder <josharian@gmail.com>
Wed, 8 Apr 2020 20:41:59 +0000 (13:41 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Thu, 9 Apr 2020 01:17:25 +0000 (01:17 +0000)
This change mostly moves code around to unify it.
A subsequent change will simplify and improve slicesym.

Passes toolstash-check.

Change-Id: I84a877ea747febb2b571d4089ba6d905b51b27ec
Reviewed-on: https://go-review.googlesource.com/c/go/+/227549
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/gc/obj.go
src/cmd/compile/internal/gc/sinit.go

index a3e82cf6993b5bafa52fe5bd81d00b8b003d7b03..d555fcf21fbaa35375b44756e4f2320ef2931d70 100644 (file)
@@ -417,6 +417,16 @@ func dsymptrWeakOff(s *obj.LSym, off int, x *obj.LSym) int {
        return off
 }
 
+// slicesym writes a static slice symbol {&arr, lencap, lencap} to n.
+func slicesym(n, arr, lencap *Node) {
+       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)
+}
+
 func gdata(nam *Node, nr *Node, wid int) {
        if nam.Op != ONAME {
                Fatalf("gdata nam op %v", nam.Op)
index 446bd8ab177a2bd43fdc1c836c2e3adc9d858d27..d0239b359e487d71fd45e88b959001fb7ae5ff84 100644 (file)
@@ -130,12 +130,7 @@ func (s *InitSchedule) staticcopy(l *Node, r *Node) bool {
                a := s.inittemps[r]
 
                n := l.copy()
-               n.Xoffset = l.Xoffset + slicePtrOffset
-               gdata(n, nod(OADDR, a, nil), Widthptr)
-               n.Xoffset = l.Xoffset + sliceLenOffset
-               gdata(n, r.Right, Widthptr)
-               n.Xoffset = l.Xoffset + sliceCapOffset
-               gdata(n, r.Right, Widthptr)
+               slicesym(n, a, r.Right)
                return true
 
        case OARRAYLIT, OSTRUCTLIT:
@@ -227,12 +222,7 @@ func (s *InitSchedule) staticassign(l *Node, r *Node) bool {
                a := staticname(ta)
                s.inittemps[r] = a
                n := l.copy()
-               n.Xoffset = l.Xoffset + slicePtrOffset
-               gdata(n, nod(OADDR, a, nil), Widthptr)
-               n.Xoffset = l.Xoffset + sliceLenOffset
-               gdata(n, r.Right, Widthptr)
-               n.Xoffset = l.Xoffset + sliceCapOffset
-               gdata(n, r.Right, Widthptr)
+               slicesym(n, a, r.Right)
 
                // Fall through to init underlying array.
                l = a
@@ -614,14 +604,7 @@ func slicelit(ctxt initContext, n *Node, var_ *Node, init *Nodes) {
                var v Node
                v.Type = types.Types[TINT]
                setintconst(&v, t.NumElem())
-
-               nam.Xoffset += slicePtrOffset
-               gdata(&nam, nod(OADDR, vstat, nil), Widthptr)
-               nam.Xoffset += sliceLenOffset - slicePtrOffset
-               gdata(&nam, &v, Widthptr)
-               nam.Xoffset += sliceCapOffset - sliceLenOffset
-               gdata(&nam, &v, Widthptr)
-
+               slicesym(&nam, vstat, &v)
                return
        }