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:
if t.Elem() == nil {
break
}
- w = int64(sizeof_Slice)
+ w = sizeofSlice
checkwidth(t.Elem())
t.Align = uint8(Widthptr)
_ = 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
+// }
+//
+// Strings in the runtime are represented by two components:
//
-// 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)
+// 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
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
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.
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
// 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
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)
}
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)