Skip to content

Commit a460a2b

Browse files
randall77dmitshur
authored andcommitted
[release-branch.go1.15] cmd/compile: make Haspointers a method instead of a function
More ergonomic that way. Also change Haspointers to HasPointers while we are here. Change-Id: I45bedc294c1a8c2bd01dc14bd04615ae77555375 Reviewed-on: https://go-review.googlesource.com/c/go/+/249959 Run-TryBot: Keith Randall <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Emmanuel Odeke <[email protected]> Reviewed-by: Matthew Dempsky <[email protected]> Reviewed-on: https://go-review.googlesource.com/c/go/+/255318 Trust: Keith Randall <[email protected]> Reviewed-by: Austin Clements <[email protected]>
1 parent 0b80775 commit a460a2b

File tree

12 files changed

+45
-46
lines changed

12 files changed

+45
-46
lines changed

src/cmd/compile/internal/gc/esc.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ func (e *Escape) paramTag(fn *Node, narg int, f *types.Field) string {
377377
return unsafeUintptrTag
378378
}
379379

380-
if !types.Haspointers(f.Type) { // don't bother tagging for scalars
380+
if !f.Type.HasPointers() { // don't bother tagging for scalars
381381
return ""
382382
}
383383

@@ -415,7 +415,7 @@ func (e *Escape) paramTag(fn *Node, narg int, f *types.Field) string {
415415
}
416416
}
417417

