[Macros] Private discriminators for outermost-private MacroExpansionDecl (#64813)

Add a private discriminator to the mangling of an outermost-private `MacroExpansionDecl` so that declaration macros in different files won't have colliding macro expansion buffer names.

rdar://107462515
This commit is contained in:
Richard Wei
2023-03-31 20:36:29 -07:00
committed by GitHub
parent 77bd312a88
commit eb8e984b97
24 changed files with 84 additions and 49 deletions

View File

@@ -1968,7 +1968,7 @@ void Serializer::writeCrossReference(const DeclContext *DC, uint32_t pathLen) {
Identifier discriminator;
if (generic->isOutermostPrivateOrFilePrivateScope()) {
auto *containingFile = cast<FileUnit>(generic->getModuleScopeContext());
discriminator = containingFile->getDiscriminatorForPrivateValue(generic);
discriminator = containingFile->getDiscriminatorForPrivateDecl(generic);
}
bool isProtocolExt = DC->getParent()->getExtendedProtocolDecl();
@@ -2144,7 +2144,7 @@ void Serializer::writeCrossReference(const Decl *D) {
if (type->isOutermostPrivateOrFilePrivateScope()) {
auto *containingFile =
cast<FileUnit>(type->getDeclContext()->getModuleScopeContext());
discriminator = containingFile->getDiscriminatorForPrivateValue(type);
discriminator = containingFile->getDiscriminatorForPrivateDecl(type);
}
XRefTypePathPieceLayout::emitRecord(Out, ScratchRecord, abbrCode,
@@ -3057,7 +3057,7 @@ class Serializer::DeclSerializer : public DeclVisitor<DeclSerializer> {
if (auto *enclosingFile = dyn_cast<FileUnit>(topLevelSubcontext)) {
if (shouldEmitPrivateDiscriminator) {
Identifier discriminator =
enclosingFile->getDiscriminatorForPrivateValue(value);
enclosingFile->getDiscriminatorForPrivateDecl(value);
unsigned abbrCode =
S.DeclTypeAbbrCodes[PrivateDiscriminatorLayout::Code];
PrivateDiscriminatorLayout::emitRecord(