Skip to content

Commit cc389eb

Browse files
authored
Merge pull request #9657 from eeckstein/fix-demangler
Demangler: make the demangler more tolerant with malformed symbols.
2 parents f080a9c + 4efdceb commit cc389eb

File tree

3 files changed

+25
-32
lines changed

3 files changed

+25
-32
lines changed

lib/Demangling/Demangler.cpp

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,6 @@ using swift::Demangle::FunctionSigSpecializationParamKind;
2828
// Private utility functions //
2929
//////////////////////////////////
3030

31-
[[noreturn]]
32-
static void demangler_unreachable(const char *Message) {
33-
fprintf(stderr, "fatal error: %s\n", Message);
34-
std::abort();
35-
}
36-
3731
namespace {
3832

3933
static bool isDeclName(Node::Kind kind) {
@@ -1283,6 +1277,8 @@ NodePointer Demangler::demangleThunkOrSpecialization() {
12831277

12841278
NodePointer Demangler::demangleGenericSpecialization(Node::Kind SpecKind) {
12851279
NodePointer Spec = demangleSpecAttributes(SpecKind);
1280+
if (!Spec)
1281+
return nullptr;
12861282
NodePointer TyList = popTypeList();
12871283
if (!TyList)
12881284
return nullptr;
@@ -1907,21 +1903,21 @@ NodePointer Demangler::demangleGenericRequirement() {
19071903
return nullptr;
19081904
name = "m";
19091905
} else {
1910-
demangler_unreachable("Unknown layout constraint");
1906+
// Unknown layout constraint.
1907+
return nullptr;
19111908
}
19121909

19131910
auto NameNode = createNode(Node::Kind::Identifier, name);
19141911
auto LayoutRequirement = createWithChildren(
19151912
Node::Kind::DependentGenericLayoutRequirement, ConstrTy, NameNode);
19161913
if (size)
1917-
LayoutRequirement->addChild(size, *this);
1914+
addChild(LayoutRequirement, size);
19181915
if (alignment)
1919-
LayoutRequirement->addChild(alignment, *this);
1916+
addChild(LayoutRequirement, alignment);
19201917
return LayoutRequirement;
19211918
}
19221919
}
1923-
1924-
demangler_unreachable("Unhandled TypeKind in switch.");
1920+
return nullptr;
19251921
}
19261922

19271923
NodePointer Demangler::demangleGenericType() {

lib/Demangling/OldDemangler.cpp

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,6 @@ using namespace Demangle;
3232
using llvm::Optional;
3333
using llvm::None;
3434

35-
[[noreturn]]
36-
static void unreachable(const char *Message) {
37-
fprintf(stderr, "fatal error: %s\n", Message);
38-
std::abort();
39-
}
40-
4135
namespace {
4236
struct FindPtr {
4337
FindPtr(Node *v) : Target(v) {}
@@ -575,7 +569,8 @@ class OldDemangler {
575569
return true;
576570
}
577571

578-
unreachable("Unknown constant prop specialization");
572+
// Unknown constant prop specialization
573+
return false;
579574
}
580575

581576
bool demangleFuncSigSpecializationClosureProp(NodePointer parent) {
@@ -1483,7 +1478,8 @@ class OldDemangler {
14831478
return Factory.createNode(Node::Kind::MetatypeRepresentation,
14841479
"@objc_metatype");
14851480

1486-
unreachable("Unhandled metatype representation");
1481+
// Unknown metatype representation
1482+
return nullptr;
14871483
}
14881484

14891485
NodePointer demangleGenericRequirement() {
@@ -1546,7 +1542,7 @@ class OldDemangler {
15461542
return nullptr;
15471543
name = "m";
15481544
} else {
1549-
unreachable("Unknown layout constraint");
1545+
return nullptr;
15501546
}
15511547

15521548
NodePointer second = Factory.createNode(kind, name);
@@ -2114,7 +2110,7 @@ class OldDemangler {
21142110
case ImplConventionContext::Parameter: return (FOR_PARAMETER); \
21152111
case ImplConventionContext::Result: return (FOR_RESULT); \
21162112
} \
2117-
unreachable("bad context"); \
2113+
return StringRef(); \
21182114
}
21192115
auto Nothing = StringRef();
21202116
CASE('a', Nothing, Nothing, "@autoreleased")
@@ -2177,18 +2173,18 @@ class OldDemangler {
21772173
return nullptr;
21782174
kind = Node::Kind::ImplErrorResult;
21792175
}
2180-
2181-
auto getContext = [](Node::Kind kind) -> ImplConventionContext {
2182-
if (kind == Node::Kind::ImplParameter)
2183-
return ImplConventionContext::Parameter;
2184-
else if (kind == Node::Kind::ImplResult
2185-
|| kind == Node::Kind::ImplErrorResult)
2186-
return ImplConventionContext::Result;
2187-
else
2188-
unreachable("unexpected node kind");
2189-
};
21902176

2191-
auto convention = demangleImplConvention(getContext(kind));
2177+
ImplConventionContext ConvCtx;
2178+
if (kind == Node::Kind::ImplParameter) {
2179+
ConvCtx = ImplConventionContext::Parameter;
2180+
} else if (kind == Node::Kind::ImplResult
2181+
|| kind == Node::Kind::ImplErrorResult) {
2182+
ConvCtx = ImplConventionContext::Result;
2183+
} else {
2184+
return nullptr;
2185+
}
2186+
2187+
auto convention = demangleImplConvention(ConvCtx);
21922188
if (convention.empty()) return nullptr;
21932189
auto type = demangleType();
21942190
if (!type) return nullptr;

test/Demangle/Inputs/manglings.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,4 +254,5 @@ _T04main1_yyF ---> main._() -> ()
254254
_T04test6testitSiyt_tF ---> test.testit(()) -> Swift.Int
255255
_T08_ElementQzSbs5Error_pIxxdzo_ABSbsAC_pIxidzo_s26RangeReplaceableCollectionRzABRLClTR ---> {T:} reabstraction thunk helper <A where A: Swift.RangeReplaceableCollection, A._Element: AnyObject> from @callee_owned (@owned A._Element) -> (@unowned Swift.Bool, @error @owned Swift.Error) to @callee_owned (@in A._Element) -> (@unowned Swift.Bool, @error @owned Swift.Error)
256256
_T0Ix_IyB_Tr ---> {T:} reabstraction thunk from @callee_owned () -> () to @callee_unowned @convention(block) () -> ()
257+
_T0Rml ---> _T0Rml
257258

0 commit comments

Comments
 (0)