Skip to content

Commit 24a1d01

Browse files
authored
Merge pull request #65340 from slavapestov/bind-element-archetype-fix
Fix issues with binding local element archetypes, and misc other stuff
2 parents 017794a + 0d1e507 commit 24a1d01

12 files changed

+160
-147
lines changed

lib/AST/ParameterPack.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,12 @@ PackType *PackType::getSingletonPackExpansion(Type param) {
301301
}
302302

303303
CanPackType CanPackType::getSingletonPackExpansion(CanType param) {
304-
return CanPackType(PackType::getSingletonPackExpansion(param));
304+
// Note: You can't just wrap the result in CanPackType() here because
305+
// PackExpansionType has the additional requirement that the count type
306+
// must be a reduced shape.
307+
return cast<PackType>(
308+
PackType::getSingletonPackExpansion(param)
309+
->getCanonicalType());
305310
}
306311

307312
PackExpansionType *PackType::unwrapSingletonPackExpansion() const {

lib/IRGen/GenArchetype.cpp

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -363,51 +363,6 @@ const TypeInfo *TypeConverter::convertArchetypeType(ArchetypeType *archetype) {
363363
return OpaqueArchetypeTypeInfo::create(storageType, abiAccessible);
364364
}
365365

366-
static void setMetadataRef(IRGenFunction &IGF,
367-
ArchetypeType *archetype,
368-
llvm::Value *metadata,
369-
MetadataState metadataState) {
370-
assert(metadata->getType() == IGF.IGM.TypeMetadataPtrTy);
371-
IGF.setUnscopedLocalTypeMetadata(CanType(archetype),
372-
MetadataResponse::forBounded(metadata, metadataState));
373-
}
374-
375-
static void setWitnessTable(IRGenFunction &IGF,
376-
ArchetypeType *archetype,
377-
unsigned protocolIndex,
378-
llvm::Value *wtable) {
379-
assert(wtable->getType() == IGF.IGM.WitnessTablePtrTy);
380-
assert(protocolIndex < archetype->getConformsTo().size());
381-
auto protocol = archetype->getConformsTo()[protocolIndex];
382-
IGF.setUnscopedLocalTypeData(CanType(archetype),
383-
LocalTypeDataKind::forAbstractProtocolWitnessTable(protocol),
384-
wtable);
385-
}
386-
387-
/// Inform IRGenFunction that the given archetype has the given value
388-
/// witness value within this scope.
389-
void IRGenFunction::bindArchetype(ArchetypeType *archetype,
390-
llvm::Value *metadata,
391-
MetadataState metadataState,
392-
ArrayRef<llvm::Value*> wtables) {
393-
// Set the metadata pointer.
394-
setTypeMetadataName(IGM, metadata, CanType(archetype));
395-
setMetadataRef(*this, archetype, metadata, metadataState);
396-
397-
// Set the protocol witness tables.
398-
399-
unsigned wtableI = 0;
400-
for (unsigned i = 0, e = archetype->getConformsTo().size(); i != e; ++i) {
401-
auto proto = archetype->getConformsTo()[i];
402-
if (!Lowering::TypeConverter::protocolRequiresWitnessTable(proto))
403-
continue;
404-
auto wtable = wtables[wtableI++];
405-
setProtocolWitnessTableName(IGM, wtable, CanType(archetype), proto);
406-
setWitnessTable(*this, archetype, i, wtable);
407-
}
408-
assert(wtableI == wtables.size());
409-
}
410-
411366
llvm::Value *irgen::emitDynamicTypeOfOpaqueArchetype(IRGenFunction &IGF,
412367
Address addr,
413368
SILType type) {

lib/IRGen/GenExistential.cpp

Lines changed: 56 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1688,6 +1688,52 @@ TypeConverter::convertExistentialMetatypeType(ExistentialMetatypeType *T) {
16881688
baseTI);
16891689
}
16901690

1691+
static void setMetadataRef(IRGenFunction &IGF,
1692+
ArchetypeType *archetype,
1693+
llvm::Value *metadata,
1694+
MetadataState metadataState) {
1695+
assert(metadata->getType() == IGF.IGM.TypeMetadataPtrTy);
1696+
IGF.setUnscopedLocalTypeMetadata(CanType(archetype),
1697+
MetadataResponse::forBounded(metadata, metadataState));
1698+
}
1699+
1700+
static void setWitnessTable(IRGenFunction &IGF,
1701+
ArchetypeType *archetype,
1702+
unsigned protocolIndex,
1703+
llvm::Value *wtable) {
1704+
assert(wtable->getType() == IGF.IGM.WitnessTablePtrTy);
1705+
assert(protocolIndex < archetype->getConformsTo().size());
1706+
auto protocol = archetype->getConformsTo()[protocolIndex];
1707+
IGF.setUnscopedLocalTypeData(CanType(archetype),
1708+
LocalTypeDataKind::forAbstractProtocolWitnessTable(protocol),
1709+
wtable);
1710+
}
1711+
1712+
/// Inform IRGenFunction that the given archetype has the given value
1713+
/// witness value within this scope.
1714+
static void bindArchetype(IRGenFunction &IGF,
1715+
ArchetypeType *archetype,
1716+
llvm::Value *metadata,
1717+
MetadataState metadataState,
1718+
ArrayRef<llvm::Value*> wtables) {
1719+
// Set the metadata pointer.
1720+
setTypeMetadataName(IGF.IGM, metadata, CanType(archetype));
1721+
setMetadataRef(IGF, archetype, metadata, metadataState);
1722+
1723+
// Set the protocol witness tables.
1724+
1725+
unsigned wtableI = 0;
1726+
for (unsigned i = 0, e = archetype->getConformsTo().size(); i != e; ++i) {
1727+
auto proto = archetype->getConformsTo()[i];
1728+
if (!Lowering::TypeConverter::protocolRequiresWitnessTable(proto))
1729+
continue;
1730+
auto wtable = wtables[wtableI++];
1731+
setProtocolWitnessTableName(IGF.IGM, wtable, CanType(archetype), proto);
1732+
setWitnessTable(IGF, archetype, i, wtable);
1733+
}
1734+
assert(wtableI == wtables.size());
1735+
}
1736+
16911737
/// Emit protocol witness table pointers for the given protocol conformances,
16921738
/// passing each emitted witness table index into the given function body.
16931739
static void forEachProtocolWitnessTable(
@@ -1766,8 +1812,8 @@ Address irgen::emitOpenExistentialBox(IRGenFunction &IGF,
17661812
2 * IGF.IGM.getPointerSize());
17671813
auto witness = IGF.Builder.CreateLoad(witnessAddr);
17681814

1769-
IGF.bindArchetype(openedArchetype, metadata, MetadataState::Complete,
1770-
witness);
1815+
bindArchetype(IGF, openedArchetype, metadata, MetadataState::Complete,
1816+
witness);
17711817
return box.getAddress();
17721818
}
17731819

@@ -2093,8 +2139,8 @@ irgen::emitClassExistentialProjection(IRGenFunction &IGF,
20932139
baseTy,
20942140
sigFn,
20952141
/*allow artificial*/ false);
2096-
IGF.bindArchetype(openedArchetype, metadata, MetadataState::Complete,
2097-
wtables);
2142+
bindArchetype(IGF, openedArchetype, metadata, MetadataState::Complete,
2143+
wtables);
20982144

20992145
return value;
21002146
}
@@ -2143,8 +2189,8 @@ irgen::emitExistentialMetatypeProjection(IRGenFunction &IGF,
21432189
}
21442190

