@@ -943,181 +943,27 @@ const TypeInfo *TypeConverter::tryGetCompleteTypeInfo(CanType T) {
943
943
return &ti;
944
944
}
945
945
946
- // / Profile the archetype constraints that may affect type layout into a
947
- // / folding set node ID.
948
- static void profileArchetypeConstraints (
949
- Type ty,
950
- llvm::FoldingSetNodeID &ID,
951
- llvm::DenseMap<ArchetypeType*, unsigned > &seen) {
952
- // Helper.
953
- class ProfileType : public CanTypeVisitor <ProfileType> {
954
- llvm::FoldingSetNodeID &ID;
955
- llvm::DenseMap<ArchetypeType *, unsigned > &seen;
956
-
957
- public:
958
- ProfileType (llvm::FoldingSetNodeID &ID,
959
- llvm::DenseMap<ArchetypeType *, unsigned > &seen)
960
- : ID(ID), seen(seen) {}
961
-
962
- #define TYPE_WITHOUT_ARCHETYPE (KIND ) \
963
- void visit##KIND##Type(Can##KIND##Type type) { \
964
- llvm_unreachable (" does not contain an archetype" ); \
965
- }
966
-
967
- TYPE_WITHOUT_ARCHETYPE (Builtin)
968
-
969
- void visitNominalType (CanNominalType type) {
970
- if (type.getParent ())
971
- profileArchetypeConstraints (type.getParent (), ID, seen);
972
- ID.AddPointer (type->getDecl ());
973
- }
974
-
975
- void visitTupleType (CanTupleType type) {
976
- ID.AddInteger (type->getNumElements ());
977
- for (auto &elt : type->getElements ()) {
978
- ID.AddInteger (elt.isVararg ());
979
- profileArchetypeConstraints (elt.getType (), ID, seen);
980
- }
981
- }
982
-
983
- void visitReferenceStorageType (CanReferenceStorageType type) {
984
- profileArchetypeConstraints (type.getReferentType (), ID, seen);
985
- }
986
-
987
- void visitAnyMetatypeType (CanAnyMetatypeType type) {
988
- profileArchetypeConstraints (type.getInstanceType (), ID, seen);
989
- }
990
-
991
- TYPE_WITHOUT_ARCHETYPE (Module)
992
-
993
- void visitDynamicSelfType (CanDynamicSelfType type) {
994
- profileArchetypeConstraints (type.getSelfType (), ID, seen);
995
- }
996
-
997
- void visitArchetypeType (CanArchetypeType type) {
998
- profileArchetypeConstraints (type, ID, seen);
999
- }
1000
-
1001
- TYPE_WITHOUT_ARCHETYPE (GenericTypeParam)
1002
-
1003
- void visitDependentMemberType (CanDependentMemberType type) {
1004
- ID.AddPointer (type->getAssocType ());
1005
- profileArchetypeConstraints (type.getBase (), ID, seen);
1006
- }
1007
-
1008
- void visitAnyFunctionType (CanAnyFunctionType type) {
1009
- ID.AddInteger (type->getExtInfo ().getFuncAttrKey ());
1010
- profileArchetypeConstraints (type.getInput (), ID, seen);
1011
- profileArchetypeConstraints (type.getResult (), ID, seen);
1012
- }
1013
-
1014
- TYPE_WITHOUT_ARCHETYPE (SILFunction)
1015
- TYPE_WITHOUT_ARCHETYPE (SILBlockStorage)
1016
- TYPE_WITHOUT_ARCHETYPE (SILBox)
1017
- TYPE_WITHOUT_ARCHETYPE (ProtocolComposition)
1018
-
1019
- void visitLValueType (CanLValueType type) {
1020
- profileArchetypeConstraints (type.getObjectType (), ID, seen);
1021
- }
1022
-
1023
- void visitInOutType (CanInOutType type) {
1024
- profileArchetypeConstraints (type.getObjectType (), ID, seen);
1025
- }
1026
-
1027
- TYPE_WITHOUT_ARCHETYPE (UnboundGeneric)
1028
-
1029
- void visitBoundGenericType (CanBoundGenericType type) {
1030
- if (type.getParent ())
1031
- profileArchetypeConstraints (type.getParent (), ID, seen);
1032
- ID.AddPointer (type->getDecl ());
1033
- for (auto arg : type.getGenericArgs ()) {
1034
- profileArchetypeConstraints (arg, ID, seen);
1035
- }
1036
- }
1037
- #undef TYPE_WITHOUT_ARCHETYPE
1038
- };
1039
-
1040
- // End recursion if we found a concrete associated type.
1041
- auto arch = ty->getAs <ArchetypeType>();
1042
- if (!arch) {
1043
- auto concreteTy = ty->getCanonicalType ();
1044
- if (!concreteTy->hasArchetype ()) {
1045
- // Trivial case: if there are no archetypes, just use the canonical type
1046
- // pointer.
1047
- ID.AddBoolean (true );
1048
- ID.AddPointer (concreteTy.getPointer ());
1049
- return ;
1050
- }
1051
-
1052
- // When there are archetypes, recurse to profile the type itself.
1053
- ID.AddInteger (1 );
1054
- ID.AddInteger (static_cast <unsigned >(concreteTy->getKind ()));
1055
-
1056
- ProfileType (ID, seen).visit (concreteTy);
1057
- return ;
1058
- }
1059
-
1060
- auto found = seen.find (arch);
1061
- if (found != seen.end ()) {
1062
- ID.AddInteger (found->second );
1063
- return ;
1064
- }
1065
- seen.insert ({arch, seen.size ()});
1066
-
1067
- // Is the archetype class-constrained?
1068
- ID.AddBoolean (arch->requiresClass ());
1069
-
1070
- // The archetype's superclass constraint.
1071
- auto superclass = arch->getSuperclass ();
1072
- if (superclass) {
1073
- ProfileType (ID, seen).visit (superclass->getCanonicalType ());
1074
- } else {
1075
- ID.AddPointer (nullptr );
1076
- }
1077
-
1078
- // The archetype's protocol constraints.
1079
- for (auto proto : arch->getConformsTo ()) {
1080
- ID.AddPointer (proto);
1081
- }
946
+ ArchetypeType *TypeConverter::getExemplarArchetype (ArchetypeType *t) {
947
+ // Retrieve the generic environment of the archetype.
948
+ auto genericEnv = t->getGenericEnvironment ();
1082
949
1083
- // Skip nested types if this is an opened existential, since those
1084
- // won't resolve. Normally opened existentials cannot have nested
1085
- // types, but one case we missed compiled in Swift 3 so we support
1086
- // it here.
1087
- if (arch->getOpenedExistentialType ()) {
1088
- return ;
1089
- }
950
+ // If there is no generic environment, the archetype is an exemplar.
951
+ if (!genericEnv) return t;
1090
952
1091
- // Recursively profile nested archetypes.
1092
- for (auto nested : arch->getAllNestedTypes ()) {
1093
- profileArchetypeConstraints (nested.second , ID, seen);
1094
- }
1095
- }
953
+ // Dig out the canonical generic environment.
954
+ auto genericSig = genericEnv->getGenericSignature ();
955
+ auto canGenericSig = genericSig->getCanonicalSignature ();
956
+ auto module = IGM.getSwiftModule ();
957
+ auto canGenericEnv = canGenericSig.getGenericEnvironment (*module );
958
+ if (canGenericEnv == genericEnv) return t;
1096
959
1097
- void ExemplarArchetype::Profile (llvm::FoldingSetNodeID &ID) const {
1098
- llvm::DenseMap<ArchetypeType*, unsigned > seen;
1099
- profileArchetypeConstraints (Archetype, ID, seen);
1100
- }
1101
-
1102
- ArchetypeType *TypeConverter::getExemplarArchetype (ArchetypeType *t) {
1103
- // Check the folding set to see whether we already have an exemplar matching
1104
- // this archetype.
1105
- llvm::FoldingSetNodeID ID;
1106
- llvm::DenseMap<ArchetypeType*, unsigned > seen;
1107
- profileArchetypeConstraints (t, ID, seen);
1108
- void *insertPos;
1109
- ExemplarArchetype *existing
1110
- = Types.ExemplarArchetypes .FindNodeOrInsertPos (ID, insertPos);
1111
- if (existing) {
1112
- return existing->Archetype ;
1113
- }
1114
-
1115
- // Otherwise, use this archetype as the exemplar for future similar
1116
- // archetypes.
1117
- Types.ExemplarArchetypeStorage .push_back (new ExemplarArchetype (t));
1118
- Types.ExemplarArchetypes .InsertNode (&Types.ExemplarArchetypeStorage .back (),
1119
- insertPos);
1120
- return t;
960
+ // Map the archetype out of its own generic environment and into the
961
+ // canonical generic environment.
962
+ auto interfaceType = genericEnv->mapTypeOutOfContext (t);
963
+ auto exemplar = canGenericEnv->mapTypeIntoContext (module , interfaceType)
964
+ ->castTo <ArchetypeType>();
965
+ assert (isExemplarArchetype (exemplar));
966
+ return exemplar;
1121
967
}
1122
968
1123
969
// / Fold archetypes to unique exemplars. Any archetype with the same
@@ -1858,9 +1704,18 @@ CanType TypeConverter::getTypeThatLoweredTo(llvm::Type *t) const {
1858
1704
}
1859
1705
1860
1706
bool TypeConverter::isExemplarArchetype (ArchetypeType *arch) const {
1861
- for (auto &ea : Types.ExemplarArchetypeStorage )
1862
- if (ea.Archetype == arch) return true ;
1863
- return false ;
1707
+ auto genericEnv = arch->getGenericEnvironment ();
1708
+ if (!genericEnv) return true ;
1709
+
1710
+ // Dig out the canonical generic environment.
1711
+ auto genericSig = genericEnv->getGenericSignature ();
1712
+ auto canGenericSig = genericSig->getCanonicalSignature ();
1713
+ auto module = IGM.getSwiftModule ();
1714
+ auto canGenericEnv = canGenericSig.getGenericEnvironment (*module );
1715
+
1716
+ // If this archetype is in the canonical generic environment, it's an
1717
+ // exemplar archetype.
1718
+ return canGenericEnv == genericEnv;
1864
1719
}
1865
1720
#endif
1866
1721
0 commit comments