@@ -3845,6 +3845,8 @@ std::string ASTMangler::mangleRuntimeAttributeGeneratorEntity(
38453845void ASTMangler::appendMacroExpansionContext (
38463846 SourceLoc loc, DeclContext *origDC
38473847) {
3848+ origDC = MacroDiscriminatorContext::getInnermostMacroContext (origDC);
3849+
38483850 if (loc.isInvalid ())
38493851 return appendContext (origDC, StringRef ());
38503852
@@ -3992,10 +3994,41 @@ void ASTMangler::appendMacroExpansionOperator(
39923994 }
39933995}
39943996
3997+ static StringRef getPrivateDiscriminatorIfNecessary (
3998+ const MacroExpansionExpr *expansion) {
3999+ auto dc = MacroDiscriminatorContext::getInnermostMacroContext (
4000+ expansion->getDeclContext ());
4001+ auto decl = dc->getAsDecl ();
4002+ if (decl && !decl->isOutermostPrivateOrFilePrivateScope ())
4003+ return StringRef ();
4004+
4005+ // Mangle non-local private declarations with a textual discriminator
4006+ // based on their enclosing file.
4007+ auto topLevelSubcontext = dc->getModuleScopeContext ();
4008+ SourceFile *sf = dyn_cast<SourceFile>(topLevelSubcontext);
4009+ if (!sf)
4010+ return StringRef ();
4011+
4012+ Identifier discriminator =
4013+ sf->getPrivateDiscriminator (/* createIfMissing=*/ true );
4014+ assert (!discriminator.empty ());
4015+ assert (!isNonAscii (discriminator.str ()) &&
4016+ " discriminator contains non-ASCII characters" );
4017+ (void )&isNonAscii;
4018+ assert (!clang::isDigit (discriminator.str ().front ()) &&
4019+ " not a valid identifier" );
4020+ return discriminator.str ();
4021+ }
4022+
39954023std::string ASTMangler::mangleMacroExpansion (
39964024 const MacroExpansionExpr *expansion) {
39974025 beginMangling ();
39984026 appendMacroExpansionContext (expansion->getLoc (), expansion->getDeclContext ());
4027+ auto privateDiscriminator = getPrivateDiscriminatorIfNecessary (expansion);
4028+ if (!privateDiscriminator.empty ()) {
4029+ appendIdentifier (privateDiscriminator);
4030+ appendOperator (" Ll" );
4031+ }
39994032 appendMacroExpansionOperator (
40004033 expansion->getMacroName ().getBaseName ().userFacingName (),
40014034 MacroRole::Expression,
0 commit comments