From ea133b5c51a039df05dabd9bb0831da4126b28d1 Mon Sep 17 00:00:00 2001 From: Adrian Prantl Date: Wed, 17 Sep 2025 17:21:52 -0700 Subject: [PATCH] [LLDB] Support GetNumChildren on thin function types This fixes a performance problem by eliminating a SwiftASTContext fallback. rdar://160730897 --- .../TypeSystem/Swift/TypeSystemSwiftTypeRef.cpp | 3 +-- lldb/unittests/Symbol/TestTypeSystemSwiftTypeRef.cpp | 12 ++++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.cpp b/lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.cpp index fc1ad7b8421b4..96e756dbb01d9 100644 --- a/lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.cpp +++ b/lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.cpp @@ -3056,9 +3056,8 @@ bool TypeSystemSwiftTypeRef::IsFunctionType(opaque_compiler_type_t type) { using namespace swift::Demangle; Demangler dem; NodePointer node = DemangleCanonicalOutermostType(dem, type); - // Note: There are a number of other candidates, and this list may need - // updating. Ex: `NoEscapeFunctionType`, `ThinFunctionType`, etc. return node && (node->getKind() == Node::Kind::FunctionType || + node->getKind() == Node::Kind::ThinFunctionType || node->getKind() == Node::Kind::NoEscapeFunctionType || node->getKind() == Node::Kind::ImplFunctionType); }; diff --git a/lldb/unittests/Symbol/TestTypeSystemSwiftTypeRef.cpp b/lldb/unittests/Symbol/TestTypeSystemSwiftTypeRef.cpp index e1dfa01354a19..ba98e61f487f3 100644 --- a/lldb/unittests/Symbol/TestTypeSystemSwiftTypeRef.cpp +++ b/lldb/unittests/Symbol/TestTypeSystemSwiftTypeRef.cpp @@ -148,6 +148,18 @@ TEST_F(TestTypeSystemSwiftTypeRef, Function) { ASSERT_TRUE(void_void.IsFunctionPointerType()); ASSERT_EQ(void_void.GetNumberOfFunctionArguments(), 0UL); } + { + NodePointer n = b.GlobalType( + b.Node(Node::Kind::ThinFunctionType, + b.Node(Node::Kind::ArgumentTuple, + b.Node(Node::Kind::Type, b.Node(Node::Kind::Tuple))), + b.Node(Node::Kind::ReturnType, + b.Node(Node::Kind::Type, b.Node(Node::Kind::Tuple))))); + CompilerType void_void = GetCompilerType(b.Mangle(n)); + ASSERT_TRUE(void_void.IsFunctionType()); + ASSERT_TRUE(void_void.IsFunctionPointerType()); + ASSERT_EQ(void_void.GetNumberOfFunctionArguments(), 0UL); + } { NodePointer n = b.GlobalType( b.Node(Node::Kind::ImplFunctionType, b.Node(Node::Kind::ImplEscaping),