Skip to content

Commit 1462210

Browse files
Merge pull request #6473 from adrian-prantl/is-pack
Add an is_pack flag to GenericSignature
2 parents 46f3f8b + 356ec74 commit 1462210

File tree

3 files changed

+61
-6
lines changed

3 files changed

+61
-6
lines changed

lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntime.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,7 @@ class SwiftLanguageRuntime : public LanguageRuntime {
281281
/// A vector of |generic_params| bits, indicating which other
282282
/// generic_params share the same shape.
283283
llvm::BitVector same_shape;
284+
bool is_pack = false;
284285
GenericParam(unsigned d, unsigned i, unsigned nparams)
285286
: depth(d), index(i), same_shape(nparams) {}
286287
};
@@ -294,11 +295,12 @@ class SwiftLanguageRuntime : public LanguageRuntime {
294295
};
295296

296297
llvm::SmallVector<GenericParam, 4> generic_params;
297-
/// Indices of the shape of the pack expansions.
298298
llvm::SmallVector<PackExpansion> pack_expansions;
299299

300300
llvm::SmallVector<unsigned, 4> count_for_value_pack;
301301
llvm::SmallVector<unsigned, 4> count_for_type_pack;
302+
unsigned dependent_generic_param_count = 0;
303+
unsigned num_counts = 0;
302304

303305
unsigned GetNumValuePacks() { return count_for_value_pack.size(); }
304306
unsigned GetNumTypePacks() { return count_for_type_pack.size(); }

lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntimeNames.cpp

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -677,9 +677,8 @@ void SwiftLanguageRuntime::GetGenericParameterNamesForFunction(
677677
}
678678
}
679679

680-
std::string
681-
SwiftLanguageRuntime::DemangleSymbolAsString(StringRef symbol, DemangleMode mode,
682-
const SymbolContext *sc) {
680+
std::string SwiftLanguageRuntime::DemangleSymbolAsString(
681+
StringRef symbol, DemangleMode mode, const SymbolContext *sc) {
683682
bool did_init = false;
684683
llvm::DenseMap<ArchetypePath, StringRef> dict;
685684
swift::Demangle::DemangleOptions options;
@@ -1231,7 +1230,8 @@ SwiftLanguageRuntime::GetGenericSignature(StringRef function_name,
12311230
if (child->getKind() ==
12321231
swift::Demangle::Node::Kind::DependentGenericParamCount &&
12331232
child->hasIndex()) {
1234-
if (child->getIndex() != num_generic_params)
1233+
signature.dependent_generic_param_count = child->getIndex();
1234+
if (signature.dependent_generic_param_count > num_generic_params)
12351235
return {};
12361236
continue;
12371237
}
@@ -1331,12 +1331,24 @@ SwiftLanguageRuntime::GetGenericSignature(StringRef function_name,
13311331
signature.count_for_type_pack.push_back(count);
13321332

13331333
// Mark all pack_expansions with the same shape for skipping.
1334-
auto shape = signature.generic_params[shape_idx];
1334+
auto &shape = signature.generic_params[shape_idx];
13351335
skip |= shape.same_shape;
13361336
}
1337+
signature.num_counts = next_count;
13371338
assert(signature.count_for_value_pack.size() ==
13381339
signature.pack_expansions.size());
13391340

1341+
// Fill in the is_pack field for all generic parameters.
1342+
for (auto pack_expansion : signature.pack_expansions) {
1343+
unsigned shape_idx = pack_expansion.shape;
1344+
auto &param = signature.generic_params[shape_idx];
1345+
param.is_pack = true;
1346+
for (unsigned idx : param.same_shape.set_bits()) {
1347+
auto &sibling = signature.generic_params[idx];
1348+
sibling.is_pack = true;
1349+
}
1350+
}
1351+
13401352
return signature;
13411353
}
13421354

lldb/unittests/Symbol/TestTypeSystemSwiftTypeRef.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -930,6 +930,8 @@ TEST_F(TestTypeSystemSwiftTypeRef, GenericSignature) {
930930
ASSERT_EQ(s.GetNumTypePacks(), 1);
931931
ASSERT_EQ(s.GetCountForValuePack(0), 0);
932932
ASSERT_EQ(s.GetCountForTypePack(0), 0);
933+
ASSERT_TRUE(s.generic_params[0].is_pack);
934+
ASSERT_FALSE(s.generic_params[1].is_pack);
933935
}
934936
{
935937
// public func f6<U..., V...>(us: repeat each U, more_us: repeat each U, vs: repeat each V) {}
@@ -969,6 +971,45 @@ TEST_F(TestTypeSystemSwiftTypeRef, GenericSignature) {
969971
ASSERT_EQ(s.GetCountForValuePack(3), 1);
970972
ASSERT_EQ(s.GetCountForTypePack(0), 0);
971973
ASSERT_EQ(s.GetCountForTypePack(1), 1);
974+
ASSERT_EQ(s.num_counts, 2);
972975
}
973976

977+
// Test non-variadic functions.
978+
{
979+
//public class C<U> {
980+
// public func f<V>(_ v: V) {}
981+
//}
982+
auto maybe_signature = SwiftLanguageRuntime::GetGenericSignature(
983+
"$s1t1CC1fyyqd__lF", *m_swift_ts);
984+
ASSERT_TRUE(maybe_signature.hasValue());
985+
auto s = *maybe_signature;
986+
// "U" does not count.
987+
ASSERT_EQ(s.dependent_generic_param_count, 1);
988+
ASSERT_EQ(s.generic_params.size(), 1);
989+
ASSERT_EQ(s.pack_expansions.size(), 0);
990+
ASSERT_EQ(s.GetNumValuePacks(), 0);
991+
ASSERT_EQ(s.GetNumTypePacks(), 0);
992+
}
993+
// Test non-variadic functions.
994+
{
995+
//public class C<U> {
996+
// public func f<V>(_ u: U, _ v: V) {}
997+
//}
998+
auto maybe_signature = SwiftLanguageRuntime::GetGenericSignature(
999+
"$s1t1CC1fyyx_qd__tlF", *m_swift_ts);
1000+
ASSERT_TRUE(maybe_signature.hasValue());
1001+
auto s = *maybe_signature;
1002+
ASSERT_EQ(s.dependent_generic_param_count, 1);
1003+
ASSERT_EQ(s.generic_params.size(), 2);
1004+
ASSERT_EQ(s.pack_expansions.size(), 0);
1005+
ASSERT_EQ(s.GetNumValuePacks(), 0);
1006+
ASSERT_EQ(s.GetNumTypePacks(), 0);
1007+
}
1008+
// Test a non-generic function.
1009+
{
1010+
// public func f() {}
1011+
auto maybe_signature = SwiftLanguageRuntime::GetGenericSignature(
1012+
"$s1t1fyyF", *m_swift_ts);
1013+
ASSERT_FALSE(maybe_signature.hasValue());
1014+
}
9741015
}

0 commit comments

Comments
 (0)