1
2
3
4
5 package types
6
7 import (
8 "cmd/compile/internal/base"
9 "cmd/internal/objabi"
10 "cmd/internal/src"
11 "fmt"
12 "go/constant"
13 "internal/types/errors"
14 "sync"
15 )
16
17
18
19
20 type Object interface {
21 Pos() src.XPos
22 Sym() *Sym
23 Type() *Type
24 }
25
26
27
28
29 type Kind uint8
30
31 const (
32 Txxx Kind = iota
33
34 TINT8
35 TUINT8
36 TINT16
37 TUINT16
38 TINT32
39 TUINT32
40 TINT64
41 TUINT64
42 TINT
43 TUINT
44 TUINTPTR
45
46 TCOMPLEX64
47 TCOMPLEX128
48
49 TFLOAT32
50 TFLOAT64
51
52 TBOOL
53
54 TPTR
55 TFUNC
56 TSLICE
57 TARRAY
58 TSTRUCT
59 TCHAN
60 TMAP
61 TINTER
62 TFORW
63 TANY
64 TSTRING
65 TUNSAFEPTR
66
67
68 TIDEAL
69 TNIL
70 TBLANK
71
72
73 TFUNCARGS
74 TCHANARGS
75
76
77 TSSA
78 TTUPLE
79 TRESULTS
80
81 NTYPE
82 )
83
84
85 type ChanDir uint8
86
87 func (c ChanDir) CanRecv() bool { return c&Crecv != 0 }
88 func (c ChanDir) CanSend() bool { return c&Csend != 0 }
89
90 const (
91
92
93 Crecv ChanDir = 1 << 0
94 Csend ChanDir = 1 << 1
95 Cboth ChanDir = Crecv | Csend
96 )
97
98
99
100
101
102
103
104
105
106 var Types [NTYPE]*Type
107
108 var (
109
110
111
112 AnyType *Type
113 ByteType *Type
114 RuneType *Type
115
116
117 ErrorType *Type
118
119 ComparableType *Type
120
121
122 UntypedString = newType(TSTRING)
123 UntypedBool = newType(TBOOL)
124
125
126 UntypedInt = newType(TIDEAL)
127 UntypedRune = newType(TIDEAL)
128 UntypedFloat = newType(TIDEAL)
129 UntypedComplex = newType(TIDEAL)
130 )
131
132
133
134 var UntypedTypes = [...]*Type{
135 constant.Bool: UntypedBool,
136 constant.String: UntypedString,
137 constant.Int: UntypedInt,
138 constant.Float: UntypedFloat,
139 constant.Complex: UntypedComplex,
140 }
141
142
143 var DefaultKinds = [...]Kind{
144 constant.Bool: TBOOL,
145 constant.String: TSTRING,
146 constant.Int: TINT,
147 constant.Float: TFLOAT64,
148 constant.Complex: TCOMPLEX128,
149 }
150
151
152
153
154
155
156
157
158
159
160 type Type struct {
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177 extra interface{}
178
179
180 width int64
181
182
183 methods fields
184
185 allMethods fields
186
187
188 obj Object
189
190 underlying *Type
191
192
193 cache struct {
194 ptr *Type
195 slice *Type
196 }
197
198 kind Kind
199 align uint8
200
201 intRegs, floatRegs uint8
202
203 flags bitset8
204 alg AlgKind
205
206
207
208
209 ptrBytes int64
210 }
211
212
213
214
215
216
217
218 func (t *Type) Registers() (uint8, uint8) {
219 CalcSize(t)
220 return t.intRegs, t.floatRegs
221 }
222
223 func (*Type) CanBeAnSSAAux() {}
224
225 const (
226 typeNotInHeap = 1 << iota
227 typeNoalg
228 typeDeferwidth
229 typeRecur
230 typeIsShape
231 typeHasShape
232
233
234 typeIsFullyInstantiated
235 )
236
237 func (t *Type) NotInHeap() bool { return t.flags&typeNotInHeap != 0 }
238 func (t *Type) Noalg() bool { return t.flags&typeNoalg != 0 }
239 func (t *Type) Deferwidth() bool { return t.flags&typeDeferwidth != 0 }
240 func (t *Type) Recur() bool { return t.flags&typeRecur != 0 }
241 func (t *Type) IsShape() bool { return t.flags&typeIsShape != 0 }
242 func (t *Type) HasShape() bool { return t.flags&typeHasShape != 0 }
243 func (t *Type) IsFullyInstantiated() bool { return t.flags&typeIsFullyInstantiated != 0 }
244
245 func (t *Type) SetNotInHeap(b bool) { t.flags.set(typeNotInHeap, b) }
246 func (t *Type) SetNoalg(b bool) { t.flags.set(typeNoalg, b) }
247 func (t *Type) SetDeferwidth(b bool) { t.flags.set(typeDeferwidth, b) }
248 func (t *Type) SetRecur(b bool) { t.flags.set(typeRecur, b) }
249 func (t *Type) SetIsFullyInstantiated(b bool) { t.flags.set(typeIsFullyInstantiated, b) }
250
251
252 func (t *Type) SetIsShape(b bool) { t.flags.set(typeIsShape, b) }
253 func (t *Type) SetHasShape(b bool) { t.flags.set(typeHasShape, b) }
254
255
256 func (t *Type) Kind() Kind { return t.kind }
257
258
259 func (t *Type) Sym() *Sym {
260 if t.obj != nil {
261 return t.obj.Sym()
262 }
263 return nil
264 }
265
266
267 func (t *Type) Underlying() *Type { return t.underlying }
268
269
270
271 func (t *Type) Pos() src.XPos {
272 if t.obj != nil {
273 return t.obj.Pos()
274 }
275 return src.NoXPos
276 }
277
278
279 type Map struct {
280 Key *Type
281 Elem *Type
282
283 Group *Type
284 }
285
286
287 func (t *Type) MapType() *Map {
288 t.wantEtype(TMAP)
289 return t.extra.(*Map)
290 }
291
292
293 type Forward struct {
294 Copyto []*Type
295 Embedlineno src.XPos
296 }
297
298
299 func (t *Type) forwardType() *Forward {
300 t.wantEtype(TFORW)
301 return t.extra.(*Forward)
302 }
303
304
305 type Func struct {
306 allParams []*Field
307
308 startParams int
309 startResults int
310
311 resultsTuple *Type
312
313
314
315
316 Argwid int64
317 }
318
319 func (ft *Func) recvs() []*Field { return ft.allParams[:ft.startParams] }
320 func (ft *Func) params() []*Field { return ft.allParams[ft.startParams:ft.startResults] }
321 func (ft *Func) results() []*Field { return ft.allParams[ft.startResults:] }
322 func (ft *Func) recvParams() []*Field { return ft.allParams[:ft.startResults] }
323 func (ft *Func) paramsResults() []*Field { return ft.allParams[ft.startParams:] }
324
325
326 func (t *Type) funcType() *Func {
327 t.wantEtype(TFUNC)
328 return t.extra.(*Func)
329 }
330
331
332 type Struct struct {
333 fields fields
334
335
336
337 Map *Type
338
339 ParamTuple bool
340 }
341
342
343 func (t *Type) StructType() *Struct {
344 t.wantEtype(TSTRUCT)
345 return t.extra.(*Struct)
346 }
347
348
349 type Interface struct {
350 }
351
352
353 type Ptr struct {
354 Elem *Type
355 }
356
357
358 type ChanArgs struct {
359 T *Type
360 }
361
362
363 type FuncArgs struct {
364 T *Type
365 }
366
367
368 type Chan struct {
369 Elem *Type
370 Dir ChanDir
371 }
372
373
374 func (t *Type) chanType() *Chan {
375 t.wantEtype(TCHAN)
376 return t.extra.(*Chan)
377 }
378
379 type Tuple struct {
380 first *Type
381 second *Type
382
383 }
384
385
386 type Results struct {
387 Types []*Type
388 }
389
390
391 type Array struct {
392 Elem *Type
393 Bound int64
394 }
395
396
397 type Slice struct {
398 Elem *Type
399 }
400
401
402
403
404
405
406 type Field struct {
407 flags bitset8
408
409 Embedded uint8
410
411 Pos src.XPos
412
413
414
415 Sym *Sym
416 Type *Type
417 Note string
418
419
420
421
422 Nname Object
423
424
425
426 Offset int64
427 }
428
429 const (
430 fieldIsDDD = 1 << iota
431 fieldNointerface
432 )
433
434 func (f *Field) IsDDD() bool { return f.flags&fieldIsDDD != 0 }
435 func (f *Field) Nointerface() bool { return f.flags&fieldNointerface != 0 }
436
437 func (f *Field) SetIsDDD(b bool) { f.flags.set(fieldIsDDD, b) }
438 func (f *Field) SetNointerface(b bool) { f.flags.set(fieldNointerface, b) }
439
440
441 func (f *Field) End() int64 {
442 return f.Offset + f.Type.width
443 }
444
445
446 func (f *Field) IsMethod() bool {
447 return f.Type.kind == TFUNC && f.Type.Recv() != nil
448 }
449
450
451 func CompareFields(a, b *Field) int {
452 return CompareSyms(a.Sym, b.Sym)
453 }
454
455
456
457
458 type fields struct {
459 s *[]*Field
460 }
461
462
463
464 func (f *fields) Slice() []*Field {
465 if f.s == nil {
466 return nil
467 }
468 return *f.s
469 }
470
471
472
473 func (f *fields) Set(s []*Field) {
474 if len(s) == 0 {
475 f.s = nil
476 } else {
477
478
479 t := s
480 f.s = &t
481 }
482 }
483
484
485 func newType(et Kind) *Type {
486 t := &Type{
487 kind: et,
488 width: BADWIDTH,
489 }
490 t.underlying = t
491
492 switch t.kind {
493 case TMAP:
494 t.extra = new(Map)
495 case TFORW:
496 t.extra = new(Forward)
497 case TFUNC:
498 t.extra = new(Func)
499 case TSTRUCT:
500 t.extra = new(Struct)
501 case TINTER:
502 t.extra = new(Interface)
503 case TPTR:
504 t.extra = Ptr{}
505 case TCHANARGS:
506 t.extra = ChanArgs{}
507 case TFUNCARGS:
508 t.extra = FuncArgs{}
509 case TCHAN:
510 t.extra = new(Chan)
511 case TTUPLE:
512 t.extra = new(Tuple)
513 case TRESULTS:
514 t.extra = new(Results)
515 }
516 return t
517 }
518
519
520 func NewArray(elem *Type, bound int64) *Type {
521 if bound < 0 {
522 base.Fatalf("NewArray: invalid bound %v", bound)
523 }
524 t := newType(TARRAY)
525 t.extra = &Array{Elem: elem, Bound: bound}
526 if elem.HasShape() {
527 t.SetHasShape(true)
528 }
529 if elem.NotInHeap() {
530 t.SetNotInHeap(true)
531 }
532 return t
533 }
534
535
536 func NewSlice(elem *Type) *Type {
537 if t := elem.cache.slice; t != nil {
538 if t.Elem() != elem {
539 base.Fatalf("elem mismatch")
540 }
541 if elem.HasShape() != t.HasShape() {
542 base.Fatalf("Incorrect HasShape flag for cached slice type")
543 }
544 return t
545 }
546
547 t := newType(TSLICE)
548 t.extra = Slice{Elem: elem}
549 elem.cache.slice = t
550 if elem.HasShape() {
551 t.SetHasShape(true)
552 }
553 return t
554 }
555
556
557 func NewChan(elem *Type, dir ChanDir) *Type {
558 t := newType(TCHAN)
559 ct := t.chanType()
560 ct.Elem = elem
561 ct.Dir = dir
562 if elem.HasShape() {
563 t.SetHasShape(true)
564 }
565 return t
566 }
567
568 func NewTuple(t1, t2 *Type) *Type {
569 t := newType(TTUPLE)
570 t.extra.(*Tuple).first = t1
571 t.extra.(*Tuple).second = t2
572 if t1.HasShape() || t2.HasShape() {
573 t.SetHasShape(true)
574 }
575 return t
576 }
577
578 func newResults(types []*Type) *Type {
579 t := newType(TRESULTS)
580 t.extra.(*Results).Types = types
581 return t
582 }
583
584 func NewResults(types []*Type) *Type {
585 if len(types) == 1 && types[0] == TypeMem {
586 return TypeResultMem
587 }
588 return newResults(types)
589 }
590
591 func newSSA(name string) *Type {
592 t := newType(TSSA)
593 t.extra = name
594 return t
595 }
596
597
598 func NewMap(k, v *Type) *Type {
599 t := newType(TMAP)
600 mt := t.MapType()
601 mt.Key = k
602 mt.Elem = v
603 if k.HasShape() || v.HasShape() {
604 t.SetHasShape(true)
605 }
606 return t
607 }
608
609
610
611
612 var NewPtrCacheEnabled = true
613
614
615 func NewPtr(elem *Type) *Type {
616 if elem == nil {
617 base.Fatalf("NewPtr: pointer to elem Type is nil")
618 }
619
620 if t := elem.cache.ptr; t != nil {
621 if t.Elem() != elem {
622 base.Fatalf("NewPtr: elem mismatch")
623 }
624 if elem.HasShape() != t.HasShape() {
625 base.Fatalf("Incorrect HasShape flag for cached pointer type")
626 }
627 return t
628 }
629
630 t := newType(TPTR)
631 t.extra = Ptr{Elem: elem}
632 t.width = int64(PtrSize)
633 t.align = uint8(PtrSize)
634 t.intRegs = 1
635 if NewPtrCacheEnabled {
636 elem.cache.ptr = t
637 }
638 if elem.HasShape() {
639 t.SetHasShape(true)
640 }
641 t.alg = AMEM
642 if elem.Noalg() {
643 t.SetNoalg(true)
644 t.alg = ANOALG
645 }
646
647
648 t.ptrBytes = int64(PtrSize)
649 return t
650 }
651
652
653 func NewChanArgs(c *Type) *Type {
654 t := newType(TCHANARGS)
655 t.extra = ChanArgs{T: c}
656 return t
657 }
658
659
660 func NewFuncArgs(f *Type) *Type {
661 t := newType(TFUNCARGS)
662 t.extra = FuncArgs{T: f}
663 return t
664 }
665
666 func NewField(pos src.XPos, sym *Sym, typ *Type) *Field {
667 f := &Field{
668 Pos: pos,
669 Sym: sym,
670 Type: typ,
671 Offset: BADWIDTH,
672 }
673 if typ == nil {
674 base.Fatalf("typ is nil")
675 }
676 return f
677 }
678
679
680
681 func SubstAny(t *Type, types *[]*Type) *Type {
682 if t == nil {
683 return nil
684 }
685
686 switch t.kind {
687 default:
688
689
690 case TANY:
691 if len(*types) == 0 {
692 base.Fatalf("SubstArgTypes: not enough argument types")
693 }
694 t = (*types)[0]
695 *types = (*types)[1:]
696
697 case TPTR:
698 elem := SubstAny(t.Elem(), types)
699 if elem != t.Elem() {
700 t = t.copy()
701 t.extra = Ptr{Elem: elem}
702 }
703
704 case TARRAY:
705 elem := SubstAny(t.Elem(), types)
706 if elem != t.Elem() {
707 t = t.copy()
708 t.extra.(*Array).Elem = elem
709 }
710
711 case TSLICE:
712 elem := SubstAny(t.Elem(), types)
713 if elem != t.Elem() {
714 t = t.copy()
715 t.extra = Slice{Elem: elem}
716 }
717
718 case TCHAN:
719 elem := SubstAny(t.Elem(), types)
720 if elem != t.Elem() {
721 t = t.copy()
722 t.extra.(*Chan).Elem = elem
723 }
724
725 case TMAP:
726 key := SubstAny(t.Key(), types)
727 elem := SubstAny(t.Elem(), types)
728 if key != t.Key() || elem != t.Elem() {
729 t = t.copy()
730 t.extra.(*Map).Key = key
731 t.extra.(*Map).Elem = elem
732 }
733
734 case TFUNC:
735 ft := t.funcType()
736 allParams := substFields(ft.allParams, types)
737
738 t = t.copy()
739 ft = t.funcType()
740 ft.allParams = allParams
741
742 rt := ft.resultsTuple
743 rt = rt.copy()
744 ft.resultsTuple = rt
745 rt.setFields(t.Results())
746
747 case TSTRUCT:
748
749
750
751 nfs := substFields(t.Fields(), types)
752 t = t.copy()
753 t.setFields(nfs)
754 }
755
756 return t
757 }
758
759 func substFields(fields []*Field, types *[]*Type) []*Field {
760 nfs := make([]*Field, len(fields))
761 for i, f := range fields {
762 nft := SubstAny(f.Type, types)
763 nfs[i] = f.Copy()
764 nfs[i].Type = nft
765 }
766 return nfs
767 }
768
769
770 func (t *Type) copy() *Type {
771 if t == nil {
772 return nil
773 }
774 nt := *t
775
776 switch t.kind {
777 case TMAP:
778 x := *t.extra.(*Map)
779 nt.extra = &x
780 case TFORW:
781 x := *t.extra.(*Forward)
782 nt.extra = &x
783 case TFUNC:
784 x := *t.extra.(*Func)
785 nt.extra = &x
786 case TSTRUCT:
787 x := *t.extra.(*Struct)
788 nt.extra = &x
789 case TINTER:
790 x := *t.extra.(*Interface)
791 nt.extra = &x
792 case TCHAN:
793 x := *t.extra.(*Chan)
794 nt.extra = &x
795 case TARRAY:
796 x := *t.extra.(*Array)
797 nt.extra = &x
798 case TTUPLE, TSSA, TRESULTS:
799 base.Fatalf("ssa types cannot be copied")
800 }
801
802 if t.underlying == t {
803 nt.underlying = &nt
804 }
805 return &nt
806 }
807
808 func (f *Field) Copy() *Field {
809 nf := *f
810 return &nf
811 }
812
813 func (t *Type) wantEtype(et Kind) {
814 if t.kind != et {
815 base.Fatalf("want %v, but have %v", et, t)
816 }
817 }
818
819
820
821 func (t *Type) ResultsTuple() *Type { return t.funcType().resultsTuple }
822
823
824
825 func (t *Type) Recvs() []*Field { return t.funcType().recvs() }
826
827
828 func (t *Type) Params() []*Field { return t.funcType().params() }
829
830
831 func (t *Type) Results() []*Field { return t.funcType().results() }
832
833
834
835
836 func (t *Type) RecvParamsResults() []*Field { return t.funcType().allParams }
837
838
839
840 func (t *Type) RecvParams() []*Field { return t.funcType().recvParams() }
841
842
843
844 func (t *Type) ParamsResults() []*Field { return t.funcType().paramsResults() }
845
846 func (t *Type) NumRecvs() int { return len(t.Recvs()) }
847 func (t *Type) NumParams() int { return len(t.Params()) }
848 func (t *Type) NumResults() int { return len(t.Results()) }
849
850
851 func (t *Type) IsVariadic() bool {
852 n := t.NumParams()
853 return n > 0 && t.Param(n-1).IsDDD()
854 }
855
856
857 func (t *Type) Recv() *Field {
858 if s := t.Recvs(); len(s) == 1 {
859 return s[0]
860 }
861 return nil
862 }
863
864
865 func (t *Type) Param(i int) *Field { return t.Params()[i] }
866
867
868 func (t *Type) Result(i int) *Field { return t.Results()[i] }
869
870
871 func (t *Type) Key() *Type {
872 t.wantEtype(TMAP)
873 return t.extra.(*Map).Key
874 }
875
876
877
878 func (t *Type) Elem() *Type {
879 switch t.kind {
880 case TPTR:
881 return t.extra.(Ptr).Elem
882 case TARRAY:
883 return t.extra.(*Array).Elem
884 case TSLICE:
885 return t.extra.(Slice).Elem
886 case TCHAN:
887 return t.extra.(*Chan).Elem
888 case TMAP:
889 return t.extra.(*Map).Elem
890 }
891 base.Fatalf("Type.Elem %s", t.kind)
892 return nil
893 }
894
895
896 func (t *Type) ChanArgs() *Type {
897 t.wantEtype(TCHANARGS)
898 return t.extra.(ChanArgs).T
899 }
900
901
902 func (t *Type) FuncArgs() *Type {
903 t.wantEtype(TFUNCARGS)
904 return t.extra.(FuncArgs).T
905 }
906
907
908 func (t *Type) IsFuncArgStruct() bool {
909 return t.kind == TSTRUCT && t.extra.(*Struct).ParamTuple
910 }
911
912
913
914
915 func (t *Type) Methods() []*Field {
916 return t.methods.Slice()
917 }
918
919
920
921
922
923 func (t *Type) AllMethods() []*Field {
924 if t.kind == TINTER {
925
926
927 CalcSize(t)
928 }
929 return t.allMethods.Slice()
930 }
931
932
933
934 func (t *Type) SetMethods(fs []*Field) {
935 t.methods.Set(fs)
936 }
937
938
939
940 func (t *Type) SetAllMethods(fs []*Field) {
941 t.allMethods.Set(fs)
942 }
943
944
945 func (t *Type) fields() *fields {
946 t.wantEtype(TSTRUCT)
947 return &t.extra.(*Struct).fields
948 }
949
950
951 func (t *Type) Field(i int) *Field { return t.Fields()[i] }
952
953
954
955 func (t *Type) Fields() []*Field { return t.fields().Slice() }
956
957
958 func (t *Type) setFields(fields []*Field) {
959
960
961
962
963
964
965 if t.widthCalculated() {
966 base.Fatalf("SetFields of %v: width previously calculated", t)
967 }
968 t.wantEtype(TSTRUCT)
969 t.fields().Set(fields)
970 }
971
972
973 func (t *Type) SetInterface(methods []*Field) {
974 t.wantEtype(TINTER)
975 t.methods.Set(methods)
976 }
977
978
979
980 func (t *Type) ArgWidth() int64 {
981 t.wantEtype(TFUNC)
982 return t.extra.(*Func).Argwid
983 }
984
985 func (t *Type) Size() int64 {
986 if t.kind == TSSA {
987 if t == TypeInt128 {
988 return 16
989 }
990 return 0
991 }
992 CalcSize(t)
993 return t.width
994 }
995
996 func (t *Type) Alignment() int64 {
997 CalcSize(t)
998 return int64(t.align)
999 }
1000
1001 func (t *Type) SimpleString() string {
1002 return t.kind.String()
1003 }
1004
1005
1006
1007
1008
1009
1010 type Cmp int8
1011
1012 const (
1013 CMPlt = Cmp(-1)
1014 CMPeq = Cmp(0)
1015 CMPgt = Cmp(1)
1016 )
1017
1018
1019
1020
1021
1022
1023
1024 func (t *Type) Compare(x *Type) Cmp {
1025 if x == t {
1026 return CMPeq
1027 }
1028 return t.cmp(x)
1029 }
1030
1031 func cmpForNe(x bool) Cmp {
1032 if x {
1033 return CMPlt
1034 }
1035 return CMPgt
1036 }
1037
1038 func (r *Sym) cmpsym(s *Sym) Cmp {
1039 if r == s {
1040 return CMPeq
1041 }
1042 if r == nil {
1043 return CMPlt
1044 }
1045 if s == nil {
1046 return CMPgt
1047 }
1048
1049 if len(r.Name) != len(s.Name) {
1050 return cmpForNe(len(r.Name) < len(s.Name))
1051 }
1052 if r.Pkg != s.Pkg {
1053 if len(r.Pkg.Prefix) != len(s.Pkg.Prefix) {
1054 return cmpForNe(len(r.Pkg.Prefix) < len(s.Pkg.Prefix))
1055 }
1056 if r.Pkg.Prefix != s.Pkg.Prefix {
1057 return cmpForNe(r.Pkg.Prefix < s.Pkg.Prefix)
1058 }
1059 }
1060 if r.Name != s.Name {
1061 return cmpForNe(r.Name < s.Name)
1062 }
1063 return CMPeq
1064 }
1065
1066
1067
1068
1069
1070
1071 func (t *Type) cmp(x *Type) Cmp {
1072
1073
1074
1075
1076
1077 if t == x {
1078 return CMPeq
1079 }
1080 if t == nil {
1081 return CMPlt
1082 }
1083 if x == nil {
1084 return CMPgt
1085 }
1086
1087 if t.kind != x.kind {
1088 return cmpForNe(t.kind < x.kind)
1089 }
1090
1091 if t.obj != nil || x.obj != nil {
1092
1093
1094 switch t.kind {
1095 case TUINT8:
1096 if (t == Types[TUINT8] || t == ByteType) && (x == Types[TUINT8] || x == ByteType) {
1097 return CMPeq
1098 }
1099
1100 case TINT32:
1101 if (t == Types[RuneType.kind] || t == RuneType) && (x == Types[RuneType.kind] || x == RuneType) {
1102 return CMPeq
1103 }
1104
1105 case TINTER:
1106
1107 if t == AnyType && x.IsEmptyInterface() || x == AnyType && t.IsEmptyInterface() {
1108 return CMPeq
1109 }
1110 }
1111 }
1112
1113 if c := t.Sym().cmpsym(x.Sym()); c != CMPeq {
1114 return c
1115 }
1116
1117 if x.obj != nil {
1118 return CMPeq
1119 }
1120
1121
1122 switch t.kind {
1123 case TBOOL, TFLOAT32, TFLOAT64, TCOMPLEX64, TCOMPLEX128, TUNSAFEPTR, TUINTPTR,
1124 TINT8, TINT16, TINT32, TINT64, TINT, TUINT8, TUINT16, TUINT32, TUINT64, TUINT:
1125 return CMPeq
1126
1127 case TSSA:
1128 tname := t.extra.(string)
1129 xname := x.extra.(string)
1130
1131 if len(tname) == len(xname) {
1132 if tname == xname {
1133 return CMPeq
1134 }
1135 if tname < xname {
1136 return CMPlt
1137 }
1138 return CMPgt
1139 }
1140 if len(tname) > len(xname) {
1141 return CMPgt
1142 }
1143 return CMPlt
1144
1145 case TTUPLE:
1146 xtup := x.extra.(*Tuple)
1147 ttup := t.extra.(*Tuple)
1148 if c := ttup.first.Compare(xtup.first); c != CMPeq {
1149 return c
1150 }
1151 return ttup.second.Compare(xtup.second)
1152
1153 case TRESULTS:
1154 xResults := x.extra.(*Results)
1155 tResults := t.extra.(*Results)
1156 xl, tl := len(xResults.Types), len(tResults.Types)
1157 if tl != xl {
1158 if tl < xl {
1159 return CMPlt
1160 }
1161 return CMPgt
1162 }
1163 for i := 0; i < tl; i++ {
1164 if c := tResults.Types[i].Compare(xResults.Types[i]); c != CMPeq {
1165 return c
1166 }
1167 }
1168 return CMPeq
1169
1170 case TMAP:
1171 if c := t.Key().cmp(x.Key()); c != CMPeq {
1172 return c
1173 }
1174 return t.Elem().cmp(x.Elem())
1175
1176 case TPTR, TSLICE:
1177
1178
1179
1180 case TSTRUCT:
1181
1182 if t.StructType().Map == nil {
1183 if x.StructType().Map != nil {
1184 return CMPlt
1185 }
1186
1187 } else if x.StructType().Map == nil {
1188 return CMPgt
1189 }
1190
1191
1192
1193
1194
1195
1196 tfs := t.Fields()
1197 xfs := x.Fields()
1198 for i := 0; i < len(tfs) && i < len(xfs); i++ {
1199 t1, x1 := tfs[i], xfs[i]
1200 if t1.Embedded != x1.Embedded {
1201 return cmpForNe(t1.Embedded < x1.Embedded)
1202 }
1203 if t1.Note != x1.Note {
1204 return cmpForNe(t1.Note < x1.Note)
1205 }
1206 if c := t1.Sym.cmpsym(x1.Sym); c != CMPeq {
1207 return c
1208 }
1209 if c := t1.Type.cmp(x1.Type); c != CMPeq {
1210 return c
1211 }
1212 }
1213 if len(tfs) != len(xfs) {
1214 return cmpForNe(len(tfs) < len(xfs))
1215 }
1216 return CMPeq
1217
1218 case TINTER:
1219 tfs := t.AllMethods()
1220 xfs := x.AllMethods()
1221 for i := 0; i < len(tfs) && i < len(xfs); i++ {
1222 t1, x1 := tfs[i], xfs[i]
1223 if c := t1.Sym.cmpsym(x1.Sym); c != CMPeq {
1224 return c
1225 }
1226 if c := t1.Type.cmp(x1.Type); c != CMPeq {
1227 return c
1228 }
1229 }
1230 if len(tfs) != len(xfs) {
1231 return cmpForNe(len(tfs) < len(xfs))
1232 }
1233 return CMPeq
1234
1235 case TFUNC:
1236 if tn, xn := t.NumRecvs(), x.NumRecvs(); tn != xn {
1237 return cmpForNe(tn < xn)
1238 }
1239 if tn, xn := t.NumParams(), x.NumParams(); tn != xn {
1240 return cmpForNe(tn < xn)
1241 }
1242 if tn, xn := t.NumResults(), x.NumResults(); tn != xn {
1243 return cmpForNe(tn < xn)
1244 }
1245 if tv, xv := t.IsVariadic(), x.IsVariadic(); tv != xv {
1246 return cmpForNe(!tv)
1247 }
1248
1249 tfs := t.RecvParamsResults()
1250 xfs := x.RecvParamsResults()
1251 for i, tf := range tfs {
1252 if c := tf.Type.cmp(xfs[i].Type); c != CMPeq {
1253 return c
1254 }
1255 }
1256 return CMPeq
1257
1258 case TARRAY:
1259 if t.NumElem() != x.NumElem() {
1260 return cmpForNe(t.NumElem() < x.NumElem())
1261 }
1262
1263 case TCHAN:
1264 if t.ChanDir() != x.ChanDir() {
1265 return cmpForNe(t.ChanDir() < x.ChanDir())
1266 }
1267
1268 default:
1269 e := fmt.Sprintf("Do not know how to compare %v with %v", t, x)
1270 panic(e)
1271 }
1272
1273
1274 return t.Elem().cmp(x.Elem())
1275 }
1276
1277
1278 func (t *Type) IsKind(et Kind) bool {
1279 return t != nil && t.kind == et
1280 }
1281
1282 func (t *Type) IsBoolean() bool {
1283 return t.kind == TBOOL
1284 }
1285
1286 var unsignedEType = [...]Kind{
1287 TINT8: TUINT8,
1288 TUINT8: TUINT8,
1289 TINT16: TUINT16,
1290 TUINT16: TUINT16,
1291 TINT32: TUINT32,
1292 TUINT32: TUINT32,
1293 TINT64: TUINT64,
1294 TUINT64: TUINT64,
1295 TINT: TUINT,
1296 TUINT: TUINT,
1297 TUINTPTR: TUINTPTR,
1298 }
1299
1300
1301 func (t *Type) ToUnsigned() *Type {
1302 if !t.IsInteger() {
1303 base.Fatalf("unsignedType(%v)", t)
1304 }
1305 return Types[unsignedEType[t.kind]]
1306 }
1307
1308 func (t *Type) IsInteger() bool {
1309 switch t.kind {
1310 case TINT8, TUINT8, TINT16, TUINT16, TINT32, TUINT32, TINT64, TUINT64, TINT, TUINT, TUINTPTR:
1311 return true
1312 }
1313 return t == UntypedInt || t == UntypedRune
1314 }
1315
1316 func (t *Type) IsSigned() bool {
1317 switch t.kind {
1318 case TINT8, TINT16, TINT32, TINT64, TINT:
1319 return true
1320 }
1321 return false
1322 }
1323
1324 func (t *Type) IsUnsigned() bool {
1325 switch t.kind {
1326 case TUINT8, TUINT16, TUINT32, TUINT64, TUINT, TUINTPTR:
1327 return true
1328 }
1329 return false
1330 }
1331
1332 func (t *Type) IsFloat() bool {
1333 return t.kind == TFLOAT32 || t.kind == TFLOAT64 || t == UntypedFloat
1334 }
1335
1336 func (t *Type) IsComplex() bool {
1337 return t.kind == TCOMPLEX64 || t.kind == TCOMPLEX128 || t == UntypedComplex
1338 }
1339
1340
1341
1342 func (t *Type) IsPtr() bool {
1343 return t.kind == TPTR
1344 }
1345
1346
1347 func (t *Type) IsPtrElem() bool {
1348 return t.cache.ptr != nil
1349 }
1350
1351
1352 func (t *Type) IsUnsafePtr() bool {
1353 return t.kind == TUNSAFEPTR
1354 }
1355
1356
1357 func (t *Type) IsUintptr() bool {
1358 return t.kind == TUINTPTR
1359 }
1360
1361
1362
1363
1364
1365
1366 func (t *Type) IsPtrShaped() bool {
1367 return t.kind == TPTR || t.kind == TUNSAFEPTR ||
1368 t.kind == TMAP || t.kind == TCHAN || t.kind == TFUNC
1369 }
1370
1371
1372 func (t *Type) HasNil() bool {
1373 switch t.kind {
1374 case TCHAN, TFUNC, TINTER, TMAP, TNIL, TPTR, TSLICE, TUNSAFEPTR:
1375 return true
1376 }
1377 return false
1378 }
1379
1380 func (t *Type) IsString() bool {
1381 return t.kind == TSTRING
1382 }
1383
1384 func (t *Type) IsMap() bool {
1385 return t.kind == TMAP
1386 }
1387
1388 func (t *Type) IsChan() bool {
1389 return t.kind == TCHAN
1390 }
1391
1392 func (t *Type) IsSlice() bool {
1393 return t.kind == TSLICE
1394 }
1395
1396 func (t *Type) IsArray() bool {
1397 return t.kind == TARRAY
1398 }
1399
1400 func (t *Type) IsStruct() bool {
1401 return t.kind == TSTRUCT
1402 }
1403
1404 func (t *Type) IsInterface() bool {
1405 return t.kind == TINTER
1406 }
1407
1408
1409 func (t *Type) IsEmptyInterface() bool {
1410 return t.IsInterface() && len(t.AllMethods()) == 0
1411 }
1412
1413
1414
1415
1416
1417 func (t *Type) IsScalar() bool {
1418 switch t.kind {
1419 case TBOOL, TINT8, TUINT8, TINT16, TUINT16, TINT32,
1420 TUINT32, TINT64, TUINT64, TINT, TUINT,
1421 TUINTPTR, TCOMPLEX64, TCOMPLEX128, TFLOAT32, TFLOAT64:
1422 return true
1423 }
1424 return false
1425 }
1426
1427 func (t *Type) PtrTo() *Type {
1428 return NewPtr(t)
1429 }
1430
1431 func (t *Type) NumFields() int {
1432 if t.kind == TRESULTS {
1433 return len(t.extra.(*Results).Types)
1434 }
1435 return len(t.Fields())
1436 }
1437 func (t *Type) FieldType(i int) *Type {
1438 if t.kind == TTUPLE {
1439 switch i {
1440 case 0:
1441 return t.extra.(*Tuple).first
1442 case 1:
1443 return t.extra.(*Tuple).second
1444 default:
1445 panic("bad tuple index")
1446 }
1447 }
1448 if t.kind == TRESULTS {
1449 return t.extra.(*Results).Types[i]
1450 }
1451 return t.Field(i).Type
1452 }
1453 func (t *Type) FieldOff(i int) int64 {
1454 return t.Field(i).Offset
1455 }
1456 func (t *Type) FieldName(i int) string {
1457 return t.Field(i).Sym.Name
1458 }
1459
1460
1461
1462 func (t *Type) OffsetOf(name string) int64 {
1463 if t.kind != TSTRUCT {
1464 base.Fatalf("can't call OffsetOf on non-struct %v", t)
1465 }
1466 for _, f := range t.Fields() {
1467 if f.Sym.Name == name {
1468 return f.Offset
1469 }
1470 }
1471 base.Fatalf("couldn't find field %s in %v", name, t)
1472 return -1
1473 }
1474
1475 func (t *Type) NumElem() int64 {
1476 t.wantEtype(TARRAY)
1477 return t.extra.(*Array).Bound
1478 }
1479
1480 type componentsIncludeBlankFields bool
1481
1482 const (
1483 IgnoreBlankFields componentsIncludeBlankFields = false
1484 CountBlankFields componentsIncludeBlankFields = true
1485 )
1486
1487
1488
1489
1490
1491
1492
1493 func (t *Type) NumComponents(countBlank componentsIncludeBlankFields) int64 {
1494 switch t.kind {
1495 case TSTRUCT:
1496 if t.IsFuncArgStruct() {
1497 base.Fatalf("NumComponents func arg struct")
1498 }
1499 var n int64
1500 for _, f := range t.Fields() {
1501 if countBlank == IgnoreBlankFields && f.Sym.IsBlank() {
1502 continue
1503 }
1504 n += f.Type.NumComponents(countBlank)
1505 }
1506 return n
1507 case TARRAY:
1508 return t.NumElem() * t.Elem().NumComponents(countBlank)
1509 }
1510 return 1
1511 }
1512
1513
1514
1515
1516
1517 func (t *Type) SoleComponent() *Type {
1518 switch t.kind {
1519 case TSTRUCT:
1520 if t.IsFuncArgStruct() {
1521 base.Fatalf("SoleComponent func arg struct")
1522 }
1523 if t.NumFields() != 1 {
1524 return nil
1525 }
1526 return t.Field(0).Type.SoleComponent()
1527 case TARRAY:
1528 if t.NumElem() != 1 {
1529 return nil
1530 }
1531 return t.Elem().SoleComponent()
1532 }
1533 return t
1534 }
1535
1536
1537
1538 func (t *Type) ChanDir() ChanDir {
1539 t.wantEtype(TCHAN)
1540 return t.extra.(*Chan).Dir
1541 }
1542
1543 func (t *Type) IsMemory() bool {
1544 if t == TypeMem || t.kind == TTUPLE && t.extra.(*Tuple).second == TypeMem {
1545 return true
1546 }
1547 if t.kind == TRESULTS {
1548 if types := t.extra.(*Results).Types; len(types) > 0 && types[len(types)-1] == TypeMem {
1549 return true
1550 }
1551 }
1552 return false
1553 }
1554 func (t *Type) IsFlags() bool { return t == TypeFlags }
1555 func (t *Type) IsVoid() bool { return t == TypeVoid }
1556 func (t *Type) IsTuple() bool { return t.kind == TTUPLE }
1557 func (t *Type) IsResults() bool { return t.kind == TRESULTS }
1558
1559
1560 func (t *Type) IsUntyped() bool {
1561 if t == nil {
1562 return false
1563 }
1564 if t == UntypedString || t == UntypedBool {
1565 return true
1566 }
1567 switch t.kind {
1568 case TNIL, TIDEAL:
1569 return true
1570 }
1571 return false
1572 }
1573
1574
1575
1576 func (t *Type) HasPointers() bool {
1577 return PtrDataSize(t) > 0
1578 }
1579
1580 var recvType *Type
1581
1582
1583 func FakeRecvType() *Type {
1584 if recvType == nil {
1585 recvType = NewPtr(newType(TSTRUCT))
1586 }
1587 return recvType
1588 }
1589
1590 func FakeRecv() *Field {
1591 return NewField(base.AutogeneratedPos, nil, FakeRecvType())
1592 }
1593
1594 var (
1595
1596 TypeInvalid = newSSA("invalid")
1597 TypeMem = newSSA("mem")
1598 TypeFlags = newSSA("flags")
1599 TypeVoid = newSSA("void")
1600 TypeInt128 = newSSA("int128")
1601 TypeResultMem = newResults([]*Type{TypeMem})
1602 )
1603
1604 func init() {
1605 TypeInt128.width = 16
1606 TypeInt128.align = 8
1607 }
1608
1609
1610
1611
1612
1613
1614 func NewNamed(obj Object) *Type {
1615 t := newType(TFORW)
1616 t.obj = obj
1617 sym := obj.Sym()
1618 if sym.Pkg == ShapePkg {
1619 t.SetIsShape(true)
1620 t.SetHasShape(true)
1621 }
1622 if sym.Pkg.Path == "internal/runtime/sys" && sym.Name == "nih" {
1623
1624
1625
1626
1627 t.SetNotInHeap(true)
1628 }
1629 return t
1630 }
1631
1632
1633 func (t *Type) Obj() Object {
1634 return t.obj
1635 }
1636
1637
1638
1639
1640 func (t *Type) SetUnderlying(underlying *Type) {
1641 if underlying.kind == TFORW {
1642
1643 underlying.forwardType().Copyto = append(underlying.forwardType().Copyto, t)
1644 return
1645 }
1646
1647 ft := t.forwardType()
1648
1649
1650 t.kind = underlying.kind
1651 t.extra = underlying.extra
1652 t.width = underlying.width
1653 t.align = underlying.align
1654 t.alg = underlying.alg
1655 t.ptrBytes = underlying.ptrBytes
1656 t.intRegs = underlying.intRegs
1657 t.floatRegs = underlying.floatRegs
1658 t.underlying = underlying.underlying
1659
1660 if underlying.NotInHeap() {
1661 t.SetNotInHeap(true)
1662 }
1663 if underlying.HasShape() {
1664 t.SetHasShape(true)
1665 }
1666
1667
1668
1669
1670 if t.IsInterface() {
1671 t.methods = underlying.methods
1672 t.allMethods = underlying.allMethods
1673 }
1674
1675
1676 for _, w := range ft.Copyto {
1677 w.SetUnderlying(t)
1678 }
1679
1680
1681 if ft.Embedlineno.IsKnown() {
1682 if t.IsPtr() || t.IsUnsafePtr() {
1683 base.ErrorfAt(ft.Embedlineno, errors.InvalidPtrEmbed, "embedded type cannot be a pointer")
1684 }
1685 }
1686 }
1687
1688 func fieldsHasShape(fields []*Field) bool {
1689 for _, f := range fields {
1690 if f.Type != nil && f.Type.HasShape() {
1691 return true
1692 }
1693 }
1694 return false
1695 }
1696
1697
1698
1699 func NewInterface(methods []*Field) *Type {
1700 t := newType(TINTER)
1701 t.SetInterface(methods)
1702 for _, f := range methods {
1703
1704 if f.Type != nil && f.Type.HasShape() {
1705 t.SetHasShape(true)
1706 break
1707 }
1708 }
1709 return t
1710 }
1711
1712
1713
1714 func NewSignature(recv *Field, params, results []*Field) *Type {
1715 startParams := 0
1716 if recv != nil {
1717 startParams = 1
1718 }
1719 startResults := startParams + len(params)
1720
1721 allParams := make([]*Field, startResults+len(results))
1722 if recv != nil {
1723 allParams[0] = recv
1724 }
1725 copy(allParams[startParams:], params)
1726 copy(allParams[startResults:], results)
1727
1728 t := newType(TFUNC)
1729 ft := t.funcType()
1730
1731 funargs := func(fields []*Field) *Type {
1732 s := NewStruct(fields)
1733 s.StructType().ParamTuple = true
1734 return s
1735 }
1736
1737 ft.allParams = allParams
1738 ft.startParams = startParams
1739 ft.startResults = startResults
1740
1741 ft.resultsTuple = funargs(allParams[startResults:])
1742
1743 if fieldsHasShape(allParams) {
1744 t.SetHasShape(true)
1745 }
1746
1747 return t
1748 }
1749
1750
1751 func NewStruct(fields []*Field) *Type {
1752 t := newType(TSTRUCT)
1753 t.setFields(fields)
1754 if fieldsHasShape(fields) {
1755 t.SetHasShape(true)
1756 }
1757 for _, f := range fields {
1758 if f.Type.NotInHeap() {
1759 t.SetNotInHeap(true)
1760 break
1761 }
1762 }
1763
1764 return t
1765 }
1766
1767 var (
1768 IsInt [NTYPE]bool
1769 IsFloat [NTYPE]bool
1770 IsComplex [NTYPE]bool
1771 IsSimple [NTYPE]bool
1772 )
1773
1774 var IsOrdered [NTYPE]bool
1775
1776
1777
1778 func IsReflexive(t *Type) bool {
1779 switch t.Kind() {
1780 case TBOOL,
1781 TINT,
1782 TUINT,
1783 TINT8,
1784 TUINT8,
1785 TINT16,
1786 TUINT16,
1787 TINT32,
1788 TUINT32,
1789 TINT64,
1790 TUINT64,
1791 TUINTPTR,
1792 TPTR,
1793 TUNSAFEPTR,
1794 TSTRING,
1795 TCHAN:
1796 return true
1797
1798 case TFLOAT32,
1799 TFLOAT64,
1800 TCOMPLEX64,
1801 TCOMPLEX128,
1802 TINTER:
1803 return false
1804
1805 case TARRAY:
1806 return IsReflexive(t.Elem())
1807
1808 case TSTRUCT:
1809 for _, t1 := range t.Fields() {
1810 if !IsReflexive(t1.Type) {
1811 return false
1812 }
1813 }
1814 return true
1815
1816 default:
1817 base.Fatalf("bad type for map key: %v", t)
1818 return false
1819 }
1820 }
1821
1822
1823
1824 func IsDirectIface(t *Type) bool {
1825 return t.Size() == int64(PtrSize) && PtrDataSize(t) == int64(PtrSize)
1826 }
1827
1828
1829
1830
1831 func IsInterfaceMethod(f *Type) bool {
1832 return f.Recv().Type == FakeRecvType()
1833 }
1834
1835
1836
1837
1838
1839 func IsMethodApplicable(t *Type, m *Field) bool {
1840 return t.IsPtr() || !m.Type.Recv().Type.IsPtr() || IsInterfaceMethod(m.Type) || m.Embedded == 2
1841 }
1842
1843
1844
1845 func RuntimeSymName(s *Sym) string {
1846 if s.Pkg.Path == "runtime" {
1847 return s.Name
1848 }
1849 return ""
1850 }
1851
1852
1853
1854 func ReflectSymName(s *Sym) string {
1855 if s.Pkg.Path == "reflect" {
1856 return s.Name
1857 }
1858 return ""
1859 }
1860
1861
1862
1863 func IsNoInstrumentPkg(p *Pkg) bool {
1864 return objabi.LookupPkgSpecial(p.Path).NoInstrument
1865 }
1866
1867
1868
1869 func IsNoRacePkg(p *Pkg) bool {
1870 return objabi.LookupPkgSpecial(p.Path).NoRaceFunc
1871 }
1872
1873
1874 func IsRuntimePkg(p *Pkg) bool {
1875 return objabi.LookupPkgSpecial(p.Path).Runtime
1876 }
1877
1878
1879
1880
1881 func ReceiverBaseType(t *Type) *Type {
1882 if t == nil {
1883 return nil
1884 }
1885
1886
1887 if t.IsPtr() {
1888 if t.Sym() != nil {
1889 return nil
1890 }
1891 t = t.Elem()
1892 if t == nil {
1893 return nil
1894 }
1895 }
1896
1897
1898 if t.Sym() == nil && !t.IsStruct() {
1899 return nil
1900 }
1901
1902
1903 if IsSimple[t.Kind()] {
1904 return t
1905 }
1906 switch t.Kind() {
1907 case TARRAY, TCHAN, TFUNC, TMAP, TSLICE, TSTRING, TSTRUCT:
1908 return t
1909 }
1910 return nil
1911 }
1912
1913 func FloatForComplex(t *Type) *Type {
1914 switch t.Kind() {
1915 case TCOMPLEX64:
1916 return Types[TFLOAT32]
1917 case TCOMPLEX128:
1918 return Types[TFLOAT64]
1919 }
1920 base.Fatalf("unexpected type: %v", t)
1921 return nil
1922 }
1923
1924 func ComplexForFloat(t *Type) *Type {
1925 switch t.Kind() {
1926 case TFLOAT32:
1927 return Types[TCOMPLEX64]
1928 case TFLOAT64:
1929 return Types[TCOMPLEX128]
1930 }
1931 base.Fatalf("unexpected type: %v", t)
1932 return nil
1933 }
1934
1935 func TypeSym(t *Type) *Sym {
1936 return TypeSymLookup(TypeSymName(t))
1937 }
1938
1939 func TypeSymLookup(name string) *Sym {
1940 typepkgmu.Lock()
1941 s := typepkg.Lookup(name)
1942 typepkgmu.Unlock()
1943 return s
1944 }
1945
1946 func TypeSymName(t *Type) string {
1947 name := t.LinkString()
1948
1949 if TypeHasNoAlg(t) {
1950 name = "noalg." + name
1951 }
1952 return name
1953 }
1954
1955
1956
1957 var (
1958 typepkgmu sync.Mutex
1959 typepkg = NewPkg("type", "type")
1960 )
1961
1962 var SimType [NTYPE]Kind
1963
1964
1965 var ShapePkg = NewPkg("go.shape", "go.shape")
1966
View as plain text