[Lldb-commits] [lldb] 6bd46e7 - [lldb][TypeSystemClang] Use the CXXFunctionPointerSummaryProvider for member-function pointers
Michael Buch via lldb-commits
lldb-commits at lists.llvm.org
Fri Mar 3 09:44:59 PST 2023
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)'])
More information about the lldb-commits
mailing list