[Lldb-commits] [lldb] 8200848 - Reland "[lldb][TypeSystemClang] Use the CXXFunctionPointerSummaryProvider for member-function pointers"
Michael Buch via lldb-commits
lldb-commits at lists.llvm.org
Tue Mar 7 11:46:13 PST 2023
Author: Michael Buch
Date: 2023-03-07T19:45:50Z
New Revision: 8200848c4125f2307abe38801ce9ca1288ea3081
URL: https://github.com/llvm/llvm-project/commit/8200848c4125f2307abe38801ce9ca1288ea3081
DIFF: https://github.com/llvm/llvm-project/commit/8200848c4125f2307abe38801ce9ca1288ea3081.diff
LOG: Reland "[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 151a0ceaca72a..7681a700766a2 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 fa1984b50a586..f26147e7d408e 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 d5b0593cac8fb..99021f9b76bda 100644
--- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h
+++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h
@@ -656,6 +656,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 84d4a4c0ae5a8..4c6bcff35f720 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
@@ -297,10 +297,12 @@ def test_mem_func_ptr_formats(self):
patterns=['member_ptr = 0x[0-9a-z]+'])
self.expect(
"frame variable member_func_ptr",
- patterns=['member_func_ptr = 0x[0-9a-z]+'])
+ patterns=['member_func_ptr = 0x[0-9a-z]+'],
+ substrs=['(a.out`IUseCharStar::member_func(int) at main.cpp:61)'])
self.expect(
"frame variable ref_to_member_func_ptr",
- patterns=['ref_to_member_func_ptr = 0x[0-9a-z]+'])
+ patterns=['ref_to_member_func_ptr = 0x[0-9a-z]+'],
+ substrs=['(a.out`IUseCharStar::member_func(int) at main.cpp:61)'])
self.expect(
"frame variable virt_member_func_ptr",
- patterns=['virt_member_func_ptr = 0x[0-9a-z]+'])
+ patterns=['virt_member_func_ptr = 0x[0-9a-z]+$'])
More information about the lldb-commits
mailing list