Skip to content

Commit d185787

Browse files
committed
---
yaml --- r: 343614 b: refs/heads/master-rebranch c: 2656220 h: refs/heads/master
1 parent dfe4bef commit d185787

File tree

8 files changed

+71
-163
lines changed

8 files changed

+71
-163
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1455,7 +1455,7 @@ refs/tags/swift-DEVELOPMENT-SNAPSHOT-2019-08-02-a: ddd2b2976aa9bfde5f20fe37f6bd2
14551455
refs/tags/swift-DEVELOPMENT-SNAPSHOT-2019-08-03-a: 171cc166f2abeb5ca2a4003700a8a78a108bd300
14561456
refs/heads/benlangmuir-patch-1: baaebaf39d52f3bf36710d4fe40cf212e996b212
14571457
refs/heads/i-do-redeclare: 8c4e6d5de5c1e3f0a2cedccf319df713ea22c48e
1458-
refs/heads/master-rebranch: 600a6f37d86c125aad40d010a53e803691a5afbb
1458+
refs/heads/master-rebranch: 26562202220fd1b0c86b9aee53d1b634bd5df860
14591459
refs/heads/rdar-53901732: 9bd06af3284e18a109cdbf9aa59d833b24eeca7b
14601460
refs/heads/revert-26776-subst-always-returns-a-type: 1b8e18fdd391903a348970a4c848995d4cdd789c
14611461
refs/heads/tensorflow-merge: 8b854f62f80d4476cb383d43c4aac2001dde3cec

branches/master-rebranch/lib/Serialization/Deserialization.cpp

Lines changed: 28 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -808,24 +808,10 @@ static void skipGenericRequirements(llvm::BitstreamCursor &Cursor) {
808808
}
809809

810810
void ModuleFile::configureGenericEnvironment(
811-
GenericContext *genericDecl, serialization::GenericSignatureID envID) {
812-
if (envID == 0) return;
813-
814-
auto sigOrEnv = getGenericSignatureOrEnvironment(envID);
815-
816-
// If we just have a generic signature, set up lazy generic environment
817-
// creation.
818-
if (auto genericSig = sigOrEnv.dyn_cast<GenericSignature *>()) {
819-
genericDecl->setLazyGenericEnvironment(this, genericSig, envID);
820-
return;
821-
}
822-
823-
// If we have a full generic environment, it's because it happened to be
824-
// deserialized already. Record it directly.
825-
if (auto genericEnv = sigOrEnv.dyn_cast<GenericEnvironment *>()) {
826-
genericDecl->setGenericEnvironment(genericEnv);
827-
return;
828-
}
811+
GenericContext *genericDecl, serialization::GenericSignatureID sigID) {
812+
if (sigID == 0) return;
813+
auto *genericSig = getGenericSignature(sigID);
814+
genericDecl->setLazyGenericEnvironment(this, genericSig, sigID);
829815
}
830816