418-
if !types.Haspointers(f.Type) { // don't bother tagging for scalars
418+
if !f.Type.HasPointers() { // don't bother tagging for scalars
419419
return ""
420420
}
421421

src/cmd/compile/internal/gc/escape.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ func (e *Escape) stmt(n *Node) {
326326
if typesw && n.Left.Left != nil {
327327
cv := cas.Rlist.First()
328328
k := e.dcl(cv) // type switch variables have no ODCL.
329-
if types.Haspointers(cv.Type) {
329+
if cv.Type.HasPointers() {
330330
ks = append(ks, k.dotType(cv.Type, cas, "switch case"))
331331
}
332332
}
@@ -433,7 +433,7 @@ func (e *Escape) exprSkipInit(k EscHole, n *Node) {
433433

434434
if uintptrEscapesHack && n.Op == OCONVNOP && n.Left.Type.IsUnsafePtr() {
435435
// nop
436-
} else if k.derefs >= 0 && !types.Haspointers(n.Type) {
436+
} else if k.derefs >= 0 && !n.Type.HasPointers() {
437437
k = e.discardHole()
438438
}
439439

@@ -698,7 +698,7 @@ func (e *Escape) addr(n *Node) EscHole {
698698
e.assignHeap(n.Right, "key of map put", n)
699699
}
700700

701-
if !types.Haspointers(n.Type) {
701+
if !n.Type.HasPointers() {
702702
k = e.discardHole()
703703
}
704704

@@ -811,14 +811,14 @@ func (e *Escape) call(ks []EscHole, call, where *Node) {
811811
// slice might be allocated, and all slice elements
812812
// might flow to heap.
813813
appendeeK := ks[0]
814-
if types.Haspointers(args[0].Type.Elem()) {
814+
if args[0].Type.Elem().HasPointers() {
815815
appendeeK = e.teeHole(appendeeK, e.heapHole().deref(call, "appendee slice"))
816816
}
817817
argument(appendeeK, args[0])
818818

819819
if call.IsDDD() {
820820
appendedK := e.discardHole()
821-
if args[1].Type.IsSlice() && types.Haspointers(args[1].Type.Elem()) {
821+
if args[1].Type.IsSlice() && args[1].Type.Elem().HasPointers() {
822822
appendedK = e.heapHole().deref(call, "appended slice...")
823823
}
824824
argument(appendedK, args[1])
@@ -832,7 +832,7 @@ func (e *Escape) call(ks []EscHole, call, where *Node) {
832832
argument(e.discardHole(), call.Left)
833833

834834
copiedK := e.discardHole()
835-
if call.Right.Type.IsSlice() && types.Haspointers(call.Right.Type.Elem()) {
835+
if call.Right.Type.IsSlice() && call.Right.Type.Elem().HasPointers() {
836836
copiedK = e.heapHole().deref(call, "copied slice")
837837
}
838838
argument(copiedK, call.Right)

src/cmd/compile/internal/gc/gsubr.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ package gc
3232

3333
import (
3434
"cmd/compile/internal/ssa"
35-
"cmd/compile/internal/types"
3635
"cmd/internal/obj"
3736
"cmd/internal/objabi"
3837
"cmd/internal/src"
@@ -316,7 +315,7 @@ func ggloblnod(nam *Node) {
316315
if nam.Name.Readonly() {
317316
flags = obj.RODATA
318317
}
319-
if nam.Type != nil && !types.Haspointers(nam.Type) {
318+
if nam.Type != nil && !nam.Type.HasPointers() {
320319
flags |= obj.NOPTR
321320
}
322321
Ctxt.Globl(s, nam.Type.Width, flags)

src/cmd/compile/internal/gc/order.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -928,7 +928,7 @@ func (o *Order) stmt(n *Node) {
928928
n2.Ninit.Append(tmp2)
929929
}
930930

931-
r.Left = o.newTemp(r.Right.Left.Type.Elem(), types.Haspointers(r.Right.Left.Type.Elem()))
931+
r.Left = o.newTemp(r.Right.Left.Type.Elem(), r.Right.Left.Type.Elem().HasPointers())
932932
tmp2 := nod(OAS, tmp1, r.Left)
933933
tmp2 = typecheck(tmp2, ctxStmt)
934934
n2.Ninit.Append(tmp2)
@@ -1407,7 +1407,7 @@ func (o *Order) as2(n *Node) {
14071407
left := []*Node{}
14081408
for ni, l := range n.List.Slice() {
14091409
if !l.isBlank() {
1410-
tmp := o.newTemp(l.Type, types.Haspointers(l.Type))
1410+
tmp := o.newTemp(l.Type, l.Type.HasPointers())
14111411
n.List.SetIndex(ni, tmp)
14121412
tmplist = append(tmplist, tmp)
14131413
left = append(left, l)
@@ -1429,7 +1429,7 @@ func (o *Order) okAs2(n *Node) {
14291429
var tmp1, tmp2 *Node
14301430
if !n.List.First().isBlank() {
14311431
typ := n.Right.Type
1432-
tmp1 = o.newTemp(typ, types.Haspointers(typ))
1432+
tmp1 = o.newTemp(typ, typ.HasPointers())
14331433
}
14341434

14351435
if !n.List.Second().isBlank() {

src/cmd/compile/internal/gc/pgen.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ func cmpstackvarlt(a, b *Node) bool {
8080
return a.Name.Used()
8181
}
8282

83-
ap := types.Haspointers(a.Type)
84-
bp := types.Haspointers(b.Type)
83+
ap := a.Type.HasPointers()
84+
bp := b.Type.HasPointers()
8585
if ap != bp {
8686
return ap
8787
}
@@ -176,7 +176,7 @@ func (s *ssafn) AllocFrame(f *ssa.Func) {
176176
}
177177
s.stksize += w
178178
s.stksize = Rnd(s.stksize, int64(n.Type.Align))
179-
if types.Haspointers(n.Type) {
179+
if n.Type.HasPointers() {
180180
s.stkptrsize = s.stksize
181181
lastHasPtr = true
182182
} else {

src/cmd/compile/internal/gc/pgen_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,8 +185,8 @@ func TestStackvarSort(t *testing.T) {
185185
// exercise this function on all inputs so that reflect.DeepEqual
186186
// doesn't produce false positives.
187187
for i := range want {
188-
types.Haspointers(want[i].Type)
189-
types.Haspointers(inp[i].Type)
188+
want[i].Type.HasPointers()
189+
inp[i].Type.HasPointers()
190190
}
191191

192192
sort.Sort(byStackVar(inp))

src/cmd/compile/internal/gc/plive.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ func (v *varRegVec) AndNot(v1, v2 varRegVec) {
259259
// nor do we care about empty structs (handled by the pointer check),
260260
// nor do we care about the fake PAUTOHEAP variables.
261261
func livenessShouldTrack(n *Node) bool {
262-
return n.Op == ONAME && (n.Class() == PAUTO || n.Class() == PPARAM || n.Class() == PPARAMOUT) && types.Haspointers(n.Type)
262+
return n.Op == ONAME && (n.Class() == PAUTO || n.Class() == PPARAM || n.Class() == PPARAMOUT) && n.Type.HasPointers()
263263
}
264264

265265
// getvariables returns the list of on-stack variables that we need to track

src/cmd/compile/internal/gc/range.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ func walkrange(n *Node) *Node {
334334

335335
hv1 := temp(t.Elem())
336336
hv1.SetTypecheck(1)
337-
if types.Haspointers(t.Elem()) {
337+
if t.Elem().HasPointers() {
338338
init = append(init, nod(OAS, hv1, nil))
339339
}
340340
hb := temp(types.Types[TBOOL])

src/cmd/compile/internal/gc/reflect.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ func bmap(t *types.Type) *types.Type {
119119
// the type of the overflow field to uintptr in this case.
120120
// See comment on hmap.overflow in runtime/map.go.
121121
otyp := types.NewPtr(bucket)
122-
if !types.Haspointers(elemtype) && !types.Haspointers(keytype) {
122+
if !elemtype.HasPointers() && !keytype.HasPointers() {
123123
otyp = types.Types[TUINTPTR]
124124
}
125125
overflow := makefield("overflow", otyp)
@@ -754,7 +754,7 @@ var kinds = []int{
754754
// typeptrdata returns the length in bytes of the prefix of t
755755
// containing pointer data. Anything after this offset is scalar data.
756756
func typeptrdata(t *types.Type) int64 {
757-
if !types.Haspointers(t) {
757+
if !t.HasPointers() {
758758
return 0
759759
}
760760

@@ -788,7 +788,7 @@ func typeptrdata(t *types.Type) int64 {
788788
// Find the last field that has pointers.
789789
var lastPtrField *types.Field
790790
for _, t1 := range t.Fields().Slice() {
791-
if types.Haspointers(t1.Type) {
791+
if t1.Type.HasPointers() {
792792
lastPtrField = t1
793793
}
794794
}
@@ -1726,7 +1726,7 @@ func fillptrmask(t *types.Type, ptrmask []byte) {
17261726
for i := range ptrmask {
17271727
ptrmask[i] = 0
17281728
}
1729-
if !types.Haspointers(t) {
1729+
if !t.HasPointers() {
17301730
return
17311731
}
17321732

@@ -1795,7 +1795,7 @@ func (p *GCProg) end() {
17951795

17961796
func (p *GCProg) emit(t *types.Type, offset int64) {
17971797
dowidth(t)
1798-
if !types.Haspointers(t) {
1798+
if !t.HasPointers() {
17991799
return
18001800
}
18011801
if t.Width == int64(Widthptr) {

src/cmd/compile/internal/gc/ssa.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4206,7 +4206,7 @@ func (s *state) openDeferSave(n *Node, t *types.Type, val *ssa.Value) *ssa.Value
42064206
s.vars[&memVar] = s.newValue1Apos(ssa.OpVarLive, types.TypeMem, argTemp, s.mem(), false)
42074207
addrArgTemp = s.newValue2Apos(ssa.OpLocalAddr, types.NewPtr(argTemp.Type), argTemp, s.sp, s.mem(), false)
42084208
}
4209-
if types.Haspointers(t) {
4209+
if t.HasPointers() {
42104210
// Since we may use this argTemp during exit depending on the
42114211
// deferBits, we must define it unconditionally on entry.
42124212
// Therefore, we must make sure it is zeroed out in the entry
@@ -4308,12 +4308,12 @@ func (s *state) openDeferExit() {
43084308
s.vars[&memVar] = s.newValue1Apos(ssa.OpVarLive, types.TypeMem, r.closureNode, s.mem(), false)
43094309
}
43104310
if r.rcvrNode != nil {
4311-
if types.Haspointers(r.rcvrNode.Type) {
4311+
if r.rcvrNode.Type.HasPointers() {
43124312
s.vars[&memVar] = s.newValue1Apos(ssa.OpVarLive, types.TypeMem, r.rcvrNode, s.mem(), false)
43134313
}
43144314
}
43154315
for _, argNode := range r.argNodes {
4316-
if types.Haspointers(argNode.Type) {
4316+
if argNode.Type.HasPointers() {
43174317
s.vars[&memVar] = s.newValue1Apos(ssa.OpVarLive, types.TypeMem, argNode, s.mem(), false)
43184318
}
43194319
}
@@ -4953,7 +4953,7 @@ func (s *state) rtcall(fn *obj.LSym, returns bool, results []*types.Type, args .
49534953
func (s *state) storeType(t *types.Type, left, right *ssa.Value, skip skipMask, leftIsStmt bool) {
49544954
s.instrument(t, left, true)
49554955

4956-
if skip == 0 && (!types.Haspointers(t) || ssa.IsStackAddr(left)) {
4956+
if skip == 0 && (!t.HasPointers() || ssa.IsStackAddr(left)) {
49574957
// Known to not have write barrier. Store the whole type.
49584958
s.vars[&memVar] = s.newValue3Apos(ssa.OpStore, types.TypeMem, t, left, right, s.mem(), leftIsStmt)
49594959
return
@@ -4965,7 +4965,7 @@ func (s *state) storeType(t *types.Type, left, right *ssa.Value, skip skipMask,
49654965
// TODO: if the writebarrier pass knows how to reorder stores,
49664966
// we can do a single store here as long as skip==0.
49674967
s.storeTypeScalars(t, left, right, skip)
4968-
if skip&skipPtr == 0 && types.Haspointers(t) {
4968+
if skip&skipPtr == 0 && t.HasPointers() {
49694969
s.storeTypePtrs(t, left, right)
49704970
}
49714971
}
@@ -5037,7 +5037,7 @@ func (s *state) storeTypePtrs(t *types.Type, left, right *ssa.Value) {
50375037
n := t.NumFields()
50385038
for i := 0; i < n; i++ {
50395039
ft := t.FieldType(i)
5040-
if !types.Haspointers(ft) {
5040+
if !ft.HasPointers() {
50415041
continue
50425042
}
50435043
addr := s.newValue1I(ssa.OpOffPtr, ft.PtrTo(), t.FieldOff(i), left)

src/cmd/compile/internal/gc/walk.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -380,9 +380,9 @@ func convFuncName(from, to *types.Type) (fnname string, needsaddr bool) {
380380
switch {
381381
case from.Size() == 2 && from.Align == 2:
382382
return "convT16", false
383-
case from.Size() == 4 && from.Align == 4 && !types.Haspointers(from):
383+
case from.Size() == 4 && from.Align == 4 && !from.HasPointers():
384384
return "convT32", false
385-
case from.Size() == 8 && from.Align == types.Types[TUINT64].Align && !types.Haspointers(from):
385+
case from.Size() == 8 && from.Align == types.Types[TUINT64].Align && !from.HasPointers():
386386
return "convT64", false
387387
}
388388
if sc := from.SoleComponent(); sc != nil {
@@ -396,12 +396,12 @@ func convFuncName(from, to *types.Type) (fnname string, needsaddr bool) {
396396

397397
switch tkind {
398398
case 'E':
399-
if !types.Haspointers(from) {
399+
if !from.HasPointers() {
400400
return "convT2Enoptr", true
401401
}
402402
return "convT2E", true
403403
case 'I':
404-
if !types.Haspointers(from) {
404+
if !from.HasPointers() {
405405
return "convT2Inoptr", true
406406
}
407407
return "convT2I", true
@@ -1405,7 +1405,7 @@ opswitch:
14051405
copylen := nod(OLEN, n.Right, nil)
14061406
copyptr := nod(OSPTR, n.Right, nil)
14071407

1408-
if !types.Haspointers(t.Elem()) && n.Bounded() {
1408+
if !t.Elem().HasPointers() && n.Bounded() {
14091409
// When len(to)==len(from) and elements have no pointers:
14101410
// replace make+copy with runtime.mallocgc+runtime.memmove.
14111411

@@ -2855,7 +2855,7 @@ func isAppendOfMake(n *Node) bool {
28552855
// s = s[:n]
28562856
// lptr := &l1[0]
28572857
// sptr := &s[0]
2858-
// if lptr == sptr || !hasPointers(T) {
2858+
// if lptr == sptr || !T.HasPointers() {
28592859
// // growslice did not clear the whole underlying array (or did not get called)
28602860
// hp := &s[len(l1)]
28612861
// hn := l2 * sizeof(T)
@@ -2936,7 +2936,7 @@ func extendslice(n *Node, init *Nodes) *Node {
29362936
hn = conv(hn, types.Types[TUINTPTR])
29372937

29382938
clrname := "memclrNoHeapPointers"
2939-
hasPointers := types.Haspointers(elemtype)
2939+
hasPointers := elemtype.HasPointers()
29402940
if hasPointers {
29412941
clrname = "memclrHasPointers"
29422942
Curfn.Func.setWBPos(n.Pos)

src/cmd/compile/internal/types/type.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1400,11 +1400,11 @@ func (t *Type) IsUntyped() bool {
14001400
// TODO(austin): We probably only need HasHeapPointer. See
14011401
// golang.org/cl/73412 for discussion.
14021402

1403-
func Haspointers(t *Type) bool {
1404-
return Haspointers1(t, false)
1403+
func (t *Type) HasPointers() bool {
1404+
return t.hasPointers1(false)
14051405
}
14061406

1407-
func Haspointers1(t *Type, ignoreNotInHeap bool) bool {
1407+
func (t *Type) hasPointers1(ignoreNotInHeap bool) bool {
14081408
switch t.Etype {
14091409
case TINT, TUINT, TINT8, TUINT8, TINT16, TUINT16, TINT32, TUINT32, TINT64,
14101410
TUINT64, TUINTPTR, TFLOAT32, TFLOAT64, TCOMPLEX64, TCOMPLEX128, TBOOL, TSSA:
@@ -1414,11 +1414,11 @@ func Haspointers1(t *Type, ignoreNotInHeap bool) bool {
14141414
if t.NumElem() == 0 { // empty array has no pointers
14151415
return false
14161416
}
1417-
return Haspointers1(t.Elem(), ignoreNotInHeap)
1417+
return t.Elem().hasPointers1(ignoreNotInHeap)
14181418

14191419
case TSTRUCT:
14201420
for _, t1 := range t.Fields().Slice() {
1421-
if Haspointers1(t1.Type, ignoreNotInHeap) {
1421+
if t1.Type.hasPointers1(ignoreNotInHeap) {
14221422
return true
14231423
}
14241424
}
@@ -1429,7 +1429,7 @@ func Haspointers1(t *Type, ignoreNotInHeap bool) bool {
14291429

14301430
case TTUPLE:
14311431
ttup := t.Extra.(*Tuple)
1432-
return Haspointers1(ttup.first, ignoreNotInHeap) || Haspointers1(ttup.second, ignoreNotInHeap)
1432+
return ttup.first.hasPointers1(ignoreNotInHeap) || ttup.second.hasPointers1(ignoreNotInHeap)
14331433
}
14341434

14351435
return true
@@ -1439,7 +1439,7 @@ func Haspointers1(t *Type, ignoreNotInHeap bool) bool {
14391439
// This is used for write barrier insertion, so it ignores
14401440
// pointers to go:notinheap types.
14411441
func (t *Type) HasHeapPointer() bool {
1442-
return Haspointers1(t, true)
1442+
return t.hasPointers1(true)
14431443
}
14441444

14451445
func (t *Type) Symbol() *obj.LSym {
@@ -1470,7 +1470,7 @@ func FakeRecvType() *Type {
14701470
}
14711471

14721472
var (
1473-
// TSSA types. Haspointers assumes these are pointer-free.
1473+
// TSSA types. HasPointers assumes these are pointer-free.
14741474
TypeInvalid = newSSA("invalid")
14751475
TypeMem = newSSA("mem")
14761476
TypeFlags = newSSA("flags")

0 commit comments

Comments
 (0)