Skip to content

Commit 1329f3c

Browse files
committed
[NFC] Lift getGenericEnvironment() into GenericSignature
1 parent 109da00 commit 1329f3c

37 files changed

+88
-113
lines changed

include/swift/AST/GenericSignature.h

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,11 @@ class GenericSignature {
198198

199199
/// Whether this generic signature involves a type variable.
200200
bool hasTypeVariable() const;
201+
202+
/// Returns the generic environment that provides fresh contextual types
203+
/// (archetypes) that correspond to the interface types in this generic
204+
/// signature.
205+
GenericEnvironment *getGenericEnvironment() const;
201206
};
202207

203208
/// A reference to a canonical generic signature.
@@ -317,11 +322,6 @@ class alignas(1 << TypeAlignInBits) GenericSignatureImpl final
317322
/// Retrieve the requirement machine for the given generic signature.
318323
RequirementMachine *getRequirementMachine() const;
319324

320-
/// Returns the generic environment that provides fresh contextual types
321-
/// (archetypes) that correspond to the interface types in this generic
322-
/// signature.
323-
GenericEnvironment *getGenericEnvironment() const;
324-
325325
/// Collects a set of requirements on a type parameter. Used by
326326
/// GenericEnvironment for building archetypes.
327327
GenericSignature::LocalRequirements getLocalRequirements(Type depType) const;
@@ -456,6 +456,11 @@ class alignas(1 << TypeAlignInBits) GenericSignatureImpl final
456456

457457
/// Returns the canonical generic signature. The result is cached.
458458
CanGenericSignature getCanonicalSignature() const;
459+
460+
/// Returns the generic environment that provides fresh contextual types
461+
/// (archetypes) that correspond to the interface types in this generic
462+
/// signature.
463+
GenericEnvironment *getGenericEnvironment() const;
459464
};
460465

461466
void simple_display(raw_ostream &out, GenericSignature sig);

