Skip to content

Commit b31133e

Browse files
committed
Ensure that freestanding macros get consistent discriminators
Due to the duality between the expression and declaration forms of freestanding macros, we could end up assigning two different discriminators to what is effectively the same freestanding macro expansion. Across different source files, this could lead to inconsistent discriminators in different translation units. Unify the storage of the discriminator to avoid this issue. Fixes rdar://116259748
1 parent ac465ea commit b31133e

File tree

9 files changed

+48
-86
lines changed

9 files changed

+48
-86
lines changed

include/swift/AST/Decl.h

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -792,10 +792,6 @@ class alignas(1 << DeclAlignInBits) Decl : public ASTAllocated<Decl> {
792792
NumberOfVTableEntries : 2
793793
);
794794

795-
SWIFT_INLINE_BITFIELD(MacroExpansionDecl, Decl, 16,
796-
Discriminator : 16
797-
);
798-
799795
} Bits;
800796
// Turn back on clang-format now that we have defined our inline bitfields.
801797
// clang-format on
@@ -9008,8 +9004,6 @@ class MacroDecl : public GenericContext, public ValueDecl {
90089004
class MacroExpansionDecl : public Decl, public FreestandingMacroExpansion {
90099005

90109006
public:
9011-
enum : unsigned { InvalidDiscriminator = 0xFFFF };
9012-
90139007
MacroExpansionDecl(DeclContext *dc, MacroExpansionInfo *info);
90149008

90159009
static MacroExpansionDecl *create(DeclContext *dc, SourceLoc poundLoc,
@@ -9029,24 +9023,6 @@ class MacroExpansionDecl : public Decl, public FreestandingMacroExpansion {
90299023
/// Enumerate the nodes produced by expanding this macro expansion.
90309024
void forEachExpandedNode(llvm::function_ref<void(ASTNode)> callback) const;
90319025

9032-
/// Returns a discriminator which determines this macro expansion's index
9033-
/// in the sequence of macro expansions within the current function.
9034-
unsigned getDiscriminator() const;
9035-
9036-
/// Retrieve the raw discriminator, which may not have been computed yet.
9037-
///
9038-
/// Only use this for queries that are checking for (e.g.) reentrancy or
9039-
/// intentionally do not want to initiate verification.
9040-
unsigned getRawDiscriminator() const {
9041-
return Bits.MacroExpansionDecl.Discriminator;
9042-
}
9043-
9044-
void setDiscriminator(unsigned discriminator) {
9045-
assert(getRawDiscriminator() == InvalidDiscriminator);
9046-
assert(discriminator != InvalidDiscriminator);
9047-
Bits.MacroExpansionDecl.Discriminator = discriminator;
9048-
}
9049-
90509026
static bool classof(const Decl *D) {
90519027
return D->getKind() == DeclKind::MacroExpansion;
90529028
}

include/swift/AST/Expr.h

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -369,11 +369,6 @@ class alignas(8) Expr : public ASTAllocated<Expr> {
369369
NumElements : 32
370370
);
371371

372-
SWIFT_INLINE_BITFIELD(MacroExpansionExpr, Expr, (16-NumExprBits)+16,
373-
: 16 - NumExprBits, // Align and leave room for subclasses
374-
Discriminator : 16
375-
);
376-
377372
} Bits;
378373
// clang-format on
379374

@@ -6309,7 +6304,6 @@ class MacroExpansionExpr final : public Expr,
63096304
: Expr(ExprKind::MacroExpansion, isImplicit, ty),
63106305
FreestandingMacroExpansion(FreestandingMacroKind::Expr, info), DC(dc),
63116306
Rewritten(nullptr), Roles(roles), SubstituteDecl(nullptr) {
6312-
Bits.MacroExpansionExpr.Discriminator = InvalidDiscriminator;
63136307
}
63146308

63156309
static MacroExpansionExpr *
@@ -6333,24 +6327,6 @@ class MacroExpansionExpr final : public Expr,
63336327
DeclContext *getDeclContext() const { return DC; }
63346328
void setDeclContext(DeclContext *dc) { DC = dc; }
63356329

6336-
/// Returns a discriminator which determines this macro expansion's index
6337-
/// in the sequence of macro expansions within the current function.
6338-
unsigned getDiscriminator() const;
6339-
6340-
/// Retrieve the raw discriminator, which may not have been computed yet.
6341-
///
6342-
/// Only use this for queries that are checking for (e.g.) reentrancy or
6343-
/// intentionally do not want to initiate verification.
6344-
unsigned getRawDiscriminator() const {
6345-
return Bits.MacroExpansionExpr.Discriminator;
6346-
}
6347-
6348-
void setDiscriminator(unsigned discriminator) {
6349-
assert(getRawDiscriminator() == InvalidDiscriminator);
6350-
assert(discriminator != InvalidDiscriminator);
6351-
Bits.MacroExpansionExpr.Discriminator = discriminator;
6352-
}
6353-
63546330
SourceRange getSourceRange() const {
63556331
return getExpansionInfo()->getSourceRange();
63566332
}

include/swift/AST/FreestandingMacroExpansion.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ struct MacroExpansionInfo : ASTAllocated<MacroExpansionInfo> {
4545
/// The referenced macro.
4646
ConcreteDeclRef macroRef;
4747

48+
enum : unsigned { InvalidDiscriminator = 0xFFFF };
49+
50+
unsigned Discriminator = InvalidDiscriminator;
51+
4852
MacroExpansionInfo(SourceLoc sigilLoc, DeclNameRef moduleName,
4953
DeclNameLoc moduleNameLoc, DeclNameRef macroName,
5054
DeclNameLoc macroNameLoc, SourceLoc leftAngleLoc,
@@ -71,12 +75,12 @@ enum class FreestandingMacroKind {
7175
/// A base class of either 'MacroExpansionExpr' or 'MacroExpansionDecl'.
7276
class FreestandingMacroExpansion {
7377
llvm::PointerIntPair<MacroExpansionInfo *, 1, FreestandingMacroKind>
74-
infoAndKind;
78+
infoAndKind;
7579

7680
protected:
7781
FreestandingMacroExpansion(FreestandingMacroKind kind,
7882
MacroExpansionInfo *info)
79-
: infoAndKind(info, kind) {}
83+
: infoAndKind(info, kind) {}
8084

8185
public:
8286
MacroExpansionInfo *getExpansionInfo() const {
@@ -114,7 +118,13 @@ class FreestandingMacroExpansion {
114118

115119
DeclContext *getDeclContext() const;
116120
SourceRange getSourceRange() const;
121+
122+
/// Returns a discriminator which determines this macro expansion's index
123+
/// in the sequence of macro expansions within the current context.
117124
unsigned getDiscriminator() const;
125+
126+
/// Returns the raw discriminator, for debugging purposes only.
127+
unsigned getRawDiscriminator() const;
118128
};
119129

120130
} // namespace swift

lib/AST/Decl.cpp

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11680,7 +11680,6 @@ MacroExpansionDecl::MacroExpansionDecl(DeclContext *dc,
1168011680
MacroExpansionInfo *info)
1168111681
: Decl(DeclKind::MacroExpansion, dc),
1168211682
FreestandingMacroExpansion(FreestandingMacroKind::Decl, info) {
11683-
Bits.MacroExpansionDecl.Discriminator = InvalidDiscriminator;
1168411683
}
1168511684

1168611685
MacroExpansionDecl *
@@ -11704,23 +11703,6 @@ MacroExpansionDecl::create(
1170411703
return new (ctx) MacroExpansionDecl(dc, info);
1170511704
}
1170611705

11707-
unsigned MacroExpansionDecl::getDiscriminator() const {
11708-
if (getRawDiscriminator() != InvalidDiscriminator)
11709-
return getRawDiscriminator();
11710-
11711-
auto mutableThis = const_cast<MacroExpansionDecl *>(this);
11712-
auto dc = getDeclContext();
11713-
ASTContext &ctx = dc->getASTContext();
11714-
auto discriminatorContext =
11715-
MacroDiscriminatorContext::getParentOf(mutableThis);
11716-
mutableThis->setDiscriminator(
11717-
ctx.getNextMacroDiscriminator(
11718-
discriminatorContext, getMacroName().getBaseName()));
11719-
11720-
assert(getRawDiscriminator() != InvalidDiscriminator);
11721-
return getRawDiscriminator();
11722-
}
11723-
1172411706
void MacroExpansionDecl::forEachExpandedNode(
1172511707
llvm::function_ref<void(ASTNode)> callback
1172611708
) const {

lib/AST/Expr.cpp

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2786,23 +2786,6 @@ MacroExpansionExpr *MacroExpansionExpr::create(
27862786
return new (ctx) MacroExpansionExpr(dc, info, roles, isImplicit, ty);
27872787
}
27882788

2789-
unsigned MacroExpansionExpr::getDiscriminator() const {
2790-
if (getRawDiscriminator() != InvalidDiscriminator)
2791-
return getRawDiscriminator();
2792-
2793-
auto mutableThis = const_cast<MacroExpansionExpr *>(this);
2794-
auto dc = getDeclContext();
2795-
ASTContext &ctx = dc->getASTContext();
2796-
auto discriminatorContext =
2797-
MacroDiscriminatorContext::getParentOf(mutableThis);
2798-
mutableThis->setDiscriminator(
2799-
ctx.getNextMacroDiscriminator(
2800-
discriminatorContext, getMacroName().getBaseName()));
2801-
2802-
assert(getRawDiscriminator() != InvalidDiscriminator);
2803-
return getRawDiscriminator();
2804-
}
2805-
28062789
MacroExpansionDecl *MacroExpansionExpr::createSubstituteDecl() {
28072790
auto dc = DC;
28082791
if (auto *tlcd = dyn_cast_or_null<TopLevelCodeDecl>(dc->getAsDecl()))

lib/AST/FreestandingMacroExpansion.cpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
#include "swift/AST/FreestandingMacroExpansion.h"
14+
#include "swift/AST/ASTContext.h"
1415
#include "swift/AST/Decl.h"
1516
#include "swift/AST/Expr.h"
17+
#include "swift/AST/MacroDiscriminatorContext.h"
1618

1719
using namespace swift;
1820

@@ -43,7 +45,24 @@ SourceRange FreestandingMacroExpansion::getSourceRange() const {
4345
FORWARD_VARIANT(getSourceRange);
4446
}
4547
unsigned FreestandingMacroExpansion::getDiscriminator() const {
46-
FORWARD_VARIANT(getDiscriminator);
48+
auto info = getExpansionInfo();
49+
if (info->Discriminator != MacroExpansionInfo::InvalidDiscriminator)
50+
return info->Discriminator;
51+
52+
auto mutableThis = const_cast<FreestandingMacroExpansion *>(this);
53+
auto dc = getDeclContext();
54+
ASTContext &ctx = dc->getASTContext();
55+
auto discriminatorContext =
56+
MacroDiscriminatorContext::getParentOf(mutableThis);
57+
info->Discriminator = ctx.getNextMacroDiscriminator(
58+
discriminatorContext, getMacroName().getBaseName());
59+
60+
assert(info->Discriminator != MacroExpansionInfo::InvalidDiscriminator);
61+
return info->Discriminator;
62+
}
63+
64+
unsigned FreestandingMacroExpansion::getRawDiscriminator() const {
65+
return getExpansionInfo()->Discriminator;
4766
}
4867

4968
ASTNode FreestandingMacroExpansion::getASTNode() {

test/Macros/Inputs/AnonTypes1.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#anonymousTypes(public: true) { "hello" }

test/Macros/Inputs/AnonTypes2.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#anonymousTypes(public: true) { "hello" }
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// REQUIRES: swift_swift_parser, executable_test
2+
3+
// RUN: %empty-directory(%t)
4+
// RUN: %host-build-swift -swift-version 5 -emit-library -o %t/%target-library-name(MacroDefinition) -module-name=MacroDefinition %S/Inputs/syntax_macro_definitions.swift
5+
6+
@freestanding(declaration)
7+
macro anonymousTypes(public: Bool, _: () -> String) = #externalMacro(module: "MacroDefinition", type: "DefineAnonymousTypesMacro")
8+
9+
// RUN: %target-swift-frontend -swift-version 5 -emit-ir -load-plugin-library %t/%target-library-name(MacroDefinition) -module-name MacroUser %S/Inputs/AnonTypes1.swift %S/Inputs/AnonTypes2.swift %s -o - -g | %FileCheck --check-prefix CHECK-IR %s
10+
11+
// CHECK-IR: $s9MacroUser33{{.*}}14anonymousTypesfMf_4namefMu_
12+
// CHECK-IR-NOT: $s9MacroUser33{{.*}}14anonymousTypesfMf0_4namefMu_
13+
// CHECK-IR: $s9MacroUser33{{.*}}14anonymousTypesfMf_4namefMu_
14+
// CHECK-IR: $s9MacroUser33{{.*}}14anonymousTypesfMf0_4namefMu_

0 commit comments

Comments
 (0)