Skip to content

Commit 4cd17e9

Browse files
committed
[LLDB][Swift] Use the new mangleNode() return type correctly.
The return type of `mangleNode()` is changing to allow the remanglers to report errors to the caller. Change the LLDB plugin to account for that, and try to handle errors more reasonably (previously they would have resulted in program termination). See also swiftlang/swift#39187 rdar://79725187
1 parent cd08f3f commit 4cd17e9

File tree

3 files changed

+61
-16
lines changed

3 files changed

+61
-16
lines changed

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2068,7 +2068,10 @@ SwiftLanguageRuntimeImpl::BindGenericTypeParameters(StackFrame &stack_frame,
20682068

20692069
// Nothing to do if there are no type parameters.
20702070
auto get_canonical = [&]() {
2071-
return ts.GetTypeFromMangledTypename(ConstString(mangleNode(canonical)));
2071+
auto mangling = mangleNode(canonical);
2072+
if (!mangling.isSuccess())
2073+
return CompilerType();
2074+
return ts.GetTypeFromMangledTypename(ConstString(mangling.result()));
20722075
};
20732076
if (substitutions.empty())
20742077
return get_canonical();
@@ -2531,7 +2534,10 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_ClangType(
25312534
c->addChild(factory.createNode(Node::Kind::Identifier, dyn_name), factory);
25322535
cty->addChild(c, factory);
25332536

2534-
remangled = mangleNode(global);
2537+
auto mangling = mangleNode(global);
2538+
if (!mangling.isSuccess())
2539+
return false;
2540+
remangled = mangling.result();
25352541
}
25362542

25372543
// Import the remangled dynamic name into the scratch context.

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

Lines changed: 52 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -107,14 +107,15 @@ TypeSystemSwiftTypeRef::CanonicalizeSugar(swift::Demangle::Demangler &dem,
107107
}
108108

109109
/// Create a mangled name for a type alias node.
110-
static ConstString GetTypeAlias(swift::Demangle::Demangler &dem,
111-
swift::Demangle::NodePointer node) {
110+
static swift::Demangle::ManglingErrorOr<std::string>
111+
GetTypeAlias(swift::Demangle::Demangler &dem,
112+
swift::Demangle::NodePointer node) {
112113
using namespace swift::Demangle;
113114
auto global = dem.createNode(Node::Kind::Global);
114115
auto type_mangling = dem.createNode(Node::Kind::TypeMangling);
115116
global->addChild(type_mangling, dem);
116117
type_mangling->addChild(node, dem);
117-
return ConstString(mangleNode(global));
118+
return mangleNode(global);
118119
}
119120

120121
/// Find a Clang type by name in the modules in \p module_holder.
@@ -328,7 +329,14 @@ ResolveTypeAlias(SwiftASTContext *module_holder,
328329
// Try to look this up as a Swift type alias. For each *Swift*
329330
// type alias there is a debug info entry that has the mangled
330331
// name as name and the aliased type as a type.
331-
ConstString mangled = GetTypeAlias(dem, node);
332+
auto mangling = GetTypeAlias(dem, node);
333+
if (!mangling.isSuccess()) {
334+
LLDB_LOGF(GetLogIfAllCategoriesSet(LIBLLDB_LOG_TYPES),
335+
"Failed while mangling type alias (%d:%u)", mangling.error().code,
336+
mangling.error().line);
337+
return {{}, {}};
338+
}
339+
ConstString mangled(mangling.result());
332340
TypeList types;
333341
if (!prefer_clang_types) {
334342
llvm::DenseSet<SymbolFile *> searched_symbol_files;
@@ -1333,7 +1341,10 @@ bool TypeSystemSwiftTypeRef::Verify(opaque_compiler_type_t type) {
13331341
using namespace swift::Demangle;
13341342
Demangler dem;
13351343
NodePointer node = dem.demangleSymbol(str);
1336-
std::string remangled = mangleNode(node);
1344+
auto mangling = mangleNode(node);
1345+
if (!mangling.isSuccess())
1346+
return false;
1347+
std::string remangled = mangling.result();
13371348
return remangled == std::string(str);
13381349
}
13391350

@@ -1477,10 +1488,14 @@ template <> bool Equivalent<CompilerType>(CompilerType l, CompilerType r) {
14771488
if (ContainsUnresolvedTypeAlias(r_node) ||
14781489
ContainsGenericTypeParameter(r_node) || ContainsSugaredParen(r_node))
14791490
return true;
1480-
if (swift::Demangle::mangleNode(StripPrivateIDs(
1481-
dem, TypeSystemSwiftTypeRef::CanonicalizeSugar(dem, l_node))) ==
1482-
swift::Demangle::mangleNode(StripPrivateIDs(
1483-
dem, TypeSystemSwiftTypeRef::CanonicalizeSugar(dem, r_node))))
1491+
auto l_mangling = swift::Demangle::mangleNode(StripPrivateIDs(
1492+
dem, TypeSystemSwiftTypeRef::CanonicalizeSugar(dem, l_node)));
1493+
auto r_mangling = swift::Demangle::mangleNode(StripPrivateIDs(
1494+
dem, TypeSystemSwiftTypeRef::CanonicalizeSugar(dem, r_node)));
1495+
if (!l_mangling.isSuccess() || !r_mangling.isSuccess())
1496+
return false;
1497+
1498+
if (l_mangling.result() == r_mangling.result())
14841499
return true;
14851500

14861501
// SwiftASTContext hardcodes some less-precise types.
@@ -1646,7 +1661,10 @@ TypeSystemSwiftTypeRef::RemangleAsType(swift::Demangle::Demangler &dem,
16461661
auto type_mangling = dem.createNode(Node::Kind::TypeMangling);
16471662
type_mangling->addChild(node, dem);
16481663
global->addChild(type_mangling, dem);
1649-
ConstString mangled_element(mangleNode(global));
1664+
auto mangling = mangleNode(global);
1665+
if (!mangling.isSuccess())
1666+
return {};
1667+
ConstString mangled_element(mangling.result());
16501668
return GetTypeFromMangledTypename(mangled_element);
16511669
}
16521670

@@ -1953,7 +1971,16 @@ ConstString TypeSystemSwiftTypeRef::GetTypeName(opaque_compiler_type_t type) {
19531971
Demangler dem;
19541972
NodePointer print_node =
19551973
GetDemangleTreeForPrinting(dem, AsMangledName(type), true);
1956-
std::string remangled = mangleNode(print_node);
1974+
auto mangling = mangleNode(print_node);
1975+
std::string remangled;
1976+
if (mangling.isSuccess())
1977+
remangled = mangling.result();
1978+
else {
1979+
std::ostringstream buf;
1980+
buf << "<mangling error " << mangling.error().code << ":"
1981+
<< mangling.error().line << ">";
1982+
remangled = buf.str();
1983+
}
19571984
return ConstString(SwiftLanguageRuntime::DemangleSymbolAsString(
19581985
remangled, SwiftLanguageRuntime::eTypeName));
19591986
};
@@ -1969,7 +1996,16 @@ TypeSystemSwiftTypeRef::GetDisplayTypeName(opaque_compiler_type_t type,
19691996
Demangler dem;
19701997
NodePointer print_node =
19711998
GetDemangleTreeForPrinting(dem, AsMangledName(type), false);
1972-
std::string remangled = mangleNode(print_node);
1999+
auto mangling = mangleNode(print_node);
2000+
std::string remangled;
2001+
if (mangling.isSuccess())
2002+
remangled = mangling.result();
2003+
else {
2004+
std::ostringstream buf;
2005+
buf << "<mangling error " << mangling.error().code << ":"
2006+
<< mangling.error().line << ">";
2007+
remangled = buf.str();
2008+
}
19732009
return ConstString(SwiftLanguageRuntime::DemangleSymbolAsString(
19742010
remangled, SwiftLanguageRuntime::eDisplayTypeName, sc));
19752011
};
@@ -2053,7 +2089,10 @@ TypeSystemSwiftTypeRef::GetCanonicalType(opaque_compiler_type_t type) {
20532089
CompilerType ast_type = ReconstructType({this, type}).GetCanonicalType();
20542090
return GetTypeFromMangledTypename(ast_type.GetMangledTypeName());
20552091
}
2056-
ConstString mangled(mangleNode(canonical));
2092+
auto mangling = mangleNode(canonical);
2093+
if (!mangling.isSuccess())
2094+
return CompilerType();
2095+
ConstString mangled(mangling.result());
20572096
return GetTypeFromMangledTypename(mangled);
20582097
};
20592098
VALIDATE_AND_RETURN(impl, GetCanonicalType, type, (ReconstructType(type)),

lldb/unittests/Symbol/TestTypeSystemSwiftTypeRef.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ class NodeBuilder {
8888
return GlobalTypeMangling(Node(Node::Kind::Type, type));
8989
}
9090

91-
std::string Mangle(NodePointer node) { return mangleNode(node); }
91+
std::string Mangle(NodePointer node) { return mangleNode(node).result(); }
9292
};
9393

9494
TEST_F(TestTypeSystemSwiftTypeRef, Array) {

0 commit comments

Comments
 (0)