Skip to content

Commit 863d6c9

Browse files
committed
[lldb] Factor our binding generic variadic types (NFC)
(cherry picked from commit d7572b3)
1 parent 39db03c commit 863d6c9

File tree

4 files changed

+143
-91
lines changed

4 files changed

+143
-91
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,9 @@ class SwiftLanguageRuntime : public LanguageRuntime {
273273
Address &address, Value::ValueType &value_type,
274274
llvm::ArrayRef<uint8_t> &local_buffer) override;
275275

276+
llvm::Expected<CompilerType> BindGenericPackType(StackFrame &frame,
277+
CompilerType pack_type,
278+
bool *indirect = nullptr);
276279
CompilerType BindGenericTypeParameters(
277280
CompilerType unbound_type,
278281
std::function<CompilerType(unsigned, unsigned)> finder);

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

Lines changed: 93 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1774,50 +1774,33 @@ CreatePackType(swift::Demangle::Demangler &dem, TypeSystemSwiftTypeRef &ts,
17741774
return pack;
17751775
}
17761776

1777-
bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Pack(
1778-
ValueObject &in_value, CompilerType pack_type,
1779-
lldb::DynamicValueType use_dynamic, TypeAndOrName &pack_type_or_name,
1780-
Address &address, Value::ValueType &value_type) {
1781-
Log *log(GetLog(LLDBLog::Types));
1777+
llvm::Expected<CompilerType>
1778+
SwiftLanguageRuntime::BindGenericPackType(StackFrame &frame,
1779+
CompilerType pack_type, bool *is_indirect) {
1780+
swift::Demangle::Demangler dem;
1781+
Target &target = GetProcess().GetTarget();
1782+
size_t ptr_size = GetProcess().GetAddressByteSize();
1783+
ConstString func_name = frame.GetSymbolContext(eSymbolContextFunction)
1784+
.GetFunctionName(Mangled::ePreferMangled);
17821785
ThreadSafeReflectionContext reflection_ctx = GetReflectionContext();
17831786
if (!reflection_ctx)
1784-
return false;
1785-
1786-
// Return a tuple type, with one element per pack element and its
1787-
// type has all DependentGenericParamType that appear in type packs
1788-
// substituted.
1789-
1790-
StackFrameSP frame = in_value.GetExecutionContextRef().GetFrameSP();
1791-
if (!frame)
1792-
return false;
1793-
ConstString func_name = frame->GetSymbolContext(eSymbolContextFunction)
1794-
.GetFunctionName(Mangled::ePreferMangled);
1787+
return llvm::createStringError("no reflection context");
17951788

17961789
// Extract the generic signature from the function symbol.
17971790
auto ts =
17981791
pack_type.GetTypeSystem().dyn_cast_or_null<TypeSystemSwiftTypeRef>();
17991792
if (!ts)
1800-
return false;
1793+
return llvm::createStringError("no type system");
18011794
auto signature =
1802-
SwiftLanguageRuntime::GetGenericSignature(func_name.GetStringRef(), *ts);
1803-
if (!signature) {
1804-
LLDB_LOG(log, "cannot decode pack_expansion type: failed to decode generic "
1805-
"signature from function name");
1806-
return false;
1807-
}
1808-
// This type has already been resolved?
1809-
if (auto info = ts->IsSILPackType(pack_type))
1810-
if (info->expanded)
1811-
return false;
1812-
1813-
Target &target = GetProcess().GetTarget();
1814-
size_t ptr_size = GetProcess().GetAddressByteSize();
1815-
1816-
swift::Demangle::Demangler dem;
1795+
SwiftLanguageRuntime::GetGenericSignature(func_name.GetStringRef(), *ts);
1796+
if (!signature)
1797+
return llvm::createStringError(
1798+
"cannot decode pack_expansion type: failed to decode generic signature "
1799+
"from function name");
18171800

18181801
auto expand_pack_type = [&](ConstString mangled_pack_type, bool indirect,
18191802
swift::Mangle::ManglingFlavor flavor)
1820-
-> swift::Demangle::NodePointer {
1803+
-> llvm::Expected<swift::Demangle::NodePointer> {
18211804
// Find pack_type in the pack_expansions.
18221805
unsigned i = 0;
18231806
SwiftLanguageRuntime::GenericSignature::PackExpansion *pack_expansion =
@@ -1829,26 +1812,23 @@ bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Pack(
18291812
}
18301813
++i;
18311814
}
1832-
if (!pack_expansion) {
1833-
LLDB_LOG(log, "cannot decode pack_expansion type: failed to find a "
1834-
"matching type in the function signature");
1835-
return {};
1836-
}
1815+
if (!pack_expansion)
1816+
return llvm::createStringError(
1817+
"cannot decode pack_expansion type: failed to find a matching type "
1818+
"in the function signature");
18371819

18381820
// Extract the count.
18391821
llvm::SmallString<16> buf;
18401822
llvm::raw_svector_ostream os(buf);
18411823
os << "$pack_count_" << signature->GetCountForValuePack(i);
18421824
StringRef count_var = os.str();
18431825
std::optional<lldb::addr_t> count =
1844-
GetTypeMetadataForTypeNameAndFrame(count_var, *frame);
1845-
if (!count) {
1846-
LLDB_LOG(log,
1847-
"cannot decode pack_expansion type: failed to find count "
1848-
"argument \"%s\" in frame",
1849-
count_var.str());
1850-
return {};
1851-
}
1826+
GetTypeMetadataForTypeNameAndFrame(count_var, frame);
1827+
if (!count)
1828+
return llvm::createStringError(
1829+
"cannot decode pack_expansion type: failed to find count argument "
1830+
"\"%s\" in frame",
1831+
count_var.str().c_str());
18521832

18531833
// Extract the metadata for the type packs in this value pack.
18541834
llvm::SmallDenseMap<std::pair<unsigned, unsigned>, lldb::addr_t> type_packs;
@@ -1871,13 +1851,13 @@ bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Pack(
18711851
os << u8"$\u03C4_" << shape.depth << '_' << shape.index;
18721852
StringRef mds_var = os.str();
18731853
std::optional<lldb::addr_t> mds_ptr =
1874-
GetTypeMetadataForTypeNameAndFrame(mds_var, *frame);
1854+
GetTypeMetadataForTypeNameAndFrame(mds_var, frame);
18751855
if (!mds_ptr) {
1876-
LLDB_LOG(log,
1877-
"cannot decode pack_expansion type: failed to find "
1878-
"metadata "
1879-
"for \"{0}\" in frame",
1880-
mds_var.str());
1856+
LLDB_LOG(GetLog(LLDBLog::Types),
1857+
"cannot decode pack_expansion type: failed to find "
1858+
"metadata "
1859+
"for \"{0}\" in frame",
1860+
mds_var.str());
18811861
error = true;
18821862
return;
18831863
}
@@ -1886,7 +1866,7 @@ bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Pack(
18861866
}
18871867
});
18881868
if (error)
1889-
return {};
1869+
return llvm::createStringError("cannot decode pack_expansion type");
18901870

18911871
// Walk the type packs.
18921872
std::vector<TypeSystemSwift::TupleElement> elements;
@@ -1903,29 +1883,25 @@ bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Pack(
19031883
Status status;
19041884
lldb::addr_t md = LLDB_INVALID_ADDRESS;
19051885
target.ReadMemory(md_ptr, &md, ptr_size, status, true);
1906-
if (!status.Success()) {
1907-
LLDB_LOGF(log,
1886+
if (!status.Success())
1887+
return llvm::createStringError(
19081888
"cannot decode pack_expansion type: failed to read type "
19091889
"pack for type %d/%d of type pack with shape %d %d",
19101890
j, (unsigned)*count, depth, index);
1911-
return {};
1912-
}
19131891

19141892
auto type_ref_or_err =
19151893
reflection_ctx->ReadTypeFromMetadata(md, ts->GetDescriptorFinder());
1916-
if (!type_ref_or_err) {
1917-
LLDB_LOG_ERRORV(GetLog(LLDBLog::Types), type_ref_or_err.takeError(),
1918-
"{0}");
1919-
LLDB_LOGF(log,
1920-
"cannot decode pack_expansion type: failed to decode type "
1921-
"metadata for type %d/%d of type pack with shape %d %d",
1922-
j, (unsigned)*count, depth, index);
1923-
return {};
1924-
}
1894+
if (!type_ref_or_err)
1895+
return llvm::joinErrors(
1896+
llvm::createStringError(
1897+
"cannot decode pack_expansion type: failed to decode type "
1898+
"metadata for type %d/%d of type pack with shape %d %d",
1899+
j, (unsigned)*count, depth, index),
1900+
type_ref_or_err.takeError());
19251901
substitutions.insert({{depth, index}, &*type_ref_or_err});
19261902
}
19271903
if (substitutions.empty())
1928-
return {};
1904+
return llvm::createStringError("found no substitutions");
19291905

19301906
// Replace all pack expansions with a singular type. Otherwise the
19311907
// reflection context won't accept them.
@@ -1942,21 +1918,15 @@ bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Pack(
19421918
// Build a TypeRef from the demangle tree.
19431919
auto type_ref_or_err = reflection_ctx->GetTypeRef(
19441920
dem, pack_element, ts->GetDescriptorFinder());
1945-
if (!type_ref_or_err) {
1946-
LLDB_LOG_ERRORV(GetLog(LLDBLog::Types), type_ref_or_err.takeError(),
1947-
"{0}");
1948-
return {};
1949-
}
1921+
if (!type_ref_or_err)
1922+
return type_ref_or_err.takeError();
19501923
auto &type_ref = *type_ref_or_err;
19511924

19521925
// Apply the substitutions.
19531926
auto bound_typeref_or_err = reflection_ctx->ApplySubstitutions(
19541927
type_ref, substitutions, ts->GetDescriptorFinder());
1955-
if (!bound_typeref_or_err) {
1956-
LLDB_LOG_ERRORV(GetLog(LLDBLog::Types), bound_typeref_or_err.takeError(),
1957-
"{0}");
1958-
return {};
1959-
}
1928+
if (!bound_typeref_or_err)
1929+
return bound_typeref_or_err.takeError();
19601930
swift::Demangle::NodePointer node = bound_typeref_or_err->getDemangling(dem);
19611931
CompilerType type = ts->RemangleAsType(dem, node, flavor);
19621932

@@ -1986,12 +1956,14 @@ bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Pack(
19861956

19871957
auto flavor =
19881958
SwiftLanguageRuntime::GetManglingFlavor(pack_type.GetMangledTypeName());
1959+
bool indirect = false;
19891960

19901961
// Expand all the pack types that appear in the incoming type,
19911962
// either at the root level or as arguments of bound generic types.
1992-
bool indirect = false;
1993-
auto transformed = TypeSystemSwiftTypeRef::Transform(
1994-
dem, node, [&](swift::Demangle::NodePointer node) {
1963+
auto transformed = TypeSystemSwiftTypeRef::TryTransform(
1964+
dem, node,
1965+
[&](swift::Demangle::NodePointer node)
1966+
-> llvm::Expected<swift::Demangle::NodePointer> {
19951967
if (node->getKind() == swift::Demangle::Node::Kind::SILPackIndirect)
19961968
indirect = true;
19971969
if (node->getKind() != swift::Demangle::Node::Kind::SILPackIndirect &&
@@ -2004,17 +1976,48 @@ bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Pack(
20041976
node = node->getChild(0);
20051977
CompilerType pack_type = ts->RemangleAsType(dem, node, flavor);
20061978
ConstString mangled_pack_type = pack_type.GetMangledTypeName();
2007-
LLDB_LOG(log, "decoded pack_expansion type: {0}", mangled_pack_type);
2008-
auto result = expand_pack_type(mangled_pack_type, indirect, flavor);
2009-
if (!result) {
2010-
LLDB_LOG(log, "failed to expand pack type: {0}", mangled_pack_type);
2011-
return node;
2012-
}
2013-
return result;
1979+
LLDB_LOG(GetLog(LLDBLog::Types), "decoded pack_expansion type: {0}",
1980+
mangled_pack_type);
1981+
return expand_pack_type(mangled_pack_type, indirect, flavor);
20141982
});
20151983

2016-
CompilerType expanded_type = ts->RemangleAsType(dem, transformed, flavor);
2017-
pack_type_or_name.SetCompilerType(expanded_type);
1984+
if (!transformed)
1985+
return transformed.takeError();
1986+
if (is_indirect)
1987+
*is_indirect = indirect;
1988+
return ts->RemangleAsType(dem, *transformed, flavor);
1989+
}
1990+
1991+
bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Pack(
1992+
ValueObject &in_value, CompilerType pack_type,
1993+
lldb::DynamicValueType use_dynamic, TypeAndOrName &pack_type_or_name,
1994+
Address &address, Value::ValueType &value_type) {
1995+
Log *log(GetLog(LLDBLog::Types));
1996+
// Return a tuple type, with one element per pack element and its
1997+
// type has all DependentGenericParamType that appear in type packs
1998+
// substituted.
1999+
2000+
StackFrameSP frame = in_value.GetExecutionContextRef().GetFrameSP();
2001+
if (!frame)
2002+
return false;
2003+
2004+
// This type has already been resolved?
2005+
auto ts =
2006+
pack_type.GetTypeSystem().dyn_cast_or_null<TypeSystemSwiftTypeRef>();
2007+
if (!ts)
2008+
return false;
2009+
if (auto info = ts->IsSILPackType(pack_type))
2010+
if (info->expanded)
2011+
return false;
2012+
2013+
bool indirect = false;
2014+
llvm::Expected<CompilerType> expanded_type =
2015+
BindGenericPackType(*frame, pack_type, &indirect);
2016+
if (!expanded_type) {
2017+
LLDB_LOG_ERROR(GetLog(LLDBLog::Types), expanded_type.takeError(), "{0}");
2018+
return false;
2019+
}
2020+
pack_type_or_name.SetCompilerType(*expanded_type);
20182021

20192022
AddressType address_type;
20202023
lldb::addr_t addr = in_value.GetAddressOf(true, &address_type);
@@ -2024,7 +2027,7 @@ bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Pack(
20242027
addr = GetProcess().ReadPointerFromMemory(addr, status);
20252028
if (status.Fail()) {
20262029
LLDB_LOG(log, "failed to dereference indirect pack: {0}",
2027-
expanded_type.GetMangledTypeName());
2030+
expanded_type->GetMangledTypeName());
20282031
return false;
20292032
}
20302033
}
@@ -3434,7 +3437,6 @@ SwiftLanguageRuntime::GetSwiftRuntimeTypeInfo(
34343437
CompilerType type, ExecutionContextScope *exe_scope,
34353438
swift::reflection::TypeRef const **out_tr) {
34363439
Log *log(GetLog(LLDBLog::Types));
3437-
34383440
if (log && log->GetVerbose())
34393441
LLDB_LOG(log,
34403442
"[SwiftLanguageRuntime::GetSwiftRuntimeTypeInfo] Getting "

lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1157,6 +1157,42 @@ swift::Demangle::NodePointer TypeSystemSwiftTypeRef::Transform(
11571157
return fn(node);
11581158
}
11591159

1160+
llvm::Expected<swift::Demangle::NodePointer>
1161+
TypeSystemSwiftTypeRef::TryTransform(
1162+
swift::Demangle::Demangler &dem, swift::Demangle::NodePointer node,
1163+
std::function<llvm::Expected<swift::Demangle::NodePointer>(
1164+
swift::Demangle::NodePointer)>
1165+
fn) {
1166+
if (!node)
1167+
return node;
1168+
using namespace swift::Demangle;
1169+
llvm::SmallVector<NodePointer, 2> children;
1170+
bool changed = false;
1171+
for (NodePointer child : *node) {
1172+
llvm::Expected<NodePointer> transformed_or_err = TryTransform(dem, child, fn);
1173+
if (!transformed_or_err)
1174+
return transformed_or_err.takeError();
1175+
NodePointer transformed = *transformed_or_err;
1176+
changed |= (child != transformed);
1177+
assert(transformed && "callback returned a nullptr");
1178+
if (transformed)
1179+
children.push_back(transformed);
1180+
}
1181+
if (changed) {
1182+
// Create a new node with the transformed children.
1183+
auto kind = node->getKind();
1184+
if (node->hasText())
1185+
node = dem.createNodeWithAllocatedText(kind, node->getText());
1186+
else if (node->hasIndex())
1187+
node = dem.createNode(kind, node->getIndex());
1188+
else
1189+
node = dem.createNode(kind);
1190+
for (NodePointer transformed_child : children)
1191+
node->addChild(transformed_child, dem);
1192+
}
1193+
return fn(node);
1194+
}
1195+
11601196
void TypeSystemSwiftTypeRef::PreOrderTraversal(
11611197
swift::Demangle::NodePointer node,
11621198
std::function<bool(swift::Demangle::NodePointer)> visitor) {

lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,17 @@ class TypeSystemSwiftTypeRef : public TypeSystemSwift {
366366
std::function<swift::Demangle::NodePointer(swift::Demangle::NodePointer)>
367367
visitor);
368368

369+
/// Recursively transform the demangle tree starting a \p node by
370+
/// doing a post-order traversal and replacing each node with
371+
/// fn(node).
372+
/// The NodePointer passed to \p fn is guaranteed to be non-null.
373+
static llvm::Expected<swift::Demangle::NodePointer>
374+
TryTransform(swift::Demangle::Demangler &dem,
375+
swift::Demangle::NodePointer node,
376+
std::function<llvm::Expected<swift::Demangle::NodePointer>(
377+
swift::Demangle::NodePointer)>
378+
visitor);
379+
369380
/// A left-to-right preorder traversal. Don't visit children if
370381
/// visitor returns false.
371382
static void

0 commit comments

Comments
 (0)