Skip to content

Commit d7572b3

Browse files
committed
[lldb] Factor our binding generic variadic types (NFC)
1 parent d03a4ce commit d7572b3

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
@@ -1764,50 +1764,33 @@ CreatePackType(swift::Demangle::Demangler &dem, TypeSystemSwiftTypeRef &ts,
17641764
return pack;
17651765
}
17661766

1767-
bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Pack(
1768-
ValueObject &in_value, CompilerType pack_type,
1769-
lldb::DynamicValueType use_dynamic, TypeAndOrName &pack_type_or_name,
1770-
Address &address, Value::ValueType &value_type) {
1771-
Log *log(GetLog(LLDBLog::Types));
1767+
llvm::Expected<CompilerType>
1768+
SwiftLanguageRuntime::BindGenericPackType(StackFrame &frame,
1769+
CompilerType pack_type, bool *is_indirect) {
1770+
swift::Demangle::Demangler dem;
1771+
Target &target = GetProcess().GetTarget();
1772+
size_t ptr_size = GetProcess().GetAddressByteSize();
1773+
ConstString func_name = frame.GetSymbolContext(eSymbolContextFunction)
1774+
.GetFunctionName(Mangled::ePreferMangled);
17721775
ThreadSafeReflectionContext reflection_ctx = GetReflectionContext();
17731776
if (!reflection_ctx)
1774-
return false;
1775-
1776-
// Return a tuple type, with one element per pack element and its
1777-
// type has all DependentGenericParamType that appear in type packs
1778-
// substituted.
1779-
1780-
StackFrameSP frame = in_value.GetExecutionContextRef().GetFrameSP();
1781-
if (!frame)
1782-
return false;
1783-
ConstString func_name = frame->GetSymbolContext(eSymbolContextFunction)
1784-
.GetFunctionName(Mangled::ePreferMangled);
1777+
return llvm::createStringError("no reflection context");
17851778

17861779
// Extract the generic signature from the function symbol.
17871780
auto ts =
17881781
pack_type.GetTypeSystem().dyn_cast_or_null<TypeSystemSwiftTypeRef>();
17891782
if (!ts)
1790-
return false;
1783+
return llvm::createStringError("no type system");
17911784
auto signature =
1792-
SwiftLanguageRuntime::GetGenericSignature(func_name.GetStringRef(), *ts);
1793-
if (!signature) {
1794-
LLDB_LOG(log, "cannot decode pack_expansion type: failed to decode generic "
1795-
"signature from function name");
1796-
return false;
1797-
}
1798-
// This type has already been resolved?
1799-
if (auto info = ts->IsSILPackType(pack_type))
1800-
if (info->expanded)
1801-
return false;
1802-
1803-
Target &target = GetProcess().GetTarget();
1804-
size_t ptr_size = GetProcess().GetAddressByteSize();
1805-
1806-
swift::Demangle::Demangler dem;
1785+
SwiftLanguageRuntime::GetGenericSignature(func_name.GetStringRef(), *ts);
1786+
if (!signature)
1787+
return llvm::createStringError(
1788+
"cannot decode pack_expansion type: failed to decode generic signature "
1789+
"from function name");
18071790

18081791
auto expand_pack_type = [&](ConstString mangled_pack_type, bool indirect,
18091792
swift::Mangle::ManglingFlavor flavor)
1810-
-> swift::Demangle::NodePointer {
1793+
-> llvm::Expected<swift::Demangle::NodePointer> {
18111794
// Find pack_type in the pack_expansions.
18121795
unsigned i = 0;
18131796
SwiftLanguageRuntime::GenericSignature::PackExpansion *pack_expansion =
@@ -1819,26 +1802,23 @@ bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Pack(
18191802
}
18201803
++i;
18211804
}
1822-
if (!pack_expansion) {
1823-
LLDB_LOG(log, "cannot decode pack_expansion type: failed to find a "
1824-
"matching type in the function signature");
1825-
return {};
1826-
}
1805+
if (!pack_expansion)
1806+
return llvm::createStringError(
1807+
"cannot decode pack_expansion type: failed to find a matching type "
1808+
"in the function signature");
18271809

18281810
// Extract the count.
18291811
llvm::SmallString<16> buf;
18301812
llvm::raw_svector_ostream os(buf);
18311813
os << "$pack_count_" << signature->GetCountForValuePack(i);
18321814
StringRef count_var = os.str();
18331815
std::optional<lldb::addr_t> count =
1834-
GetTypeMetadataForTypeNameAndFrame(count_var, *frame);
1835-
if (!count) {
1836-
LLDB_LOG(log,
1837-
"cannot decode pack_expansion type: failed to find count "
1838-
"argument \"%s\" in frame",
1839-
count_var.str());
1840-
return {};
1841-
}
1816+
GetTypeMetadataForTypeNameAndFrame(count_var, frame);
1817+
if (!count)
1818+
return llvm::createStringError(
1819+
"cannot decode pack_expansion type: failed to find count argument "
1820+
"\"%s\" in frame",
1821+
count_var.str().c_str());
18421822

18431823
// Extract the metadata for the type packs in this value pack.
18441824
llvm::SmallDenseMap<std::pair<unsigned, unsigned>, lldb::addr_t> type_packs;
@@ -1861,13 +1841,13 @@ bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Pack(
18611841
os << u8"$\u03C4_" << shape.depth << '_' << shape.index;
18621842
StringRef mds_var = os.str();
18631843
std::optional<lldb::addr_t> mds_ptr =
1864-
GetTypeMetadataForTypeNameAndFrame(mds_var, *frame);
1844+
GetTypeMetadataForTypeNameAndFrame(mds_var, frame);
18651845
if (!mds_ptr) {
1866-
LLDB_LOG(log,
1867-
"cannot decode pack_expansion type: failed to find "
1868-
"metadata "
1869-
"for \"{0}\" in frame",
1870-
mds_var.str());
1846+
LLDB_LOG(GetLog(LLDBLog::Types),
1847+
"cannot decode pack_expansion type: failed to find "
1848+
"metadata "
1849+
"for \"{0}\" in frame",
1850+
mds_var.str());
18711851
error = true;
18721852
return;
18731853
}
@@ -1876,7 +1856,7 @@ bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Pack(
18761856
}
18771857
});
18781858
if (error)
1879-
return {};
1859+
return llvm::createStringError("cannot decode pack_expansion type");
18801860

18811861
// Walk the type packs.
18821862
std::vector<TypeSystemSwift::TupleElement> elements;
@@ -1893,29 +1873,25 @@ bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Pack(
18931873
Status status;
18941874
lldb::addr_t md = LLDB_INVALID_ADDRESS;
18951875
target.ReadMemory(md_ptr, &md, ptr_size, status, true);
1896-
if (!status.Success()) {
1897-
LLDB_LOGF(log,
1876+
if (!status.Success())
1877+
return llvm::createStringError(
18981878
"cannot decode pack_expansion type: failed to read type "
18991879
"pack for type %d/%d of type pack with shape %d %d",
19001880
j, (unsigned)*count, depth, index);
1901-
return {};
1902-
}
19031881

19041882
auto type_ref_or_err =
19051883
reflection_ctx->ReadTypeFromMetadata(md, ts->GetDescriptorFinder());
1906-
if (!type_ref_or_err) {
1907-
LLDB_LOG_ERRORV(GetLog(LLDBLog::Types), type_ref_or_err.takeError(),
1908-
"{0}");
1909-
LLDB_LOGF(log,
1910-
"cannot decode pack_expansion type: failed to decode type "
1911-
"metadata for type %d/%d of type pack with shape %d %d",
1912-
j, (unsigned)*count, depth, index);
1913-
return {};
1914-
}
1884+
if (!type_ref_or_err)
1885+
return llvm::joinErrors(
1886+
llvm::createStringError(
1887+
"cannot decode pack_expansion type: failed to decode type "
1888+
"metadata for type %d/%d of type pack with shape %d %d",
1889+
j, (unsigned)*count, depth, index),
1890+
type_ref_or_err.takeError());
19151891
substitutions.insert({{depth, index}, &*type_ref_or_err});
19161892
}
19171893
if (substitutions.empty())
1918-
return {};
1894+
return llvm::createStringError("found no substitutions");
19191895

19201896
// Replace all pack expansions with a singular type. Otherwise the
19211897
// reflection context won't accept them.
@@ -1932,21 +1908,15 @@ bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Pack(
19321908
// Build a TypeRef from the demangle tree.
19331909
auto type_ref_or_err = reflection_ctx->GetTypeRef(
19341910
dem, pack_element, ts->GetDescriptorFinder());
1935-
if (!type_ref_or_err) {
1936-
LLDB_LOG_ERRORV(GetLog(LLDBLog::Types), type_ref_or_err.takeError(),
1937-
"{0}");
1938-
return {};
1939-
}
1911+
if (!type_ref_or_err)
1912+
return type_ref_or_err.takeError();
19401913
auto &type_ref = *type_ref_or_err;
19411914

19421915
// Apply the substitutions.
19431916
auto bound_typeref_or_err = reflection_ctx->ApplySubstitutions(
19441917
type_ref, substitutions, ts->GetDescriptorFinder());
1945-
if (!bound_typeref_or_err) {
1946-
LLDB_LOG_ERRORV(GetLog(LLDBLog::Types), bound_typeref_or_err.takeError(),
1947-
"{0}");
1948-
return {};
1949-
}
1918+
if (!bound_typeref_or_err)
1919+
return bound_typeref_or_err.takeError();
19501920
swift::Demangle::NodePointer node = bound_typeref_or_err->getDemangling(dem);
19511921
CompilerType type = ts->RemangleAsType(dem, node, flavor);
19521922

@@ -1976,12 +1946,14 @@ bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Pack(
19761946

19771947
auto flavor =
19781948
SwiftLanguageRuntime::GetManglingFlavor(pack_type.GetMangledTypeName());
1949+
bool indirect = false;
19791950

19801951
// Expand all the pack types that appear in the incoming type,
19811952
// either at the root level or as arguments of bound generic types.
1982-
bool indirect = false;
1983-
auto transformed = TypeSystemSwiftTypeRef::Transform(
1984-
dem, node, [&](swift::Demangle::NodePointer node) {
1953+
auto transformed = TypeSystemSwiftTypeRef::TryTransform(
1954+
dem, node,
1955+
[&](swift::Demangle::NodePointer node)
1956+
-> llvm::Expected<swift::Demangle::NodePointer> {
19851957
if (node->getKind() == swift::Demangle::Node::Kind::SILPackIndirect)
19861958
indirect = true;
19871959
if (node->getKind() != swift::Demangle::Node::Kind::SILPackIndirect &&
@@ -1994,17 +1966,48 @@ bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Pack(
19941966
node = node->getChild(0);
19951967
CompilerType pack_type = ts->RemangleAsType(dem, node, flavor);
19961968
ConstString mangled_pack_type = pack_type.GetMangledTypeName();
1997-
LLDB_LOG(log, "decoded pack_expansion type: {0}", mangled_pack_type);
1998-
auto result = expand_pack_type(mangled_pack_type, indirect, flavor);
1999-
if (!result) {
2000-
LLDB_LOG(log, "failed to expand pack type: {0}", mangled_pack_type);
2001-
return node;
2002-
}
2003-
return result;
1969+
LLDB_LOG(GetLog(LLDBLog::Types), "decoded pack_expansion type: {0}",
1970+
mangled_pack_type);
1971+
return expand_pack_type(mangled_pack_type, indirect, flavor);
20041972
});
20051973

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

20092012
AddressType address_type;
20102013
lldb::addr_t addr = in_value.GetAddressOf(true, &address_type);
@@ -2014,7 +2017,7 @@ bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Pack(
20142017
addr = GetProcess().ReadPointerFromMemory(addr, status);
20152018
if (status.Fail()) {
20162019
LLDB_LOG(log, "failed to dereference indirect pack: {0}",
2017-
expanded_type.GetMangledTypeName());
2020+
expanded_type->GetMangledTypeName());
20182021
return false;
20192022
}
20202023
}
@@ -3425,7 +3428,6 @@ SwiftLanguageRuntime::GetSwiftRuntimeTypeInfo(
34253428
CompilerType type, ExecutionContextScope *exe_scope,
34263429
swift::reflection::TypeRef const **out_tr) {
34273430
Log *log(GetLog(LLDBLog::Types));
3428-
34293431
if (log && log->GetVerbose())
34303432
LLDB_LOG(log,
34313433
"[SwiftLanguageRuntime::GetSwiftRuntimeTypeInfo] Getting "

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1150,6 +1150,42 @@ swift::Demangle::NodePointer TypeSystemSwiftTypeRef::Transform(
11501150
return fn(node);
11511151
}
11521152

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