831817
GenericSignature *ModuleFile::getGenericSignature(
@@ -835,20 +821,17 @@ GenericSignature *ModuleFile::getGenericSignature(
835821
// Zero is a sentinel for having no generic signature.
836822
if (ID == 0) return nullptr;
837823

838-
assert(ID <= GenericSignaturesAndEnvironments.size() &&
824+
assert(ID <= GenericSignatures.size() &&
839825
"invalid GenericSignature ID");
840-
auto &sigOrEnvOrOffset = GenericSignaturesAndEnvironments[ID-1];
826+
auto &sigOffset = GenericSignatures[ID-1];
841827

842828
// If we've already deserialized this generic signature, return it.
843-
if (sigOrEnvOrOffset.isComplete()) {
844-
if (auto *env = sigOrEnvOrOffset.get().dyn_cast<GenericEnvironment *>())
845-
return env->getGenericSignature();
846-
return sigOrEnvOrOffset.get().get<GenericSignature *>();
847-
}
829+
if (sigOffset.isComplete())
830+
return sigOffset.get();
848831

849832
// Read the generic signature.
850833
BCOffsetRAII restoreOffset(DeclTypeCursor);
851-
DeclTypeCursor.JumpToBit(sigOrEnvOrOffset);
834+
DeclTypeCursor.JumpToBit(sigOffset);
852835

853836
// Read the parameter types.
854837
SmallVector<GenericTypeParamType *, 4> paramTypes;
@@ -909,51 +892,16 @@ GenericSignature *ModuleFile::getGenericSignature(
909892
// If we've already deserialized this generic signature, start over to return
910893
// it directly.
911894
// FIXME: Is this kind of re-entrancy actually possible?
912-
if (sigOrEnvOrOffset.isComplete())
895+
if (sigOffset.isComplete())
913896
return getGenericSignature(ID);
914897

915898
// Construct the generic signature from the loaded parameters and
916899
// requirements.
917900
auto signature = GenericSignature::get(paramTypes, requirements);
918-
sigOrEnvOrOffset = signature;
901+
sigOffset = signature;
919902
return signature;
920903
}
921904

922-
ModuleFile::GenericSignatureOrEnvironment
923-
ModuleFile::getGenericSignatureOrEnvironment(
924-
serialization::GenericSignatureID ID,
925-
bool wantEnvironment) {
926-
// The empty result with the type the caller expects.
927-
GenericSignatureOrEnvironment result;
928-
if (wantEnvironment)
929-
result = static_cast<GenericEnvironment *>(nullptr);
930-
931-
// Zero is a sentinel for having no generic environment.
932-
if (ID == 0) return result;
933-
934-
assert(ID <= GenericSignaturesAndEnvironments.size() &&
935-
"invalid GenericEnvironment ID");
936-
auto &sigOrEnvOrOffset = GenericSignaturesAndEnvironments[ID-1];
937-
938-
if (!sigOrEnvOrOffset.isComplete()) {
939-
// Force the loading process by fetching the generic signature.
940-
(void)getGenericSignature(ID);
941-
assert(sigOrEnvOrOffset.isComplete());
942-
}
943-
944-
if (wantEnvironment)
945-
if (auto *sig = sigOrEnvOrOffset.get().dyn_cast<GenericSignature *>())
946-
sigOrEnvOrOffset.uncheckedOverwrite(sig->getGenericEnvironment());
947-
948-
return sigOrEnvOrOffset.get();
949-
}
950-
951-
GenericEnvironment *
952-
ModuleFile::getGenericEnvironment(serialization::GenericSignatureID ID) {
953-
return getGenericSignatureOrEnvironment(ID, /*wantEnvironment=*/true)
954-
.get<GenericEnvironment *>();
955-
}
956-
957905
SubstitutionMap ModuleFile::getSubstitutionMap(
958906
serialization::SubstitutionMapID id) {
959907
using namespace decls_block;
@@ -3040,16 +2988,16 @@ class swift::DeclDeserializer {
30402988
DeclContextID contextID;
30412989
GenericSignatureID interfaceSigID;
30422990
TypeID interfaceTypeID;
3043-
GenericSignatureID genericEnvID;
2991+
GenericSignatureID genericSigID;
30442992
SubstitutionMapID underlyingTypeID;
30452993

30462994
decls_block::OpaqueTypeLayout::readRecord(scratch, contextID,
30472995
namingDeclID, interfaceSigID,
3048-
interfaceTypeID, genericEnvID,
2996+
interfaceTypeID, genericSigID,
30492997
underlyingTypeID);
30502998

30512999
auto declContext = MF.getDeclContext(contextID);
3052-
auto sig = MF.getGenericSignature(interfaceSigID);
3000+
auto interfaceSig = MF.getGenericSignature(interfaceSigID);
30533001
auto interfaceType = MF.getType(interfaceTypeID)
30543002
->castTo<GenericTypeParamType>();
30553003

@@ -3060,7 +3008,7 @@ class swift::DeclDeserializer {
30603008
// Create the decl.
30613009
auto opaqueDecl =
30623010
new (ctx) OpaqueTypeDecl(nullptr, nullptr, declContext,
3063-
sig, interfaceType);
3011+
interfaceSig, interfaceType);
30643012
declOrOffset = opaqueDecl;
30653013

30663014
auto namingDecl = cast<ValueDecl>(MF.getDecl(namingDeclID));
@@ -3069,14 +3017,15 @@ class swift::DeclDeserializer {
30693017
if (auto genericParams = MF.maybeReadGenericParams(opaqueDecl))
30703018
opaqueDecl->setGenericParams(genericParams);
30713019

3072-
auto genericEnv = MF.getGenericEnvironment(genericEnvID);
3073-
opaqueDecl->setGenericEnvironment(genericEnv);
3020+
auto genericSig = MF.getGenericSignature(genericSigID);
3021+
if (genericSig)
3022+
opaqueDecl->setGenericEnvironment(genericSig->getGenericEnvironment());
30743023
if (underlyingTypeID)
30753024
opaqueDecl->setUnderlyingTypeSubstitutions(
30763025
MF.getSubstitutionMap(underlyingTypeID));
30773026
SubstitutionMap subs;
3078-
if (genericEnv) {
3079-
subs = genericEnv->getGenericSignature()->getIdentitySubstitutionMap();
3027+
if (genericSig) {
3028+
subs = genericSig->getIdentitySubstitutionMap();
30803029
}
30813030
auto opaqueTy = OpaqueTypeArchetypeType::get(opaqueDecl, subs);
30823031
auto metatype = MetatypeType::get(opaqueTy);
@@ -4727,18 +4676,19 @@ class swift::TypeDeserializer {
47274676

47284677
Expected<Type> deserializePrimaryArchetypeType(ArrayRef<uint64_t> scratch,
47294678
StringRef blobData) {
4730-
GenericSignatureID envID;
4679+
GenericSignatureID sigID;
47314680
unsigned depth, index;
47324681

4733-
decls_block::PrimaryArchetypeTypeLayout::readRecord(scratch, envID,
4682+
decls_block::PrimaryArchetypeTypeLayout::readRecord(scratch, sigID,
47344683
depth, index);
47354684

4736-
auto env = MF.getGenericEnvironment(envID);
4737-
if (!env)
4685+
auto sig = MF.getGenericSignature(sigID);
4686+
if (!sig)
47384687
MF.fatal();
47394688

47404689
Type interfaceType = GenericTypeParamType::get(depth, index, ctx);
4741-
Type contextType = env->mapTypeIntoContext(interfaceType);
4690+
Type contextType = sig->getGenericEnvironment()
4691+
->mapTypeIntoContext(interfaceType);
47424692

47434693
if (contextType->hasError())
47444694
MF.fatal();
@@ -4777,18 +4727,7 @@ class swift::TypeDeserializer {
47774727

47784728
auto rootTy = MF.getType(rootID)->castTo<ArchetypeType>();
47794729
auto interfaceTy = MF.getType(interfaceTyID)->castTo<DependentMemberType>();
4780-
auto rootInterfaceTy = interfaceTy->getRootGenericParam();
4781-
4782-
auto sig = rootTy->getGenericEnvironment()->getGenericSignature();
4783-
4784-
auto subs = SubstitutionMap::get(sig,
4785-
[&](SubstitutableType *t) -> Type {
4786-
if (t->isEqual(rootInterfaceTy))
4787-
return rootTy;
4788-
return t;
4789-
}, LookUpConformanceInModule(MF.getAssociatedModule()));
4790-
4791-
return Type(interfaceTy).subst(subs);
4730+
return rootTy->getGenericEnvironment()->mapTypeIntoContext(interfaceTy);
47924731
}
47934732

47944733
Expected<Type> deserializeGenericTypeParamType(ArrayRef<uint64_t> scratch,
@@ -5561,7 +5500,7 @@ void ModuleFile::finishNormalConformance(NormalProtocolConformance *conformance,
55615500

55625501
GenericEnvironment *ModuleFile::loadGenericEnvironment(const DeclContext *decl,
55635502
uint64_t contextData) {
5564-
return getGenericEnvironment(contextData);
5503+
return decl->getGenericSignatureOfContext()->getGenericEnvironment();
55655504
}
55665505

55675506
void ModuleFile::loadRequirementSignature(const ProtocolDecl *decl,

branches/master-rebranch/lib/Serialization/DeserializeSIL.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ SILDeserializer::readSILFunctionChecked(DeclID FID, SILFunction *existingFn,
465465
DeclID clangNodeOwnerID;
466466
TypeID funcTyID;
467467
IdentifierID replacedFunctionID;
468-
GenericSignatureID genericEnvID;
468+
GenericSignatureID genericSigID;
469469
unsigned rawLinkage, isTransparent, isSerialized, isThunk,
470470
isWithoutactuallyEscapingThunk, isGlobal, inlineStrategy,
471471
optimizationMode, effect, numSpecAttrs, hasQualifiedOwnership,
@@ -476,7 +476,7 @@ SILDeserializer::readSILFunctionChecked(DeclID FID, SILFunction *existingFn,
476476
isWithoutactuallyEscapingThunk, isGlobal, inlineStrategy,
477477
optimizationMode, effect, numSpecAttrs, hasQualifiedOwnership,
478478
isWeakLinked, isDynamic, isExactSelfClass,
479-
funcTyID, replacedFunctionID, genericEnvID,
479+
funcTyID, replacedFunctionID, genericSigID,
480480
clangNodeOwnerID, SemanticsIDs);
481481

482482
if (funcTyID == 0) {
@@ -643,7 +643,8 @@ SILDeserializer::readSILFunctionChecked(DeclID FID, SILFunction *existingFn,
643643

644644
GenericEnvironment *genericEnv = nullptr;
645645
if (!declarationOnly)
646-
genericEnv = MF->getGenericEnvironment(genericEnvID);
646+
if (auto *genericSig = MF->getGenericSignature(genericSigID))
647+
genericEnv = genericSig->getGenericEnvironment();
647648

648649
// If the next entry is the end of the block, then this function has
649650
// no contents.
@@ -2534,7 +2535,7 @@ bool SILDeserializer::hasSILFunction(StringRef Name,
25342535
DeclID clangOwnerID;
25352536
TypeID funcTyID;
25362537
IdentifierID replacedFunctionID;
2537-
GenericSignatureID genericEnvID;
2538+
GenericSignatureID genericSigID;
25382539
unsigned rawLinkage, isTransparent, isSerialized, isThunk,
25392540
isWithoutactuallyEscapingThunk, isGlobal, inlineStrategy,
25402541
optimizationMode, effect, numSpecAttrs, hasQualifiedOwnership,
@@ -2545,7 +2546,7 @@ bool SILDeserializer::hasSILFunction(StringRef Name,
25452546
isWithoutactuallyEscapingThunk, isGlobal, inlineStrategy,
25462547
optimizationMode, effect, numSpecAttrs, hasQualifiedOwnership,
25472548
isWeakLinked, isDynamic, isExactSelfClass,
2548-
funcTyID, replacedFunctionID, genericEnvID,
2549+
funcTyID, replacedFunctionID, genericSigID,
25492550
clangOwnerID, SemanticsIDs);
25502551
auto linkage = fromStableSILLinkage(rawLinkage);
25512552
if (!linkage) {

branches/master-rebranch/lib/Serialization/ModuleFile.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -922,7 +922,7 @@ bool ModuleFile::readIndexBlock(llvm::BitstreamCursor &cursor) {
922922
break;
923923
case index_block::GENERIC_SIGNATURE_OFFSETS:
924924
assert(blobData.empty());
925-
allocateBuffer(GenericSignaturesAndEnvironments, scratch);
925+
allocateBuffer(GenericSignatures, scratch);
926926
break;
927927
case index_block::SUBSTITUTION_MAP_OFFSETS:
928928
assert(blobData.empty());
@@ -2344,7 +2344,7 @@ bool SerializedASTFile::hasEntryPoint() const {
23442344
bool SerializedASTFile::getAllGenericSignatures(
23452345
SmallVectorImpl<GenericSignature*> &genericSignatures) {
23462346
genericSignatures.clear();
2347-
for (unsigned index : indices(File.GenericSignaturesAndEnvironments)) {
2347+
for (unsigned index : indices(File.GenericSignatures)) {
23482348
if (auto genericSig = File.getGenericSignature(index + 1))
23492349
genericSignatures.push_back(genericSig);
23502350
}

branches/master-rebranch/lib/Serialization/ModuleFile.h

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -316,17 +316,8 @@ class ModuleFile
316316
/// Types referenced by this module.
317317
MutableArrayRef<Serialized<Type>> Types;
318318

319-
using GenericSignatureOrEnvironment =
320-
llvm::PointerUnion<GenericSignature *, GenericEnvironment *>;
321-
322-
/// Generic signatures and environments referenced by this module.
323-
///
324-
/// Technically only the GenericSignatures are encoded, but storing the
325-
/// environment here too allows caching them.
326-
// FIXME: That caching should be done at the AST level; it's not specific to
327-
// Serialization.
328-
MutableArrayRef<Serialized<GenericSignatureOrEnvironment>>
329-
GenericSignaturesAndEnvironments;
319+
/// Generic signatures referenced by this module.
320+
MutableArrayRef<Serialized<GenericSignature *>> GenericSignatures;
330321

331322
/// Substitution maps referenced by this module.
332323
MutableArrayRef<Serialized<SubstitutionMap>> SubstitutionMaps;
@@ -877,21 +868,6 @@ class ModuleFile
877868
/// Returns the generic signature for the given ID.
878869
GenericSignature *getGenericSignature(serialization::GenericSignatureID ID);
879870

880-
/// Returns the generic signature or environment for the given ID,
881-
/// deserializing it if needed.
882-
///
883-
/// \param wantEnvironment If true, always return the full generic
884-
/// environment. Otherwise, only return the generic environment if it's
885-
/// already been constructed, and the signature in other cases.
886-
GenericSignatureOrEnvironment
887-
getGenericSignatureOrEnvironment(serialization::GenericSignatureID ID,
888-
bool wantEnvironment = false);
889-
890-
/// Returns the generic environment for the given ID, deserializing it if
891-
/// needed.
892-
GenericEnvironment *
893-
getGenericEnvironment(serialization::GenericSignatureID ID);
894-
895871
/// Returns the substitution map for the given ID, deserializing it if
896872
/// needed.
897873
SubstitutionMap getSubstitutionMap(serialization::SubstitutionMapID id);

0 commit comments

Comments
 (0)