Skip to content

Commit 8d4f777

Browse files
committed
[Mangler] Limit the lifetime of the Mangler
to make sure we are not accessing the buffer before the output is ready. The Mangler is going to be buffered (for compression), and accessing the underlying buffer is a bug.
1 parent c5acfa1 commit 8d4f777

File tree

7 files changed

+20
-1
lines changed

7 files changed

+20
-1
lines changed

lib/AST/Mangle.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1279,6 +1279,8 @@ void Mangler::mangleType(Type type, ResilienceExpansion explosion,
12791279

12801280
if (DWARFMangling) {
12811281
Buffer << 'q' << Index(info.Index);
1282+
1283+
{
12821284
// The DWARF output created by Swift is intentionally flat,
12831285
// therefore archetypes are emitted with their DeclContext if
12841286
// they appear at the top level of a type (_Tt).
@@ -1292,6 +1294,8 @@ void Mangler::mangleType(Type type, ResilienceExpansion explosion,
12921294
assert(DC && "no decl context for archetype found");
12931295
if (!DC) return;
12941296
ContextMangler.mangleContext(DC, BindGenerics::None);
1297+
}
1298+
12951299
} else {
12961300
if (relativeDepth != 0) {
12971301
Buffer << 'd' << Index(relativeDepth - 1);

lib/AST/Verifier.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2605,8 +2605,10 @@ struct ASTNodeBase {};
26052605
void checkMangling(ValueDecl *D) {
26062606
llvm::SmallString<32> Buf;
26072607
llvm::raw_svector_ostream OS(Buf);
2608+
{
26082609
Mangle::Mangler Mangler(OS);
26092610
Mangler.mangleDeclName(D);
2611+
}
26102612
if (OS.str().empty()) {
26112613
Out << "Mangler gave empty string for a ValueDecl";
26122614
abort();

lib/SILGen/SILGenGlobalVariable.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,8 +230,10 @@ void SILGenModule::emitGlobalInitialization(PatternBindingDecl *pd,
230230
// Emit the initialization code into a function.
231231
llvm::SmallString<20> onceFuncBuffer;
232232
llvm::raw_svector_ostream onceFuncStream(onceFuncBuffer);
233+
{
233234
Mangler funcMangler(onceFuncStream);
234235
funcMangler.mangleGlobalInit(varDecl, counter, true);
236+
}
235237

236238
SILFunction *onceFunc = emitLazyGlobalInitializer(onceFuncStream.str(), pd,
237239
pbdEntry);

lib/SILOptimizer/IPO/CapturePropagation.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ static llvm::SmallString<64> getClonedName(PartialApplyInst *PAI,
7070
llvm::SmallString<64> ClonedName;
7171

7272
llvm::raw_svector_ostream buffer(ClonedName);
73+
{
7374
Mangle::Mangler M(buffer);
7475
auto P = SpecializationPass::CapturePropagation;
7576
FunctionSignatureSpecializationMangler Mangler(P, M, F);
@@ -79,6 +80,7 @@ static llvm::SmallString<64> getClonedName(PartialApplyInst *PAI,
7980
for (unsigned i : indices(Args))
8081
Mangler.setArgumentConstantProp(i, getConstant(Args[i]));
8182
Mangler.mangle();
83+
}
8284

8385
return ClonedName;
8486
}

lib/SILOptimizer/IPO/GlobalOpt.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,8 +197,10 @@ static SILFunction *genGetterFromInit(StoreInst *Store,
197197
auto *varDecl = SILG->getDecl();
198198
llvm::SmallString<20> getterBuffer;
199199
llvm::raw_svector_ostream getterStream(getterBuffer);
200+
{
200201
Mangle::Mangler getterMangler(getterStream);
201202
getterMangler.mangleGlobalGetterEntity(varDecl);
203+
}
202204

203205
// Check if a getter was generated already.
204206
if (auto *F = Store->getModule().lookUpFunction(getterStream.str()))
@@ -459,8 +461,10 @@ static SILFunction *genGetterFromInit(SILFunction *InitF, VarDecl *varDecl) {
459461
// Generate a getter from the global init function without side-effects.
460462
llvm::SmallString<20> getterBuffer;
461463
llvm::raw_svector_ostream getterStream(getterBuffer);
464+
{
462465
Mangle::Mangler getterMangler(getterStream);
463466
getterMangler.mangleGlobalGetterEntity(varDecl);
467+
}
464468

465469
// Check if a getter was generated already.
466470
if (auto *F = InitF->getModule().lookUpFunction(getterStream.str()))

lib/Serialization/Serialization.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3650,9 +3650,11 @@ void Serializer::writeAST(ModuleOrSourceFile DC) {
36503650

36513651
SmallString<32> MangledName;
36523652
llvm::raw_svector_ostream Stream(MangledName);
3653+
{
36533654
Mangle::Mangler DebugMangler(Stream, false);
36543655
DebugMangler.mangleType(TD->getDeclaredType(),
36553656
ResilienceExpansion::Minimal, 0);
3657+
}
36563658
assert(!MangledName.empty() && "Mangled type came back empty!");
36573659
localTypeGenerator.insert(MangledName, {
36583660
addDeclRef(TD), TD->getLocalDiscriminator()

tools/swift-ide-test/swift-ide-test.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1462,8 +1462,11 @@ static int doPrintLocalTypes(const CompilerInvocation &InitInvok,
14621462
for (auto LTD : LocalTypeDecls) {
14631463
SmallString<64> MangledName;
14641464
llvm::raw_svector_ostream Buffer(MangledName);
1465+
{
14651466
Mangle::Mangler Mangler(Buffer, /*DWARFMangling*/ true);
1466-
Mangler.mangleTypeForDebugger(LTD->getDeclaredType(), LTD->getDeclContext());
1467+
Mangler.mangleTypeForDebugger(LTD->getDeclaredType(),
1468+
LTD->getDeclContext());
1469+
}
14671470
MangledNames.push_back(Buffer.str());
14681471
}
14691472

0 commit comments

Comments
 (0)