annotate gcc/go/gofrontend/names.cc @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 // names.cc -- Names used by gofrontend generated code.
kono
parents:
diff changeset
2
kono
parents:
diff changeset
3 // Copyright 2017 The Go Authors. All rights reserved.
kono
parents:
diff changeset
4 // Use of this source code is governed by a BSD-style
kono
parents:
diff changeset
5 // license that can be found in the LICENSE file.
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 #include "go-system.h"
kono
parents:
diff changeset
8
kono
parents:
diff changeset
9 #include "gogo.h"
kono
parents:
diff changeset
10 #include "go-encode-id.h"
kono
parents:
diff changeset
11 #include "types.h"
kono
parents:
diff changeset
12 #include "expressions.h"
kono
parents:
diff changeset
13
kono
parents:
diff changeset
14 // This file contains functions that generate names that appear in the
kono
parents:
diff changeset
15 // assembly code. This is not used for names that appear only in the
kono
parents:
diff changeset
16 // debug info.
kono
parents:
diff changeset
17
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
18 // Our external names contain only ASCII alphanumeric characters,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
19 // underscore, and dot. (According to the GCC sources, dot is not
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
20 // permitted in assembler symbols on VxWorks and MMIX. We will not
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
21 // support those systems.) Go names can not contain dot, so we rely
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
22 // on using dot to encode Unicode characters, and to separate Go
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
23 // symbols by package, and so forth. We assume that none of the
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
24 // non-Go symbols in the final link will contain a dot, so we don't
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
25 // worry about conflicts.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
26 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
27 // We first describe the basic symbol names, used to represent Go
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
28 // functions and variables. These never start with a dot, never end
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
29 // with a dot, never contain two consecutive dots, and never contain a
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
30 // dot followed by a digit.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
31 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
32 // The external name for a normal Go symbol NAME, a function or
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
33 // variable, is simply "PKGPATH.NAME". Note that NAME is not the
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
34 // packed form used for the "hidden" name internally in the compiler;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
35 // it is the name that appears in the source code. PKGPATH is the
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
36 // -fgo-pkgpath option as adjusted by Gogo::pkgpath_for_symbol. Note
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
37 // that PKGPATH can not contain a dot and neither can NAME. Also,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
38 // NAME may not begin with a digit. NAME may require further encoding
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
39 // for non-ASCII characters as described below, but until that
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
40 // encoding these symbols contain exactly one dot, and they do not
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
41 // start with a dot.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
42 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
43 // The external name for a method NAME for a named type TYPE is
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
44 // "PKGPATH.TYPE.NAME". Unlike the gc compiler, the external name
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
45 // does not indicate whether this is a pointer method or a value
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
46 // method; a named type can not have both a pointer and value method
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
47 // with the same name, so there is no ambiguity. PKGPATH is the
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
48 // package path of the package in which TYPE is defined. Here none of
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
49 // PKGPATH, TYPE, or NAME can be empty or contain a dot, and neither
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
50 // TYPE nor NAME may begin with a digit. Before encoding these names
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
51 // contain exactly two dots, not consecutive, and they do not start
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
52 // with a dot.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
53 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
54 // It's uncommon, but the use of type literals with embedded fields
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
55 // can cause us to have methods on unnamed types. The external names
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
56 // for these are also PKGPATH.TYPE.NAME, where TYPE is an
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
57 // approximately readable version of the type literal, described
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
58 // below. As the type literal encoding always contains multiple dots,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
59 // these names always contain more than two dots. Although the type
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
60 // literal encoding contains dots, neither PKGPATH nor NAME can
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
61 // contain a dot, and neither TYPE nor NAME can begin with a digit.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
62 // The effect is that PKGPATH is always the portion of the name before
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
63 // the first dot and NAME is always the portion after the last dot.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
64 // There is no ambiguity as long as encoded type literals are
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
65 // unambiguous.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
66 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
67 // Also uncommon is an external name that must refer to a named type
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
68 // defined within a function. While such a type can not have methods
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
69 // itself, it can pick up embedded methods, and those methods need
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
70 // names. These are treated as a kind of type literal written as,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
71 // before type literal encoding, FNNAME.TYPENAME(INDEX) or, for a
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
72 // method, TYPE.MNAME.TYPENAME(INDEX). INDEX is the index of that
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
73 // named type within the function, as a single function can have
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
74 // multiple types with the same name. This is unambiguous as
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
75 // parentheses can not appear in a type literal in this form (they can
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
76 // only appear in interface method declarations).
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
77 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
78 // That is the end of the list of basic names. The remaining names
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
79 // exist for special purposes, and are differentiated from the basic
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
80 // names by containing two consecutive dots.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
81 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
82 // The hash function for a type is treated as a method whose name is
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
83 // ".hash". That is, the method name begins with a dot. The effect
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
84 // is that there will be two consecutive dots in the name; the name
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
85 // will always end with "..hash".
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
86 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
87 // Similarly the equality function for a type is treated as a method
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
88 // whose name is ".eq".
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
89 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
90 // The function descriptor for a function is the same as the name of
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
91 // the function with an added suffix "..f".
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
92 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
93 // A thunk for a go or defer statement is treated as a function whose
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
94 // name is ".thunkNN" where NN is a sequence of digits (these
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
95 // functions are never globally visible). Thus the final name of a
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
96 // thunk will be PKGPATH..thunkNN.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
97 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
98 // An init function is treated as a function whose name is ".initNN"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
99 // where NN is a sequence of digits (these functions are never
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
100 // globally visible). Thus the final name of an init function will be
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
101 // PKGPATH..initNN.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
102 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
103 // A nested function is given the name of outermost enclosing function
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
104 // or method with an added suffix "..funcNN" where NN is a sequence of
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
105 // digits. Note that the function descriptor of a nested function, if
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
106 // needed, will end with "..funcNN..f".
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
107 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
108 // A recover thunk is the same as the name of the function with an
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
109 // added suffix "..r".
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
110 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
111 // The name of a type descriptor for a named type is PKGPATH.TYPE..d.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
112 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
113 // The name of a type descriptor for an unnamed type is type..TYPE.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
114 // That is, the string "type.." followed by the type literal encoding.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
115 // These names are common symbols, in the linker's sense of the word
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
116 // common: in the final executable there is only one instance of the
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
117 // type descriptor for a given unnamed type. The type literal
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
118 // encoding can never start with a digit or with 'u' or 'U'.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
119 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
120 // The name of the GC symbol for a named type is PKGPATH.TYPE..g.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
121 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
122 // The name of the GC symbol for an unnamed type is typeg..TYPE.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
123 // These are common symbols.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
124 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
125 // The name of a ptrmask symbol is gcbits..B32 where B32 is an
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
126 // encoding of the ptrmask bits using only ASCII letters without 'u'
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
127 // or 'U'. These are common symbols.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
128 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
129 // An interface method table for assigning the non-interface type TYPE
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
130 // to the interface type ITYPE is named imt..ITYPE..TYPE. If ITYPE or
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
131 // TYPE is a named type, they are written as PKGPATH.TYPE. Otherwise
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
132 // they are written as a type literal. An interface method table for
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
133 // a pointer method set uses pimt instead of imt.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
134 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
135 // The names of composite literal initializers, including the GC root
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
136 // variable, are not referenced. They must not conflict with any C
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
137 // language names, but the names are otherwise unimportant. They are
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
138 // named "go..CNN" where NN is a sequence of digits. The names do not
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
139 // include the PKGPATH.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
140 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
141 // The map zero value, a common symbol that represents the zero value
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
142 // of a map, is named simply "go..zerovalue". The name does not
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
143 // include the PKGPATH.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
144 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
145 // The import function for the main package is referenced by C code,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
146 // and is named __go_init_main. For other packages it is
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
147 // PKGPATH..import. If a package doesn't need an init function, it
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
148 // will have a dummy one, named ~PKGPATH.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
149 //
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
150 // In each pacakge there is a list of all the type descriptors defined
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
151 // in this package. The name of the list is PKGPATH..types.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
152 //
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
153 // In the main package it gathers all the type descriptor lists in a
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
154 // single list, named go..typelists.
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
155 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
156 // The type literal encoding is essentially a single line version of
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
157 // the type literal, such as "struct { pkgpath.i int; J int }". In
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
158 // this representation unexported names use their pkgpath, exported
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
159 // names omit it.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
160 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
161 // The type literal encoding is not quite valid Go, as some aspects of
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
162 // compiler generated types can not be represented. For example,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
163 // incomparable struct types have an extra field "{x}". Struct tags
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
164 // are quoted inside curly braces, rather than introduce an encoding
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
165 // for quotes. Struct tags can contain any character, so any single
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
166 // byte Unicode character that is not alphanumeric or underscore is
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
167 // replaced with .xNN where NN is the hex encoding.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
168 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
169 // There is a simple encoding for glue characters in type literals:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
170 // .0 - ' '
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
171 // .1 - '*'
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
172 // .2 - ';'
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
173 // .3 - ','
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
174 // .4 - '{'
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
175 // .5 - '}'
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
176 // .6 - '['
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
177 // .7 - ']'
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
178 // .8 - '('
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
179 // .9 - ')'
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
180 // This is unambiguous as, although the type literal can contain a dot
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
181 // as shown above, those dots are always followed by a name and names
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
182 // can not begin with a digit. A dot is always followed by a name or
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
183 // a digit, and a type literal can neither start nor end with a dot,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
184 // so this never introduces consecutive dots.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
185 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
186 // Struct tags can contain any character, so they need special
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
187 // treatment. Alphanumerics, underscores, and Unicode characters that
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
188 // require more than a single byte are left alone (Unicode characters
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
189 // will be encoded later, as described below). Other single bytes
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
190 // characters are replace with .xNN where NN is the hex encoding.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
191 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
192 // Since Go identifiers can contain Unicode characters, we must encode
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
193 // them into ASCII. We do this last, after the name is generated as
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
194 // described above and after type literals are encoded. To make the
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
195 // encoding unambiguous, we introduce it with two consecutive dots.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
196 // This is followed by the letter u and four hex digits or the letter
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
197 // U and eight digits, just as in the language only using ..u and ..U
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
198 // instead of \u and \U. The compiler also produces identifiers that
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
199 // are qualified by package path, which means that there may also be ASCII
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
200 // characters that are not assembler-friendly (ex: '=', '/'). The encoding
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
201 // scheme translates such characters into the "..zNN" where NN is the
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
202 // hex value for the character. Since before this encoding names can never
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
203 // contain consecutive dots followed by 'z', 'u' or 'U', and after this
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
204 // encoding "..z", "..u" and "..U" are followed by a known number of
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
205 // characters, this is unambiguous.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
206 //
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
207 // Demangling these names is straightforward:
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
208 // - replace ..zXX with an ASCII character
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
209 // - replace ..uXXXX with a unicode character
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
210 // - replace ..UXXXXXXXX with a unicode character
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
211 // - replace .D, where D is a digit, with the character from the above
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
212 // That will get you as close as possible to a readable name.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
213
111
kono
parents:
diff changeset
214 // Return the assembler name to use for an exported function, a
kono
parents:
diff changeset
215 // method, or a function/method declaration. This is not called if
kono
parents:
diff changeset
216 // the function has been given an explicit name via a magic //extern
kono
parents:
diff changeset
217 // or //go:linkname comment. GO_NAME is the name that appears in the
kono
parents:
diff changeset
218 // Go code. PACKAGE is the package where the function is defined, and
kono
parents:
diff changeset
219 // is NULL for the package being compiled. For a method, RTYPE is
kono
parents:
diff changeset
220 // the method's receiver type; for a function, RTYPE is NULL.
kono
parents:
diff changeset
221
kono
parents:
diff changeset
222 std::string
kono
parents:
diff changeset
223 Gogo::function_asm_name(const std::string& go_name, const Package* package,
kono
parents:
diff changeset
224 const Type* rtype)
kono
parents:
diff changeset
225 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
226 std::string ret;
111
kono
parents:
diff changeset
227 if (rtype != NULL)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
228 ret = rtype->deref()->mangled_name(this);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
229 else if (package == NULL)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
230 ret = this->pkgpath();
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
231 else
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
232 ret = package->pkgpath();
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
233 ret.push_back('.');
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
234 // Check for special names that will break if we use
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
235 // Gogo::unpack_hidden_name.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
236 if (Gogo::is_special_name(go_name))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
237 ret.append(go_name);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
238 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
239 ret.append(Gogo::unpack_hidden_name(go_name));
111
kono
parents:
diff changeset
240 return go_encode_id(ret);
kono
parents:
diff changeset
241 }
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 // Return the name to use for a function descriptor. These symbols
kono
parents:
diff changeset
244 // are globally visible.
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 std::string
kono
parents:
diff changeset
247 Gogo::function_descriptor_name(Named_object* no)
kono
parents:
diff changeset
248 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
249 if (no->is_function() && !no->func_value()->asm_name().empty())
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
250 return no->func_value()->asm_name() + "..f";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
251 else if (no->is_function_declaration()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
252 && !no->func_declaration_value()->asm_name().empty())
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
253 return no->func_declaration_value()->asm_name() + "..f";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
254 std::string ret = this->function_asm_name(no->name(), no->package(), NULL);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
255 ret.append("..f");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
256 return ret;
111
kono
parents:
diff changeset
257 }
kono
parents:
diff changeset
258
kono
parents:
diff changeset
259 // Return the name to use for a generated stub method. MNAME is the
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
260 // method name. PACKAGE is the package where the type that needs this
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
261 // stub method is defined. These functions are globally visible.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
262 // Note that this is the function name that corresponds to the name
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
263 // used for the method in Go source code, if this stub method were
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
264 // written in Go. The assembler name will be generated by
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
265 // Gogo::function_asm_name, and because this is a method that name
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
266 // will include the receiver type.
111
kono
parents:
diff changeset
267
kono
parents:
diff changeset
268 std::string
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
269 Gogo::stub_method_name(const Package* package, const std::string& mname)
111
kono
parents:
diff changeset
270 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
271 if (!Gogo::is_hidden_name(mname))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
272 return mname + "..stub";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
273
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
274 const std::string& ppkgpath(package == NULL
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
275 ? this->pkgpath()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
276 : package->pkgpath());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
277 std::string mpkgpath = Gogo::hidden_name_pkgpath(mname);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
278 if (mpkgpath == ppkgpath)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
279 return Gogo::unpack_hidden_name(mname) + "..stub";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
280
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
281 // We are creating a stub method for an unexported method of an
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
282 // imported embedded type. We need to disambiguate the method name.
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
283 std::string ret = mpkgpath;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
284 ret.push_back('.');
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
285 ret.append(Gogo::unpack_hidden_name(mname));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
286 ret.append("..stub");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
287 return ret;
111
kono
parents:
diff changeset
288 }
kono
parents:
diff changeset
289
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
290 // Return the name of the hash function for TYPE.
111
kono
parents:
diff changeset
291
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
292 std::string
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
293 Gogo::hash_function_name(const Type* type)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
294 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
295 std::string tname = type->mangled_name(this);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
296 return tname + "..hash";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
297 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
298
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
299 // Return the name of the equal function for TYPE. If NAME is not
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
300 // NULL it is the name of the type.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
301
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
302 std::string
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
303 Gogo::equal_function_name(const Type* type, const Named_type* name)
111
kono
parents:
diff changeset
304 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
305 const Type* rtype = type;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
306 if (name != NULL)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
307 rtype = name;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
308 std::string tname = rtype->mangled_name(this);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
309 return tname + "..eq";
111
kono
parents:
diff changeset
310 }
kono
parents:
diff changeset
311
kono
parents:
diff changeset
312 // Return the assembler name to use for a global variable. GO_NAME is
kono
parents:
diff changeset
313 // the name that appears in the Go code. PACKAGE is the package where
kono
parents:
diff changeset
314 // the variable is defined, and is NULL for the package being
kono
parents:
diff changeset
315 // compiled.
kono
parents:
diff changeset
316
kono
parents:
diff changeset
317 std::string
kono
parents:
diff changeset
318 Gogo::global_var_asm_name(const std::string& go_name, const Package* package)
kono
parents:
diff changeset
319 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
320 std::string ret;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
321 if (package == NULL)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
322 ret = this->pkgpath();
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
323 else
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
324 ret = package->pkgpath();
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
325 ret.append(1, '.');
111
kono
parents:
diff changeset
326 ret.append(Gogo::unpack_hidden_name(go_name));
kono
parents:
diff changeset
327 return go_encode_id(ret);
kono
parents:
diff changeset
328 }
kono
parents:
diff changeset
329
kono
parents:
diff changeset
330 // Return an erroneous name that indicates that an error has already
kono
parents:
diff changeset
331 // been reported.
kono
parents:
diff changeset
332
kono
parents:
diff changeset
333 std::string
kono
parents:
diff changeset
334 Gogo::erroneous_name()
kono
parents:
diff changeset
335 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
336 go_assert(saw_errors());
111
kono
parents:
diff changeset
337 static int erroneous_count;
kono
parents:
diff changeset
338 char name[50];
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
339 snprintf(name, sizeof name, ".erroneous%d", erroneous_count);
111
kono
parents:
diff changeset
340 ++erroneous_count;
kono
parents:
diff changeset
341 return name;
kono
parents:
diff changeset
342 }
kono
parents:
diff changeset
343
kono
parents:
diff changeset
344 // Return whether a name is an erroneous name.
kono
parents:
diff changeset
345
kono
parents:
diff changeset
346 bool
kono
parents:
diff changeset
347 Gogo::is_erroneous_name(const std::string& name)
kono
parents:
diff changeset
348 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
349 return name.compare(0, 10, ".erroneous") == 0;
111
kono
parents:
diff changeset
350 }
kono
parents:
diff changeset
351
kono
parents:
diff changeset
352 // Return a name for a thunk object.
kono
parents:
diff changeset
353
kono
parents:
diff changeset
354 std::string
kono
parents:
diff changeset
355 Gogo::thunk_name()
kono
parents:
diff changeset
356 {
kono
parents:
diff changeset
357 static int thunk_count;
kono
parents:
diff changeset
358 char thunk_name[50];
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
359 snprintf(thunk_name, sizeof thunk_name, "..thunk%d", thunk_count);
111
kono
parents:
diff changeset
360 ++thunk_count;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
361 std::string ret = this->pkgpath();
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
362 return ret + thunk_name;
111
kono
parents:
diff changeset
363 }
kono
parents:
diff changeset
364
kono
parents:
diff changeset
365 // Return whether a function is a thunk.
kono
parents:
diff changeset
366
kono
parents:
diff changeset
367 bool
kono
parents:
diff changeset
368 Gogo::is_thunk(const Named_object* no)
kono
parents:
diff changeset
369 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
370 const std::string& name(no->name());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
371 size_t i = name.find("..thunk");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
372 if (i == std::string::npos)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
373 return false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
374 for (i += 7; i < name.size(); ++i)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
375 if (name[i] < '0' || name[i] > '9')
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
376 return false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
377 return true;
111
kono
parents:
diff changeset
378 }
kono
parents:
diff changeset
379
kono
parents:
diff changeset
380 // Return the name to use for an init function. There can be multiple
kono
parents:
diff changeset
381 // functions named "init" so each one needs a different name.
kono
parents:
diff changeset
382
kono
parents:
diff changeset
383 std::string
kono
parents:
diff changeset
384 Gogo::init_function_name()
kono
parents:
diff changeset
385 {
kono
parents:
diff changeset
386 static int init_count;
kono
parents:
diff changeset
387 char buf[30];
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
388 snprintf(buf, sizeof buf, "..init%d", init_count);
111
kono
parents:
diff changeset
389 ++init_count;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
390 std::string ret = this->pkgpath();
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
391 return ret + buf;
111
kono
parents:
diff changeset
392 }
kono
parents:
diff changeset
393
kono
parents:
diff changeset
394 // Return the name to use for a nested function.
kono
parents:
diff changeset
395
kono
parents:
diff changeset
396 std::string
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
397 Gogo::nested_function_name(Named_object* enclosing)
111
kono
parents:
diff changeset
398 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
399 std::string prefix;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
400 unsigned int index;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
401 if (enclosing == NULL)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
402 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
403 // A function literal at top level, as in
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
404 // var f = func() {}
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
405 static unsigned int toplevel_index;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
406 ++toplevel_index;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
407 index = toplevel_index;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
408 prefix = ".go";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
409 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
410 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
411 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
412 while (true)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
413 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
414 Named_object* parent = enclosing->func_value()->enclosing();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
415 if (parent == NULL)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
416 break;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
417 enclosing = parent;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
418 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
419 const Typed_identifier* rcvr =
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
420 enclosing->func_value()->type()->receiver();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
421 if (rcvr != NULL)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
422 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
423 prefix = rcvr->type()->mangled_name(this);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
424 prefix.push_back('.');
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
425 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
426 prefix.append(Gogo::unpack_hidden_name(enclosing->name()));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
427 index = enclosing->func_value()->next_nested_function_index();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
428 }
111
kono
parents:
diff changeset
429 char buf[30];
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
430 snprintf(buf, sizeof buf, "..func%u", index);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
431 return prefix + buf;
111
kono
parents:
diff changeset
432 }
kono
parents:
diff changeset
433
kono
parents:
diff changeset
434 // Return the name to use for a sink function, a function whose name
kono
parents:
diff changeset
435 // is simply underscore. We don't really need these functions but we
kono
parents:
diff changeset
436 // do have to generate them for error checking.
kono
parents:
diff changeset
437
kono
parents:
diff changeset
438 std::string
kono
parents:
diff changeset
439 Gogo::sink_function_name()
kono
parents:
diff changeset
440 {
kono
parents:
diff changeset
441 static int sink_count;
kono
parents:
diff changeset
442 char buf[30];
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
443 snprintf(buf, sizeof buf, ".sink%d", sink_count);
111
kono
parents:
diff changeset
444 ++sink_count;
kono
parents:
diff changeset
445 return buf;
kono
parents:
diff changeset
446 }
kono
parents:
diff changeset
447
kono
parents:
diff changeset
448 // Return the name to use for a redefined function. These functions
kono
parents:
diff changeset
449 // are erroneous but we still generate them for further error
kono
parents:
diff changeset
450 // checking.
kono
parents:
diff changeset
451
kono
parents:
diff changeset
452 std::string
kono
parents:
diff changeset
453 Gogo::redefined_function_name()
kono
parents:
diff changeset
454 {
kono
parents:
diff changeset
455 static int redefinition_count;
kono
parents:
diff changeset
456 char buf[30];
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
457 snprintf(buf, sizeof buf, ".redefined%d", redefinition_count);
111
kono
parents:
diff changeset
458 ++redefinition_count;
kono
parents:
diff changeset
459 return buf;
kono
parents:
diff changeset
460 }
kono
parents:
diff changeset
461
kono
parents:
diff changeset
462 // Return the name to use for a recover thunk for the function NAME.
kono
parents:
diff changeset
463 // If the function is a method, RTYPE is the receiver type.
kono
parents:
diff changeset
464
kono
parents:
diff changeset
465 std::string
kono
parents:
diff changeset
466 Gogo::recover_thunk_name(const std::string& name, const Type* rtype)
kono
parents:
diff changeset
467 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
468 std::string ret;
111
kono
parents:
diff changeset
469 if (rtype != NULL)
kono
parents:
diff changeset
470 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
471 ret = rtype->mangled_name(this);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
472 ret.append(1, '.');
111
kono
parents:
diff changeset
473 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
474 if (Gogo::is_special_name(name))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
475 ret.append(name);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
476 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
477 ret.append(Gogo::unpack_hidden_name(name));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
478 ret.append("..r");
111
kono
parents:
diff changeset
479 return ret;
kono
parents:
diff changeset
480 }
kono
parents:
diff changeset
481
kono
parents:
diff changeset
482 // Return the name to use for a GC root variable. The GC root
kono
parents:
diff changeset
483 // variable is a composite literal that is passed to
kono
parents:
diff changeset
484 // runtime.registerGCRoots. There is at most one of these variables
kono
parents:
diff changeset
485 // per compilation.
kono
parents:
diff changeset
486
kono
parents:
diff changeset
487 std::string
kono
parents:
diff changeset
488 Gogo::gc_root_name()
kono
parents:
diff changeset
489 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
490 return "go..C0";
111
kono
parents:
diff changeset
491 }
kono
parents:
diff changeset
492
kono
parents:
diff changeset
493 // Return the name to use for a composite literal or string
kono
parents:
diff changeset
494 // initializer. This is a local name never referenced outside of this
kono
parents:
diff changeset
495 // file.
kono
parents:
diff changeset
496
kono
parents:
diff changeset
497 std::string
kono
parents:
diff changeset
498 Gogo::initializer_name()
kono
parents:
diff changeset
499 {
kono
parents:
diff changeset
500 static unsigned int counter;
kono
parents:
diff changeset
501 char buf[30];
kono
parents:
diff changeset
502 ++counter;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
503 snprintf(buf, sizeof buf, "go..C%u", counter);
111
kono
parents:
diff changeset
504 return buf;
kono
parents:
diff changeset
505 }
kono
parents:
diff changeset
506
kono
parents:
diff changeset
507 // Return the name of the variable used to represent the zero value of
kono
parents:
diff changeset
508 // a map. This is a globally visible common symbol.
kono
parents:
diff changeset
509
kono
parents:
diff changeset
510 std::string
kono
parents:
diff changeset
511 Gogo::map_zero_value_name()
kono
parents:
diff changeset
512 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
513 return "go..zerovalue";
111
kono
parents:
diff changeset
514 }
kono
parents:
diff changeset
515
kono
parents:
diff changeset
516 // Return the name to use for the import control function.
kono
parents:
diff changeset
517
kono
parents:
diff changeset
518 const std::string&
kono
parents:
diff changeset
519 Gogo::get_init_fn_name()
kono
parents:
diff changeset
520 {
kono
parents:
diff changeset
521 if (this->init_fn_name_.empty())
kono
parents:
diff changeset
522 {
kono
parents:
diff changeset
523 go_assert(this->package_ != NULL);
kono
parents:
diff changeset
524 if (this->is_main_package())
kono
parents:
diff changeset
525 {
kono
parents:
diff changeset
526 // Use a name that the runtime knows.
kono
parents:
diff changeset
527 this->init_fn_name_ = "__go_init_main";
kono
parents:
diff changeset
528 }
kono
parents:
diff changeset
529 else
kono
parents:
diff changeset
530 {
kono
parents:
diff changeset
531 std::string s = this->pkgpath_symbol();
kono
parents:
diff changeset
532 s.append("..import");
kono
parents:
diff changeset
533 this->init_fn_name_ = s;
kono
parents:
diff changeset
534 }
kono
parents:
diff changeset
535 }
kono
parents:
diff changeset
536
kono
parents:
diff changeset
537 return this->init_fn_name_;
kono
parents:
diff changeset
538 }
kono
parents:
diff changeset
539
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
540 // Return the name for a dummy init function, which is not a real
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
541 // function but only for tracking transitive import.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
542
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
543 std::string
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
544 Gogo::dummy_init_fn_name()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
545 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
546 return "~" + this->pkgpath_symbol();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
547 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
548
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
549 // Return the package path symbol from an init function name, which
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
550 // can be a real init function or a dummy one.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
551
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
552 std::string
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
553 Gogo::pkgpath_from_init_fn_name(std::string name)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
554 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
555 go_assert(!name.empty());
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
556 if (name[0] == '~')
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
557 return name.substr(1);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
558 size_t pos = name.find("..import");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
559 if (pos != std::string::npos)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
560 return name.substr(0, pos);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
561 go_unreachable();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
562 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
563
111
kono
parents:
diff changeset
564 // Return a mangled name for a type. These names appear in symbol
kono
parents:
diff changeset
565 // names in the assembler file for things like type descriptors and
kono
parents:
diff changeset
566 // methods.
kono
parents:
diff changeset
567
kono
parents:
diff changeset
568 std::string
kono
parents:
diff changeset
569 Type::mangled_name(Gogo* gogo) const
kono
parents:
diff changeset
570 {
kono
parents:
diff changeset
571 std::string ret;
kono
parents:
diff changeset
572
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
573 // The do_mangled_name virtual function will set RET to the mangled
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
574 // name before glue character mapping.
111
kono
parents:
diff changeset
575 this->do_mangled_name(gogo, &ret);
kono
parents:
diff changeset
576
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
577 // Type descriptor names and interface method table names use a ".."
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
578 // before the mangled name of a type, so to avoid ambiguity the
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
579 // mangled name must not start with 'u' or 'U' or a digit.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
580 go_assert((ret[0] < '0' || ret[0] > '9') && ret[0] != ' ');
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
581 if (ret[0] == 'u' || ret[0] == 'U')
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
582 ret = " " + ret;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
583
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
584 // Map glue characters as described above.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
585
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
586 // The mapping is only unambiguous if there is no .DIGIT in the
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
587 // string, so check that.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
588 for (size_t i = ret.find('.');
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
589 i != std::string::npos;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
590 i = ret.find('.', i + 1))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
591 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
592 if (i + 1 < ret.size())
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
593 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
594 char c = ret[i + 1];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
595 go_assert(c < '0' || c > '9');
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
596 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
597 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
598
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
599 // The order of these characters is the replacement code.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
600 const char * const replace = " *;,{}[]()";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
601
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
602 const size_t rlen = strlen(replace);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
603 char buf[2];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
604 buf[0] = '.';
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
605 for (size_t ri = 0; ri < rlen; ++ri)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
606 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
607 buf[1] = '0' + ri;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
608 while (true)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
609 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
610 size_t i = ret.find(replace[ri]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
611 if (i == std::string::npos)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
612 break;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
613 ret.replace(i, 1, buf, 2);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
614 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
615 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
616
111
kono
parents:
diff changeset
617 return ret;
kono
parents:
diff changeset
618 }
kono
parents:
diff changeset
619
kono
parents:
diff changeset
620 // The mangled name is implemented as a method on each instance of
kono
parents:
diff changeset
621 // Type.
kono
parents:
diff changeset
622
kono
parents:
diff changeset
623 void
kono
parents:
diff changeset
624 Error_type::do_mangled_name(Gogo*, std::string* ret) const
kono
parents:
diff changeset
625 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
626 ret->append("{error}");
111
kono
parents:
diff changeset
627 }
kono
parents:
diff changeset
628
kono
parents:
diff changeset
629 void
kono
parents:
diff changeset
630 Void_type::do_mangled_name(Gogo*, std::string* ret) const
kono
parents:
diff changeset
631 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
632 ret->append("{void}");
111
kono
parents:
diff changeset
633 }
kono
parents:
diff changeset
634
kono
parents:
diff changeset
635 void
kono
parents:
diff changeset
636 Boolean_type::do_mangled_name(Gogo*, std::string* ret) const
kono
parents:
diff changeset
637 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
638 ret->append("bool");
111
kono
parents:
diff changeset
639 }
kono
parents:
diff changeset
640
kono
parents:
diff changeset
641 void
kono
parents:
diff changeset
642 Integer_type::do_mangled_name(Gogo*, std::string* ret) const
kono
parents:
diff changeset
643 {
kono
parents:
diff changeset
644 char buf[100];
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
645 snprintf(buf, sizeof buf, "%s%si%d",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
646 this->is_abstract_ ? "{abstract}" : "",
111
kono
parents:
diff changeset
647 this->is_unsigned_ ? "u" : "",
kono
parents:
diff changeset
648 this->bits_);
kono
parents:
diff changeset
649 ret->append(buf);
kono
parents:
diff changeset
650 }
kono
parents:
diff changeset
651
kono
parents:
diff changeset
652 void
kono
parents:
diff changeset
653 Float_type::do_mangled_name(Gogo*, std::string* ret) const
kono
parents:
diff changeset
654 {
kono
parents:
diff changeset
655 char buf[100];
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
656 snprintf(buf, sizeof buf, "%sfloat%d",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
657 this->is_abstract_ ? "{abstract}" : "",
111
kono
parents:
diff changeset
658 this->bits_);
kono
parents:
diff changeset
659 ret->append(buf);
kono
parents:
diff changeset
660 }
kono
parents:
diff changeset
661
kono
parents:
diff changeset
662 void
kono
parents:
diff changeset
663 Complex_type::do_mangled_name(Gogo*, std::string* ret) const
kono
parents:
diff changeset
664 {
kono
parents:
diff changeset
665 char buf[100];
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
666 snprintf(buf, sizeof buf, "%sc%d",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
667 this->is_abstract_ ? "{abstract}" : "",
111
kono
parents:
diff changeset
668 this->bits_);
kono
parents:
diff changeset
669 ret->append(buf);
kono
parents:
diff changeset
670 }
kono
parents:
diff changeset
671
kono
parents:
diff changeset
672 void
kono
parents:
diff changeset
673 String_type::do_mangled_name(Gogo*, std::string* ret) const
kono
parents:
diff changeset
674 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
675 ret->append("string");
111
kono
parents:
diff changeset
676 }
kono
parents:
diff changeset
677
kono
parents:
diff changeset
678 void
kono
parents:
diff changeset
679 Function_type::do_mangled_name(Gogo* gogo, std::string* ret) const
kono
parents:
diff changeset
680 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
681 ret->append("func");
111
kono
parents:
diff changeset
682
kono
parents:
diff changeset
683 if (this->receiver_ != NULL)
kono
parents:
diff changeset
684 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
685 ret->push_back('(');
111
kono
parents:
diff changeset
686 this->append_mangled_name(this->receiver_->type(), gogo, ret);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
687 ret->append(")");
111
kono
parents:
diff changeset
688 }
kono
parents:
diff changeset
689
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
690 ret->push_back('(');
111
kono
parents:
diff changeset
691 const Typed_identifier_list* params = this->parameters();
kono
parents:
diff changeset
692 if (params != NULL)
kono
parents:
diff changeset
693 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
694 bool first = true;
111
kono
parents:
diff changeset
695 for (Typed_identifier_list::const_iterator p = params->begin();
kono
parents:
diff changeset
696 p != params->end();
kono
parents:
diff changeset
697 ++p)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
698 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
699 if (first)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
700 first = false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
701 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
702 ret->push_back(',');
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
703 if (this->is_varargs_ && p + 1 == params->end())
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
704 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
705 // We can't use "..." here because the mangled name
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
706 // might start with 'u' or 'U', which would be ambiguous
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
707 // with the encoding of Unicode characters.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
708 ret->append(",,,");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
709 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
710 this->append_mangled_name(p->type(), gogo, ret);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
711 }
111
kono
parents:
diff changeset
712 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
713 ret->push_back(')');
111
kono
parents:
diff changeset
714
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
715 ret->push_back('(');
111
kono
parents:
diff changeset
716 const Typed_identifier_list* results = this->results();
kono
parents:
diff changeset
717 if (results != NULL)
kono
parents:
diff changeset
718 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
719 bool first = true;
111
kono
parents:
diff changeset
720 for (Typed_identifier_list::const_iterator p = results->begin();
kono
parents:
diff changeset
721 p != results->end();
kono
parents:
diff changeset
722 ++p)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
723 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
724 if (first)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
725 first = false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
726 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
727 ret->append(",");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
728 this->append_mangled_name(p->type(), gogo, ret);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
729 }
111
kono
parents:
diff changeset
730 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
731 ret->push_back(')');
111
kono
parents:
diff changeset
732 }
kono
parents:
diff changeset
733
kono
parents:
diff changeset
734 void
kono
parents:
diff changeset
735 Pointer_type::do_mangled_name(Gogo* gogo, std::string* ret) const
kono
parents:
diff changeset
736 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
737 ret->push_back('*');
111
kono
parents:
diff changeset
738 this->append_mangled_name(this->to_type_, gogo, ret);
kono
parents:
diff changeset
739 }
kono
parents:
diff changeset
740
kono
parents:
diff changeset
741 void
kono
parents:
diff changeset
742 Nil_type::do_mangled_name(Gogo*, std::string* ret) const
kono
parents:
diff changeset
743 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
744 ret->append("{nil}");
111
kono
parents:
diff changeset
745 }
kono
parents:
diff changeset
746
kono
parents:
diff changeset
747 void
kono
parents:
diff changeset
748 Struct_type::do_mangled_name(Gogo* gogo, std::string* ret) const
kono
parents:
diff changeset
749 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
750 ret->append("struct{");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
751
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
752 if (this->is_struct_incomparable_)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
753 ret->append("{x}");
111
kono
parents:
diff changeset
754
kono
parents:
diff changeset
755 const Struct_field_list* fields = this->fields_;
kono
parents:
diff changeset
756 if (fields != NULL)
kono
parents:
diff changeset
757 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
758 bool first = true;
111
kono
parents:
diff changeset
759 for (Struct_field_list::const_iterator p = fields->begin();
kono
parents:
diff changeset
760 p != fields->end();
kono
parents:
diff changeset
761 ++p)
kono
parents:
diff changeset
762 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
763 if (first)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
764 first = false;
111
kono
parents:
diff changeset
765 else
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
766 ret->push_back(';');
111
kono
parents:
diff changeset
767
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
768 if (!p->is_anonymous())
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
769 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
770 Gogo::append_possibly_hidden_name(ret, p->field_name());
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
771 ret->push_back(' ');
111
kono
parents:
diff changeset
772 }
kono
parents:
diff changeset
773
kono
parents:
diff changeset
774 // For an anonymous field with an alias type, the field name
kono
parents:
diff changeset
775 // is the alias name.
kono
parents:
diff changeset
776 if (p->is_anonymous()
kono
parents:
diff changeset
777 && p->type()->named_type() != NULL
kono
parents:
diff changeset
778 && p->type()->named_type()->is_alias())
kono
parents:
diff changeset
779 p->type()->named_type()->append_mangled_type_name(gogo, true, ret);
kono
parents:
diff changeset
780 else
kono
parents:
diff changeset
781 this->append_mangled_name(p->type(), gogo, ret);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
782
111
kono
parents:
diff changeset
783 if (p->has_tag())
kono
parents:
diff changeset
784 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
785 // Use curly braces around a struct tag, since they are
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
786 // unambiguous here and we have no encoding for
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
787 // quotation marks.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
788 ret->push_back('{');
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
789 ret->append(go_mangle_struct_tag(p->tag()));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
790 ret->push_back('}');
111
kono
parents:
diff changeset
791 }
kono
parents:
diff changeset
792 }
kono
parents:
diff changeset
793 }
kono
parents:
diff changeset
794
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
795 ret->push_back('}');
111
kono
parents:
diff changeset
796 }
kono
parents:
diff changeset
797
kono
parents:
diff changeset
798 void
kono
parents:
diff changeset
799 Array_type::do_mangled_name(Gogo* gogo, std::string* ret) const
kono
parents:
diff changeset
800 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
801 ret->push_back('[');
111
kono
parents:
diff changeset
802 if (this->length_ != NULL)
kono
parents:
diff changeset
803 {
kono
parents:
diff changeset
804 Numeric_constant nc;
kono
parents:
diff changeset
805 if (!this->length_->numeric_constant_value(&nc))
kono
parents:
diff changeset
806 {
kono
parents:
diff changeset
807 go_assert(saw_errors());
kono
parents:
diff changeset
808 return;
kono
parents:
diff changeset
809 }
kono
parents:
diff changeset
810 mpz_t val;
kono
parents:
diff changeset
811 if (!nc.to_int(&val))
kono
parents:
diff changeset
812 {
kono
parents:
diff changeset
813 go_assert(saw_errors());
kono
parents:
diff changeset
814 return;
kono
parents:
diff changeset
815 }
kono
parents:
diff changeset
816 char *s = mpz_get_str(NULL, 10, val);
kono
parents:
diff changeset
817 ret->append(s);
kono
parents:
diff changeset
818 free(s);
kono
parents:
diff changeset
819 mpz_clear(val);
kono
parents:
diff changeset
820 if (this->is_array_incomparable_)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
821 ret->append("x");
111
kono
parents:
diff changeset
822 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
823 ret->push_back(']');
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
824 this->append_mangled_name(this->element_type_, gogo, ret);
111
kono
parents:
diff changeset
825 }
kono
parents:
diff changeset
826
kono
parents:
diff changeset
827 void
kono
parents:
diff changeset
828 Map_type::do_mangled_name(Gogo* gogo, std::string* ret) const
kono
parents:
diff changeset
829 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
830 ret->append("map[");
111
kono
parents:
diff changeset
831 this->append_mangled_name(this->key_type_, gogo, ret);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
832 ret->push_back(']');
111
kono
parents:
diff changeset
833 this->append_mangled_name(this->val_type_, gogo, ret);
kono
parents:
diff changeset
834 }
kono
parents:
diff changeset
835
kono
parents:
diff changeset
836 void
kono
parents:
diff changeset
837 Channel_type::do_mangled_name(Gogo* gogo, std::string* ret) const
kono
parents:
diff changeset
838 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
839 if (!this->may_send_)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
840 ret->append("{}");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
841 ret->append("chan");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
842 if (!this->may_receive_)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
843 ret->append("{}");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
844 ret->push_back(' ');
111
kono
parents:
diff changeset
845 this->append_mangled_name(this->element_type_, gogo, ret);
kono
parents:
diff changeset
846 }
kono
parents:
diff changeset
847
kono
parents:
diff changeset
848 void
kono
parents:
diff changeset
849 Interface_type::do_mangled_name(Gogo* gogo, std::string* ret) const
kono
parents:
diff changeset
850 {
kono
parents:
diff changeset
851 go_assert(this->methods_are_finalized_);
kono
parents:
diff changeset
852
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
853 ret->append("interface{");
111
kono
parents:
diff changeset
854
kono
parents:
diff changeset
855 const Typed_identifier_list* methods = this->all_methods_;
kono
parents:
diff changeset
856 if (methods != NULL && !this->seen_)
kono
parents:
diff changeset
857 {
kono
parents:
diff changeset
858 this->seen_ = true;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
859 bool first = true;
111
kono
parents:
diff changeset
860 for (Typed_identifier_list::const_iterator p = methods->begin();
kono
parents:
diff changeset
861 p != methods->end();
kono
parents:
diff changeset
862 ++p)
kono
parents:
diff changeset
863 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
864 if (first)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
865 first = false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
866 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
867 ret->push_back(';');
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
868
111
kono
parents:
diff changeset
869 if (!p->name().empty())
kono
parents:
diff changeset
870 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
871 Gogo::append_possibly_hidden_name(ret, p->name());
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
872 ret->push_back(' ');
111
kono
parents:
diff changeset
873 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
874
111
kono
parents:
diff changeset
875 this->append_mangled_name(p->type(), gogo, ret);
kono
parents:
diff changeset
876 }
kono
parents:
diff changeset
877 this->seen_ = false;
kono
parents:
diff changeset
878 }
kono
parents:
diff changeset
879
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
880 ret->push_back('}');
111
kono
parents:
diff changeset
881 }
kono
parents:
diff changeset
882
kono
parents:
diff changeset
883 void
kono
parents:
diff changeset
884 Named_type::do_mangled_name(Gogo* gogo, std::string* ret) const
kono
parents:
diff changeset
885 {
kono
parents:
diff changeset
886 this->append_mangled_type_name(gogo, false, ret);
kono
parents:
diff changeset
887 }
kono
parents:
diff changeset
888
kono
parents:
diff changeset
889 void
kono
parents:
diff changeset
890 Forward_declaration_type::do_mangled_name(Gogo* gogo, std::string* ret) const
kono
parents:
diff changeset
891 {
kono
parents:
diff changeset
892 if (this->is_defined())
kono
parents:
diff changeset
893 this->append_mangled_name(this->real_type(), gogo, ret);
kono
parents:
diff changeset
894 else
kono
parents:
diff changeset
895 {
kono
parents:
diff changeset
896 const Named_object* no = this->named_object();
kono
parents:
diff changeset
897 if (no->package() == NULL)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
898 ret->append(gogo->pkgpath());
111
kono
parents:
diff changeset
899 else
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
900 ret->append(no->package()->pkgpath());
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
901 ret->push_back('.');
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
902 ret->append(Gogo::unpack_hidden_name(no->name()));
111
kono
parents:
diff changeset
903 }
kono
parents:
diff changeset
904 }
kono
parents:
diff changeset
905
kono
parents:
diff changeset
906 // Append the mangled name for a named type to RET. For an alias we
kono
parents:
diff changeset
907 // normally use the real name, but if USE_ALIAS is true we use the
kono
parents:
diff changeset
908 // alias name itself.
kono
parents:
diff changeset
909
kono
parents:
diff changeset
910 void
kono
parents:
diff changeset
911 Named_type::append_mangled_type_name(Gogo* gogo, bool use_alias,
kono
parents:
diff changeset
912 std::string* ret) const
kono
parents:
diff changeset
913 {
kono
parents:
diff changeset
914 if (this->is_error_)
kono
parents:
diff changeset
915 return;
kono
parents:
diff changeset
916 if (this->is_alias_ && !use_alias)
kono
parents:
diff changeset
917 {
kono
parents:
diff changeset
918 if (this->seen_alias_)
kono
parents:
diff changeset
919 return;
kono
parents:
diff changeset
920 this->seen_alias_ = true;
kono
parents:
diff changeset
921 this->append_mangled_name(this->type_, gogo, ret);
kono
parents:
diff changeset
922 this->seen_alias_ = false;
kono
parents:
diff changeset
923 return;
kono
parents:
diff changeset
924 }
kono
parents:
diff changeset
925 Named_object* no = this->named_object_;
kono
parents:
diff changeset
926 std::string name;
kono
parents:
diff changeset
927 if (this->is_builtin())
kono
parents:
diff changeset
928 go_assert(this->in_function_ == NULL);
kono
parents:
diff changeset
929 else
kono
parents:
diff changeset
930 {
kono
parents:
diff changeset
931 if (this->in_function_ != NULL)
kono
parents:
diff changeset
932 {
kono
parents:
diff changeset
933 const Typed_identifier* rcvr =
kono
parents:
diff changeset
934 this->in_function_->func_value()->type()->receiver();
kono
parents:
diff changeset
935 if (rcvr != NULL)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
936 ret->append(rcvr->type()->deref()->mangled_name(gogo));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
937 else if (this->in_function_->package() == NULL)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
938 ret->append(gogo->pkgpath());
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
939 else
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
940 ret->append(this->in_function_->package()->pkgpath());
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
941 ret->push_back('.');
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
942 ret->append(Gogo::unpack_hidden_name(this->in_function_->name()));
111
kono
parents:
diff changeset
943 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
944 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
945 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
946 if (no->package() == NULL)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
947 ret->append(gogo->pkgpath());
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
948 else
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
949 ret->append(no->package()->pkgpath());
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
950 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
951 ret->push_back('.');
111
kono
parents:
diff changeset
952 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
953
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
954 ret->append(Gogo::unpack_hidden_name(no->name()));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
955
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
956 if (this->in_function_ != NULL && this->in_function_index_ > 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
957 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
958 char buf[30];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
959 snprintf(buf, sizeof buf, "..i%u", this->in_function_index_);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
960 ret->append(buf);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
961 }
111
kono
parents:
diff changeset
962 }
kono
parents:
diff changeset
963
kono
parents:
diff changeset
964 // Return the name for the type descriptor symbol for TYPE. This can
kono
parents:
diff changeset
965 // be a global, common, or local symbol, depending. NT is not NULL if
kono
parents:
diff changeset
966 // it is the name to use.
kono
parents:
diff changeset
967
kono
parents:
diff changeset
968 std::string
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
969 Gogo::type_descriptor_name(const Type* type, Named_type* nt)
111
kono
parents:
diff changeset
970 {
kono
parents:
diff changeset
971 // The type descriptor symbol for the unsafe.Pointer type is defined
kono
parents:
diff changeset
972 // in libgo/runtime/go-unsafe-pointer.c, so just use a reference to
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
973 // that symbol for all unsafe pointer types.
111
kono
parents:
diff changeset
974 if (type->is_unsafe_pointer_type())
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
975 return "unsafe.Pointer..d";
111
kono
parents:
diff changeset
976
kono
parents:
diff changeset
977 if (nt == NULL)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
978 return "type.." + type->mangled_name(this);
111
kono
parents:
diff changeset
979
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
980 std::string ret;
111
kono
parents:
diff changeset
981 Named_object* no = nt->named_object();
kono
parents:
diff changeset
982 unsigned int index;
kono
parents:
diff changeset
983 const Named_object* in_function = nt->in_function(&index);
kono
parents:
diff changeset
984 if (nt->is_builtin())
kono
parents:
diff changeset
985 go_assert(in_function == NULL);
kono
parents:
diff changeset
986 else
kono
parents:
diff changeset
987 {
kono
parents:
diff changeset
988 if (in_function != NULL)
kono
parents:
diff changeset
989 {
kono
parents:
diff changeset
990 const Typed_identifier* rcvr =
kono
parents:
diff changeset
991 in_function->func_value()->type()->receiver();
kono
parents:
diff changeset
992 if (rcvr != NULL)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
993 ret.append(rcvr->type()->deref()->mangled_name(this));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
994 else if (in_function->package() == NULL)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
995 ret.append(this->pkgpath());
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
996 else
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
997 ret.append(in_function->package()->pkgpath());
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
998 ret.push_back('.');
111
kono
parents:
diff changeset
999 ret.append(Gogo::unpack_hidden_name(in_function->name()));
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1000 ret.push_back('.');
111
kono
parents:
diff changeset
1001 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1002
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1003 if (no->package() == NULL)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1004 ret.append(this->pkgpath());
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1005 else
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1006 ret.append(no->package()->pkgpath());
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1007 ret.push_back('.');
111
kono
parents:
diff changeset
1008 }
kono
parents:
diff changeset
1009
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1010 Gogo::append_possibly_hidden_name(&ret, no->name());
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1011
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1012 if (in_function != NULL && index > 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1013 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1014 char buf[30];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1015 snprintf(buf, sizeof buf, "..i%u", index);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1016 ret.append(buf);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1017 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1018
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1019 ret.append("..d");
111
kono
parents:
diff changeset
1020
kono
parents:
diff changeset
1021 return ret;
kono
parents:
diff changeset
1022 }
kono
parents:
diff changeset
1023
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1024 // Return the name of the type descriptor list symbol of a package.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1025
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1026 std::string
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1027 Gogo::type_descriptor_list_symbol(std::string pkgpath)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1028 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1029 return pkgpath + "..types";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1030 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1031
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1032 // Return the name of the list of all type descriptor lists. This is
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1033 // only used in the main package.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1034
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1035 std::string
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1036 Gogo::typelists_symbol()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1037 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1038 return "go..typelists";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1039 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1040
111
kono
parents:
diff changeset
1041 // Return the name for the GC symbol for a type. This is used to
kono
parents:
diff changeset
1042 // initialize the gcdata field of a type descriptor. This is a local
kono
parents:
diff changeset
1043 // name never referenced outside of this assembly file. (Note that
kono
parents:
diff changeset
1044 // some type descriptors will initialize the gcdata field with a name
kono
parents:
diff changeset
1045 // generated by ptrmask_symbol_name rather than this method.)
kono
parents:
diff changeset
1046
kono
parents:
diff changeset
1047 std::string
kono
parents:
diff changeset
1048 Gogo::gc_symbol_name(Type* type)
kono
parents:
diff changeset
1049 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1050 return this->type_descriptor_name(type, type->named_type()) + "..g";
111
kono
parents:
diff changeset
1051 }
kono
parents:
diff changeset
1052
kono
parents:
diff changeset
1053 // Return the name for a ptrmask variable. PTRMASK_SYM_NAME is a
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1054 // base32 string encoding the ptrmask (as returned by Ptrmask::symname
111
kono
parents:
diff changeset
1055 // in types.cc). This name is used to intialize the gcdata field of a
kono
parents:
diff changeset
1056 // type descriptor. These names are globally visible. (Note that
kono
parents:
diff changeset
1057 // some type descriptors will initialize the gcdata field with a name
kono
parents:
diff changeset
1058 // generated by gc_symbol_name rather than this method.)
kono
parents:
diff changeset
1059
kono
parents:
diff changeset
1060 std::string
kono
parents:
diff changeset
1061 Gogo::ptrmask_symbol_name(const std::string& ptrmask_sym_name)
kono
parents:
diff changeset
1062 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1063 return "gcbits.." + ptrmask_sym_name;
111
kono
parents:
diff changeset
1064 }
kono
parents:
diff changeset
1065
kono
parents:
diff changeset
1066 // Return the name to use for an interface method table used for the
kono
parents:
diff changeset
1067 // ordinary type TYPE converted to the interface type ITYPE.
kono
parents:
diff changeset
1068 // IS_POINTER is true if this is for the method set for a pointer
kono
parents:
diff changeset
1069 // receiver.
kono
parents:
diff changeset
1070
kono
parents:
diff changeset
1071 std::string
kono
parents:
diff changeset
1072 Gogo::interface_method_table_name(Interface_type* itype, Type* type,
kono
parents:
diff changeset
1073 bool is_pointer)
kono
parents:
diff changeset
1074 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1075 return ((is_pointer ? "pimt.." : "imt..")
111
kono
parents:
diff changeset
1076 + itype->mangled_name(this)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1077 + ".."
111
kono
parents:
diff changeset
1078 + type->mangled_name(this));
kono
parents:
diff changeset
1079 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1080
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1081 // Return whether NAME is a special name that can not be passed to
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1082 // unpack_hidden_name. This is needed because various special names
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1083 // use "..SUFFIX", but unpack_hidden_name just looks for '.'.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1084
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1085 bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1086 Gogo::is_special_name(const std::string& name)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1087 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1088 return (name.find("..hash") != std::string::npos
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1089 || name.find("..eq") != std::string::npos
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1090 || name.find("..stub") != std::string::npos
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1091 || name.find("..func") != std::string::npos
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1092 || name.find("..r") != std::string::npos
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1093 || name.find("..init") != std::string::npos
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1094 || name.find("..thunk") != std::string::npos
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1095 || name.find("..import") != std::string::npos);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1096 }