...
Source file src/pkg/cmd/compile/internal/types/sym.go
1
2
3
4
5 package types
6
7 import (
8 "cmd/internal/obj"
9 "cmd/internal/src"
10 "unicode"
11 "unicode/utf8"
12 )
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 type Sym struct {
29 Importdef *Pkg
30 Linkname string
31
32 Pkg *Pkg
33 Name string
34
35
36 Def *Node
37 Block int32
38 Lastlineno src.XPos
39
40 flags bitset8
41 Label *Node
42 Origpkg *Pkg
43 }
44
45 const (
46 symOnExportList = 1 << iota
47 symUniq
48 symSiggen
49 symAsm
50 symAlgGen
51 symFunc
52 )
53
54 func (sym *Sym) OnExportList() bool { return sym.flags&symOnExportList != 0 }
55 func (sym *Sym) Uniq() bool { return sym.flags&symUniq != 0 }
56 func (sym *Sym) Siggen() bool { return sym.flags&symSiggen != 0 }
57 func (sym *Sym) Asm() bool { return sym.flags&symAsm != 0 }
58 func (sym *Sym) AlgGen() bool { return sym.flags&symAlgGen != 0 }
59 func (sym *Sym) Func() bool { return sym.flags&symFunc != 0 }
60
61 func (sym *Sym) SetOnExportList(b bool) { sym.flags.set(symOnExportList, b) }
62 func (sym *Sym) SetUniq(b bool) { sym.flags.set(symUniq, b) }
63 func (sym *Sym) SetSiggen(b bool) { sym.flags.set(symSiggen, b) }
64 func (sym *Sym) SetAsm(b bool) { sym.flags.set(symAsm, b) }
65 func (sym *Sym) SetAlgGen(b bool) { sym.flags.set(symAlgGen, b) }
66 func (sym *Sym) SetFunc(b bool) { sym.flags.set(symFunc, b) }
67
68 func (sym *Sym) IsBlank() bool {
69 return sym != nil && sym.Name == "_"
70 }
71
72 func (sym *Sym) LinksymName() string {
73 if sym.IsBlank() {
74 return "_"
75 }
76 if sym.Linkname != "" {
77 return sym.Linkname
78 }
79 return sym.Pkg.Prefix + "." + sym.Name
80 }
81
82 func (sym *Sym) Linksym() *obj.LSym {
83 if sym == nil {
84 return nil
85 }
86 if sym.Func() {
87
88 return Ctxt.LookupABI(sym.LinksymName(), obj.ABIInternal)
89 }
90 return Ctxt.Lookup(sym.LinksymName())
91 }
92
93
94
95
96
97
98
99
100
101
102
103
104 func (a *Sym) Less(b *Sym) bool {
105 if a == b {
106 return false
107 }
108
109
110 ea := IsExported(a.Name)
111 eb := IsExported(b.Name)
112 if ea != eb {
113 return ea
114 }
115
116
117
118 if a.Name != b.Name {
119 return a.Name < b.Name
120 }
121 if !ea {
122 if a.Pkg.Height != b.Pkg.Height {
123 return a.Pkg.Height < b.Pkg.Height
124 }
125 return a.Pkg.Path < b.Pkg.Path
126 }
127 return false
128 }
129
130
131
132 func IsExported(name string) bool {
133 if r := name[0]; r < utf8.RuneSelf {
134 return 'A' <= r && r <= 'Z'
135 }
136 r, _ := utf8.DecodeRuneInString(name)
137 return unicode.IsUpper(r)
138 }
139
View as plain text