Commit bfe0cbdc authored by Keith Randall's avatar Keith Randall

cmd/compile,runtime: pass elem type to {make,grow}slice

No point in passing the slice type to these functions.
All they need is the element type.  One less indirection,
maybe a few less []T type descriptors in the binary.

Change-Id: Ib0b83b5f14ca21d995ecc199ce8ac00c4eb375e6
Reviewed-on: https://go-review.googlesource.com/22275Reviewed-by: default avatarJosh Bleecher Snyder <josharian@gmail.com>
parent 0150f15a
...@@ -2876,7 +2876,7 @@ func cgen_append(n, res *Node) { ...@@ -2876,7 +2876,7 @@ func cgen_append(n, res *Node) {
arg.Addable = true arg.Addable = true
arg.Xoffset = Ctxt.FixedFrameSize() arg.Xoffset = Ctxt.FixedFrameSize()
arg.Type = Ptrto(Types[TUINT8]) arg.Type = Ptrto(Types[TUINT8])
Cgen(typename(res.Type), &arg) Cgen(typename(res.Type.Elem()), &arg)
arg.Xoffset += int64(Widthptr) arg.Xoffset += int64(Widthptr)
arg.Type = Types[Tptr] arg.Type = Types[Tptr]
......
...@@ -2185,7 +2185,7 @@ func (s *state) append(n *Node, inplace bool) *ssa.Value { ...@@ -2185,7 +2185,7 @@ func (s *state) append(n *Node, inplace bool) *ssa.Value {
// Call growslice // Call growslice
s.startBlock(grow) s.startBlock(grow)
taddr := s.newValue1A(ssa.OpAddr, Types[TUINTPTR], &ssa.ExternSymbol{Types[TUINTPTR], typenamesym(n.Type)}, s.sb) taddr := s.newValue1A(ssa.OpAddr, Types[TUINTPTR], &ssa.ExternSymbol{Types[TUINTPTR], typenamesym(n.Type.Elem())}, s.sb)
r := s.rtcall(growslice, true, []*Type{pt, Types[TINT], Types[TINT]}, taddr, p, l, c, nl) r := s.rtcall(growslice, true, []*Type{pt, Types[TINT], Types[TINT]}, taddr, p, l, c, nl)
......
...@@ -1420,11 +1420,11 @@ opswitch: ...@@ -1420,11 +1420,11 @@ opswitch:
r = walkexpr(r, init) r = walkexpr(r, init)
n = r n = r
} else { } else {
// makeslice(t *Type, nel int64, max int64) (ary []any) // makeslice(et *Type, nel int64, max int64) (ary []any)
fn := syslook("makeslice") fn := syslook("makeslice")
fn = substArgTypes(fn, t.Elem()) // any-1 fn = substArgTypes(fn, t.Elem()) // any-1
n = mkcall1(fn, n.Type, init, typename(n.Type), conv(l, Types[TINT64]), conv(r, Types[TINT64])) n = mkcall1(fn, n.Type, init, typename(t.Elem()), conv(l, Types[TINT64]), conv(r, Types[TINT64]))
} }
case ORUNESTR: case ORUNESTR:
...@@ -2799,7 +2799,7 @@ func appendslice(n *Node, init *Nodes) *Node { ...@@ -2799,7 +2799,7 @@ func appendslice(n *Node, init *Nodes) *Node {
fn = substArgTypes(fn, s.Type.Elem(), s.Type.Elem()) fn = substArgTypes(fn, s.Type.Elem(), s.Type.Elem())
// s = growslice(T, s, n) // s = growslice(T, s, n)
nif.Nbody.Set1(Nod(OAS, s, mkcall1(fn, s.Type, &nif.Ninit, typename(s.Type), s, nn))) nif.Nbody.Set1(Nod(OAS, s, mkcall1(fn, s.Type, &nif.Ninit, typename(s.Type.Elem()), s, nn)))
l = append(l, nif) l = append(l, nif)
// s = s[:n] // s = s[:n]
...@@ -2929,7 +2929,7 @@ func walkappend(n *Node, init *Nodes, dst *Node) *Node { ...@@ -2929,7 +2929,7 @@ func walkappend(n *Node, init *Nodes, dst *Node) *Node {
fn = substArgTypes(fn, ns.Type.Elem(), ns.Type.Elem()) fn = substArgTypes(fn, ns.Type.Elem(), ns.Type.Elem())
nx.Nbody.Set1(Nod(OAS, ns, nx.Nbody.Set1(Nod(OAS, ns,
mkcall1(fn, ns.Type, &nx.Ninit, typename(ns.Type), ns, mkcall1(fn, ns.Type, &nx.Ninit, typename(ns.Type.Elem()), ns,
Nod(OADD, Nod(OLEN, ns, nil), na)))) Nod(OADD, Nod(OLEN, ns, nil), na))))
l = append(l, nx) l = append(l, nx)
......
...@@ -37,14 +37,14 @@ func maxSliceCap(elemsize uintptr) uintptr { ...@@ -37,14 +37,14 @@ func maxSliceCap(elemsize uintptr) uintptr {
} }
// TODO: take uintptrs instead of int64s? // TODO: take uintptrs instead of int64s?
func makeslice(t *slicetype, len64, cap64 int64) slice { func makeslice(et *_type, len64, cap64 int64) slice {
// NOTE: The len > maxElements check here is not strictly necessary, // NOTE: The len > maxElements check here is not strictly necessary,
// but it produces a 'len out of range' error instead of a 'cap out of range' error // but it produces a 'len out of range' error instead of a 'cap out of range' error
// when someone does make([]T, bignumber). 'cap out of range' is true too, // when someone does make([]T, bignumber). 'cap out of range' is true too,
// but since the cap is only being supplied implicitly, saying len is clearer. // but since the cap is only being supplied implicitly, saying len is clearer.
// See issue 4085. // See issue 4085.
maxElements := maxSliceCap(t.elem.size) maxElements := maxSliceCap(et.size)
len := int(len64) len := int(len64)
if len64 < 0 || int64(len) != len64 || uintptr(len) > maxElements { if len64 < 0 || int64(len) != len64 || uintptr(len) > maxElements {
panic(errorString("makeslice: len out of range")) panic(errorString("makeslice: len out of range"))
...@@ -55,7 +55,6 @@ func makeslice(t *slicetype, len64, cap64 int64) slice { ...@@ -55,7 +55,6 @@ func makeslice(t *slicetype, len64, cap64 int64) slice {
panic(errorString("makeslice: cap out of range")) panic(errorString("makeslice: cap out of range"))
} }
et := t.elem
var flags uint32 var flags uint32
if et.kind&kindNoPointers != 0 { if et.kind&kindNoPointers != 0 {
flags = flagNoScan flags = flagNoScan
...@@ -65,7 +64,7 @@ func makeslice(t *slicetype, len64, cap64 int64) slice { ...@@ -65,7 +64,7 @@ func makeslice(t *slicetype, len64, cap64 int64) slice {
} }
// growslice handles slice growth during append. // growslice handles slice growth during append.
// It is passed the slice type, the old slice, and the desired new minimum capacity, // It is passed the slice element type, the old slice, and the desired new minimum capacity,
// and it returns a new slice with at least that capacity, with the old data // and it returns a new slice with at least that capacity, with the old data
// copied into it. // copied into it.
// The new slice's length is set to the old slice's length, // The new slice's length is set to the old slice's length,
...@@ -74,16 +73,15 @@ func makeslice(t *slicetype, len64, cap64 int64) slice { ...@@ -74,16 +73,15 @@ func makeslice(t *slicetype, len64, cap64 int64) slice {
// to calculate where to write new values during an append. // to calculate where to write new values during an append.
// TODO: When the old backend is gone, reconsider this decision. // TODO: When the old backend is gone, reconsider this decision.
// The SSA backend might prefer the new length or to return only ptr/cap and save stack space. // The SSA backend might prefer the new length or to return only ptr/cap and save stack space.
func growslice(t *slicetype, old slice, cap int) slice { func growslice(et *_type, old slice, cap int) slice {
if raceenabled { if raceenabled {
callerpc := getcallerpc(unsafe.Pointer(&t)) callerpc := getcallerpc(unsafe.Pointer(&et))
racereadrangepc(old.array, uintptr(old.len*int(t.elem.size)), callerpc, funcPC(growslice)) racereadrangepc(old.array, uintptr(old.len*int(et.size)), callerpc, funcPC(growslice))
} }
if msanenabled { if msanenabled {
msanread(old.array, uintptr(old.len*int(t.elem.size))) msanread(old.array, uintptr(old.len*int(et.size)))
} }
et := t.elem
if et.size == 0 { if et.size == 0 {
if cap < old.cap { if cap < old.cap {
panic(errorString("growslice: cap out of range")) panic(errorString("growslice: cap out of range"))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment