@@ -88,15 +88,14 @@ void LinkEntity::mangle(raw_ostream &buffer) const {
88
88
switch (getKind ()) {
89
89
// global ::= 'w' value-witness-kind type // value witness
90
90
case Kind::ValueWitness:
91
- buffer << " _Tw" ;
92
- buffer << mangleValueWitness (getValueWitness ());
93
-
91
+ mangler.manglePrefix (" _Tw" );
92
+ mangler.manglePrefix (mangleValueWitness (getValueWitness ()));
94
93
mangler.mangleType (getType (), ResilienceExpansion::Minimal, 0 );
95
94
return ;
96
95
97
96
// global ::= 'WV' type // value witness
98
97
case Kind::ValueWitnessTable:
99
- buffer << " _TWV" ;
98
+ mangler. manglePrefix ( " _TWV" ) ;
100
99
mangler.mangleType (getType (), ResilienceExpansion::Minimal, 0 );
101
100
return ;
102
101
@@ -108,13 +107,13 @@ void LinkEntity::mangle(raw_ostream &buffer) const {
108
107
109
108
// global ::= 'Ma' type // type metadata access function
110
109
case Kind::TypeMetadataAccessFunction:
111
- buffer << " _TMa" ;
110
+ mangler. manglePrefix ( " _TMa" ) ;
112
111
mangler.mangleType (getType (), ResilienceExpansion::Minimal, 0 );
113
112
return ;
114
113
115
114
// global ::= 'ML' type // type metadata lazy cache variable
116
115
case Kind::TypeMetadataLazyCacheVariable:
117
- buffer << " _TML" ;
116
+ mangler. manglePrefix ( " _TML" ) ;
118
117
mangler.mangleType (getType (), ResilienceExpansion::Minimal, 0 );
119
118
return ;
120
119
@@ -139,29 +138,29 @@ void LinkEntity::mangle(raw_ostream &buffer) const {
139
138
140
139
// global ::= 'Mm' type // class metaclass
141
140
case Kind::SwiftMetaclassStub:
142
- buffer << " _TMm" ;
141
+ mangler. manglePrefix ( " _TMm" ) ;
143
142
mangler.mangleNominalType (cast<ClassDecl>(getDecl ()),
144
143
ResilienceExpansion::Minimal,
145
144
Mangler::BindGenerics::None);
146
145
return ;
147
146
148
147
// global ::= 'Mn' type // nominal type descriptor
149
148
case Kind::NominalTypeDescriptor:
150
- buffer << " _TMn" ;
149
+ mangler. manglePrefix ( " _TMn" ) ;
151
150
mangler.mangleNominalType (cast<NominalTypeDecl>(getDecl ()),
152
151
ResilienceExpansion::Minimal,
153
152
Mangler::BindGenerics::None);
154
153
return ;
155
154
156
155
// global ::= 'Mp' type // protocol descriptor
157
156
case Kind::ProtocolDescriptor:
158
- buffer << " _TMp" ;
157
+ mangler. manglePrefix ( " _TMp" ) ;
159
158
mangler.mangleProtocolName (cast<ProtocolDecl>(getDecl ()));
160
159
return ;
161
160
162
161
// global ::= 'Wo' entity
163
162
case Kind::WitnessTableOffset:
164
- buffer << " _TWo" ;
163
+ mangler. manglePrefix ( " _TWo" ) ;
165
164
166
165
// Witness table entries for constructors always refer to the allocating
167
166
// constructor.
@@ -180,39 +179,39 @@ void LinkEntity::mangle(raw_ostream &buffer) const {
180
179
181
180
// global ::= 'WP' protocol-conformance
182
181
case Kind::DirectProtocolWitnessTable:
183
- buffer << " _TWP" ;
182
+ mangler. manglePrefix ( " _TWP" ) ;
184
183
mangler.mangleProtocolConformance (getProtocolConformance ());
185
184
return ;
186
185
187
186
// global ::= 'Wa' protocol-conformance
188
187
case Kind::ProtocolWitnessTableAccessFunction:
189
- buffer << " _TWa" ;
188
+ mangler. manglePrefix ( " _TWa" ) ;
190
189
mangler.mangleProtocolConformance (getProtocolConformance ());
191
190
return ;
192
191
193
192
// global ::= 'Wl' type protocol-conformance
194
193
case Kind::ProtocolWitnessTableLazyAccessFunction:
195
- buffer << " _TWl" ;
194
+ mangler. manglePrefix ( " _TWl" ) ;
196
195
mangler.mangleType (getType (), ResilienceExpansion::Minimal, 0 );
197
196
mangler.mangleProtocolConformance (getProtocolConformance ());
198
197
return ;
199
198
200
199
// global ::= 'WL' type protocol-conformance
201
200
case Kind::ProtocolWitnessTableLazyCacheVariable:
202
- buffer << " _TWL" ;
201
+ mangler. manglePrefix ( " _TWL" ) ;
203
202
mangler.mangleType (getType (), ResilienceExpansion::Minimal, 0 );
204
203
mangler.mangleProtocolConformance (getProtocolConformance ());
205
204
return ;
206
205
207
206
// global ::= 'WD' protocol-conformance
208
207
case Kind::DependentProtocolWitnessTableGenerator:
209
- buffer << " _TWD" ;
208
+ mangler. manglePrefix ( " _TWD" ) ;
210
209
mangler.mangleProtocolConformance (getProtocolConformance ());
211
210
return ;
212
211
213
212
// global ::= 'Wd' protocol-conformance
214
213
case Kind::DependentProtocolWitnessTableTemplate:
215
- buffer << " _TWd" ;
214
+ mangler. manglePrefix ( " _TWd" ) ;
216
215
mangler.mangleProtocolConformance (getProtocolConformance ());
217
216
return ;
218
217
@@ -223,7 +222,7 @@ void LinkEntity::mangle(raw_ostream &buffer) const {
223
222
case Kind::Function:
224
223
// As a special case, functions can have external asm names.
225
224
if (auto AsmA = getDecl ()->getAttrs ().getAttribute <SILGenNameAttr>()) {
226
- buffer << AsmA->Name ;
225
+ mangler. manglePrefix ( AsmA->Name ) ;
227
226
return ;
228
227
}
229
228
@@ -235,18 +234,22 @@ void LinkEntity::mangle(raw_ostream &buffer) const {
235
234
if (auto clangDecl = getDecl ()->getClangDecl ()) {
236
235
if (auto namedClangDecl = dyn_cast<clang::DeclaratorDecl>(clangDecl)) {
237
236
if (auto asmLabel = namedClangDecl->getAttr <clang::AsmLabelAttr>()) {
238
- buffer << ' \01 ' << asmLabel->getLabel ();
237
+ mangler.manglePrefix (' \01 ' );
238
+ mangler.manglePrefix (asmLabel->getLabel ());
239
239
} else if (namedClangDecl->hasAttr <clang::OverloadableAttr>()) {
240
240
// FIXME: When we can import C++, use Clang's mangler all the time.
241
- mangleClangDecl (buffer, namedClangDecl, getDecl ()->getASTContext ());
241
+ std::string storage;
242
+ llvm::raw_string_ostream SS (storage);
243
+ mangleClangDecl (SS, namedClangDecl, getDecl ()->getASTContext ());
244
+ mangler.manglePrefix (SS.str ());
242
245
} else {
243
- buffer << namedClangDecl->getName ();
246
+ mangler. manglePrefix ( namedClangDecl->getName () );
244
247
}
245
248
return ;
246
249
}
247
250
}
248
251
249
- buffer << " _T" ;
252
+ mangler. manglePrefix ( " _T" ) ;
250
253
if (auto type = dyn_cast<NominalTypeDecl>(getDecl ())) {
251
254
mangler.mangleNominalType (type, getResilienceExpansion (),
252
255
Mangler::BindGenerics::None);
@@ -263,25 +266,27 @@ void LinkEntity::mangle(raw_ostream &buffer) const {
263
266
264
267
// An Objective-C class reference; not a swift mangling.
265
268
case Kind::ObjCClass: {
266
- llvm::SmallString<64 > nameBuffer;
267
- buffer << " OBJC_CLASS_$_"
268
- << cast<ClassDecl>(getDecl ())->getObjCRuntimeName (nameBuffer);
269
+ llvm::SmallString<64 > TempBuffer;
270
+ mangler.manglePrefix (" OBJC_CLASS_$_" );
271
+ StringRef Name = cast<ClassDecl>(getDecl ())->getObjCRuntimeName (TempBuffer);
272
+ mangler.manglePrefix (Name);
269
273
return ;
270
274
}
271
275
272
276
// An Objective-C metaclass reference; not a swift mangling.
273
277
case Kind::ObjCMetaclass: {
274
- llvm::SmallString<64 > nameBuffer;
275
- buffer << " OBJC_METACLASS_$_"
276
- << cast<ClassDecl>(getDecl ())->getObjCRuntimeName (nameBuffer);
278
+ llvm::SmallString<64 > TempBuffer;
279
+ mangler.manglePrefix (" OBJC_METACLASS_$_" );
280
+ StringRef Name = cast<ClassDecl>(getDecl ())->getObjCRuntimeName (TempBuffer);
281
+ mangler.manglePrefix (Name);
277
282
return ;
278
283
}
279
284
280
285
case Kind::SILFunction:
281
- buffer << getSILFunction ()->getName ();
286
+ mangler. manglePrefix ( getSILFunction ()->getName () );
282
287
return ;
283
288
case Kind::SILGlobalVariable:
284
- buffer << getSILGlobalVariable ()->getName ();
289
+ mangler. manglePrefix ( getSILGlobalVariable ()->getName () );
285
290
return ;
286
291
}
287
292
llvm_unreachable (" bad entity kind!" );
0 commit comments