Skip to content

Commit 6a44de2

Browse files
committed
[GenericRequirement] Added pack variants.
Added pack flavors of requirement kinds for metadata and witness tables. Fixes the function signatures for variadic generic functions which previously used %swift.type* for variadic generic parameters--those are lists of metadata and should actually be %swift.type**.
1 parent 28c8c6e commit 6a44de2

File tree

4 files changed

+56
-13
lines changed

4 files changed

+56
-13
lines changed

include/swift/IRGen/GenericRequirement.h

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#include "swift/AST/Decl.h"
1717
#include "swift/AST/Type.h"
18+
#include "swift/AST/Types.h"
1819
#include "llvm/Support/raw_ostream.h"
1920

2021
namespace llvm {
@@ -41,10 +42,12 @@ class IRGenModule;
4142
/// generic signature.
4243
class GenericRequirement {
4344
public:
44-
enum class Kind: uint8_t {
45+
enum class Kind : uint8_t {
4546
Shape,
4647
Metadata,
47-
WitnessTable
48+
WitnessTable,
49+
MetadataPack,
50+
WitnessTablePack,
4851
};
4952

5053
private:
@@ -55,6 +58,16 @@ class GenericRequirement {
5558
GenericRequirement(Kind kind, CanType type, ProtocolDecl *proto)
5659
: kind(kind), type(type), proto(proto) {}
5760

61+
static bool isPack(CanType ty) {
62+
if (auto gp = dyn_cast<GenericTypeParamType>(ty))
63+
return gp->isParameterPack();
64+
if (auto dm = dyn_cast<DependentMemberType>(ty))
65+
if (auto gp =
66+
dyn_cast<GenericTypeParamType>(dm->getBase()->getCanonicalType()))
67+
return gp->isParameterPack();
68+
return false;
69+
}
70+
5871
public:
5972
Kind getKind() const {
6073
return kind;
@@ -81,17 +94,27 @@ class GenericRequirement {
8194
return kind == Kind::Metadata;
8295
}
8396

97+
static GenericRequirement forMetadata(CanType type, bool isPack) {
98+
auto kind = isPack ? Kind::MetadataPack : Kind::Metadata;
99+
return GenericRequirement(kind, type, nullptr);
100+
}
101+
84102
static GenericRequirement forMetadata(CanType type) {
85-
return GenericRequirement(Kind::Metadata, type, nullptr);
103+
return forMetadata(type, isPack(type));
86104
}
87105

88106
bool isWitnessTable() const {
89107
return kind == Kind::WitnessTable;
90108
}
91109

110+
static GenericRequirement forWitnessTable(CanType type, ProtocolDecl *proto,
111+
bool isPack) {
112+
auto kind = isPack ? Kind::WitnessTablePack : Kind::WitnessTable;
113+
return GenericRequirement(kind, type, proto);
114+
}
115+
92116
static GenericRequirement forWitnessTable(CanType type, ProtocolDecl *proto) {
93-
assert(proto != nullptr);
94-
return GenericRequirement(Kind::WitnessTable, type, proto);
117+
return forWitnessTable(type, proto, isPack(type));
95118
}
96119

97120
static llvm::Type *typeForKind(irgen::IRGenModule &IGM,
@@ -112,6 +135,12 @@ class GenericRequirement {
112135
case Kind::WitnessTable:
113136
out << "witness_table: " << type << " : " << proto->getName();
114137
break;
138+
case Kind::MetadataPack:
139+
out << "metadata_pack: " << type;
140+
break;
141+
case Kind::WitnessTablePack:
142+
out << "witness_table_pack: " << type << " : " << proto->getName();
143+
break;
115144
}
116145
}
117146
};
@@ -123,10 +152,12 @@ template <> struct DenseMapInfo<swift::GenericRequirement> {
123152
using GenericRequirement = swift::GenericRequirement;
124153
using CanTypeInfo = llvm::DenseMapInfo<swift::CanType>;
125154
static GenericRequirement getEmptyKey() {
126-
return GenericRequirement::forMetadata(CanTypeInfo::getEmptyKey());
155+
return GenericRequirement::forMetadata(CanTypeInfo::getEmptyKey(),
156+
/*isPack=*/false);
127157
}
128158
static GenericRequirement getTombstoneKey() {
129-
return GenericRequirement::forMetadata(CanTypeInfo::getTombstoneKey());
159+
return GenericRequirement::forMetadata(CanTypeInfo::getTombstoneKey(),
160+
/*isPack=*/false);
130161
}
131162
static llvm::hash_code getHashValue(GenericRequirement req) {
132163
return hash_combine(CanTypeInfo::getHashValue(req.getTypeParameter()),

lib/IRGen/GenMeta.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3902,6 +3902,8 @@ namespace {
39023902
break;
39033903
case GenericRequirement::Kind::Metadata:
39043904
case GenericRequirement::Kind::WitnessTable:
3905+
case GenericRequirement::Kind::MetadataPack:
3906+
case GenericRequirement::Kind::WitnessTablePack:
39053907
B.addNullPointer(cast<llvm::PointerType>(requirement.getType(IGM)));
39063908
break;
39073909
}

lib/IRGen/GenProto.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3560,9 +3560,11 @@ irgen::emitGenericRequirementFromSubstitutions(IRGenFunction &IGF,
35603560
return IGF.emitPackShapeExpression(argType);
35613561

35623562
case GenericRequirement::Kind::Metadata:
3563+
case GenericRequirement::Kind::MetadataPack:
35633564
return IGF.emitTypeMetadataRef(argType, request).getMetadata();
35643565

3565-
case GenericRequirement::Kind::WitnessTable: {
3566+
case GenericRequirement::Kind::WitnessTable:
3567+
case GenericRequirement::Kind::WitnessTablePack: {
35663568
auto proto = requirement.getProtocol();
35673569
auto conformance = subs.lookupConformance(depTy, proto);
35683570
assert(conformance.getRequirement() == proto);
@@ -3618,6 +3620,10 @@ llvm::Type *GenericRequirement::typeForKind(IRGenModule &IGM,
36183620
return IGM.TypeMetadataPtrTy;
36193621
case GenericRequirement::Kind::WitnessTable:
36203622
return IGM.WitnessTablePtrTy;
3623+
case GenericRequirement::Kind::MetadataPack:
3624+
return IGM.TypeMetadataPtrPtrTy;
3625+
case GenericRequirement::Kind::WitnessTablePack:
3626+
return IGM.WitnessTablePtrPtrTy;
36213627
}
36223628
}
36233629

@@ -3638,13 +3644,15 @@ void irgen::bindGenericRequirement(IRGenFunction &IGF,
36383644
break;
36393645
}
36403646

3641-
case GenericRequirement::Kind::Metadata: {
3647+
case GenericRequirement::Kind::Metadata:
3648+
case GenericRequirement::Kind::MetadataPack: {
36423649
setTypeMetadataName(IGF.IGM, value, type);
36433650
IGF.bindLocalTypeDataFromTypeMetadata(type, IsExact, value, metadataState);
36443651
break;
36453652
}
36463653

3647-
case GenericRequirement::Kind::WitnessTable: {
3654+
case GenericRequirement::Kind::WitnessTable:
3655+
case GenericRequirement::Kind::WitnessTablePack: {
36483656
auto proto = requirement.getProtocol();
36493657
assert(isa<ArchetypeType>(type));
36503658
setProtocolWitnessTableName(IGF.IGM, value, type, proto);
@@ -3683,9 +3691,11 @@ namespace {
36833691
++numShapes;
36843692
break;
36853693
case GenericRequirement::Kind::Metadata:
3694+
case GenericRequirement::Kind::MetadataPack:
36863695
++numTypeMetadataPtrs;
36873696
break;
36883697
case GenericRequirement::Kind::WitnessTable:
3698+
case GenericRequirement::Kind::WitnessTablePack:
36893699
++numWitnessTablePtrs;
36903700
break;
36913701
}

test/IRGen/variadic_generic_functions.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55

66
// REQUIRES: PTRSIZE=64
77

8-
// CHECK-LABEL: define hidden swiftcc void @"$s26variadic_generic_functions2f11tyxxQp_tlF"(%swift.opaque** noalias nocapture %0, i64 %1, %swift.type* %T)
8+
// CHECK-LABEL: define hidden swiftcc void @"$s26variadic_generic_functions2f11tyxxQp_tlF"(%swift.opaque** noalias nocapture %0, i64 %1, %swift.type** %T)
99
func f1<T...>(t: repeat each T) {}
1010

11-
// CHECK-LABEL: define hidden swiftcc void @"$s26variadic_generic_functions2f21t1uyxxQp_q_q_Qptr0_lF"(%swift.opaque** noalias nocapture %0, %swift.opaque** noalias nocapture %1, i64 %2, i64 %3, %swift.type* %T, %swift.type* %U)
11+
// CHECK-LABEL: define hidden swiftcc void @"$s26variadic_generic_functions2f21t1uyxxQp_q_q_Qptr0_lF"(%swift.opaque** noalias nocapture %0, %swift.opaque** noalias nocapture %1, i64 %2, i64 %3, %swift.type** %T, %swift.type** %U)
1212
func f2<T..., U...>(t: repeat each T, u: repeat each U) {}
1313

14-
// CHECK-LABEL: define hidden swiftcc void @"$s26variadic_generic_functions2f31t1uyxxQp_q_xQptq_Rhzr0_lF"(%swift.opaque** noalias nocapture %0, %swift.opaque** noalias nocapture %1, i64 %2, %swift.type* %T, %swift.type* %U)
14+
// CHECK-LABEL: define hidden swiftcc void @"$s26variadic_generic_functions2f31t1uyxxQp_q_xQptq_Rhzr0_lF"(%swift.opaque** noalias nocapture %0, %swift.opaque** noalias nocapture %1, i64 %2, %swift.type** %T, %swift.type** %U)
1515
func f3<T..., U...>(t: repeat each T, u: repeat each U) where (repeat (each T, each U)): Any {}

0 commit comments

Comments
 (0)