Skip to content

Commit d5fecf1

Browse files
authored
Merge pull request #79976 from tshortli/unique-custom-availability-domains
AST: Unique `CustomAvailabilityDomain` instances
2 parents c4a472e + 5429860 commit d5fecf1

File tree

6 files changed

+52
-17
lines changed

6 files changed

+52
-17
lines changed

include/swift/AST/AvailabilityDomain.h

+17-8
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ class AvailabilityDomain final {
100100
using InlineDomainPtr =
101101
llvm::PointerEmbeddedInt<uint32_t, InlineDomain::ReprBits>;
102102
using Storage =
103-
llvm::PointerUnion<CustomAvailabilityDomain *, InlineDomainPtr>;
103+
llvm::PointerUnion<const CustomAvailabilityDomain *, InlineDomainPtr>;
104104
Storage storage;
105105

106106
AvailabilityDomain(Kind kind)
@@ -111,7 +111,8 @@ class AvailabilityDomain final {
111111
AvailabilityDomain(PlatformKind platform)
112112
: storage(InlineDomain(Kind::Platform, platform).asInteger()) {};
113113

114-
AvailabilityDomain(CustomAvailabilityDomain *domain) : storage(domain) {};
114+
AvailabilityDomain(const CustomAvailabilityDomain *domain)
115+
: storage(domain) {};
115116

116117
AvailabilityDomain(Storage storage) : storage(storage) {};
117118

@@ -122,9 +123,9 @@ class AvailabilityDomain final {
122123
: std::nullopt;
123124
}
124125

125-
CustomAvailabilityDomain *getCustomDomain() const {
126+
const CustomAvailabilityDomain *getCustomDomain() const {
126127
ASSERT(isCustom());
127-
return storage.get<CustomAvailabilityDomain *>();
128+
return storage.get<const CustomAvailabilityDomain *>();
128129
}
129130

130131
public:
@@ -152,7 +153,7 @@ class AvailabilityDomain final {
152153
return AvailabilityDomain(Kind::Embedded);
153154
}
154155

155-
static AvailabilityDomain forCustom(CustomAvailabilityDomain *domain) {
156+
static AvailabilityDomain forCustom(const CustomAvailabilityDomain *domain) {
156157
return AvailabilityDomain(domain);
157158
}
158159

@@ -294,7 +295,7 @@ struct StableAvailabilityDomainComparator {
294295
};
295296

296297
/// Represents an availability domain that has been defined in a module.
297-
class CustomAvailabilityDomain : public ASTAllocated<CustomAvailabilityDomain> {
298+
class CustomAvailabilityDomain : public llvm::FoldingSetNode {
298299
public:
299300
enum class Kind {
300301
/// A domain that is known to be enabled at compile time.
@@ -313,12 +314,20 @@ class CustomAvailabilityDomain : public ASTAllocated<CustomAvailabilityDomain> {
313314
CustomAvailabilityDomain(Identifier name, ModuleDecl *mod, Kind kind);
314315

315316
public:
316-
static CustomAvailabilityDomain *create(const ASTContext &ctx, StringRef name,
317-
ModuleDecl *mod, Kind kind);
317+
static const CustomAvailabilityDomain *get(StringRef name, ModuleDecl *mod,
318+
Kind kind, const ASTContext &ctx);
318319

319320
Identifier getName() const { return name; }
320321
Kind getKind() const { return kind; }
321322
ModuleDecl *getModule() const { return mod; }
323+
324+
/// Uniquing for `ASTContext`.
325+
static void Profile(llvm::FoldingSetNodeID &ID, Identifier name,
326+
ModuleDecl *mod, Kind kind);
327+
328+
void Profile(llvm::FoldingSetNodeID &ID) const {
329+
Profile(ID, name, mod, kind);
330+
}
322331
};
323332

324333
/// Represents either a resolved availability domain or an identifier written

include/swift/AST/Module.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ class ModuleDecl
351351
bool BypassResilience = false;
352352

353353
using AvailabilityDomainMap =
354-
llvm::SmallDenseMap<Identifier, CustomAvailabilityDomain *>;
354+
llvm::SmallDenseMap<Identifier, const CustomAvailabilityDomain *>;
355355
AvailabilityDomainMap AvailabilityDomains;
356356

357357
public:

lib/AST/ASTContext.cpp

+25
Original file line numberDiff line numberDiff line change
@@ -637,6 +637,9 @@ struct ASTContext::Implementation {
637637
/// The set of unique AvailabilityContexts (uniqued by their storage).
638638
llvm::FoldingSet<AvailabilityContext::Storage> AvailabilityContexts;
639639

640+
/// The set of unique custom availability domains.
641+
llvm::FoldingSet<CustomAvailabilityDomain> CustomAvailabilityDomains;
642+
640643
/// A cache of information about whether particular nominal types
641644
/// are representable in a foreign language.
642645
llvm::DenseMap<NominalTypeDecl *, ForeignRepresentationInfo>
@@ -886,6 +889,7 @@ void ASTContext::Implementation::dump(llvm::raw_ostream &os) const {
886889
SIZE(NormalConformances);
887890
SIZE(SelfConformances);
888891
SIZE(AvailabilityContexts);
892+
SIZE(CustomAvailabilityDomains);
889893
SIZE_AND_BYTES(ForeignRepresentableCache);
890894
SIZE(SearchPathsSet);
891895

@@ -5738,6 +5742,27 @@ const AvailabilityContext::Storage *AvailabilityContext::Storage::get(
57385742
return newNode;
57395743
}
57405744

5745+
const CustomAvailabilityDomain *
5746+
CustomAvailabilityDomain::get(StringRef name, ModuleDecl *mod, Kind kind,
5747+
const ASTContext &ctx) {
5748+
auto identifier = ctx.getIdentifier(name);
5749+
llvm::FoldingSetNodeID id;
5750+
CustomAvailabilityDomain::Profile(id, identifier, mod, kind);
5751+
5752+
auto &foldingSet = ctx.getImpl().CustomAvailabilityDomains;
5753+
void *insertPos;
5754+
auto *existing = foldingSet.FindNodeOrInsertPos(id, insertPos);
5755+
if (existing)
5756+
return existing;
5757+
5758+
void *mem = ctx.Allocate(sizeof(CustomAvailabilityDomain),
5759+
alignof(CustomAvailabilityDomain));
5760+
auto *newNode = ::new (mem) CustomAvailabilityDomain(identifier, mod, kind);
5761+
foldingSet.InsertNode(newNode, insertPos);
5762+
5763+
return newNode;
5764+
}
5765+
57415766
void GenericSignatureImpl::Profile(llvm::FoldingSetNodeID &ID,
57425767
ArrayRef<GenericTypeParamType *> genericParams,
57435768
ArrayRef<Requirement> requirements) {

lib/AST/Availability.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -738,7 +738,6 @@ Decl::getAvailableAttrForPlatformIntroduction(bool checkExtension) const {
738738
}
739739

740740
AvailabilityRange AvailabilityInference::availableRange(const Decl *D) {
741-
// ALLANXXX
742741
if (auto attr = D->getAvailableAttrForPlatformIntroduction())
743742
return attr->getIntroducedRange(D->getASTContext())
744743
.value_or(AvailabilityRange::alwaysAvailable());

lib/AST/AvailabilityDomain.cpp

+6-4
Original file line numberDiff line numberDiff line change
@@ -280,10 +280,12 @@ CustomAvailabilityDomain::CustomAvailabilityDomain(Identifier name,
280280
ASSERT(mod);
281281
}
282282

283-
CustomAvailabilityDomain *
284-
CustomAvailabilityDomain::create(const ASTContext &ctx, StringRef name,
285-
ModuleDecl *mod, Kind kind) {
286-
return new (ctx) CustomAvailabilityDomain(ctx.getIdentifier(name), mod, kind);
283+
void CustomAvailabilityDomain::Profile(llvm::FoldingSetNodeID &ID,
284+
Identifier name, ModuleDecl *mod,
285+
Kind kind) {
286+
ID.AddPointer(name.getAsOpaquePointer());
287+
ID.AddPointer(mod);
288+
ID.AddInteger(static_cast<unsigned>(kind));
287289
}
288290

289291
static std::optional<AvailabilityDomain>

lib/Frontend/Frontend.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -1395,11 +1395,11 @@ bool CompilerInstance::createFilesForMainModule(
13951395
static void configureAvailabilityDomains(const ASTContext &ctx,
13961396
const FrontendOptions &opts,
13971397
ModuleDecl *mainModule) {
1398-
llvm::SmallDenseMap<Identifier, CustomAvailabilityDomain *> domainMap;
1398+
llvm::SmallDenseMap<Identifier, const CustomAvailabilityDomain *> domainMap;
13991399
auto createAndInsertDomain = [&](const std::string &name,
14001400
CustomAvailabilityDomain::Kind kind) {
1401-
auto *domain = CustomAvailabilityDomain::create(
1402-
ctx, name, mainModule, CustomAvailabilityDomain::Kind::Enabled);
1401+
auto *domain = CustomAvailabilityDomain::get(
1402+
name, mainModule, CustomAvailabilityDomain::Kind::Enabled, ctx);
14031403
bool inserted = domainMap.insert({domain->getName(), domain}).second;
14041404
ASSERT(inserted); // Domains must be unique.
14051405
};

0 commit comments

Comments
 (0)