Skip to content

Commit 25d3bbd

Browse files
committed
[NFC] Add names of deserialized decls to pretty stack traces
Several declarations must be at least partially deserialized before their names can be determined. Add those names to pretty stack traces to make deserialization crashes easier to debug. We don’t test pretty stack traces, so this doesn’t contain any test changes.
1 parent 984df63 commit 25d3bbd

File tree

1 file changed

+37
-6
lines changed

1 file changed

+37
-6
lines changed

lib/Serialization/Deserialization.cpp

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,17 @@ namespace {
113113
}
114114
};
115115

116+
class PrettySupplementalDeclNameTrace : public llvm::PrettyStackTraceEntry {
117+
DeclName name;
118+
public:
119+
PrettySupplementalDeclNameTrace(DeclName name)
120+
: name(name) { }
121+
122+
void print(raw_ostream &os) const override {
123+
os << " ...decl is named '" << name << "'\n";
124+
}
125+
};
126+
116127
class PrettyXRefTrace :
117128
public llvm::PrettyStackTraceEntry,
118129
public XRefTracePath {
@@ -2375,6 +2386,7 @@ class DeclDeserializer {
23752386
rawAccessLevel, dependencyIDs);
23762387

23772388
Identifier name = MF.getIdentifier(nameID);
2389+
PrettySupplementalDeclNameTrace trace(name);
23782390

23792391
for (TypeID dependencyID : dependencyIDs) {
23802392
auto dependency = MF.getTypeChecked(dependencyID);
@@ -2505,6 +2517,7 @@ class DeclDeserializer {
25052517
rawInheritedAndDependencyIDs);
25062518

25072519
Identifier name = MF.getIdentifier(nameID);
2520+
PrettySupplementalDeclNameTrace trace(name);
25082521

25092522
for (TypeID dependencyID :
25102523
rawInheritedAndDependencyIDs.slice(numInheritedTypes)) {
@@ -2582,6 +2595,7 @@ class DeclDeserializer {
25822595
for (auto argNameID : argNameAndDependencyIDs.slice(0, numArgNames))
25832596
argNames.push_back(MF.getIdentifier(argNameID));
25842597
DeclName name(ctx, DeclBaseName::createConstructor(), argNames);
2598+
PrettySupplementalDeclNameTrace trace(name);
25852599

25862600
Optional<swift::CtorInitializerKind> initKind =
25872601
getActualCtorInitializerKind(storedInitKind);
@@ -2712,6 +2726,7 @@ class DeclDeserializer {
27122726
arrayFieldIDs);
27132727

27142728
Identifier name = MF.getIdentifier(nameID);
2729+
PrettySupplementalDeclNameTrace trace(name);
27152730

27162731
auto getErrorFlags = [&]() {
27172732
// Stored properties in classes still impact class object layout because
@@ -2879,6 +2894,10 @@ class DeclDeserializer {
28792894
interfaceTypeID, isIUO, isVariadic,
28802895
isAutoClosure, rawDefaultArg);
28812896

2897+
auto argName = MF.getIdentifier(argNameID);
2898+
auto paramName = MF.getIdentifier(paramNameID);
2899+
PrettySupplementalDeclNameTrace trace(paramName);
2900+
28822901
auto DC = MF.getDeclContext(contextID);
28832902
if (declOrOffset.isComplete())
28842903
return declOrOffset;
@@ -2888,10 +2907,8 @@ class DeclDeserializer {
28882907
if (!specifier)
28892908
MF.fatal();
28902909

2891-
auto param = MF.createDecl<ParamDecl>(SourceLoc(), SourceLoc(),
2892-
MF.getIdentifier(argNameID),
2893-
SourceLoc(),
2894-
MF.getIdentifier(paramNameID), DC);
2910+
auto param = MF.createDecl<ParamDecl>(SourceLoc(), SourceLoc(), argName,
2911+
SourceLoc(), paramName, DC);
28952912
param->setSpecifier(*specifier);
28962913

28972914
declOrOffset = param;
@@ -3023,6 +3040,7 @@ class DeclDeserializer {
30233040
dependencyIDs = nameAndDependencyIDs.drop_front();
30243041
}
30253042
}
3043+
PrettySupplementalDeclNameTrace trace(name);
30263044

30273045
Expected<Decl *> overriddenOrError = MF.getDeclChecked(overriddenID);
30283046
Decl *overridden;
@@ -3281,6 +3299,7 @@ class DeclDeserializer {
32813299
rawInheritedAndDependencyIDs);
32823300

32833301
Identifier name = MF.getIdentifier(nameID);
3302+
PrettySupplementalDeclNameTrace trace(name);
32843303

32853304
for (TypeID dependencyID :
32863305
rawInheritedAndDependencyIDs.slice(numInheritedTypes)) {
@@ -3340,6 +3359,10 @@ class DeclDeserializer {
33403359

33413360
OperatorLayout::readRecord(scratch, nameID, contextID,
33423361
designatedNominalTypeDeclIDs);
3362+
3363+
Identifier name = MF.getIdentifier(nameID);
3364+
PrettySupplementalDeclNameTrace trace(name);
3365+
33433366
auto DC = MF.getDeclContext(contextID);
33443367

33453368
SmallVector<NominalTypeDecl *, 1> designatedNominalTypes;
@@ -3351,7 +3374,7 @@ class DeclDeserializer {
33513374
}
33523375

33533376
auto result = MF.createDecl<OperatorDecl>(
3354-
DC, SourceLoc(), MF.getIdentifier(nameID), SourceLoc(),
3377+
DC, SourceLoc(), name, SourceLoc(),
33553378
ctx.AllocateCopy(designatedNominalTypes));
33563379

33573380
declOrOffset = result;
@@ -3380,6 +3403,8 @@ class DeclDeserializer {
33803403
decls_block::InfixOperatorLayout::readRecord(scratch, nameID, contextID,
33813404
precedenceGroupID,
33823405
designatedNominalTypeDeclIDs);
3406+
Identifier name = MF.getIdentifier(nameID);
3407+
PrettySupplementalDeclNameTrace trace(name);
33833408

33843409
Expected<Decl *> precedenceGroup = MF.getDeclChecked(precedenceGroupID);
33853410
if (!precedenceGroup)
@@ -3396,7 +3421,7 @@ class DeclDeserializer {
33963421
}
33973422

33983423
auto result = MF.createDecl<InfixOperatorDecl>(
3399-
DC, SourceLoc(), MF.getIdentifier(nameID), SourceLoc(), SourceLoc(),
3424+
DC, SourceLoc(), name, SourceLoc(), SourceLoc(),
34003425
ArrayRef<Identifier>{}, ArrayRef<SourceLoc>{});
34013426
result->setDesignatedNominalTypes(ctx.AllocateCopy(designatedNominalTypes));
34023427
ctx.evaluator.cacheOutput(
@@ -3487,6 +3512,7 @@ class DeclDeserializer {
34873512
rawInheritedAndDependencyIDs);
34883513

34893514
Identifier name = MF.getIdentifier(nameID);
3515+
PrettySupplementalDeclNameTrace trace(name);
34903516

34913517
for (TypeID dependencyID :
34923518
rawInheritedAndDependencyIDs.slice(numInheritedTypes)) {
@@ -3560,6 +3586,8 @@ class DeclDeserializer {
35603586
return declOrOffset;
35613587

35623588
Identifier name = MF.getIdentifier(nameID);
3589+
PrettySupplementalDeclNameTrace trace(name);
3590+
35633591
for (TypeID dependencyID :
35643592
rawInheritedAndDependencyIDs.slice(numInherited)) {
35653593
auto dependency = MF.getTypeChecked(dependencyID);
@@ -3638,6 +3666,7 @@ class DeclDeserializer {
36383666
argNames.push_back(MF.getIdentifier(argNameID));
36393667
DeclName compoundName(ctx, baseName, argNames);
36403668
DeclName name = argNames.empty() ? baseName : compoundName;
3669+
PrettySupplementalDeclNameTrace trace(name);
36413670

36423671
for (TypeID dependencyID : argNameAndDependencyIDs.slice(numArgNames)) {
36433672
auto dependency = MF.getTypeChecked(dependencyID);
@@ -3730,6 +3759,8 @@ class DeclDeserializer {
37303759
for (auto argNameID : argNameAndDependencyIDs.slice(0, numArgNames))
37313760
argNames.push_back(MF.getIdentifier(argNameID));
37323761
DeclName name(ctx, DeclBaseName::createSubscript(), argNames);
3762+
PrettySupplementalDeclNameTrace trace(name);
3763+
37333764
argNameAndDependencyIDs = argNameAndDependencyIDs.slice(numArgNames);
37343765

37353766
// Exctract the accessor IDs.

0 commit comments

Comments
 (0)