@@ -259,16 +259,6 @@ FOR_KNOWN_FOUNDATION_TYPES(CACHE_FOUNDATION_DECL)
259
259
// / Stores information about lazy deserialization of various declarations.
260
260
llvm::DenseMap<const DeclContext *, LazyContextData *> LazyContexts;
261
261
262
- // / Stored generic signature builders for canonical generic signatures.
263
- llvm::DenseMap<GenericSignature *, std::unique_ptr<GenericSignatureBuilder>>
264
- GenericSignatureBuilders;
265
-
266
- // / Canonical generic environments for canonical generic signatures.
267
- // /
268
- // / The keys are the generic signature builders in \c GenericSignatureBuilders.
269
- llvm::DenseMap<GenericSignatureBuilder *, GenericEnvironment *>
270
- CanonicalGenericEnvironments;
271
-
272
262
// / The single-parameter generic signature with no constraints, <T>.
273
263
CanGenericSignature SingleGenericParameterSignature;
274
264
@@ -334,6 +324,19 @@ FOR_KNOWN_FOUNDATION_TYPES(CACHE_FOUNDATION_DECL)
334
324
llvm::FoldingSet<LayoutConstraintInfo> LayoutConstraints;
335
325
llvm::FoldingSet<OpaqueTypeArchetypeType> OpaqueArchetypes;
336
326
327
+ llvm::FoldingSet<GenericSignature> GenericSignatures;
328
+
329
+ // / Stored generic signature builders for canonical generic signatures.
330
+ llvm::DenseMap<GenericSignature *, std::unique_ptr<GenericSignatureBuilder>>
331
+ GenericSignatureBuilders;
332
+
333
+ // / Canonical generic environments for canonical generic signatures.
334
+ // /
335
+ // / The keys are the generic signature builders in
336
+ // / \c GenericSignatureBuilders.
337
+ llvm::DenseMap<GenericSignatureBuilder *, GenericEnvironment *>
338
+ CanonicalGenericEnvironments;
339
+
337
340
// / The set of function types.
338
341
llvm::FoldingSet<FunctionType> FunctionTypes;
339
342
@@ -384,7 +387,6 @@ FOR_KNOWN_FOUNDATION_TYPES(CACHE_FOUNDATION_DECL)
384
387
llvm::FoldingSet<SILBoxType> SILBoxTypes;
385
388
llvm::DenseMap<BuiltinIntegerWidth, BuiltinIntegerType*> IntegerTypes;
386
389
llvm::FoldingSet<BuiltinVectorType> BuiltinVectorTypes;
387
- llvm::FoldingSet<GenericSignature> GenericSignatures;
388
390
llvm::FoldingSet<DeclName::CompoundDeclName> CompoundNames;
389
391
llvm::DenseMap<UUID, OpenedArchetypeType *> OpenedExistentialArchetypes;
390
392
@@ -1506,34 +1508,50 @@ void ASTContext::getVisibleTopLevelClangModules(
1506
1508
collectAllModules (Modules);
1507
1509
}
1508
1510
1511
+ static AllocationArena getArena (GenericSignature *genericSig) {
1512
+ if (!genericSig)
1513
+ return AllocationArena::Permanent;
1514
+
1515
+ if (genericSig->hasTypeVariable ())
1516
+ return AllocationArena::ConstraintSolver;
1517
+
1518
+ return AllocationArena::Permanent;
1519
+ }
1520
+
1509
1521
void ASTContext::registerGenericSignatureBuilder (
1510
1522
GenericSignature *sig,
1511
1523
GenericSignatureBuilder &&builder) {
1512
1524
auto canSig = sig->getCanonicalSignature ();
1513
- auto known = getImpl ().GenericSignatureBuilders .find (canSig);
1514
- if (known != getImpl ().GenericSignatureBuilders .end ()) {
1525
+ auto arena = getArena (sig);
1526
+ auto &genericSignatureBuilders =
1527
+ getImpl ().getArena (arena).GenericSignatureBuilders ;
1528
+ auto known = genericSignatureBuilders.find (canSig);
1529
+ if (known != genericSignatureBuilders.end ()) {
1515
1530
++NumRegisteredGenericSignatureBuildersAlready;
1516
1531
return ;
1517
1532
}
1518
1533
1519
1534
++NumRegisteredGenericSignatureBuilders;
1520
- getImpl (). GenericSignatureBuilders [canSig] =
1535
+ genericSignatureBuilders [canSig] =
1521
1536
llvm::make_unique<GenericSignatureBuilder>(std::move (builder));
1522
1537
}
1523
1538
1524
1539
GenericSignatureBuilder *ASTContext::getOrCreateGenericSignatureBuilder (
1525
1540
CanGenericSignature sig) {
1526
1541
// Check whether we already have a generic signature builder for this
1527
1542
// signature and module.
1528
- auto known = getImpl ().GenericSignatureBuilders .find (sig);
1529
- if (known != getImpl ().GenericSignatureBuilders .end ())
1543
+ auto arena = getArena (sig);
1544
+ auto &genericSignatureBuilders =
1545
+ getImpl ().getArena (arena).GenericSignatureBuilders ;
1546
+ auto known = genericSignatureBuilders.find (sig);
1547
+ if (known != genericSignatureBuilders.end ())
1530
1548
return known->second .get ();
1531
1549
1532
1550
// Create a new generic signature builder with the given signature.
1533
1551
auto builder = new GenericSignatureBuilder (*this );
1534
1552
1535
1553
// Store this generic signature builder (no generic environment yet).
1536
- getImpl (). GenericSignatureBuilders [sig] =
1554
+ genericSignatureBuilders [sig] =
1537
1555
std::unique_ptr<GenericSignatureBuilder>(builder);
1538
1556
1539
1557
builder->addGenericSignature (sig);
@@ -1604,12 +1622,16 @@ GenericSignatureBuilder *ASTContext::getOrCreateGenericSignatureBuilder(
1604
1622
GenericEnvironment *ASTContext::getOrCreateCanonicalGenericEnvironment (
1605
1623
GenericSignatureBuilder *builder,
1606
1624
GenericSignature *sig) {
1607
- auto known = getImpl ().CanonicalGenericEnvironments .find (builder);
1608
- if (known != getImpl ().CanonicalGenericEnvironments .end ())
1625
+ auto arena = getArena (sig);
1626
+ auto &canonicalGenericEnvironments =
1627
+ getImpl ().getArena (arena).CanonicalGenericEnvironments ;
1628
+
1629
+ auto known = canonicalGenericEnvironments.find (builder);
1630
+ if (known != canonicalGenericEnvironments.end ())
1609
1631
return known->second ;
1610
1632
1611
1633
auto env = sig->createGenericEnvironment ();
1612
- getImpl (). CanonicalGenericEnvironments [builder] = env;
1634
+ canonicalGenericEnvironments [builder] = env;
1613
1635
return env;
1614
1636
}
1615
1637
@@ -4608,10 +4630,14 @@ GenericSignature::get(TypeArrayView<GenericTypeParamType> params,
4608
4630
llvm::FoldingSetNodeID ID;
4609
4631
GenericSignature::Profile (ID, params, requirements);
4610
4632
4633
+ auto arena = GenericSignature::hasTypeVariable (requirements)
4634
+ ? AllocationArena::ConstraintSolver
4635
+ : AllocationArena::Permanent;
4636
+
4611
4637
auto &ctx = getASTContext (params, requirements);
4612
4638
void *insertPos;
4613
- if (auto *sig = ctx.getImpl ().GenericSignatures . FindNodeOrInsertPos (ID,
4614
- insertPos)) {
4639
+ if (auto *sig = ctx.getImpl ().getArena (arena). GenericSignatures
4640
+ . FindNodeOrInsertPos (ID, insertPos)) {
4615
4641
if (isKnownCanonical)
4616
4642
sig->CanonicalSignatureOrASTContext = &ctx;
4617
4643
@@ -4624,7 +4650,7 @@ GenericSignature::get(TypeArrayView<GenericTypeParamType> params,
4624
4650
void *mem = ctx.Allocate (bytes, alignof (GenericSignature));
4625
4651
auto newSig = new (mem) GenericSignature (params, requirements,
4626
4652
isKnownCanonical);
4627
- ctx.getImpl ().GenericSignatures .InsertNode (newSig, insertPos);
4653
+ ctx.getImpl ().getArena (arena). GenericSignatures .InsertNode (newSig, insertPos);
4628
4654
return newSig;
4629
4655
}
4630
4656
0 commit comments