[Lldb-commits] [lldb] [LLDB][NativePDB] Create typedefs in structs (PR #169248)
via lldb-commits
lldb-commits at lists.llvm.org
Fri Dec 12 06:32:36 PST 2025
================
@@ -233,6 +233,32 @@ Error UdtRecordCompleter::visitKnownMember(
Error UdtRecordCompleter::visitKnownMember(CVMemberRecord &cvr,
NestedTypeRecord &nested) {
+ // Typedefs can only be added on structs.
+ if (m_record.record.kind != Member::Struct)
+ return Error::success();
+
+ clang::QualType qt =
+ m_ast_builder.GetOrCreateType(PdbTypeSymId(nested.Type, false));
+ if (qt.isNull())
+ return Error::success();
+ CompilerType ct = m_ast_builder.ToCompilerType(qt);
+
+ // There's no distinction between nested types and typedefs, so check if we
+ // encountered a nested type.
+ auto *pdb = static_cast<SymbolFileNativePDB *>(
+ m_ast_builder.clang().GetSymbolFile()->GetBackingSymbolFile());
+ std::optional<TypeIndex> parent = pdb->GetParentType(nested.Type);
+ if (parent && *parent == m_id.index && ct.GetTypeName(true) == nested.Name)
----------------
Nerixyz wrote:
> So `ct.GetTypeName(true)` returns the type name `Bar` for both `Bar` and `Baz`?
Yes
> Shouldn't it be the base name of the parent?
The last check is there to see if this `LF_NESTTYPE` originates from an actual nested type or a typedef.
In the example above, both `Bar`'s and `Baz`' parent is `Foo`. For `Bar`, we don't want to create a typedef, because we already have `Bar` as the nested type. For `Baz`, we do want to create a typedef. If we were to use the base name of the parent (i.e. the current tag record), we'd get `Foo`.
The output of llvm-pdbutil is a bit confusing, because [it outputs `NestedTypeRecord::Type` as `parent`](https://github.com/llvm/llvm-project/blob/5ebb9285321157fe89496746d59b46fbc2480232/llvm/tools/llvm-pdbutil/MinimalTypeDumper.cpp#L528).
https://github.com/llvm/llvm-project/pull/169248
More information about the lldb-commits
mailing list