@@ -245,16 +245,6 @@ FOR_KNOWN_FOUNDATION_TYPES(CACHE_FOUNDATION_DECL)
245
245
// / Stores information about lazy deserialization of various declarations.
246
246
llvm::DenseMap<const DeclContext *, LazyContextData *> LazyContexts;
247
247
248
- // / Stored generic signature builders for canonical generic signatures.
249
- llvm::DenseMap<GenericSignature *, std::unique_ptr<GenericSignatureBuilder>>
250
- GenericSignatureBuilders;
251
-
252
- // / Canonical generic environments for canonical generic signatures.
253
- // /
254
- // / The keys are the generic signature builders in \c GenericSignatureBuilders.
255
- llvm::DenseMap<GenericSignatureBuilder *, GenericEnvironment *>
256
- CanonicalGenericEnvironments;
257
-
258
248
// / The single-parameter generic signature with no constraints, <T>.
259
249
CanGenericSignature SingleGenericParameterSignature;
260
250
@@ -327,6 +317,19 @@ FOR_KNOWN_FOUNDATION_TYPES(CACHE_FOUNDATION_DECL)
327
317
llvm::FoldingSet<LayoutConstraintInfo> LayoutConstraints;
328
318
llvm::FoldingSet<OpaqueTypeArchetypeType> OpaqueArchetypes;
329
319
320
+ llvm::FoldingSet<GenericSignature> GenericSignatures;
321
+
322
+ // / Stored generic signature builders for canonical generic signatures.
323
+ llvm::DenseMap<GenericSignature *, std::unique_ptr<GenericSignatureBuilder>>
324
+ GenericSignatureBuilders;
325
+
326
+ // / Canonical generic environments for canonical generic signatures.
327
+ // /
328
+ // / The keys are the generic signature builders in
329
+ // / \c GenericSignatureBuilders.
330
+ llvm::DenseMap<GenericSignatureBuilder *, GenericEnvironment *>
331
+ CanonicalGenericEnvironments;
332
+
330
333
// / The set of function types.
331
334
llvm::FoldingSet<FunctionType> FunctionTypes;
332
335
@@ -377,7 +380,6 @@ FOR_KNOWN_FOUNDATION_TYPES(CACHE_FOUNDATION_DECL)
377
380
llvm::FoldingSet<SILBoxType> SILBoxTypes;
378
381
llvm::DenseMap<BuiltinIntegerWidth, BuiltinIntegerType*> IntegerTypes;
379
382
llvm::FoldingSet<BuiltinVectorType> BuiltinVectorTypes;
380
- llvm::FoldingSet<GenericSignature> GenericSignatures;
381
383
llvm::FoldingSet<DeclName::CompoundDeclName> CompoundNames;
382
384
llvm::DenseMap<UUID, OpenedArchetypeType *> OpenedExistentialArchetypes;
383
385
@@ -1427,34 +1429,50 @@ void ASTContext::getVisibleTopLevelClangModules(
1427
1429
collectAllModules (Modules);
1428
1430
}
1429
1431
1432
+ static AllocationArena getArena (GenericSignature *genericSig) {
1433
+ if (!genericSig)
1434
+ return AllocationArena::Permanent;
1435
+
1436
+ if (genericSig->hasTypeVariable ())
1437
+ return AllocationArena::ConstraintSolver;
1438
+
1439
+ return AllocationArena::Permanent;
1440
+ }
1441
+
1430
1442
void ASTContext::registerGenericSignatureBuilder (
1431
1443
GenericSignature *sig,
1432
1444
GenericSignatureBuilder &&builder) {
1433
1445
auto canSig = sig->getCanonicalSignature ();
1434
- auto known = getImpl ().GenericSignatureBuilders .find (canSig);
1435
- if (known != getImpl ().GenericSignatureBuilders .end ()) {
1446
+ auto arena = getArena (sig);
1447
+ auto &genericSignatureBuilders =
1448
+ getImpl ().getArena (arena).GenericSignatureBuilders ;
1449
+ auto known = genericSignatureBuilders.find (canSig);
1450
+ if (known != genericSignatureBuilders.end ()) {
1436
1451
++NumRegisteredGenericSignatureBuildersAlready;
1437
1452
return ;
1438
1453
}
1439
1454
1440
1455
++NumRegisteredGenericSignatureBuilders;
1441
- getImpl (). GenericSignatureBuilders [canSig] =
1456
+ genericSignatureBuilders [canSig] =
1442
1457
llvm::make_unique<GenericSignatureBuilder>(std::move (builder));
1443
1458
}
1444
1459
1445
1460
GenericSignatureBuilder *ASTContext::getOrCreateGenericSignatureBuilder (
1446
1461
CanGenericSignature sig) {
1447
1462
// Check whether we already have a generic signature builder for this
1448
1463
// signature and module.
1449
- auto known = getImpl ().GenericSignatureBuilders .find (sig);
1450
- if (known != getImpl ().GenericSignatureBuilders .end ())
1464
+ auto arena = getArena (sig);
1465
+ auto &genericSignatureBuilders =
1466
+ getImpl ().getArena (arena).GenericSignatureBuilders ;
1467
+ auto known = genericSignatureBuilders.find (sig);
1468
+ if (known != genericSignatureBuilders.end ())
1451
1469
return known->second .get ();
1452
1470
1453
1471
// Create a new generic signature builder with the given signature.
1454
1472
auto builder = new GenericSignatureBuilder (*this );
1455
1473
1456
1474
// Store this generic signature builder (no generic environment yet).
1457
- getImpl (). GenericSignatureBuilders [sig] =
1475
+ genericSignatureBuilders [sig] =
1458
1476
std::unique_ptr<GenericSignatureBuilder>(builder);
1459
1477
1460
1478
builder->addGenericSignature (sig);
@@ -1525,12 +1543,16 @@ GenericSignatureBuilder *ASTContext::getOrCreateGenericSignatureBuilder(
1525
1543
GenericEnvironment *ASTContext::getOrCreateCanonicalGenericEnvironment (
1526
1544
GenericSignatureBuilder *builder,
1527
1545
GenericSignature *sig) {
1528
- auto known = getImpl ().CanonicalGenericEnvironments .find (builder);
1529
- if (known != getImpl ().CanonicalGenericEnvironments .end ())
1546
+ auto arena = getArena (sig);
1547
+ auto &canonicalGenericEnvironments =
1548
+ getImpl ().getArena (arena).CanonicalGenericEnvironments ;
1549
+
1550
+ auto known = canonicalGenericEnvironments.find (builder);
1551
+ if (known != canonicalGenericEnvironments.end ())
1530
1552
return known->second ;
1531
1553
1532
1554
auto env = sig->createGenericEnvironment ();
1533
- getImpl (). CanonicalGenericEnvironments [builder] = env;
1555
+ canonicalGenericEnvironments [builder] = env;
1534
1556
return env;
1535
1557
}
1536
1558
@@ -3774,10 +3796,14 @@ GenericSignature::get(TypeArrayView<GenericTypeParamType> params,
3774
3796
llvm::FoldingSetNodeID ID;
3775
3797
GenericSignature::Profile (ID, params, requirements);
3776
3798
3799
+ auto arena = GenericSignature::hasTypeVariable (requirements)
3800
+ ? AllocationArena::ConstraintSolver
3801
+ : AllocationArena::Permanent;
3802
+
3777
3803
auto &ctx = getASTContext (params, requirements);
3778
3804
void *insertPos;
3779
- if (auto *sig = ctx.getImpl ().GenericSignatures . FindNodeOrInsertPos (ID,
3780
- insertPos)) {
3805
+ if (auto *sig = ctx.getImpl ().getArena (arena). GenericSignatures
3806
+ . FindNodeOrInsertPos (ID, insertPos)) {
3781
3807
if (isKnownCanonical)
3782
3808
sig->CanonicalSignatureOrASTContext = &ctx;
3783
3809
@@ -3790,7 +3816,7 @@ GenericSignature::get(TypeArrayView<GenericTypeParamType> params,
3790
3816
void *mem = ctx.Allocate (bytes, alignof (GenericSignature));
3791
3817
auto newSig = new (mem) GenericSignature (params, requirements,
3792
3818
isKnownCanonical);
3793
- ctx.getImpl ().GenericSignatures .InsertNode (newSig, insertPos);
3819
+ ctx.getImpl ().getArena (arena). GenericSignatures .InsertNode (newSig, insertPos);
3794
3820
return newSig;
3795
3821
}
3796
3822
0 commit comments