@@ -88,7 +88,7 @@ std::string ASTMangler::mangleClosureEntity(const AbstractClosureExpr *closure,
88
88
89
89
std::string ASTMangler::mangleEntity (const ValueDecl *decl, SymbolKind SKind) {
90
90
beginMangling ();
91
- appendEntity (decl);
91
+ appendEntity (decl, SKind == SymbolKind::AsyncHandlerBody );
92
92
appendSymbolKind (SKind);
93
93
return finalize ();
94
94
}
@@ -657,7 +657,7 @@ std::string ASTMangler::mangleTypeAsUSR(Type Ty) {
657
657
Ty = getTypeForDWARFMangling (Ty);
658
658
659
659
if (auto *fnType = Ty->getAs <AnyFunctionType>()) {
660
- appendFunction (fnType, false );
660
+ appendFunction (fnType);
661
661
} else {
662
662
appendType (Ty);
663
663
}
@@ -744,6 +744,7 @@ std::string ASTMangler::mangleOpaqueTypeDecl(const ValueDecl *decl) {
744
744
void ASTMangler::appendSymbolKind (SymbolKind SKind) {
745
745
switch (SKind) {
746
746
case SymbolKind::Default: return ;
747
+ case SymbolKind::AsyncHandlerBody: return ;
747
748
case SymbolKind::DynamicThunk: return appendOperator (" TD" );
748
749
case SymbolKind::SwiftAsObjCThunk: return appendOperator (" To" );
749
750
case SymbolKind::ObjCAsSwiftThunk: return appendOperator (" TO" );
@@ -2249,7 +2250,8 @@ void ASTMangler::appendAnyGenericType(const GenericTypeDecl *decl) {
2249
2250
addSubstitution (cast<TypeAliasDecl>(decl));
2250
2251
}
2251
2252
2252
- void ASTMangler::appendFunction (AnyFunctionType *fn, bool isFunctionMangling,
2253
+ void ASTMangler::appendFunction (AnyFunctionType *fn,
2254
+ FunctionManglingKind functionMangling,
2253
2255
const ValueDecl *forDecl) {
2254
2256
// Append parameter labels right before the signature/type.
2255
2257
auto parameters = fn->getParams ();
@@ -2269,8 +2271,8 @@ void ASTMangler::appendFunction(AnyFunctionType *fn, bool isFunctionMangling,
2269
2271
appendOperator (" y" );
2270
2272
}
2271
2273
2272
- if (isFunctionMangling ) {
2273
- appendFunctionSignature (fn, forDecl);
2274
+ if (functionMangling != NoFunctionMangling ) {
2275
+ appendFunctionSignature (fn, forDecl, functionMangling );
2274
2276
} else {
2275
2277
appendFunctionType (fn, /* autoclosure*/ false , forDecl);
2276
2278
}
@@ -2281,7 +2283,7 @@ void ASTMangler::appendFunctionType(AnyFunctionType *fn, bool isAutoClosure,
2281
2283
assert ((DWARFMangling || fn->isCanonical ()) &&
2282
2284
" expecting canonical types when not mangling for the debugger" );
2283
2285
2284
- appendFunctionSignature (fn, forDecl);
2286
+ appendFunctionSignature (fn, forDecl, NoFunctionMangling );
2285
2287
2286
2288
bool mangleClangType = fn->getASTContext ().LangOpts .UseClangFunctionTypes &&
2287
2289
fn->hasNonDerivableClangType ();
@@ -2359,10 +2361,11 @@ void ASTMangler::appendClangType(AnyFunctionType *fn) {
2359
2361
}
2360
2362
2361
2363
void ASTMangler::appendFunctionSignature (AnyFunctionType *fn,
2362
- const ValueDecl *forDecl) {
2364
+ const ValueDecl *forDecl,
2365
+ FunctionManglingKind functionMangling) {
2363
2366
appendFunctionResultType (fn->getResult (), forDecl);
2364
2367
appendFunctionInputType (fn->getParams (), forDecl);
2365
- if (fn->isAsync ())
2368
+ if (fn->isAsync () || functionMangling == AsyncHandlerBodyMangling )
2366
2369
appendOperator (" Y" );
2367
2370
if (fn->isThrowing ())
2368
2371
appendOperator (" K" );
@@ -2780,22 +2783,23 @@ CanType ASTMangler::getDeclTypeForMangling(
2780
2783
return canTy;
2781
2784
}
2782
2785
2783
- void ASTMangler::appendDeclType (const ValueDecl *decl, bool isFunctionMangling) {
2786
+ void ASTMangler::appendDeclType (const ValueDecl *decl,
2787
+ FunctionManglingKind functionMangling) {
2784
2788
Mod = decl->getModuleContext ();
2785
2789
GenericSignature genericSig;
2786
2790
GenericSignature parentGenericSig;
2787
2791
auto type = getDeclTypeForMangling (decl, genericSig, parentGenericSig);
2788
2792
2789
2793
if (AnyFunctionType *FuncTy = type->getAs <AnyFunctionType>()) {
2790
- appendFunction (FuncTy, isFunctionMangling , decl);
2794
+ appendFunction (FuncTy, functionMangling , decl);
2791
2795
} else {
2792
2796
appendType (type, decl);
2793
2797
}
2794
2798
2795
2799
// Mangle the generic signature, if any.
2796
2800
if (genericSig && appendGenericSignature (genericSig, parentGenericSig)) {
2797
2801
// The 'F' function mangling doesn't need a 'u' for its generic signature.
2798
- if (!isFunctionMangling )
2802
+ if (functionMangling == NoFunctionMangling )
2799
2803
appendOperator (" u" );
2800
2804
}
2801
2805
}
@@ -2870,7 +2874,7 @@ void ASTMangler::appendEntity(const ValueDecl *decl, StringRef EntityOp,
2870
2874
appendOperator (" Z" );
2871
2875
}
2872
2876
2873
- void ASTMangler::appendEntity (const ValueDecl *decl) {
2877
+ void ASTMangler::appendEntity (const ValueDecl *decl, bool isAsyncHandlerBody ) {
2874
2878
assert (!isa<ConstructorDecl>(decl));
2875
2879
assert (!isa<DestructorDecl>(decl));
2876
2880
@@ -2891,7 +2895,8 @@ void ASTMangler::appendEntity(const ValueDecl *decl) {
2891
2895
2892
2896
appendContextOf (decl);
2893
2897
appendDeclName (decl);
2894
- appendDeclType (decl, /* isFunctionMangling*/ true );
2898
+ appendDeclType (decl, isAsyncHandlerBody ? AsyncHandlerBodyMangling
2899
+ : FunctionMangling);
2895
2900
appendOperator (" F" );
2896
2901
if (decl->isStatic ())
2897
2902
appendOperator (" Z" );
0 commit comments