21452191
auto openedArchetype = cast<ArchetypeType>(targetType.getInstanceType());
2146-
IGF.bindArchetype(openedArchetype, metatype, MetadataState::Complete,
2147-
wtables);
2192+
bindArchetype(IGF, openedArchetype, metatype, MetadataState::Complete,
2193+
wtables);
21482194

21492195
return value;
21502196
}
@@ -2484,8 +2530,8 @@ Address irgen::emitOpaqueBoxedExistentialProjection(
24842530
wtables.push_back(IGF.Builder.CreateLoad(wtableAddr));
24852531
}
24862532

2487-
IGF.bindArchetype(openedArchetype, metadata, MetadataState::Complete,
2488-
wtables);
2533+
bindArchetype(IGF, openedArchetype, metadata, MetadataState::Complete,
2534+
wtables);
24892535
}
24902536

24912537
return valueAddr;
@@ -2503,8 +2549,8 @@ Address irgen::emitOpaqueBoxedExistentialProjection(
25032549
for (unsigned i = 0, n = layout.getNumTables(); i != n; ++i) {
25042550
wtables.push_back(layout.loadWitnessTable(IGF, base, i));
25052551
}
2506-
IGF.bindArchetype(openedArchetype, metadata, MetadataState::Complete,
2507-
wtables);
2552+
bindArchetype(IGF, openedArchetype, metadata, MetadataState::Complete,
2553+
wtables);
25082554
}
25092555

25102556
auto *projectFunc =

