Author: Michael Buch Date: 2023-03-03T17:44:36Z New Revision: 6bd46e713c6d8deda7bdae8b1efadb99c88b4443
URL: https://github.com/llvm/llvm-project/commit/6bd46e713c6d8deda7bdae8b1efadb99c88b4443 DIFF: https://github.com/llvm/llvm-project/commit/6bd46e713c6d8deda7bdae8b1efadb99c88b4443.diff LOG: [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 Added: Modified: lldb/include/lldb/Symbol/CompilerType.h lldb/include/lldb/Symbol/TypeSystem.h lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h lldb/source/Symbol/CompilerType.cpp lldb/test/API/functionalities/data-formatter/data-formatter-cpp/TestDataFormatterCpp.py Removed: ################################################################################ diff --git a/lldb/include/lldb/Symbol/CompilerType.h b/lldb/include/lldb/Symbol/CompilerType.h index c96fc5a2b6886..50587f4aab827 100644 --- a/lldb/include/lldb/Symbol/CompilerType.h +++ b/lldb/include/lldb/Symbol/CompilerType.h @@ -164,6 +164,8 @@ class CompilerType { 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 a358d6fb13ad4..9c27fd92906a6 100644 --- a/lldb/include/lldb/Symbol/TypeSystem.h +++ b/lldb/include/lldb/Symbol/TypeSystem.h @@ -169,6 +169,9 @@ class TypeSystem : public PluginInterface, 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 1b152c16eac2a..0dfaa92ac99f4 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 e08e7bcd96e38..aefc67ba10b37 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 9751c0de3a50d..d6c09cf3725f3 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h @@ -658,6 +658,8 @@ class TypeSystemClang : public TypeSystem { 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 11a7d09680d3f..d6dc43c05d1bd 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 fb79d1463e5e1..2085025629bec 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 @@ def cleanup(): 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)']) _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits