From 376472ddb7252a4a859d89fc5ccb6db802e2b3b0 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Wed, 8 Apr 2020 12:36:35 -0700 Subject: [PATCH] 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 TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/align.go | 6 ++-- src/cmd/compile/internal/gc/go.go | 46 ++++++++++++------------- src/cmd/compile/internal/gc/sinit.go | 18 +++++----- src/cmd/compile/internal/gc/ssa.go | 4 +-- src/cmd/compile/internal/gc/universe.go | 10 +++--- 5 files changed, 41 insertions(+), 43 deletions(-) diff --git a/src/cmd/compile/internal/gc/align.go b/src/cmd/compile/internal/gc/align.go index ec66cb4392..ab578ee8c7 100644 --- a/src/cmd/compile/internal/gc/align.go +++ b/src/cmd/compile/internal/gc/align.go @@ -319,10 +319,10 @@ func dowidth(t *types.Type) { Fatalf("dowidth any") case TSTRING: - if sizeof_String == 0 { + if sizeofString == 0 { Fatalf("early dowidth string") } - w = int64(sizeof_String) + w = sizeofString t.Align = uint8(Widthptr) case TARRAY: @@ -344,7 +344,7 @@ func dowidth(t *types.Type) { if t.Elem() == nil { break } - w = int64(sizeof_Slice) + w = sizeofSlice checkwidth(t.Elem()) t.Align = uint8(Widthptr) diff --git a/src/cmd/compile/internal/gc/go.go b/src/cmd/compile/internal/gc/go.go index d2a1b21cbd..a7fdfd5b7a 100644 --- a/src/cmd/compile/internal/gc/go.go +++ b/src/cmd/compile/internal/gc/go.go @@ -64,32 +64,30 @@ const ( _ = uint((1 << 3) - iota) // static assert for iota <= (1 << 3) ) -// note this is the runtime representation -// of the compilers slices. +// Slices in the runtime are represented by three components: // -// typedef struct -// { // must not move anything -// uchar array[8]; // pointer to data -// uchar nel[4]; // number of elements -// 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. +// type slice struct { +// ptr unsafe.Pointer +// len int +// cap int +// } // -// typedef struct -// { // must not move anything -// uchar array[8]; // pointer to data -// uchar nel[4]; // number of elements -// } String; -var sizeof_String int // runtime sizeof(String) +// Strings in the runtime are represented by two components: +// +// type string struct { +// ptr unsafe.Pointer +// len int +// } +// +// 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 diff --git a/src/cmd/compile/internal/gc/sinit.go b/src/cmd/compile/internal/gc/sinit.go index 630b3999d1..446bd8ab17 100644 --- a/src/cmd/compile/internal/gc/sinit.go +++ b/src/cmd/compile/internal/gc/sinit.go @@ -130,11 +130,11 @@ func (s *InitSchedule) staticcopy(l *Node, r *Node) bool { a := s.inittemps[r] n := l.copy() - n.Xoffset = l.Xoffset + int64(slice_array) + n.Xoffset = l.Xoffset + slicePtrOffset gdata(n, nod(OADDR, a, nil), Widthptr) - n.Xoffset = l.Xoffset + int64(slice_nel) + n.Xoffset = l.Xoffset + sliceLenOffset gdata(n, r.Right, Widthptr) - n.Xoffset = l.Xoffset + int64(slice_cap) + n.Xoffset = l.Xoffset + sliceCapOffset gdata(n, r.Right, Widthptr) return true @@ -227,11 +227,11 @@ func (s *InitSchedule) staticassign(l *Node, r *Node) bool { a := staticname(ta) s.inittemps[r] = a n := l.copy() - n.Xoffset = l.Xoffset + int64(slice_array) + n.Xoffset = l.Xoffset + slicePtrOffset gdata(n, nod(OADDR, a, nil), Widthptr) - n.Xoffset = l.Xoffset + int64(slice_nel) + n.Xoffset = l.Xoffset + sliceLenOffset gdata(n, r.Right, Widthptr) - n.Xoffset = l.Xoffset + int64(slice_cap) + n.Xoffset = l.Xoffset + sliceCapOffset gdata(n, r.Right, Widthptr) // 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] setintconst(&v, t.NumElem()) - nam.Xoffset += int64(slice_array) + nam.Xoffset += slicePtrOffset gdata(&nam, nod(OADDR, vstat, nil), Widthptr) - nam.Xoffset += int64(slice_nel) - int64(slice_array) + nam.Xoffset += sliceLenOffset - slicePtrOffset gdata(&nam, &v, Widthptr) - nam.Xoffset += int64(slice_cap) - int64(slice_nel) + nam.Xoffset += sliceCapOffset - sliceLenOffset gdata(&nam, &v, Widthptr) return diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 03d541f807..5f45361980 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -2830,7 +2830,7 @@ func (s *state) append(n *Node, inplace bool) *ssa.Value { // Tell liveness we're about to build a new slice 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(pt, addr, r[0]) // 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 { 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)) - 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) } diff --git a/src/cmd/compile/internal/gc/universe.go b/src/cmd/compile/internal/gc/universe.go index d1072997f1..04861c8dd4 100644 --- a/src/cmd/compile/internal/gc/universe.go +++ b/src/cmd/compile/internal/gc/universe.go @@ -342,13 +342,13 @@ func typeinit() { simtype[TFUNC] = TPTR simtype[TUNSAFEPTR] = TPTR - slice_array = int(Rnd(0, int64(Widthptr))) - slice_nel = int(Rnd(int64(slice_array)+int64(Widthptr), int64(Widthptr))) - slice_cap = int(Rnd(int64(slice_nel)+int64(Widthptr), int64(Widthptr))) - sizeof_Slice = int(Rnd(int64(slice_cap)+int64(Widthptr), int64(Widthptr))) + slicePtrOffset = 0 + sliceLenOffset = Rnd(slicePtrOffset+int64(Widthptr), int64(Widthptr)) + sliceCapOffset = Rnd(sliceLenOffset+int64(Widthptr), int64(Widthptr)) + sizeofSlice = Rnd(sliceCapOffset+int64(Widthptr), int64(Widthptr)) // 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.Idealstring)