[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