clayborg wrote:

Ok, I found the issue. `.debug_names` tables with `DW_IDX_parent` entries, 
might contain tons of entries for forward declared classes because in my 
example `std::ios_base` is the parent declaration context for `seekdir`, 
`openmode`, and `iostate` so `.debug_names` entries for these types will refer 
to another `.debug_names` for `std::ios_base` as the parent, buit this is 
messing up the table itself as now it contains entries that are not all full 
definitions. The `.debug_names` spec states that only entries with definitions 
should be in the .debug_names table... 

That being said, an easy fix is this:
```bool DebugNamesDWARFIndex::ProcessEntry(
    const DebugNames::Entry &entry,
    llvm::function_ref<bool(DWARFDIE die)> callback) {
  std::optional<DIERef> ref = ToDIERef(entry);
  if (!ref)
    return true;
  SymbolFileDWARF &dwarf = *llvm::cast<SymbolFileDWARF>(
      m_module.GetSymbolFile()->GetBackingSymbolFile());
  DWARFDIE die = dwarf.GetDIE(*ref);
  if (!die)
    return true;
  // Watch out for forward declarations that appear in the .debug_names tables
  // only due to being there for a DW_IDX_parent.
  if (die.GetAttributeValueAsUnsigned(DW_AT_declaration, 0)) /// <<< newly 
added for fix
    return true;/// <<< newly added for fix
  return callback(die);
}
```

https://github.com/llvm/llvm-project/pull/90663
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to