@@ -633,6 +633,7 @@ std::string ASTMangler::mangleTypeForDebugger(Type Ty, GenericSignature sig) {
633
633
" mangling type for debugger" , Ty);
634
634
635
635
DWARFMangling = true ;
636
+ RespectOriginallyDefinedIn = false ;
636
637
OptimizeProtocolNames = false ;
637
638
beginMangling ();
638
639
@@ -651,6 +652,7 @@ std::string ASTMangler::mangleTypeForTypeName(Type type) {
651
652
652
653
std::string ASTMangler::mangleDeclType (const ValueDecl *decl) {
653
654
DWARFMangling = true ;
655
+ RespectOriginallyDefinedIn = false ;
654
656
beginMangling ();
655
657
656
658
appendDeclType (decl);
@@ -742,6 +744,7 @@ std::string ASTMangler::mangleTypeAsContextUSR(const NominalTypeDecl *type) {
742
744
743
745
std::string ASTMangler::mangleTypeAsUSR (Type Ty) {
744
746
DWARFMangling = true ;
747
+ RespectOriginallyDefinedIn = false ;
745
748
beginMangling ();
746
749
747
750
Ty = getTypeForDWARFMangling (Ty);
@@ -758,6 +761,7 @@ std::string ASTMangler::mangleTypeAsUSR(Type Ty) {
758
761
759
762
std::string ASTMangler::mangleAnyDecl (const ValueDecl *Decl, bool prefix) {
760
763
DWARFMangling = true ;
764
+ RespectOriginallyDefinedIn = false ;
761
765
if (prefix) {
762
766
beginMangling ();
763
767
} else {
@@ -1032,6 +1036,14 @@ void ASTMangler::appendOpaqueDeclName(const OpaqueTypeDecl *opaqueDecl) {
1032
1036
if (canSymbolicReference (opaqueDecl)) {
1033
1037
appendSymbolicReference (opaqueDecl);
1034
1038
} else if (auto namingDecl = opaqueDecl->getNamingDecl ()) {
1039
+ // Set this to true temporarily, even if we're doing DWARF
1040
+ // mangling for debug info, where it is false. Otherwise,
1041
+ // the mangled opaque result type name will not be able to
1042
+ // be looked up, since we rely on an exact match with the
1043
+ // ABI name.
1044
+ llvm::SaveAndRestore<bool > savedRespectOriginallyDefinedIn (
1045
+ RespectOriginallyDefinedIn, true );
1046
+
1035
1047
appendEntity (namingDecl);
1036
1048
appendOperator (" QO" );
1037
1049
} else {
@@ -2269,10 +2281,11 @@ void ASTMangler::appendModule(const ModuleDecl *module,
2269
2281
// Use the module real name in mangling; this is the physical name
2270
2282
// of the module on-disk, which can be different if -module-alias is
2271
2283
// used.
2284
+ //
2272
2285
// For example, if a module Foo has 'import Bar', and '-module-alias Bar=Baz'
2273
2286
// was passed, the name 'Baz' will be used for mangling besides loading.
2274
2287
StringRef ModName = module ->getRealName ().str ();
2275
- if (!DWARFMangling &&
2288
+ if (RespectOriginallyDefinedIn &&
2276
2289
module ->getABIName () != module ->getName ()) { // check if the ABI name is set
2277
2290
ModName = module ->getABIName ().str ();
2278
2291
}
@@ -2281,7 +2294,7 @@ void ASTMangler::appendModule(const ModuleDecl *module,
2281
2294
if (ModName == STDLIB_NAME) {
2282
2295
if (useModuleName.empty ()) {
2283
2296
appendOperator (" s" );
2284
- } else if (DWARFMangling ) {
2297
+ } else if (!RespectOriginallyDefinedIn ) {
2285
2298
appendOperator (" s" );
2286
2299
} else {
2287
2300
appendIdentifier (useModuleName);
@@ -2298,11 +2311,11 @@ void ASTMangler::appendModule(const ModuleDecl *module,
2298
2311
return appendOperator (" SC" );
2299
2312
}
2300
2313
2301
- // Enabling DWARFMangling indicate the mangled names are not part of the ABI,
2302
- // probably used by the debugger or IDE (USR). These mangled names will not be
2303
- // demangled successfully if we use the original module name instead of the
2304
- // actual module name.
2305
- if (!useModuleName.empty () && !DWARFMangling )
2314
+ // Disabling RespectOriginallyDefinedIn indicate the mangled names are not part
2315
+ // of the ABI, probably used by the debugger or IDE (USR). These mangled names
2316
+ // will not be demangled successfully if we use the original module name instead
2317
+ // of the actual module name.
2318
+ if (!useModuleName.empty () && RespectOriginallyDefinedIn )
2306
2319
appendIdentifier (useModuleName);
2307
2320
else
2308
2321
appendIdentifier (ModName);
0 commit comments