[Lldb-commits] [lldb] Reapply [lldb][DWARF] Delay struct/class/union definition DIE searching when parsing declaration DIEs. (PR #98361)
Pavel Labath via lldb-commits
lldb-commits at lists.llvm.org
Thu Jul 11 23:36:34 PDT 2024
================
@@ -1631,27 +1638,49 @@ bool SymbolFileDWARF::CompleteType(CompilerType &compiler_type) {
return true;
}
- DWARFDIE dwarf_die = GetDIE(die_it->getSecond());
- if (dwarf_die) {
- // Once we start resolving this type, remove it from the forward
- // declaration map in case anyone child members or other types require this
- // type to get resolved. The type will get resolved when all of the calls
- // to SymbolFileDWARF::ResolveClangOpaqueTypeDefinition are done.
- GetForwardDeclCompilerTypeToDIE().erase(die_it);
-
- Type *type = GetDIEToType().lookup(dwarf_die.GetDIE());
+ DWARFDIE decl_die = GetDIE(die_it->getSecond());
+ // Once we start resolving this type, remove it from the forward
+ // declaration map in case anyone's child members or other types require this
+ // type to get resolved.
+ GetForwardDeclCompilerTypeToDIE().erase(die_it);
+ DWARFDIE def_die = FindDefinitionDIE(decl_die);
+ if (!def_die) {
+ SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile();
+ if (debug_map_symfile) {
+ // We weren't able to find a full declaration in this DWARF, see
+ // if we have a declaration anywhere else...
+ def_die = debug_map_symfile->FindDefinitionDIE(decl_die);
+ }
+ }
+ if (!def_die) {
+ // If we don't have definition DIE, CompleteTypeFromDWARF will forcefully
+ // complete this type.
+ def_die = decl_die;
+ }
- Log *log = GetLog(DWARFLog::DebugInfo | DWARFLog::TypeCompletion);
- if (log)
- GetObjectFile()->GetModule()->LogMessageVerboseBacktrace(
- log, "{0:x8}: {1} ({2}) '{3}' resolving forward declaration...",
- dwarf_die.GetID(), DW_TAG_value_to_name(dwarf_die.Tag()),
- dwarf_die.Tag(), type->GetName().AsCString());
- assert(compiler_type);
- if (DWARFASTParser *dwarf_ast = GetDWARFParser(*dwarf_die.GetCU()))
- return dwarf_ast->CompleteTypeFromDWARF(dwarf_die, type, compiler_type);
+ DWARFASTParser *dwarf_ast = GetDWARFParser(*def_die.GetCU());
+ if (!dwarf_ast)
+ return false;
+ Type *type = GetDIEToType().lookup(decl_die.GetDIE());
+ if (decl_die != def_die) {
+ GetDIEToType()[def_die.GetDIE()] = type;
+ // Need to update Type ID to refer to the definition DIE. because
+ // it's used in ParseCXXMethod to determine if we need to copy cxx
+ // method types from a declaration DIE to this definition DIE.
+ type->SetID(def_die.GetID());
+ if (DWARFASTParserClang *ast_parser =
+ static_cast<DWARFASTParserClang *>(dwarf_ast))
----------------
labath wrote:
this check is superfluous. static_cast will never turn a non-null pointer into nullptr.
https://github.com/llvm/llvm-project/pull/98361
More information about the lldb-commits
mailing list