Skip to content

Commit b5e4197

Browse files
committed
[Mangler] Fix all of the places where users of the Mangler access the underlying buffer.
This commit fixes all of the places where users of the Mangler write to the stream that's used by the Mangler. The plan is to make the Mangler buffered, and this means that users can't assume that the mangler immediately writes the mangled tokens to the output stream.
1 parent 8d4f777 commit b5e4197

File tree

6 files changed

+63
-53
lines changed

6 files changed

+63
-53
lines changed

lib/AST/Decl.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2318,13 +2318,14 @@ static StringRef mangleObjCRuntimeName(const NominalTypeDecl *nominal,
23182318
{
23192319
buffer.clear();
23202320
llvm::raw_svector_ostream os(buffer);
2321+
2322+
// Mangle the type.
2323+
Mangle::Mangler mangler(os, false/*dwarf*/, false/*punycode*/);
23212324

23222325
// We add the "_Tt" prefix to make this a reserved name that will
23232326
// not conflict with any valid Objective-C class or protocol name.
2324-
os << "_Tt";
2327+
mangler.manglePrefix("_Tt");
23252328

2326-
// Mangle the type.
2327-
Mangle::Mangler mangler(os, false/*dwarf*/, false/*punycode*/);
23282329
NominalTypeDecl *NTD = const_cast<NominalTypeDecl*>(nominal);
23292330
if (isa<ClassDecl>(nominal)) {
23302331
mangler.mangleNominalType(NTD,

lib/IRGen/Linking.cpp

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -88,15 +88,14 @@ void LinkEntity::mangle(raw_ostream &buffer) const {
8888
switch (getKind()) {
8989
// global ::= 'w' value-witness-kind type // value witness
9090
case Kind::ValueWitness:
91-
buffer << "_Tw";
92-
buffer << mangleValueWitness(getValueWitness());
93-
91+
mangler.manglePrefix("_Tw");
92+
mangler.manglePrefix(mangleValueWitness(getValueWitness()));
9493
mangler.mangleType(getType(), ResilienceExpansion::Minimal, 0);
9594
return;
9695

9796
// global ::= 'WV' type // value witness
9897
case Kind::ValueWitnessTable:
99-
buffer << "_TWV";
98+
mangler.manglePrefix("_TWV");
10099
mangler.mangleType(getType(), ResilienceExpansion::Minimal, 0);
101100
return;
102101

@@ -108,13 +107,13 @@ void LinkEntity::mangle(raw_ostream &buffer) const {
108107

109108
// global ::= 'Ma' type // type metadata access function
110109
case Kind::TypeMetadataAccessFunction:
111-
buffer << "_TMa";
110+
mangler.manglePrefix("_TMa");
112111
mangler.mangleType(getType(), ResilienceExpansion::Minimal, 0);
113112
return;
114113

115114
// global ::= 'ML' type // type metadata lazy cache variable
116115
case Kind::TypeMetadataLazyCacheVariable:
117-
buffer << "_TML";
116+
mangler.manglePrefix("_TML");
118117
mangler.mangleType(getType(), ResilienceExpansion::Minimal, 0);
119118
return;
120119

@@ -139,29 +138,29 @@ void LinkEntity::mangle(raw_ostream &buffer) const {
139138

140139
// global ::= 'Mm' type // class metaclass
141140
case Kind::SwiftMetaclassStub:
142-
buffer << "_TMm";
141+
mangler.manglePrefix("_TMm");
143142
mangler.mangleNominalType(cast<ClassDecl>(getDecl()),
144143
ResilienceExpansion::Minimal,
145144
Mangler::BindGenerics::None);
146145
return;
147146

148147
// global ::= 'Mn' type // nominal type descriptor
149148
case Kind::NominalTypeDescriptor:
150-
buffer << "_TMn";
149+
mangler.manglePrefix("_TMn");
151150
mangler.mangleNominalType(cast<NominalTypeDecl>(getDecl()),
152151
ResilienceExpansion::Minimal,
153152
Mangler::BindGenerics::None);
154153
return;
155154

156155
// global ::= 'Mp' type // protocol descriptor
157156
case Kind::ProtocolDescriptor:
158-
buffer << "_TMp";
157+
mangler.manglePrefix("_TMp");
159158
mangler.mangleProtocolName(cast<ProtocolDecl>(getDecl()));
160159
return;
161160

162161
// global ::= 'Wo' entity
163162
case Kind::WitnessTableOffset:
164-
buffer << "_TWo";
163+
mangler.manglePrefix("_TWo");
165164

166165
// Witness table entries for constructors always refer to the allocating
167166
// constructor.
@@ -180,39 +179,39 @@ void LinkEntity::mangle(raw_ostream &buffer) const {
180179

181180
// global ::= 'WP' protocol-conformance
182181
case Kind::DirectProtocolWitnessTable:
183-
buffer << "_TWP";
182+
mangler.manglePrefix("_TWP");
184183
mangler.mangleProtocolConformance(getProtocolConformance());
185184
return;
186185

187186
// global ::= 'Wa' protocol-conformance
188187
case Kind::ProtocolWitnessTableAccessFunction:
189-
buffer << "_TWa";
188+
mangler.manglePrefix("_TWa");
190189
mangler.mangleProtocolConformance(getProtocolConformance());
191190
return;
192191

193192
// global ::= 'Wl' type protocol-conformance
194193
case Kind::ProtocolWitnessTableLazyAccessFunction:
195-
buffer << "_TWl";
194+
mangler.manglePrefix("_TWl");
196195
mangler.mangleType(getType(), ResilienceExpansion::Minimal, 0);
197196
mangler.mangleProtocolConformance(getProtocolConformance());
198197
return;
199198

200199
// global ::= 'WL' type protocol-conformance
201200
case Kind::ProtocolWitnessTableLazyCacheVariable:
202-
buffer << "_TWL";
201+
mangler.manglePrefix("_TWL");
203202
mangler.mangleType(getType(), ResilienceExpansion::Minimal, 0);
204203
mangler.mangleProtocolConformance(getProtocolConformance());
205204
return;
206205

207206
// global ::= 'WD' protocol-conformance
208207
case Kind::DependentProtocolWitnessTableGenerator:
209-
buffer << "_TWD";
208+
mangler.manglePrefix("_TWD");
210209
mangler.mangleProtocolConformance(getProtocolConformance());
211210
return;
212211

213212
// global ::= 'Wd' protocol-conformance
214213
case Kind::DependentProtocolWitnessTableTemplate:
215-
buffer << "_TWd";
214+
mangler.manglePrefix("_TWd");
216215
mangler.mangleProtocolConformance(getProtocolConformance());
217216
return;
218217

@@ -223,7 +222,7 @@ void LinkEntity::mangle(raw_ostream &buffer) const {
223222
case Kind::Function:
224223
// As a special case, functions can have external asm names.
225224
if (auto AsmA = getDecl()->getAttrs().getAttribute<SILGenNameAttr>()) {
226-
buffer << AsmA->Name;
225+
mangler.manglePrefix(AsmA->Name);
227226
return;
228227
}
229228

@@ -235,18 +234,22 @@ void LinkEntity::mangle(raw_ostream &buffer) const {
235234
if (auto clangDecl = getDecl()->getClangDecl()) {
236235
if (auto namedClangDecl = dyn_cast<clang::DeclaratorDecl>(clangDecl)) {
237236
if (auto asmLabel = namedClangDecl->getAttr<clang::AsmLabelAttr>()) {
238-
buffer << '\01' << asmLabel->getLabel();
237+
mangler.manglePrefix('\01');
238+
mangler.manglePrefix(asmLabel->getLabel());
239239
} else if (namedClangDecl->hasAttr<clang::OverloadableAttr>()) {
240240
// 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());
242245
} else {
243-
buffer << namedClangDecl->getName();
246+
mangler.manglePrefix(namedClangDecl->getName());
244247
}
245248
return;
246249
}
247250
}
248251

249-
buffer << "_T";
252+
mangler.manglePrefix("_T");
250253
if (auto type = dyn_cast<NominalTypeDecl>(getDecl())) {
251254
mangler.mangleNominalType(type, getResilienceExpansion(),
252255
Mangler::BindGenerics::None);
@@ -263,25 +266,27 @@ void LinkEntity::mangle(raw_ostream &buffer) const {
263266

264267
// An Objective-C class reference; not a swift mangling.
265268
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);
269273
return;
270274
}
271275

272276
// An Objective-C metaclass reference; not a swift mangling.
273277
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);
277282
return;
278283
}
279284

280285
case Kind::SILFunction:
281-
buffer << getSILFunction()->getName();
286+
mangler.manglePrefix(getSILFunction()->getName());
282287
return;
283288
case Kind::SILGlobalVariable:
284-
buffer << getSILGlobalVariable()->getName();
289+
mangler.manglePrefix(getSILGlobalVariable()->getName());
285290
return;
286291
}
287292
llvm_unreachable("bad entity kind!");

lib/SIL/SILDeclRef.cpp

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -478,7 +478,7 @@ static void mangleConstant(SILDeclRef c, llvm::raw_ostream &buffer,
478478
// entity ::= declaration // other declaration
479479
case SILDeclRef::Kind::Func:
480480
if (!c.hasDecl()) {
481-
buffer << introducer;
481+
mangler.manglePrefix(introducer);
482482
mangler.mangleClosureEntity(c.getAbstractClosureExpr(),
483483
c.getResilienceExpansion(),
484484
c.uncurryLevel);
@@ -491,7 +491,7 @@ static void mangleConstant(SILDeclRef c, llvm::raw_ostream &buffer,
491491
if (auto AsmA = c.getDecl()->getAttrs().getAttribute<SILGenNameAttr>())
492492
if (!c.isForeignToNativeThunk() && !c.isNativeToForeignThunk()
493493
&& !c.isCurried) {
494-
buffer << AsmA->Name;
494+
mangler.manglePrefix(AsmA->Name);
495495
return;
496496
}
497497

@@ -505,40 +505,44 @@ static void mangleConstant(SILDeclRef c, llvm::raw_ostream &buffer,
505505
&& !c.isCurried) {
506506
if (auto namedClangDecl = dyn_cast<clang::DeclaratorDecl>(clangDecl)) {
507507
if (auto asmLabel = namedClangDecl->getAttr<clang::AsmLabelAttr>()) {
508-
buffer << '\01' << asmLabel->getLabel();
508+
mangler.manglePrefix('\01');
509+
mangler.manglePrefix(asmLabel->getLabel());
509510
} else if (namedClangDecl->hasAttr<clang::OverloadableAttr>()) {
511+
std::string storage;
512+
llvm::raw_string_ostream SS(storage);
510513
// FIXME: When we can import C++, use Clang's mangler all the time.
511-
mangleClangDecl(buffer, namedClangDecl,
514+
mangleClangDecl(SS, namedClangDecl,
512515
c.getDecl()->getASTContext());
516+
mangler.manglePrefix(SS.str());
513517
} else {
514-
buffer << namedClangDecl->getName();
518+
mangler.manglePrefix(namedClangDecl->getName());
515519
}
516520
return;
517521
}
518522
}
519523
}
520524

521-
buffer << introducer;
525+
mangler.manglePrefix(introducer);
522526
mangler.mangleEntity(c.getDecl(), c.getResilienceExpansion(), c.uncurryLevel);
523527
return;
524528

525529
// entity ::= context 'D' // deallocating destructor
526530
case SILDeclRef::Kind::Deallocator:
527-
buffer << introducer;
531+
mangler.manglePrefix(introducer);
528532
mangler.mangleDestructorEntity(cast<DestructorDecl>(c.getDecl()),
529533
/*isDeallocating*/ true);
530534
return;
531535

532536
// entity ::= context 'd' // destroying destructor
533537
case SILDeclRef::Kind::Destroyer:
534-
buffer << introducer;
538+
mangler.manglePrefix(introducer);
535539
mangler.mangleDestructorEntity(cast<DestructorDecl>(c.getDecl()),
536540
/*isDeallocating*/ false);
537541
return;
538542

539543
// entity ::= context 'C' type // allocating constructor
540544
case SILDeclRef::Kind::Allocator:
541-
buffer << introducer;
545+
mangler.manglePrefix(introducer);
542546
mangler.mangleConstructorEntity(cast<ConstructorDecl>(c.getDecl()),
543547
/*allocating*/ true,
544548
c.getResilienceExpansion(),
@@ -547,7 +551,7 @@ static void mangleConstant(SILDeclRef c, llvm::raw_ostream &buffer,
547551

548552
// entity ::= context 'c' type // initializing constructor
549553
case SILDeclRef::Kind::Initializer:
550-
buffer << introducer;
554+
mangler.manglePrefix(introducer);
551555
mangler.mangleConstructorEntity(cast<ConstructorDecl>(c.getDecl()),
552556
/*allocating*/ false,
553557
c.getResilienceExpansion(),
@@ -558,27 +562,27 @@ static void mangleConstant(SILDeclRef c, llvm::raw_ostream &buffer,
558562
// entity ::= declaration 'E' // ivar destroyer
559563
case SILDeclRef::Kind::IVarInitializer:
560564
case SILDeclRef::Kind::IVarDestroyer:
561-
buffer << introducer;
565+
mangler.manglePrefix(introducer);
562566
mangler.mangleIVarInitDestroyEntity(
563567
cast<ClassDecl>(c.getDecl()),
564568
c.kind == SILDeclRef::Kind::IVarDestroyer);
565569
return;
566570

567571
// entity ::= declaration 'a' // addressor
568572
case SILDeclRef::Kind::GlobalAccessor:
569-
buffer << introducer;
573+
mangler.manglePrefix(introducer);
570574
mangler.mangleAddressorEntity(c.getDecl());
571575
return;
572576

573577
// entity ::= declaration 'G' // getter
574578
case SILDeclRef::Kind::GlobalGetter:
575-
buffer << introducer;
579+
mangler.manglePrefix(introducer);
576580
mangler.mangleGlobalGetterEntity(c.getDecl());
577581
return;
578582

579583
// entity ::= context 'e' index // default arg generator
580584
case SILDeclRef::Kind::DefaultArgGenerator:
581-
buffer << introducer;
585+
mangler.manglePrefix(introducer);
582586
mangler.mangleDefaultArgumentEntity(cast<AbstractFunctionDecl>(c.getDecl()),
583587
c.defaultArgIndex);
584588
return;

lib/SIL/SILWitnessTable.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ static void mangleConstant(NormalProtocolConformance *C,
3333

3434
// mangled-name ::= '_T' global
3535
// global ::= 'WP' protocol-conformance
36-
buffer << "_TWP";
36+
mangler.manglePrefix("_TWP");
3737
mangler.mangleProtocolConformance(C);
3838
buffer.flush();
3939
}

lib/SILGen/SILGenDecl.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1721,8 +1721,8 @@ SILGenModule::emitProtocolWitness(ProtocolConformance *conformance,
17211721
llvm::SmallString<128> nameBuffer;
17221722
{
17231723
llvm::raw_svector_ostream nameStream(nameBuffer);
1724-
nameStream << "_TTW";
17251724
Mangler mangler(nameStream);
1725+
mangler.manglePrefix("_TTW");
17261726
mangler.mangleProtocolConformance(conformance);
17271727

17281728
if (auto ctor = dyn_cast<ConstructorDecl>(requirement.getDecl())) {
@@ -1795,9 +1795,9 @@ getOrCreateReabstractionThunk(GenericParamList *thunkContextParams,
17951795

17961796
// This is actually the SIL helper function. For now, IR-gen
17971797
// makes the actual thunk.
1798-
stream << "_TTR";
1798+
mangler.manglePrefix("_TTR");
17991799
if (auto generics = thunkType->getGenericSignature()) {
1800-
stream << 'G';
1800+
mangler.manglePrefix('G');
18011801
mangler.setModuleContext(M.getSwiftModule());
18021802
mangler.mangleGenericSignature(generics,
18031803
ResilienceExpansion::Minimal);

lib/SILGen/SILGenLValue.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2887,9 +2887,9 @@ SILFunction *MaterializeForSetEmitter::createCallback(GeneratorFn generator) {
28872887
nullptr));
28882888
closure.getCaptureInfo().setGenericParamCaptures(true);
28892889

2890-
llvm::raw_svector_ostream nameStream(name);
2891-
nameStream << "_TTW";
2892-
Mangle::Mangler mangler(nameStream);
2890+
llvm::raw_svector_ostream stream(name);
2891+
Mangle::Mangler mangler(stream);
2892+
mangler.manglePrefix("_TTW");
28932893
mangler.mangleProtocolConformance(Conformance);
28942894
mangler.mangleClosureEntity(&closure, ResilienceExpansion::Minimal, 1);
28952895
}

0 commit comments

Comments
 (0)