Skip to content

Commit

Permalink
Reland "[lldb][TypeSystemClang] Use the CXXFunctionPointerSummaryProv…
Browse files Browse the repository at this point in the history
…ider 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
  • Loading branch information
Michael137 committed Mar 7, 2023
1 parent ef7adbe commit 8200848
Show file tree
Hide file tree
Showing 7 changed files with 30 additions and 4 deletions.
2 changes: 2 additions & 0 deletions lldb/include/lldb/Symbol/CompilerType.h
Expand Up @@ -164,6 +164,8 @@ class CompilerType {

bool IsFunctionPointerType() const;

bool IsMemberFunctionPointerType() const;

bool
IsBlockPointerType(CompilerType *function_pointer_type_ptr = nullptr) const;

Expand Down
3 changes: 3 additions & 0 deletions lldb/include/lldb/Symbol/TypeSystem.h
Expand Up @@ -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;

Expand Down
3 changes: 2 additions & 1 deletion lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
Expand Up @@ -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;
Expand Down
9 changes: 9 additions & 0 deletions lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
Expand Up @@ -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();
Expand Down
2 changes: 2 additions & 0 deletions lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h
Expand Up @@ -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;

Expand Down
7 changes: 7 additions & 0 deletions lldb/source/Symbol/CompilerType.cpp
Expand Up @@ -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())
Expand Down
Expand Up @@ -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]+$'])

0 comments on commit 8200848

Please sign in to comment.