lib/IRGen/GenMeta.cpp

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2586,8 +2586,7 @@ void irgen::emitLazyTypeContextDescriptor(IRGenModule &IGM,
25862586
eraseExistingTypeContextDescriptor(IGM, type);
25872587

25882588
bool hasLayoutString = false;
2589-
auto lowered = getLoweredTypeInPrimaryContext(
2590-
IGM, type->getDeclaredType()->getCanonicalType());
2589+
auto lowered = getLoweredTypeInPrimaryContext(IGM, type);
25912590
auto &ti = IGM.getTypeInfo(lowered);
25922591
auto *typeLayoutEntry =
25932592
ti.buildTypeLayoutEntry(IGM, lowered, /*useStructLayouts*/ true);
@@ -3131,8 +3130,7 @@ namespace {
31313130
if (!IGM.Context.LangOpts.hasFeature(Feature::LayoutStringValueWitnesses) ||
31323131
!IGM.getOptions().EnableLayoutStringValueWitnesses)
31333132
return nullptr;
3134-
auto lowered = getLoweredTypeInPrimaryContext(
3135-
IGM, Target->getDeclaredType()->getCanonicalType());
3133+
auto lowered = getLoweredTypeInPrimaryContext(IGM, Target);
31363134
auto &ti = IGM.getTypeInfo(lowered);
31373135
auto *typeLayoutEntry =
31383136
ti.buildTypeLayoutEntry(IGM, lowered, /*useStructLayouts*/ true);
@@ -3792,8 +3790,7 @@ namespace {
37923790
if (!IGM.Context.LangOpts.hasFeature(Feature::LayoutStringValueWitnesses) ||
37933791
!IGM.getOptions().EnableLayoutStringValueWitnesses)
37943792
return nullptr;
3795-
auto lowered = getLoweredTypeInPrimaryContext(
3796-
IGM, Target->getDeclaredType()->getCanonicalType());
3793+
auto lowered = getLoweredTypeInPrimaryContext(IGM, Target);
37973794
auto &ti = IGM.getTypeInfo(lowered);
37983795
auto *typeLayoutEntry =
37993796
ti.buildTypeLayoutEntry(IGM, lowered, /*useStructLayouts*/ true);
@@ -5078,8 +5075,7 @@ namespace {
50785075
if (!IGM.Context.LangOpts.hasFeature(Feature::LayoutStringValueWitnesses) ||
50795076
!IGM.getOptions().EnableLayoutStringValueWitnesses)
50805077
return nullptr;
5081-
auto lowered = getLoweredTypeInPrimaryContext(
5082-
IGM, Target->getDeclaredType()->getCanonicalType());
5078+
auto lowered = getLoweredTypeInPrimaryContext(IGM, Target);
50835079
auto &ti = IGM.getTypeInfo(lowered);
50845080
auto *typeLayoutEntry =
50855081
ti.buildTypeLayoutEntry(IGM, lowered, /*useStructLayouts*/ true);
@@ -5172,10 +5168,8 @@ namespace {
51725168
getValueWitnessTableForGenericValueType(IRGenModule &IGM,
51735169
NominalTypeDecl *decl,
51745170
bool &dependent) {
5175-
CanType unboundType
5176-
= decl->getDeclaredType()->getCanonicalType();
5177-
5178-
dependent = hasDependentValueWitnessTable(IGM, unboundType);
5171+
dependent = hasDependentValueWitnessTable(IGM, decl);
5172+
CanType unboundType = decl->getDeclaredType()->getCanonicalType();
51795173
return emitValueWitnessTable(IGM, unboundType, dependent,
51805174
/*relative reference*/ true);
51815175
}
@@ -5504,8 +5498,7 @@ namespace {
55045498
if (!IGM.Context.LangOpts.hasFeature(Feature::LayoutStringValueWitnesses) ||
55055499
!IGM.getOptions().EnableLayoutStringValueWitnesses)
55065500
return nullptr;
5507-
auto lowered = getLoweredTypeInPrimaryContext(
5508-
IGM, Target->getDeclaredType()->getCanonicalType());
5501+
auto lowered = getLoweredTypeInPrimaryContext(IGM, Target);
55095502
auto &ti = IGM.getTypeInfo(lowered);
55105503
auto *typeLayoutEntry =
55115504
ti.buildTypeLayoutEntry(IGM, lowered, /*useStructLayouts*/ true);

lib/IRGen/GenPack.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -954,6 +954,7 @@ void irgen::bindOpenedElementArchetypesAtIndex(IRGenFunction &IGF,
954954
return openablePackParams.contains(
955955
ty->getRootGenericParam()->getCanonicalType());
956956
};
957+
957958
enumerateGenericSignatureRequirements(
958959
environment->getGenericSignature().getCanonicalSignature(),
959960
[&](GenericRequirement requirement) {
@@ -996,7 +997,18 @@ void irgen::bindOpenedElementArchetypesAtIndex(IRGenFunction &IGF,
996997
llvm::SmallVector<llvm::Value *, 2> wtables;
997998
auto *metadata = emitTypeMetadataPackElementRef(
998999
IGF, packType, conformances, index, MetadataState::Complete, wtables);
999-
IGF.bindArchetype(archetype, metadata, MetadataState::Complete, wtables);
1000+
1001+
auto reqt = GenericRequirement::forMetadata(archetype);
1002+
bindGenericRequirement(IGF, reqt, metadata, MetadataState::Complete,
1003+
SubstitutionMap());
1004+
1005+
assert(conformances.size() == wtables.size());
1006+
for (unsigned i : indices(wtables)) {
1007+
auto reqt = GenericRequirement::forWitnessTable(
1008+
archetype, conformances[i].getRequirement());
1009+
bindGenericRequirement(IGF, reqt, wtables[i], MetadataState::Complete,
1010+
SubstitutionMap());
1011+
}
10001012
}
10011013
}
10021014

lib/IRGen/GenProto.cpp

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3753,18 +3753,24 @@ void irgen::bindGenericRequirement(IRGenFunction &IGF,
37533753
case GenericRequirement::Kind::WitnessTable:
37543754
case GenericRequirement::Kind::WitnessTablePack: {
37553755
auto proto = requirement.getProtocol();
3756-
auto conf = subs.lookupConformance(requirement.getTypeParameter(), proto);
3756+
setProtocolWitnessTableName(IGF.IGM, value, type, proto);
37573757

3758-
// FIXME: Remove this
3759-
if (conf.isPack() && isa<PackArchetypeType>(type)) {
3760-
assert(wasUnwrappedPack);
3761-
assert(conf.getPack()->getPatternConformances().size() == 1);
3762-
conf = conf.getPack()->getPatternConformances()[0];
3763-
}
3758+
if (subs) {
3759+
auto conf = subs.lookupConformance(requirement.getTypeParameter(), proto);
37643760

3765-
setProtocolWitnessTableName(IGF.IGM, value, type, proto);
3766-
auto kind = LocalTypeDataKind::forProtocolWitnessTable(conf);
3767-
IGF.setUnscopedLocalTypeData(type, kind, value);
3761+
// FIXME: Remove this
3762+
if (conf.isPack() && isa<PackArchetypeType>(type)) {
3763+
assert(wasUnwrappedPack);
3764+
assert(conf.getPack()->getPatternConformances().size() == 1);
3765+
conf = conf.getPack()->getPatternConformances()[0];
3766+
}
3767+
3768+
auto kind = LocalTypeDataKind::forProtocolWitnessTable(conf);
3769+
IGF.setUnscopedLocalTypeData(type, kind, value);
3770+
} else {
3771+
auto kind = LocalTypeDataKind::forAbstractProtocolWitnessTable(proto);
3772+
IGF.setUnscopedLocalTypeData(type, kind, value);
3773+
}
37683774
break;
37693775
}
37703776
}

lib/IRGen/GenReflection.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1079,19 +1079,20 @@ void IRGenModule::emitBuiltinTypeMetadataRecord(CanType builtinType) {
10791079

10801080
class MultiPayloadEnumDescriptorBuilder : public ReflectionMetadataBuilder {
10811081
CanType type;
1082+
CanType typeInContext;
10821083
const FixedTypeInfo *ti;
10831084

10841085
public:
10851086
MultiPayloadEnumDescriptorBuilder(IRGenModule &IGM,
10861087
const NominalTypeDecl *nominalDecl)
10871088
: ReflectionMetadataBuilder(IGM) {
10881089
type = nominalDecl->getDeclaredType()->getCanonicalType();
1089-
ti = &cast<FixedTypeInfo>(IGM.getTypeInfoForUnlowered(
1090-
nominalDecl->getDeclaredTypeInContext()->getCanonicalType()));
1090+
typeInContext = nominalDecl->getDeclaredTypeInContext()->getCanonicalType();
1091+
ti = &cast<FixedTypeInfo>(IGM.getTypeInfoForUnlowered(typeInContext));
10911092
}
10921093

10931094
void layout() override {
1094-
auto &strategy = getEnumImplStrategy(IGM, getFormalTypeInPrimaryContext(type));
1095+
auto &strategy = getEnumImplStrategy(IGM, typeInContext);
10951096
bool isMPE = strategy.getElementsWithPayload().size() > 1;
10961097
assert(isMPE && "Cannot emit Multi-Payload Enum data for an enum that doesn't have multiple payloads");
10971098

0 commit comments

Comments
 (0)