Skip to content

Commit 9481130

Browse files
authored
Merge pull request #39826 from slavapestov/encapsulate-gsb
Refactor remaining non-request usages of the GenericSignatureBuilder
2 parents 5e2a5cb + a9794dc commit 9481130

File tree

13 files changed

+116
-190
lines changed

13 files changed

+116
-190
lines changed

include/swift/AST/GenericParamList.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,8 +203,6 @@ class RequirementRepr {
203203
void print(ASTPrinter &Printer) const;
204204
};
205205

206-
using GenericParamSource = PointerUnion<GenericContext *, GenericParamList *>;
207-
208206
/// GenericParamList - A list of generic parameters that is part of a generic
209207
/// function or type, along with extra requirements placed on those generic
210208
/// parameters and types derived from them.

include/swift/AST/TypeCheckRequests.h

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,8 @@ struct WhereClauseOwner {
459459
SpecializeAttr *, DifferentiableAttr *>
460460
source;
461461

462+
WhereClauseOwner() : dc(nullptr) {}
463+
462464
WhereClauseOwner(GenericContext *genCtx);
463465
WhereClauseOwner(AssociatedTypeDecl *atd);
464466

@@ -480,6 +482,10 @@ struct WhereClauseOwner {
480482
return llvm::hash_value(owner.source.getOpaqueValue());
481483
}
482484

485+
operator bool() const {
486+
return dc != nullptr;
487+
}
488+
483489
friend bool operator==(const WhereClauseOwner &lhs,
484490
const WhereClauseOwner &rhs) {
485491
return lhs.source.getOpaqueValue() == rhs.source.getOpaqueValue();
@@ -1437,11 +1443,12 @@ class AbstractGenericSignatureRequest :
14371443
class InferredGenericSignatureRequest :
14381444
public SimpleRequest<InferredGenericSignatureRequest,
14391445
GenericSignature (ModuleDecl *,
1440-
const GenericSignatureImpl *,
1441-
GenericParamSource,
1442-
SmallVector<Requirement, 2>,
1443-
SmallVector<TypeLoc, 2>,
1444-
bool),
1446+
const GenericSignatureImpl *,
1447+
GenericParamList *,
1448+
WhereClauseOwner,
1449+
SmallVector<Requirement, 2>,
1450+
SmallVector<TypeLoc, 2>,
1451+
bool),
14451452
RequestFlags::Cached> {
14461453
public:
14471454
using SimpleRequest::SimpleRequest;
@@ -1452,9 +1459,10 @@ class InferredGenericSignatureRequest :
14521459
// Evaluation.
14531460
GenericSignature
14541461
evaluate(Evaluator &evaluator,
1455-
ModuleDecl *module,
1462+
ModuleDecl *parentModule,
14561463
const GenericSignatureImpl *baseSignature,
1457-
GenericParamSource paramSource,
1464+
GenericParamList *genericParams,
1465+
WhereClauseOwner whereClause,
14581466
SmallVector<Requirement, 2> addedRequirements,
14591467
SmallVector<TypeLoc, 2> inferenceSources,
14601468
bool allowConcreteGenericParams) const;

include/swift/AST/TypeCheckerTypeIDZone.def

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,12 @@ SWIFT_REQUEST(TypeChecker, HasImplementationOnlyImportsRequest,
131131
SWIFT_REQUEST(TypeChecker, ModuleLibraryLevelRequest,
132132
LibraryLevel(ModuleDecl *), Cached, NoLocationInfo)
133133
SWIFT_REQUEST(TypeChecker, InferredGenericSignatureRequest,
134-
GenericSignature (ModuleDecl *, const GenericSignatureImpl *,
135-
GenericParamSource,
136-
SmallVector<Requirement, 2>,
137-
SmallVector<TypeLoc, 2>, bool),
134+
GenericSignature (ModuleDecl *,
135+
const GenericSignatureImpl *,
136+
GenericParamList *,
137+
WhereClauseOwner,
138+
SmallVector<Requirement, 2>,
139+
SmallVector<TypeLoc, 2>, bool),
138140
Cached, NoLocationInfo)
139141
SWIFT_REQUEST(TypeChecker, DistributedModuleIsAvailableRequest,
140142
bool(ModuleDecl *), Cached, NoLocationInfo)

include/swift/SILOptimizer/Analysis/DifferentiableActivityAnalysis.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@
4949
#define SWIFT_SILOPTIMIZER_ANALYSIS_DIFFERENTIABLEACTIVITYANALYSIS_H_
5050

5151
#include "swift/AST/GenericEnvironment.h"
52-
#include "swift/AST/GenericSignatureBuilder.h"
5352
#include "swift/SIL/SILFunction.h"
5453
#include "swift/SIL/SILModule.h"
5554
#include "swift/SIL/SILValue.h"

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8679,9 +8679,11 @@ AbstractGenericSignatureRequest::evaluate(
86798679

86808680
GenericSignature
86818681
InferredGenericSignatureRequest::evaluate(
8682-
Evaluator &evaluator, ModuleDecl *parentModule,
8682+
Evaluator &evaluator,
8683+
ModuleDecl *parentModule,
86838684
const GenericSignatureImpl *parentSig,
8684-
GenericParamSource paramSource,
8685+
GenericParamList *genericParams,
8686+
WhereClauseOwner whereClause,
86858687
SmallVector<Requirement, 2> addedRequirements,
86868688
SmallVector<TypeLoc, 2> inferenceSources,
86878689
bool allowConcreteGenericParams) const {
@@ -8729,12 +8731,6 @@ InferredGenericSignatureRequest::evaluate(
87298731
return false;
87308732
};
87318733

8732-
GenericParamList *genericParams = nullptr;
8733-
if (auto params = paramSource.dyn_cast<GenericParamList *>())
8734-
genericParams = params;
8735-
else
8736-
genericParams = paramSource.get<GenericContext *>()->getGenericParams();
8737-
87388734
if (genericParams) {
87398735
// Extensions never have a parent signature.
87408736
if (genericParams->getOuterParameters())
@@ -8777,15 +8773,10 @@ InferredGenericSignatureRequest::evaluate(
87778773
}
87788774
}
87798775

8780-
if (auto *ctx = paramSource.dyn_cast<GenericContext *>()) {
8781-
// The declaration might have a trailing where clause.
8782-
if (auto *where = ctx->getTrailingWhereClause()) {
8783-
// Determine where and how to perform name lookup.
8784-
lookupDC = ctx;
8785-
8786-
WhereClauseOwner(lookupDC, where).visitRequirements(
8776+
if (whereClause) {
8777+
lookupDC = whereClause.dc;
8778+
std::move(whereClause).visitRequirements(
87878779
TypeResolutionStage::Structural, visitRequirement);
8788-
}
87898780
}
87908781

87918782
/// Perform any remaining requirement inference.

lib/IRGen/GenType.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ namespace llvm {
3434
}
3535

3636
namespace swift {
37-
class GenericSignatureBuilder;
3837
class ArchetypeType;
3938
class CanType;
4039
class ClassDecl;

lib/IRGen/IRGenModule.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ namespace clang {
8585

8686
namespace swift {
8787
class GenericSignature;
88-
class GenericSignatureBuilder;
8988
class AssociatedConformance;
9089
class AssociatedType;
9190
class ASTContext;

lib/SILOptimizer/Differentiation/Thunk.cpp

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@
2020
#include "swift/SILOptimizer/Differentiation/Common.h"
2121

2222
#include "swift/AST/AnyFunctionRef.h"
23-
#include "swift/AST/GenericSignatureBuilder.h"
2423
#include "swift/AST/Requirement.h"
2524
#include "swift/AST/SubstitutionMap.h"
25+
#include "swift/AST/TypeCheckRequests.h"
2626
#include "swift/SILOptimizer/Utils/SILOptFunctionBuilder.h"
2727
#include "swift/SILOptimizer/Utils/DifferentiationMangler.h"
2828

@@ -53,30 +53,26 @@ CanGenericSignature buildThunkSignature(SILFunction *fn, bool inheritGenericSig,
5353
}
5454

5555
auto &ctx = fn->getASTContext();
56-
GenericSignatureBuilder builder(ctx);
5756

5857
// Add the existing generic signature.
58+
GenericSignature baseGenericSig;
5959
int depth = 0;
6060
if (inheritGenericSig) {
61-
if (auto genericSig =
62-
fn->getLoweredFunctionType()->getSubstGenericSignature()) {
63-
builder.addGenericSignature(genericSig);
64-
depth = genericSig.getGenericParams().back()->getDepth() + 1;
65-
}
61+
baseGenericSig = fn->getLoweredFunctionType()->getSubstGenericSignature();
62+
if (baseGenericSig)
63+
depth = baseGenericSig.getGenericParams().back()->getDepth() + 1;
6664
}
6765

6866
// Add a new generic parameter to replace the opened existential.
6967
auto *newGenericParam = GenericTypeParamType::get(depth, 0, ctx);
70-
71-
builder.addGenericParameter(newGenericParam);
7268
Requirement newRequirement(RequirementKind::Conformance, newGenericParam,
7369
openedExistential->getOpenedExistentialType());
74-
auto source =
75-
GenericSignatureBuilder::FloatingRequirementSource::forAbstract();
76-
builder.addRequirement(newRequirement, source, nullptr);
7770

78-
auto genericSig = std::move(builder).computeGenericSignature(
79-
/*allowConcreteGenericParams=*/true);
71+
auto genericSig = evaluateOrDefault(
72+
ctx.evaluator,
73+
AbstractGenericSignatureRequest{
74+
baseGenericSig.getPointer(), { newGenericParam }, { newRequirement }},
75+
GenericSignature());
8076
genericEnv = genericSig.getGenericEnvironment();
8177

8278
newArchetype =

lib/Sema/TypeCheckAttr.cpp

Lines changed: 35 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
#include "swift/AST/DiagnosticsParse.h"
2626
#include "swift/AST/Effects.h"
2727
#include "swift/AST/GenericEnvironment.h"
28-
#include "swift/AST/GenericSignatureBuilder.h"
2928
#include "swift/AST/ImportCache.h"
3029
#include "swift/AST/ModuleNameLookup.h"
3130
#include "swift/AST/NameLookup.h"
@@ -2231,28 +2230,17 @@ void AttributeChecker::visitSpecializeAttr(SpecializeAttr *attr) {
22312230
return;
22322231
}
22332232

2234-
// Form a new generic signature based on the old one.
2235-
GenericSignatureBuilder Builder(D->getASTContext());
2233+
InferredGenericSignatureRequest request{
2234+
DC->getParentModule(),
2235+
genericSig.getPointer(),
2236+
/*genericParams=*/nullptr,
2237+
WhereClauseOwner(FD, attr),
2238+
/*addedRequirements=*/{},
2239+
/*inferenceSources=*/{},
2240+
/*allowConcreteGenericParams=*/true};
22362241

2237-
// First, add the old generic signature.
2238-
Builder.addGenericSignature(genericSig);
2239-
2240-
// Go over the set of requirements, adding them to the builder.
2241-
WhereClauseOwner(FD, attr).visitRequirements(TypeResolutionStage::Interface,
2242-
[&](const Requirement &req, RequirementRepr *reqRepr) {
2243-
// Add the requirement to the generic signature builder.
2244-
using FloatingRequirementSource =
2245-
GenericSignatureBuilder::FloatingRequirementSource;
2246-
Builder.addRequirement(req, reqRepr,
2247-
FloatingRequirementSource::forExplicit(
2248-
reqRepr->getSeparatorLoc()),
2249-
nullptr, DC->getParentModule());
2250-
return false;
2251-
});
2252-
2253-
// Check the result.
2254-
auto specializedSig = std::move(Builder).computeGenericSignature(
2255-
/*allowConcreteGenericParams=*/true);
2242+
auto specializedSig = evaluateOrDefault(Ctx.evaluator, request,
2243+
GenericSignature());
22562244

22572245
// Check the validity of provided requirements.
22582246
checkSpecializeAttrRequirements(attr, genericSig, specializedSig, Ctx);
@@ -4266,7 +4254,8 @@ bool resolveDifferentiableAttrDerivativeGenericSignature(
42664254
// - If the `@differentiable` attribute has a `where` clause, use it to
42674255
// compute the derivative generic signature.
42684256
// - Otherwise, use the original function's generic signature by default.
4269-
derivativeGenSig = original->getGenericSignature();
4257+
auto originalGenSig = original->getGenericSignature();
4258+
derivativeGenSig = originalGenSig;
42704259

42714260
// Handle the `where` clause, if it exists.
42724261
// - Resolve attribute where clause requirements and store in the attribute
@@ -4291,7 +4280,6 @@ bool resolveDifferentiableAttrDerivativeGenericSignature(
42914280
return true;
42924281
}
42934282

4294-
auto originalGenSig = original->getGenericSignature();
42954283
if (!originalGenSig) {
42964284
// `where` clauses are valid only when the original function is generic.
42974285
diags
@@ -4304,51 +4292,34 @@ bool resolveDifferentiableAttrDerivativeGenericSignature(
43044292
return true;
43054293
}
43064294

4307-
// Build a new generic signature for autodiff derivative functions.
4308-
GenericSignatureBuilder builder(ctx);
4309-
// Add the original function's generic signature.
4310-
builder.addGenericSignature(originalGenSig);
4311-
4312-
using FloatingRequirementSource =
4313-
GenericSignatureBuilder::FloatingRequirementSource;
4314-
4315-
bool errorOccurred = false;
4316-
WhereClauseOwner(original, attr)
4317-
.visitRequirements(
4318-
TypeResolutionStage::Structural,
4319-
[&](const Requirement &req, RequirementRepr *reqRepr) {
4320-
switch (req.getKind()) {
4321-
case RequirementKind::SameType:
4322-
case RequirementKind::Superclass:
4323-
case RequirementKind::Conformance:
4324-
break;
4325-
4326-
// Layout requirements are not supported.
4327-
case RequirementKind::Layout:
4328-
diags
4329-
.diagnose(attr->getLocation(),
4330-
diag::differentiable_attr_layout_req_unsupported)
4331-
.highlight(reqRepr->getSourceRange());
4332-
errorOccurred = true;
4333-
return false;
4334-
}
4295+
InferredGenericSignatureRequest request{
4296+
original->getParentModule(),
4297+
originalGenSig.getPointer(),
4298+
/*genericParams=*/nullptr,
4299+
WhereClauseOwner(original, attr),
4300+
/*addedRequirements=*/{},
4301+
/*inferenceSources=*/{},
4302+
/*allowConcreteParams=*/true};
4303+
4304+
// Compute generic signature for derivative functions.
4305+
derivativeGenSig = evaluateOrDefault(ctx.evaluator, request,
4306+
GenericSignature());
43354307

4336-
// Add requirement to generic signature builder.
4337-
builder.addRequirement(
4338-
req, reqRepr, FloatingRequirementSource::forExplicit(
4339-
reqRepr->getSeparatorLoc()),
4340-
nullptr, original->getModuleContext());
4341-
return false;
4342-
});
4308+
bool hadInvalidRequirements = false;
4309+
for (auto req : derivativeGenSig.requirementsNotSatisfiedBy(originalGenSig)) {
4310+
if (req.getKind() == RequirementKind::Layout) {
4311+
// Layout requirements are not supported.
4312+
diags
4313+
.diagnose(attr->getLocation(),
4314+
diag::differentiable_attr_layout_req_unsupported);
4315+
hadInvalidRequirements = true;
4316+
}
4317+
}
43434318

4344-
if (errorOccurred) {
4319+
if (hadInvalidRequirements) {
43454320
attr->setInvalid();
43464321
return true;
43474322
}
4348-
4349-
// Compute generic signature for derivative functions.
4350-
derivativeGenSig = std::move(builder).computeGenericSignature(
4351-
/*allowConcreteGenericParams=*/true);
43524323
}
43534324

43544325
attr->setDerivativeGenericSignature(derivativeGenSig);

0 commit comments

Comments
 (0)