1
0
mirror of https://github.com/golang/go synced 2024-11-18 10:54:40 -07:00

cmd/compile: clean up slice and string offsets/sizes

Minor cleanup:

* Modernize comments.
* Change from int to int64 to avoid conversions.
* Use idiomatic names.

Passes toolstash-check.

Change-Id: I93560c81926c0f4e00f33129cb4846b53bea99e6
Reviewed-on: https://go-review.googlesource.com/c/go/+/227548
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 12:36:35 -07:00
parent 7a4247cd46
commit 376472ddb7
5 changed files with 41 additions and 43 deletions

View File

@ -319,10 +319,10 @@ func dowidth(t *types.Type) {
Fatalf("dowidth any") Fatalf("dowidth any")
case TSTRING: case TSTRING:
if sizeof_String == 0 { if sizeofString == 0 {
Fatalf("early dowidth string") Fatalf("early dowidth string")
} }
w = int64(sizeof_String) w = sizeofString
t.Align = uint8(Widthptr) t.Align = uint8(Widthptr)
case TARRAY: case TARRAY:
@ -344,7 +344,7 @@ func dowidth(t *types.Type) {
if t.Elem() == nil { if t.Elem() == nil {
break break
} }
w = int64(sizeof_Slice) w = sizeofSlice
checkwidth(t.Elem()) checkwidth(t.Elem())
t.Align = uint8(Widthptr) t.Align = uint8(Widthptr)

View File

@ -64,32 +64,30 @@ const (
_ = uint((1 << 3) - iota) // static assert for iota <= (1 << 3) _ = uint((1 << 3) - iota) // static assert for iota <= (1 << 3)
) )
// note this is the runtime representation // Slices in the runtime are represented by three components:
// of the compilers slices.
// //
// typedef struct // type slice struct {
// { // must not move anything // ptr unsafe.Pointer
// uchar array[8]; // pointer to data // len int
// uchar nel[4]; // number of elements // cap int
// uchar cap[4]; // allocated number of elements // }
// } Slice;
var slice_array int // runtime offsetof(Slice,array) - same for String
var slice_nel int // runtime offsetof(Slice,nel) - same for String
var slice_cap int // runtime offsetof(Slice,cap)
var sizeof_Slice int // runtime sizeof(Slice)
// note this is the runtime representation
// of the compilers strings.
// //
// typedef struct // Strings in the runtime are represented by two components:
// { // must not move anything //
// uchar array[8]; // pointer to data // type string struct {
// uchar nel[4]; // number of elements // ptr unsafe.Pointer
// } String; // len int
var sizeof_String int // runtime sizeof(String) // }
//
// These variables are the offsets of fields and sizes of these structs.
var (
slicePtrOffset int64
sliceLenOffset int64
sliceCapOffset int64
sizeofSlice int64
sizeofString int64
)
var pragcgobuf [][]string var pragcgobuf [][]string

View File

@ -130,11 +130,11 @@ func (s *InitSchedule) staticcopy(l *Node, r *Node) bool {
a := s.inittemps[r] a := s.inittemps[r]
n := l.copy() n := l.copy()
n.Xoffset = l.Xoffset + int64(slice_array) n.Xoffset = l.Xoffset + slicePtrOffset
gdata(n, nod(OADDR, a, nil), Widthptr) gdata(n, nod(OADDR, a, nil), Widthptr)
n.Xoffset = l.Xoffset + int64(slice_nel) n.Xoffset = l.Xoffset + sliceLenOffset
gdata(n, r.Right, Widthptr) gdata(n, r.Right, Widthptr)
n.Xoffset = l.Xoffset + int64(slice_cap) n.Xoffset = l.Xoffset + sliceCapOffset
gdata(n, r.Right, Widthptr) gdata(n, r.Right, Widthptr)
return true return true
@ -227,11 +227,11 @@ func (s *InitSchedule) staticassign(l *Node, r *Node) bool {
a := staticname(ta) a := staticname(ta)
s.inittemps[r] = a s.inittemps[r] = a
n := l.copy() n := l.copy()
n.Xoffset = l.Xoffset + int64(slice_array) n.Xoffset = l.Xoffset + slicePtrOffset
gdata(n, nod(OADDR, a, nil), Widthptr) gdata(n, nod(OADDR, a, nil), Widthptr)
n.Xoffset = l.Xoffset + int64(slice_nel) n.Xoffset = l.Xoffset + sliceLenOffset
gdata(n, r.Right, Widthptr) gdata(n, r.Right, Widthptr)
n.Xoffset = l.Xoffset + int64(slice_cap) n.Xoffset = l.Xoffset + sliceCapOffset
gdata(n, r.Right, Widthptr) gdata(n, r.Right, Widthptr)
// Fall through to init underlying array. // Fall through to init underlying array.
@ -615,11 +615,11 @@ func slicelit(ctxt initContext, n *Node, var_ *Node, init *Nodes) {
v.Type = types.Types[TINT] v.Type = types.Types[TINT]
setintconst(&v, t.NumElem()) setintconst(&v, t.NumElem())
nam.Xoffset += int64(slice_array) nam.Xoffset += slicePtrOffset
gdata(&nam, nod(OADDR, vstat, nil), Widthptr) gdata(&nam, nod(OADDR, vstat, nil), Widthptr)
nam.Xoffset += int64(slice_nel) - int64(slice_array) nam.Xoffset += sliceLenOffset - slicePtrOffset
gdata(&nam, &v, Widthptr) gdata(&nam, &v, Widthptr)
nam.Xoffset += int64(slice_cap) - int64(slice_nel) nam.Xoffset += sliceCapOffset - sliceLenOffset
gdata(&nam, &v, Widthptr) gdata(&nam, &v, Widthptr)
return return

View File

@ -2830,7 +2830,7 @@ func (s *state) append(n *Node, inplace bool) *ssa.Value {
// Tell liveness we're about to build a new slice // Tell liveness we're about to build a new slice
s.vars[&memVar] = s.newValue1A(ssa.OpVarDef, types.TypeMem, sn, s.mem()) s.vars[&memVar] = s.newValue1A(ssa.OpVarDef, types.TypeMem, sn, s.mem())
} }
capaddr := s.newValue1I(ssa.OpOffPtr, s.f.Config.Types.IntPtr, int64(slice_cap), addr) capaddr := s.newValue1I(ssa.OpOffPtr, s.f.Config.Types.IntPtr, sliceCapOffset, addr)
s.store(types.Types[TINT], capaddr, r[2]) s.store(types.Types[TINT], capaddr, r[2])
s.store(pt, addr, r[0]) s.store(pt, addr, r[0])
// load the value we just stored to avoid having to spill it // load the value we just stored to avoid having to spill it
@ -2851,7 +2851,7 @@ func (s *state) append(n *Node, inplace bool) *ssa.Value {
if inplace { if inplace {
l = s.variable(&lenVar, types.Types[TINT]) // generates phi for len l = s.variable(&lenVar, types.Types[TINT]) // generates phi for len
nl = s.newValue2(s.ssaOp(OADD, types.Types[TINT]), types.Types[TINT], l, s.constInt(types.Types[TINT], nargs)) nl = s.newValue2(s.ssaOp(OADD, types.Types[TINT]), types.Types[TINT], l, s.constInt(types.Types[TINT], nargs))
lenaddr := s.newValue1I(ssa.OpOffPtr, s.f.Config.Types.IntPtr, int64(slice_nel), addr) lenaddr := s.newValue1I(ssa.OpOffPtr, s.f.Config.Types.IntPtr, sliceLenOffset, addr)
s.store(types.Types[TINT], lenaddr, nl) s.store(types.Types[TINT], lenaddr, nl)
} }

View File

@ -342,13 +342,13 @@ func typeinit() {
simtype[TFUNC] = TPTR simtype[TFUNC] = TPTR
simtype[TUNSAFEPTR] = TPTR simtype[TUNSAFEPTR] = TPTR
slice_array = int(Rnd(0, int64(Widthptr))) slicePtrOffset = 0
slice_nel = int(Rnd(int64(slice_array)+int64(Widthptr), int64(Widthptr))) sliceLenOffset = Rnd(slicePtrOffset+int64(Widthptr), int64(Widthptr))
slice_cap = int(Rnd(int64(slice_nel)+int64(Widthptr), int64(Widthptr))) sliceCapOffset = Rnd(sliceLenOffset+int64(Widthptr), int64(Widthptr))
sizeof_Slice = int(Rnd(int64(slice_cap)+int64(Widthptr), int64(Widthptr))) sizeofSlice = Rnd(sliceCapOffset+int64(Widthptr), int64(Widthptr))
// string is same as slice wo the cap // string is same as slice wo the cap
sizeof_String = int(Rnd(int64(slice_nel)+int64(Widthptr), int64(Widthptr))) sizeofString = Rnd(sliceLenOffset+int64(Widthptr), int64(Widthptr))
dowidth(types.Types[TSTRING]) dowidth(types.Types[TSTRING])
dowidth(types.Idealstring) dowidth(types.Idealstring)