lib/AST/ASTContext.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1894,7 +1894,7 @@ GenericSignatureBuilder *ASTContext::getOrCreateGenericSignatureBuilder(
18941894

18951895
RequirementMachine *ASTContext::getOrCreateRequirementMachine(
18961896
CanGenericSignature sig) {
1897-
assert(!sig->hasTypeVariable());
1897+
assert(!sig.hasTypeVariable());
18981898

18991899
auto &rewriteCtx = getImpl().TheRewriteContext;
19001900
if (!rewriteCtx)

lib/AST/Attr.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1800,7 +1800,7 @@ void DifferentiableAttr::setParameterIndices(IndexSubset *paramIndices) {
18001800
GenericEnvironment *DifferentiableAttr::getDerivativeGenericEnvironment(
18011801
AbstractFunctionDecl *original) const {
18021802
if (auto derivativeGenSig = getDerivativeGenericSignature())
1803-
return derivativeGenSig->getGenericEnvironment();
1803+
return derivativeGenSig.getGenericEnvironment();
18041804
return original->getGenericEnvironment();
18051805
}
18061806

lib/AST/Decl.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1001,10 +1001,7 @@ GenericSignature GenericContext::getGenericSignature() const {
10011001
}
10021002

10031003
GenericEnvironment *GenericContext::getGenericEnvironment() const {
1004-
if (auto genericSig = getGenericSignature())
1005-
return genericSig->getGenericEnvironment();
1006-
1007-
return nullptr;
1004+
return getGenericSignature().getGenericEnvironment();
10081005
}
10091006

10101007
void GenericContext::setGenericSignature(GenericSignature genericSig) {

lib/AST/GenericSignature.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,12 @@ CanGenericSignature GenericSignatureImpl::getCanonicalSignature() const {
269269
CanonicalSignatureOrASTContext.get<const GenericSignatureImpl *>());
270270
}
271271

272+
GenericEnvironment *GenericSignature::getGenericEnvironment() const {
273+
if (isNull())
274+
return nullptr;
275+
return getPointer()->getGenericEnvironment();
276+
}
277+
272278
GenericEnvironment *GenericSignatureImpl::getGenericEnvironment() const {
273279
if (GenericEnv == nullptr) {
274280
const auto impl = const_cast<GenericSignatureImpl *>(this);

lib/AST/RequirementEnvironment.cpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -138,12 +138,9 @@ RequirementEnvironment::RequirementEnvironment(
138138
if (!covariantSelf &&
139139
reqSig.getGenericParams().size() == 1 &&
140140
reqSig.getRequirements().size() == 1) {
141-
syntheticSignature = conformanceDC->getGenericSignatureOfContext();
142-
if (syntheticSignature) {
143-
syntheticSignature = syntheticSignature.getCanonicalSignature();
144-
syntheticEnvironment =
145-
syntheticSignature->getGenericEnvironment();
146-
}
141+
syntheticSignature = conformanceDC->getGenericSignatureOfContext().getCanonicalSignature();
142+
syntheticEnvironment =
143+
syntheticSignature.getGenericEnvironment();
147144

148145
return;
149146
}
@@ -217,5 +214,5 @@ RequirementEnvironment::RequirementEnvironment(
217214
AbstractGenericSignatureRequest{
218215
nullptr, std::move(genericParamTypes), std::move(requirements)},
219216
GenericSignature());
220-
syntheticEnvironment = syntheticSignature->getGenericEnvironment();
217+
syntheticEnvironment = syntheticSignature.getGenericEnvironment();
221218
}

lib/AST/RequirementMachine/GenericSignatureQueries.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,7 @@ RequirementMachine::getConformanceAccessPath(Type type,
483483
// visit all of the root conformance requirements in our generic signature and
484484
// add them to the buffer.
485485
if (Impl->ConformanceAccessPaths.empty()) {
486-
for (const auto &req : Impl->Sig->getRequirements()) {
486+
for (const auto &req : Impl->Sig.getRequirements()) {
487487
// We only care about conformance requirements.
488488
if (req.getKind() != RequirementKind::Conformance)
489489
continue;
@@ -680,4 +680,4 @@ RequirementMachine::lookupNestedType(Type depType, Identifier name) const {
680680
}
681681

682682
return nullptr;
683-
}
683+
}

lib/AST/RequirementMachine/RequirementMachine.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ RewriteSystemBuilder::getConcreteSubstitutionSchema(CanType concreteType,
8686
void RewriteSystemBuilder::addGenericSignature(CanGenericSignature sig) {
8787
// Collect all protocols transitively referenced from the generic signature's
8888
// requirements.
89-
Protocols.visitRequirements(sig->getRequirements());
89+
Protocols.visitRequirements(sig.getRequirements());
9090
Protocols.compute();
9191

9292
// Add rewrite rules for each protocol.
@@ -112,7 +112,7 @@ void RewriteSystemBuilder::addGenericSignature(CanGenericSignature sig) {
112112
}
113113

114114
// Add rewrite rules for all requirements in the top-level signature.
115-
for (const auto &req : sig->getRequirements())
115+
for (const auto &req : sig.getRequirements())
116116
addRequirement(req, /*proto=*/nullptr);
117117
}
118118

lib/IRGen/GenKeyPath.cpp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,12 +1185,9 @@ IRGenModule::getAddrOfKeyPathPattern(KeyPathPattern *pattern,
11851185
// Collect the required parameters for the keypath's generic environment.
11861186
SmallVector<GenericRequirement, 4> requirements;
11871187

1188-
GenericEnvironment *genericEnv = nullptr;
1189-
if (auto sig = pattern->getGenericSignature()) {
1190-
genericEnv = sig->getGenericEnvironment();
1191-
enumerateGenericSignatureRequirements(pattern->getGenericSignature(),
1192-
[&](GenericRequirement reqt) { requirements.push_back(reqt); });
1193-
}
1188+
auto *genericEnv = pattern->getGenericSignature().getGenericEnvironment();
1189+
enumerateGenericSignatureRequirements(pattern->getGenericSignature(),
1190+
[&](GenericRequirement reqt) { requirements.push_back(reqt); });
11941191

11951192
// Start building the key path pattern.
11961193
ConstantInitBuilder builder(*this);

lib/IRGen/GenPointerAuth.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -523,18 +523,15 @@ static uint64_t getTypeHash(IRGenModule &IGM, CanSILFunctionType type) {
523523
auto genericSig = type->getInvocationGenericSignature();
524524
hashStringForFunctionType(
525525
IGM, type, Out,
526-
genericSig ? genericSig.getCanonicalSignature()->getGenericEnvironment()
527-
: nullptr);
526+
genericSig.getCanonicalSignature().getGenericEnvironment());
528527
return clang::CodeGen::computeStableStringHash(Out.str());
529528
}
530529

531530
static uint64_t getYieldTypesHash(IRGenModule &IGM, CanSILFunctionType type) {
532531
SmallString<32> buffer;
533532
llvm::raw_svector_ostream out(buffer);
534533
auto genericSig = type->getInvocationGenericSignature();
535-
GenericEnvironment *genericEnv =
536-
genericSig ? genericSig.getCanonicalSignature()->getGenericEnvironment()
537-
: nullptr;
534+
auto *genericEnv = genericSig.getCanonicalSignature().getGenericEnvironment();
538535

539536
out << [&]() -> StringRef {
540537
switch (type->getCoroutineKind()) {

lib/IRGen/GenProto.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ PolymorphicConvention::PolymorphicConvention(IRGenModule &IGM,
236236

237237
void PolymorphicConvention::addPseudogenericFulfillments() {
238238
enumerateRequirements([&](GenericRequirement reqt) {
239-
auto archetype = Generics->getGenericEnvironment()
239+
auto archetype = Generics.getGenericEnvironment()
240240
->mapTypeIntoContext(reqt.TypeParameter)
241241
->getAs<ArchetypeType>();
242242
assert(archetype && "did not get an archetype by mapping param?");

lib/IRGen/GenReflection.cpp

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -229,13 +229,10 @@ getTypeRefByFunction(IRGenModule &IGM,
229229
accessor->setAttributes(IGM.constructInitialAttributes());
230230

231231
SmallVector<GenericRequirement, 4> requirements;
232-
GenericEnvironment *genericEnv = nullptr;
233-
if (sig) {
234-
enumerateGenericSignatureRequirements(sig,
235-
[&](GenericRequirement reqt) { requirements.push_back(reqt); });
236-
genericEnv = sig->getGenericEnvironment();
237-
}
238-
232+
auto *genericEnv = sig.getGenericEnvironment();
233+
enumerateGenericSignatureRequirements(sig,
234+
[&](GenericRequirement reqt) { requirements.push_back(reqt); });
235+
239236
{
240237
IRGenFunction IGF(IGM, accessor);
241238
if (IGM.DebugInfo)
@@ -355,16 +352,12 @@ IRGenModule::emitWitnessTableRefString(CanType type,
355352
= substOpaqueTypesWithUnderlyingTypes(type, conformance);
356353

357354
auto origType = type;
358-
CanGenericSignature genericSig;
359-
SmallVector<GenericRequirement, 4> requirements;
360-
GenericEnvironment *genericEnv = nullptr;
355+
auto genericSig = origGenericSig.getCanonicalSignature();
361356

362-
if (origGenericSig) {
363-
genericSig = origGenericSig.getCanonicalSignature();
364-
enumerateGenericSignatureRequirements(genericSig,
365-
[&](GenericRequirement reqt) { requirements.push_back(reqt); });
366-
genericEnv = genericSig->getGenericEnvironment();
367-
}
357+
SmallVector<GenericRequirement, 4> requirements;
358+
enumerateGenericSignatureRequirements(genericSig,
359+
[&](GenericRequirement reqt) { requirements.push_back(reqt); });
360+
auto *genericEnv = genericSig.getGenericEnvironment();
368361

369362
IRGenMangler mangler;
370363
std::string symbolName =

lib/IRGen/GenType.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1463,7 +1463,7 @@ CanGenericSignature IRGenModule::getCurGenericContext() {
14631463
}
14641464

14651465
GenericEnvironment *TypeConverter::getGenericEnvironment() {
1466-
return CurGenericSignature->getGenericEnvironment();
1466+
return CurGenericSignature.getGenericEnvironment();
14671467
}
14681468

14691469
GenericEnvironment *IRGenModule::getGenericEnvironment() {
@@ -1816,7 +1816,7 @@ ArchetypeType *TypeConverter::getExemplarArchetype(ArchetypeType *t) {
18161816
// Dig out the canonical generic environment.
18171817
auto genericSig = genericEnv->getGenericSignature();
18181818
auto canGenericSig = genericSig.getCanonicalSignature();
1819-
auto canGenericEnv = canGenericSig->getGenericEnvironment();
1819+
auto canGenericEnv = canGenericSig.getGenericEnvironment();
18201820
if (canGenericEnv == genericEnv) return t;
18211821

18221822
// Map the archetype out of its own generic environment and into the
@@ -2567,7 +2567,7 @@ bool TypeConverter::isExemplarArchetype(ArchetypeType *arch) const {
25672567
// Dig out the canonical generic environment.
25682568
auto genericSig = genericEnv->getGenericSignature();
25692569
auto canGenericSig = genericSig.getCanonicalSignature();
2570-
auto canGenericEnv = canGenericSig->getGenericEnvironment();
2570+
auto canGenericEnv = canGenericSig.getGenericEnvironment();
25712571

25722572
// If this archetype is in the canonical generic environment, it's an
25732573
// exemplar archetype.

lib/IRGen/LoadableByAddress.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,7 @@ using namespace swift;
3838
using namespace swift::irgen;
3939

4040
static GenericEnvironment *getSubstGenericEnvironment(CanSILFunctionType fnTy) {
41-
auto sig = fnTy->getSubstGenericSignature();
42-
return sig ? sig->getGenericEnvironment() : nullptr;
41+
return fnTy->getSubstGenericSignature().getGenericEnvironment();
4342
}
4443

4544
static GenericEnvironment *getSubstGenericEnvironment(SILFunction *F) {
@@ -2729,9 +2728,7 @@ bool LoadableByAddress::recreateDifferentiabilityWitnessFunction(
27292728
auto *currIRMod = getIRGenModule()->IRGen.getGenModule(instr->getFunction());
27302729
auto resultFnTy = instr->getType().castTo<SILFunctionType>();
27312730
auto genSig = resultFnTy->getSubstGenericSignature();
2732-
GenericEnvironment *genEnv = nullptr;
2733-
if (genSig)
2734-
genEnv = genSig->getGenericEnvironment();
2731+
auto *genEnv = genSig.getGenericEnvironment();
27352732
auto newResultFnTy =
27362733
MapperCache.getNewSILFunctionType(genEnv, resultFnTy, *currIRMod);
27372734
if (resultFnTy == newResultFnTy)
@@ -2799,9 +2796,9 @@ bool LoadableByAddress::recreateConvInstr(SILInstruction &I,
27992796
if (convInstr->getKind() == SILInstructionKind::DifferentiableFunctionInst ||
28002797
convInstr->getKind() == SILInstructionKind::DifferentiableFunctionExtractInst ||
28012798
convInstr->getKind() == SILInstructionKind::LinearFunctionInst ||
2802-
convInstr->getKind() == SILInstructionKind::LinearFunctionExtractInst)
2803-
if (auto genSig = currSILFunctionType->getSubstGenericSignature())
2804-
genEnv = genSig->getGenericEnvironment();
2799+
convInstr->getKind() == SILInstructionKind::LinearFunctionExtractInst) {
2800+
genEnv = currSILFunctionType->getSubstGenericSignature().getGenericEnvironment();
2801+
}
28052802
CanSILFunctionType newFnType = MapperCache.getNewSILFunctionType(
28062803
genEnv, currSILFunctionType, *currIRMod);
28072804
SILType newType = SILType::getPrimitiveObjectType(newFnType);

lib/SIL/IR/SILFunctionType.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1299,7 +1299,7 @@ class SubstFunctionTypeCollector {
12991299

13001300
// Extract structural substitutions.
13011301
if (origContextType->hasTypeParameter()) {
1302-
origContextType = origSig->getGenericEnvironment()
1302+
origContextType = origSig.getGenericEnvironment()
13031303
->mapTypeIntoContext(origContextType)
13041304
->getCanonicalType();
13051305
}

lib/SIL/IR/TypeLowering.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2731,9 +2731,7 @@ TypeConverter::getConstantGenericSignature(SILDeclRef c) {
27312731

27322732
GenericEnvironment *
27332733
TypeConverter::getConstantGenericEnvironment(SILDeclRef c) {
2734-
if (auto sig = getConstantGenericSignature(c))
2735-
return sig->getGenericEnvironment();
2736-
return nullptr;
2734+
return getConstantGenericSignature(c).getGenericEnvironment();
27372735
}
27382736

27392737
SILType TypeConverter::getSubstitutedStorageType(TypeExpansionContext context,
@@ -3415,7 +3413,7 @@ TypeConverter::getInterfaceBoxTypeForCapture(ValueDecl *captured,
34153413
auto loweredContextType = loweredInterfaceType;
34163414
auto contextBoxTy = boxTy;
34173415
if (signature) {
3418-
auto env = signature->getGenericEnvironment();
3416+
auto env = signature.getGenericEnvironment();
34193417
loweredContextType = env->mapTypeIntoContext(loweredContextType)
34203418
->getCanonicalType();
34213419
contextBoxTy = cast<SILBoxType>(

lib/SIL/Utils/GenericSpecializationMangler.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ getSubstitutionMapForPrespecialization(GenericSignature genericSig,
127127
GenericSignature specSig) {
128128
auto CalleeGenericSig = genericSig;
129129
auto SpecializedGenericSig = specSig;
130-
auto SpecializedGenericEnv = specSig->getGenericEnvironment();
130+
auto SpecializedGenericEnv = specSig.getGenericEnvironment();
131131

132132
auto CalleeInterfaceToSpecializedInterfaceMap = SubstitutionMap::get(
133133
CalleeGenericSig,

lib/SILGen/ResultPlan.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,8 @@ class ForeignAsyncInitializationPlan final : public ResultPlan {
525525
impFnTy = cast<SILFunctionType>(impTy.getASTType());
526526
}
527527
auto env = SGF.F.getGenericEnvironment();
528-
auto sig = env->getGenericSignature().getCanonicalSignature();
528+
auto sig = env ? env->getGenericSignature().getCanonicalSignature()
529+
: CanGenericSignature();
529530
SILFunction *impl = SGF.SGM
530531
.getOrCreateForeignAsyncCompletionHandlerImplFunction(
531532
cast<SILFunctionType>(impFnTy->mapTypeOutOfContext()

lib/SILGen/SILGen.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -534,7 +534,7 @@ SILGenModule::getKeyPathProjectionCoroutine(bool isReadAccess,
534534
SubstitutionMap(),
535535
getASTContext());
536536

537-
auto env = sig->getGenericEnvironment();
537+
auto env = sig.getGenericEnvironment();
538538

539539
SILGenFunctionBuilder builder(*this);
540540
fn = builder.createFunction(SILLinkage::PublicExternal,

lib/SILGen/SILGenPoly.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3059,7 +3059,7 @@ buildThunkSignature(SILGenFunction &SGF,
30593059
AbstractGenericSignatureRequest{
30603060
baseGenericSig.getPointer(), { newGenericParam }, { newRequirement }},
30613061
GenericSignature());
3062-
genericEnv = genericSig->getGenericEnvironment();
3062+
genericEnv = genericSig.getGenericEnvironment();
30633063

30643064
newArchetype = genericEnv->mapTypeIntoContext(newGenericParam)
30653065
->castTo<ArchetypeType>();
@@ -3938,10 +3938,7 @@ SILFunction *SILGenModule::getOrCreateCustomDerivativeThunk(
39383938
SILFunction *customDerivativeFn, const AutoDiffConfig &config,
39393939
AutoDiffDerivativeFunctionKind kind) {
39403940
auto customDerivativeFnTy = customDerivativeFn->getLoweredFunctionType();
3941-
auto *thunkGenericEnv = customDerivativeFnTy->getSubstGenericSignature()
3942-
? customDerivativeFnTy->getSubstGenericSignature()
3943-
->getGenericEnvironment()
3944-
: nullptr;
3941+
auto *thunkGenericEnv = customDerivativeFnTy->getSubstGenericSignature().getGenericEnvironment();
39453942

39463943
auto origFnTy = originalFn->getLoweredFunctionType();
39473944
auto derivativeCanGenSig = config.derivativeGenericSignature.getCanonicalSignature();

lib/SILGen/SILGenThunk.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -246,8 +246,7 @@ SILGenModule::getOrCreateForeignAsyncCompletionHandlerImplFunction(
246246

247247
if (F->empty()) {
248248
// Emit the implementation.
249-
if (sig)
250-
F->setGenericEnvironment(sig->getGenericEnvironment());
249+
F->setGenericEnvironment(sig.getGenericEnvironment());
251250

252251
SILGenFunction SGF(*this, *F, SwiftModule);
253252
{
@@ -508,8 +507,7 @@ SILFunction *SILGenModule::getOrCreateDerivativeVTableThunk(
508507
if (!thunk->empty())
509508
return thunk;
510509

511-
if (auto genSig = constantTy->getSubstGenericSignature())
512-
thunk->setGenericEnvironment(genSig->getGenericEnvironment());
510+
thunk->setGenericEnvironment(constantTy->getSubstGenericSignature().getGenericEnvironment());
513511
SILGenFunction SGF(*this, *thunk, SwiftModule);
514512
SmallVector<ManagedValue, 4> params;
515513
auto loc = derivativeFnDeclRef.getAsRegularLocation();

lib/SILGen/SILGenType.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,9 +184,7 @@ SILGenModule::emitVTableMethod(ClassDecl *theClass,
184184
if (auto existingThunk = M.lookUpFunction(name))
185185
return SILVTable::Entry(base, existingThunk, implKind, false);
186186

187-
GenericEnvironment *genericEnv = nullptr;
188-
if (auto genericSig = overrideInfo.FormalType.getOptGenericSignature())
189-
genericEnv = genericSig->getGenericEnvironment();
187+
auto *genericEnv = overrideInfo.FormalType.getOptGenericSignature().getGenericEnvironment();
190188

191189
// Emit the thunk.
192190
SILLocation loc(derivedDecl);

0 commit comments

Comments
 (0)