Skip to content

Commit 2b68ee1

Browse files
committed
Runtime: Teach _gatherWrittenGenericArgs() about metadata packs
1 parent bcf6f26 commit 2b68ee1

File tree

1 file changed

+83
-36
lines changed

1 file changed

+83
-36
lines changed

stdlib/public/runtime/MetadataLookup.cpp

Lines changed: 83 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1188,7 +1188,7 @@ struct MetadataOrPack {
11881188
/// Use with \c _getTypeByMangledName to decode potentially-generic types.
11891189
class SubstGenericParametersFromWrittenArgs {
11901190
/// The complete set of generic arguments.
1191-
const llvm::SmallVectorImpl<const Metadata *> &allGenericArgs;
1191+
const llvm::SmallVectorImpl<MetadataOrPack> &allGenericArgs;
11921192

11931193
/// The counts of generic parameters at each level.
11941194
const llvm::SmallVectorImpl<unsigned> &genericParamCounts;
@@ -1205,7 +1205,7 @@ class SubstGenericParametersFromWrittenArgs {
12051205
/// \param genericParamCounts The count of generic parameters at each
12061206
/// generic level, typically gathered by _gatherGenericParameterCounts.
12071207
explicit SubstGenericParametersFromWrittenArgs(
1208-
const llvm::SmallVectorImpl<const Metadata *> &allGenericArgs,
1208+
const llvm::SmallVectorImpl<MetadataOrPack> &allGenericArgs,
12091209
const llvm::SmallVectorImpl<unsigned> &genericParamCounts)
12101210
: allGenericArgs(allGenericArgs),
12111211
genericParamCounts(genericParamCounts) {}
@@ -1219,12 +1219,12 @@ class SubstGenericParametersFromWrittenArgs {
12191219

12201220
static void _gatherWrittenGenericArgs(
12211221
const Metadata *metadata, const TypeContextDescriptor *description,
1222-
llvm::SmallVectorImpl<const Metadata *> &allGenericArgs,
1222+
llvm::SmallVectorImpl<MetadataOrPack> &allGenericArgs,
12231223
Demangler &BorrowFrom);
12241224

12251225
static llvm::Optional<TypeLookupError>
12261226
_gatherGenericParameters(const ContextDescriptor *context,
1227-
llvm::ArrayRef<const Metadata *> genericArgs,
1227+
llvm::ArrayRef<MetadataOrPack> genericArgs,
12281228
const Metadata *parent,
12291229
llvm::SmallVectorImpl<unsigned> &genericParamCounts,
12301230
llvm::SmallVectorImpl<const void *> &allGenericArgsVec,
@@ -1249,11 +1249,11 @@ _gatherGenericParameters(const ContextDescriptor *context,
12491249
str += " <";
12501250

12511251
bool first = true;
1252-
for (const Metadata *metadata : genericArgs) {
1252+
for (MetadataOrPack metadata : genericArgs) {
12531253
if (!first)
12541254
str += ", ";
12551255
first = false;
1256-
str += nameForMetadata(metadata);
1256+
str += metadata.nameForMetadata();
12571257
}
12581258

12591259
str += "> ";
@@ -1297,7 +1297,7 @@ _gatherGenericParameters(const ContextDescriptor *context,
12971297
// requirements and fill in the generic arguments vector.
12981298
if (!genericParamCounts.empty()) {
12991299
// Compute the set of generic arguments "as written".
1300-
llvm::SmallVector<const Metadata *, 8> allGenericArgs;
1300+
llvm::SmallVector<MetadataOrPack, 8> allGenericArgs;
13011301

13021302
// If we have a parent, gather it's generic arguments "as written".
13031303
if (parent) {
@@ -1336,16 +1336,47 @@ _gatherGenericParameters(const ContextDescriptor *context,
13361336
// Add metadata for each canonical generic parameter.
13371337
for (unsigned i = 0; i != n; ++i) {
13381338
const auto &param = genericParams[i];
1339-
if (param.getKind() != GenericParamKind::Type) {
1339+
auto arg = allGenericArgs[i];
1340+
1341+
switch (param.getKind()) {
1342+
case GenericParamKind::Type: {
1343+
if (!arg.isMetadata()) {
1344+
auto commonString = makeCommonErrorStringGetter();
1345+
return TypeLookupError([=] {
1346+
return commonString() + "param " + std::to_string(i) +
1347+
" expected metadata but got a metadata pack";
1348+
});
1349+
}
1350+
1351+
if (param.hasKeyArgument()) {
1352+
allGenericArgsVec.push_back(arg.getMetadata());
1353+
}
1354+
1355+
break;
1356+
}
1357+
case GenericParamKind::TypePack: {
1358+
if (!arg.isMetadataPack()) {
1359+
auto commonString = makeCommonErrorStringGetter();
1360+
return TypeLookupError([=] {
1361+
return commonString() + "param " + std::to_string(i) +
1362+
" expected a metadata pack but got metadata";
1363+
});
1364+
}
1365+
1366+
if (param.hasKeyArgument()) {
1367+
allGenericArgsVec.push_back(arg.getMetadataPack().getPointer());
1368+
}
1369+
1370+
break;
1371+
}
1372+
default:
13401373
auto commonString = makeCommonErrorStringGetter();
13411374
return TypeLookupError([=] {
13421375
return commonString() + "param " + std::to_string(i) +
13431376
" has unexpected kind " +
13441377
std::to_string(static_cast<uint8_t>(param.getKind()));
13451378
});
13461379
}
1347-
if (param.hasKeyArgument())
1348-
allGenericArgsVec.push_back(allGenericArgs[i]);
13491380
}
13501381

13511382
// Fill in the length for each shape class.
@@ -1597,12 +1628,9 @@ class DecodedMetadataBuilder {
15971628
return BuiltType();
15981629
auto outerContext = descriptor->Parent.get();
15991630

1600-
llvm::SmallVector<const Metadata *, 8> allGenericArgs;
1601-
for (auto argSet : genericArgs) {
1602-
// FIXME: variadic generics
1603-
for (auto arg : argSet)
1604-
allGenericArgs.push_back(arg.getMetadata());
1605-
}
1631+
llvm::SmallVector<MetadataOrPack, 8> allGenericArgs;
1632+
for (auto argSet : genericArgs)
1633+
allGenericArgs.append(argSet.begin(), argSet.end());
16061634

16071635
// Gather the generic parameters we need to parameterize the opaque decl.
16081636
llvm::SmallVector<unsigned, 8> genericParamCounts;
@@ -1719,12 +1747,7 @@ class DecodedMetadataBuilder {
17191747
llvm::SmallVector<unsigned, 8> genericParamCounts;
17201748
llvm::SmallVector<const void *, 8> allGenericArgsVec;
17211749

1722-
// FIXME: variadic generics
1723-
llvm::SmallVector<const Metadata *, 4> genericArgsMetadata;
1724-
for (auto arg : genericArgs)
1725-
genericArgsMetadata.push_back(arg.getMetadata());
1726-
1727-
if (auto error = _gatherGenericParameters(typeDecl, genericArgsMetadata,
1750+
if (auto error = _gatherGenericParameters(typeDecl, genericArgs,
17281751
parent.getMetadataOrNull(),
17291752
genericParamCounts,
17301753
allGenericArgsVec, demangler))
@@ -1968,14 +1991,22 @@ class DecodedMetadataBuilder {
19681991

19691992
TypeLookupErrorOr<BuiltType>
19701993
createPackType(llvm::ArrayRef<BuiltType> elements) const {
1971-
// FIXME: Runtime support for variadic generics.
1972-
return BuiltType();
1994+
for (auto element : elements) {
1995+
if (!element.isMetadata()) {
1996+
return TYPE_LOOKUP_ERROR_FMT("Can't have nested metadata packs");
1997+
}
1998+
}
1999+
2000+
MetadataPackPointer pack(swift_allocateMetadataPack(
2001+
reinterpret_cast<const Metadata * const *>(elements.data()),
2002+
elements.size()));
2003+
2004+
return BuiltType(pack);
19732005
}
19742006

19752007
TypeLookupErrorOr<BuiltType>
19762008
createSILPackType(llvm::ArrayRef<BuiltType> elements, bool isElementAddress) const {
1977-
// FIXME: Runtime support for variadic generics.
1978-
return BuiltType();
2009+
return TYPE_LOOKUP_ERROR_FMT("Lowered SILPackType cannot be demangled");
19792010
}
19802011

19812012
TypeLookupErrorOr<BuiltType>
@@ -1986,8 +2017,7 @@ class DecodedMetadataBuilder {
19862017

19872018
TypeLookupErrorOr<BuiltType> createDependentMemberType(StringRef name,
19882019
BuiltType base) const {
1989-
// Should not have unresolved dependent member types here.
1990-
return BuiltType();
2020+
return TYPE_LOOKUP_ERROR_FMT("Unbound dependent member type cannot be demangled");
19912021
}
19922022

19932023
TypeLookupErrorOr<BuiltType>
@@ -2890,8 +2920,10 @@ const Metadata *SubstGenericParametersFromWrittenArgs::getMetadata(
28902920
unsigned depth, unsigned index) const {
28912921
if (auto flatIndex =
28922922
_depthIndexToFlatIndex(depth, index, genericParamCounts)) {
2893-
if (*flatIndex < allGenericArgs.size())
2894-
return allGenericArgs[*flatIndex];
2923+
if (*flatIndex < allGenericArgs.size()) {
2924+
// FIXME: variadic generics
2925+
return allGenericArgs[*flatIndex].getMetadata();
2926+
}
28952927
}
28962928

28972929
return nullptr;
@@ -2924,7 +2956,7 @@ demangleToGenericParamRef(StringRef typeName) {
29242956

29252957
static void _gatherWrittenGenericArgs(
29262958
const Metadata *metadata, const TypeContextDescriptor *description,
2927-
llvm::SmallVectorImpl<const Metadata *> &allGenericArgs,
2959+
llvm::SmallVectorImpl<MetadataOrPack> &allGenericArgs,
29282960
Demangler &BorrowFrom) {
29292961
if (!description)
29302962
return;
@@ -2941,10 +2973,25 @@ static void _gatherWrittenGenericArgs(
29412973
// another type.
29422974
if (param.hasKeyArgument()) {
29432975
auto genericArg = *genericArgs++;
2944-
allGenericArgs.push_back(genericArg);
2976+
allGenericArgs.push_back(MetadataOrPack(genericArg));
2977+
} else {
2978+
// Leave a gap for us to fill in by looking at same type info.
2979+
allGenericArgs.push_back(MetadataOrPack());
2980+
missingWrittenArguments = true;
2981+
}
2982+
2983+
break;
2984+
2985+
case GenericParamKind::TypePack:
2986+
// The type should have a key argument unless it's been same-typed to
2987+
// another type.
2988+
if (param.hasKeyArgument()) {
2989+
auto genericArg = reinterpret_cast<const Metadata * const *>(*genericArgs++);
2990+
MetadataPackPointer pack(genericArg);
2991+
allGenericArgs.push_back(MetadataOrPack(pack));
29452992
} else {
29462993
// Leave a gap for us to fill in by looking at same type info.
2947-
allGenericArgs.push_back(nullptr);
2994+
allGenericArgs.push_back(MetadataOrPack());
29482995
missingWrittenArguments = true;
29492996
}
29502997

@@ -2954,7 +3001,7 @@ static void _gatherWrittenGenericArgs(
29543001
// We don't know about this kind of parameter. Create placeholders where
29553002
// needed.
29563003
if (param.hasKeyArgument()) {
2957-
allGenericArgs.push_back(nullptr);
3004+
allGenericArgs.push_back(MetadataOrPack());
29583005
++genericArgs;
29593006
}
29603007

@@ -3001,15 +3048,15 @@ static void _gatherWrittenGenericArgs(
30013048
SubstGenericParametersFromWrittenArgs substitutions(allGenericArgs,
30023049
genericParamCounts);
30033050
allGenericArgs[*lhsFlatIndex] =
3004-
swift_getTypeByMangledName(MetadataState::Abstract,
3051+
MetadataOrPack(swift_getTypeByMangledName(MetadataState::Abstract,
30053052
req.getMangledTypeName(),
30063053
(const void * const *)allGenericArgs.data(),
30073054
[&substitutions](unsigned depth, unsigned index) {
30083055
return substitutions.getMetadata(depth, index);
30093056
},
30103057
[&substitutions](const Metadata *type, unsigned index) {
30113058
return substitutions.getWitnessTable(type, index);
3012-
}).getType().getMetadata();
3059+
}).getType().getMetadata());
30133060
continue;
30143061
}
30153062

0 commit comments

Comments
 (0)