From: Michael Buch Date: Fri, 3 Mar 2023 14:18:21 +0000 (+0000) Subject: [lldb][TypeSystemClang] Use the CXXFunctionPointerSummaryProvider for member-function... X-Git-Tag: upstream/17.0.6~15907 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6bd46e713c6d8deda7bdae8b1efadb99c88b4443;p=platform%2Fupstream%2Fllvm.git [lldb][TypeSystemClang] Use the CXXFunctionPointerSummaryProvider for member-function pointers With this patch member-function pointers are formatted using `CXXFunctionPointerSummaryProvider`. This turns, ``` (lldb) v pointer_to_member_func (void (Foo::*)()) ::pointer_to_member_func = 0x00000000000000000000000100003f94 ``` into ``` (lldb) v pointer_to_member_func (void (Foo::*)()) ::pointer_to_member_func = 0x00000000000000000000000100003f94 (a.out`Foo::member_func() at main.cpp:3) ``` Differential Revision: https://reviews.llvm.org/D145242 --- diff --git a/lldb/include/lldb/Symbol/CompilerType.h b/lldb/include/lldb/Symbol/CompilerType.h index c96fc5a..50587f4 100644 --- a/lldb/include/lldb/Symbol/CompilerType.h +++ b/lldb/include/lldb/Symbol/CompilerType.h @@ -164,6 +164,8 @@ public: bool IsFunctionPointerType() const; + bool IsMemberFunctionPointerType() const; + bool IsBlockPointerType(CompilerType *function_pointer_type_ptr = nullptr) const; diff --git a/lldb/include/lldb/Symbol/TypeSystem.h b/lldb/include/lldb/Symbol/TypeSystem.h index a358d6f..9c27fd9 100644 --- a/lldb/include/lldb/Symbol/TypeSystem.h +++ b/lldb/include/lldb/Symbol/TypeSystem.h @@ -169,6 +169,9 @@ public: virtual bool IsFunctionPointerType(lldb::opaque_compiler_type_t type) = 0; + virtual bool + IsMemberFunctionPointerType(lldb::opaque_compiler_type_t type) = 0; + virtual bool IsBlockPointerType(lldb::opaque_compiler_type_t type, CompilerType *function_pointer_type_ptr) = 0; diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp index 1b152c1..0dfaa92 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -1390,7 +1390,8 @@ CPlusPlusLanguage::GetHardcodedSummaries() { TypeSummaryImpl::Flags(), lldb_private::formatters::CXXFunctionPointerSummaryProvider, "Function pointer summary provider")); - if (valobj.GetCompilerType().IsFunctionPointerType()) { + if (CompilerType CT = valobj.GetCompilerType(); + CT.IsFunctionPointerType() || CT.IsMemberFunctionPointerType()) { return formatter_sp; } return nullptr; diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp index e08e7bc..aefc67b 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -3194,6 +3194,15 @@ bool TypeSystemClang::IsTypeImpl( return false; } +bool TypeSystemClang::IsMemberFunctionPointerType( + lldb::opaque_compiler_type_t type) { + auto isMemberFunctionPointerType = [](clang::QualType qual_type) { + return qual_type->isMemberFunctionPointerType(); + }; + + return IsTypeImpl(type, isMemberFunctionPointerType); +} + bool TypeSystemClang::IsFunctionPointerType(lldb::opaque_compiler_type_t type) { auto isFunctionPointerType = [](clang::QualType qual_type) { return qual_type->isFunctionPointerType(); diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h index 9751c0d..d6c09cf 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h @@ -658,6 +658,8 @@ public: bool IsFunctionPointerType(lldb::opaque_compiler_type_t type) override; + bool IsMemberFunctionPointerType(lldb::opaque_compiler_type_t type) override; + bool IsBlockPointerType(lldb::opaque_compiler_type_t type, CompilerType *function_pointer_type_ptr) override; diff --git a/lldb/source/Symbol/CompilerType.cpp b/lldb/source/Symbol/CompilerType.cpp index 11a7d09..d6dc43c 100644 --- a/lldb/source/Symbol/CompilerType.cpp +++ b/lldb/source/Symbol/CompilerType.cpp @@ -154,6 +154,13 @@ bool CompilerType::IsFunctionPointerType() const { return false; } +bool CompilerType::IsMemberFunctionPointerType() const { + if (IsValid()) + if (auto type_system_sp = GetTypeSystem()) + return type_system_sp->IsMemberFunctionPointerType(m_type); + return false; +} + bool CompilerType::IsBlockPointerType( CompilerType *function_pointer_type_ptr) const { if (IsValid()) diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-cpp/TestDataFormatterCpp.py b/lldb/test/API/functionalities/data-formatter/data-formatter-cpp/TestDataFormatterCpp.py index fb79d14..2085025 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-cpp/TestDataFormatterCpp.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-cpp/TestDataFormatterCpp.py @@ -292,7 +292,9 @@ class CppDataFormatterTestCase(TestBase): substrs=['member_ptr = 0x']) self.expect( "frame variable member_func_ptr", - substrs=['member_func_ptr = 0x']) + substrs=['member_func_ptr = 0x', + '(a.out`IUseCharStar::member_func(int) at main.cpp:61)']) self.expect( "frame variable ref_to_member_func_ptr", - substrs=['ref_to_member_func_ptr = 0x']) + substrs=['ref_to_member_func_ptr = 0x', + '(a.out`IUseCharStar::member_func(int) at main.cpp:61)'])