[Lldb-commits] [lldb] [LLDB][NativePDB] Use original struct name when searching for constants (PR #166845)
via lldb-commits
lldb-commits at lists.llvm.org
Thu Nov 6 12:55:38 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lldb
Author: nerix (Nerixyz)
<details>
<summary>Changes</summary>
We used to search for constants using the name we parsed. For C++, this would mean using the demangled struct name (from the unique name). This name is not always equal to the one used for the struct's name by the compiler. For example:
```
0x105E | LF_STRUCTURE [size = 120, hash = 0xF38F] ``anonymous namespace'::Anonymous<A::B::C<void> >::D`
unique name: `.?AUD@?$Anonymous@<!-- -->U?$C@<!-- -->X@<!-- -->B@<!-- -->A@@@?A0x8C295248@@`
```
We would use the unique name and get to `(anonymous namespace)::Anonymous<struct A::B::C<void>>::D`. Then, when finding the constant in the field list, we'd search for `(anonymous namespace)::Anonymous<struct A::B::C<void>>::D::StaticMember`. This wouldn't yield any results, because the constant will use the demangled name as given by the compiler.
With this PR, we use the struct's name as given in the PDB and append the member name.
---
Full diff: https://github.com/llvm/llvm-project/pull/166845.diff
2 Files Affected:
- (modified) lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp (+7-1)
- (modified) lldb/test/Shell/SymbolFile/NativePDB/ast-types.cpp (+4-1)
``````````diff
diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp
index 46cf9b8524ede..bfaba7f91b711 100644
--- a/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp
+++ b/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp
@@ -168,7 +168,13 @@ Error UdtRecordCompleter::visitKnownMember(
// Static constant members may be a const[expr] declaration.
// Query the symbol's value as the variable initializer if valid.
if (member_ct.IsConst() && member_ct.IsCompleteType()) {
- std::string qual_name = decl->getQualifiedNameAsString();
+ std::string qual_name;
+ if (m_record.record.kind == Member::Struct)
+ qual_name = (m_cvr.cr.Name + "::" + static_data_member.Name).str();
+ else if (m_record.record.kind == Member::Union)
+ qual_name = (m_cvr.ur.Name + "::" + static_data_member.Name).str();
+ else
+ qual_name = decl->getQualifiedNameAsString();
auto results =
m_index.globals().findRecordsByName(qual_name, m_index.symrecords());
diff --git a/lldb/test/Shell/SymbolFile/NativePDB/ast-types.cpp b/lldb/test/Shell/SymbolFile/NativePDB/ast-types.cpp
index ac0d87e95dbf9..4b267c398e766 100644
--- a/lldb/test/Shell/SymbolFile/NativePDB/ast-types.cpp
+++ b/lldb/test/Shell/SymbolFile/NativePDB/ast-types.cpp
@@ -56,6 +56,7 @@ namespace {
int AnonymousMember;
// And a nested class within an anonymous namespace
struct D {
+ static constexpr int StaticMember = 1;
int AnonymousDMember;
};
};
@@ -177,6 +178,8 @@ int SI::*mp9 = nullptr;
// CHECK: | `-CXXRecordDecl {{.*}} struct Anonymous<A::B::C<void>> definition
// CHECK: | |-FieldDecl {{.*}} AnonymousMember 'int'
// CHECK: | `-CXXRecordDecl {{.*}} struct D definition
+// CHECK: | |-VarDecl {{.*}} StaticMember 'const int' static cinit
+// CHECK: | | `-IntegerLiteral {{.*}} 'int' 1
// CHECK: | `-FieldDecl {{.*}} AnonymousDMember 'int'
int main(int argc, char **argv) {
@@ -184,5 +187,5 @@ int main(int argc, char **argv) {
AnonABCVoid.AnonymousMember = 2;
AnonABCVoidD.AnonymousDMember = 3;
- return 0;
+ return AnonABCVoidD.StaticMember;
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/166845
More information about the lldb-commits
mailing list