Skip to content

Commit 936a0d5

Browse files
Merge pull request #3266 from al45tair/problem/79725187-next
[LLDB][Swift] Use the new mangleNode() return type correctly.
2 parents 62333b3 + 4cd17e9 commit 936a0d5

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;
@@ -1332,7 +1340,10 @@ bool TypeSystemSwiftTypeRef::Verify(opaque_compiler_type_t type) {
13321340
using namespace swift::Demangle;
13331341
Demangler dem;
13341342
NodePointer node = dem.demangleSymbol(str);
1335-
std::string remangled = mangleNode(node);
1343+
auto mangling = mangleNode(node);
1344+
if (!mangling.isSuccess())
1345+
return false;
1346+
std::string remangled = mangling.result();
13361347
return remangled == std::string(str);
13371348
}
13381349

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

14851500
// SwiftASTContext hardcodes some less-precise types.
@@ -1645,7 +1660,10 @@ TypeSystemSwiftTypeRef::RemangleAsType(swift::Demangle::Demangler &dem,
16451660
auto type_mangling = dem.createNode(Node::Kind::TypeMangling);
16461661
type_mangling->addChild(node, dem);
16471662
global->addChild(type_mangling, dem);
1648-
ConstString mangled_element(mangleNode(global));
1663+
auto mangling = mangleNode(global);
1664+
if (!mangling.isSuccess())
1665+
return {};
1666+
ConstString mangled_element(mangling.result());
16491667
return GetTypeFromMangledTypename(mangled_element);
16501668
}
16511669

@@ -1952,7 +1970,16 @@ ConstString TypeSystemSwiftTypeRef::GetTypeName(opaque_compiler_type_t type) {
19521970
Demangler dem;
19531971
NodePointer print_node =
19541972
GetDemangleTreeForPrinting(dem, AsMangledName(type), true);
1955-
std::string remangled = mangleNode(print_node);
1973+
auto mangling = mangleNode(print_node);
1974+
std::string remangled;
1975+
if (mangling.isSuccess())
1976+
remangled = mangling.result();
1977+
else {
1978+
std::ostringstream buf;
1979+
buf << "<mangling error " << mangling.error().code << ":"
1980+
<< mangling.error().line << ">";
1981+
remangled = buf.str();
1982+
}
19561983
return ConstString(SwiftLanguageRuntime::DemangleSymbolAsString(
19571984
remangled, SwiftLanguageRuntime::eTypeName));
19581985
};
@@ -1968,7 +1995,16 @@ TypeSystemSwiftTypeRef::GetDisplayTypeName(opaque_compiler_type_t type,
19681995
Demangler dem;
19691996
NodePointer print_node =
19701997
GetDemangleTreeForPrinting(dem, AsMangledName(type), false);
1971-
std::string remangled = mangleNode(print_node);
1998+
auto mangling = mangleNode(print_node);
1999+
std::string remangled;
2000+
if (mangling.isSuccess())
2001+
remangled = mangling.result();
2002+
else {
2003+
std::ostringstream buf;
2004+
buf << "<mangling error " << mangling.error().code << ":"
2005+
<< mangling.error().line << ">";
2006+
remangled = buf.str();
2007+
}
19722008
return ConstString(SwiftLanguageRuntime::DemangleSymbolAsString(
19732009
remangled, SwiftLanguageRuntime::eDisplayTypeName, sc));
19742010
};
@@ -2052,7 +2088,10 @@ TypeSystemSwiftTypeRef::GetCanonicalType(opaque_compiler_type_t type) {
20522088
CompilerType ast_type = ReconstructType({this, type}).GetCanonicalType();
20532089
return GetTypeFromMangledTypename(ast_type.GetMangledTypeName());
20542090
}
2055-
ConstString mangled(mangleNode(canonical));
2091+
auto mangling = mangleNode(canonical);
2092+
if (!mangling.isSuccess())
2093+
return CompilerType();
2094+
ConstString mangled(mangling.result());
20562095
return GetTypeFromMangledTypename(mangled);
20572096
};
20582097
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)