diff options
Diffstat (limited to 'lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp')
-rw-r--r-- | lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp | 227 |
1 files changed, 88 insertions, 139 deletions
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index e161c08470b..36f4d2b8ca4 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -279,9 +279,11 @@ SymbolFileDWARF::CreateInstance (ObjectFile* obj_file) TypeList * SymbolFileDWARF::GetTypeList () { - if (GetDebugMapSymfile ()) - return m_debug_map_symfile->GetTypeList(); - return m_obj_file->GetModule()->GetTypeList(); + SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile(); + if (debug_map_symfile) + return debug_map_symfile->GetTypeList(); + else + return m_obj_file->GetModule()->GetTypeList(); } void @@ -485,15 +487,17 @@ GetDWARFMachOSegmentName () UniqueDWARFASTTypeMap & SymbolFileDWARF::GetUniqueDWARFASTTypeMap () { - if (GetDebugMapSymfile ()) - return m_debug_map_symfile->GetUniqueDWARFASTTypeMap (); - return m_unique_ast_type_map; + SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile(); + if (debug_map_symfile) + return debug_map_symfile->GetUniqueDWARFASTTypeMap (); + else + return m_unique_ast_type_map; } TypeSystem * SymbolFileDWARF::GetTypeSystemForLanguage (LanguageType language) { - SymbolFileDWARFDebugMap * debug_map_symfile = GetDebugMapSymfile (); + SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile(); TypeSystem *type_system; if (debug_map_symfile) { @@ -825,30 +829,13 @@ SymbolFileDWARF::GetDWARFCompileUnit(lldb_private::CompileUnit *comp_unit) DWARFDebugInfo* info = DebugInfo(); if (info) { - if (GetDebugMapSymfile ()) - { - // The debug map symbol file made the compile units for this DWARF - // file which is .o file with DWARF in it, and we should have - // only 1 compile unit which is at offset zero in the DWARF. - // TODO: modify to support LTO .o files where each .o file might - // have multiple DW_TAG_compile_unit tags. - - DWARFCompileUnit *dwarf_cu = info->GetCompileUnit(0); - if (dwarf_cu && dwarf_cu->GetUserData() == NULL) - dwarf_cu->SetUserData(comp_unit); - return dwarf_cu; - } - else - { - // Just a normal DWARF file whose user ID for the compile unit is - // the DWARF offset itself - - DWARFCompileUnit *dwarf_cu = info->GetCompileUnit((dw_offset_t)comp_unit->GetID()); - if (dwarf_cu && dwarf_cu->GetUserData() == NULL) - dwarf_cu->SetUserData(comp_unit); - return dwarf_cu; + // Just a normal DWARF file whose user ID for the compile unit is + // the DWARF offset itself - } + DWARFCompileUnit *dwarf_cu = info->GetCompileUnit((dw_offset_t)comp_unit->GetID()); + if (dwarf_cu && dwarf_cu->GetUserData() == NULL) + dwarf_cu->SetUserData(comp_unit); + return dwarf_cu; } return NULL; } @@ -895,7 +882,7 @@ SymbolFileDWARF::ParseCompileUnit (DWARFCompileUnit* dwarf_cu, uint32_t cu_idx) { return dwarf_cu->GetSymbolFileDWARF()->ParseCompileUnit(dwarf_cu, cu_idx); } - else if (GetDebugMapSymfile ()) + else if (dwarf_cu->GetOffset() == 0 && GetDebugMapSymfile ()) { // Let the debug map create the compile unit cu_sp = m_debug_map_symfile->GetCompileUnit(this); @@ -1009,7 +996,7 @@ SymbolFileDWARF::ParseCompileUnitFunction (const SymbolContext& sc, const DWARFD bool SymbolFileDWARF::FixupAddress (Address &addr) { - SymbolFileDWARFDebugMap * debug_map_symfile = GetDebugMapSymfile (); + SymbolFileDWARFDebugMap * debug_map_symfile = GetDebugMapSymfile(); if (debug_map_symfile) { return debug_map_symfile->LinkOSOAddress(addr); @@ -1230,13 +1217,14 @@ SymbolFileDWARF::ParseCompileUnitLineTable (const SymbolContext &sc) lldb::offset_t offset = cu_line_offset; DWARFDebugLine::ParseStatementTable(get_debug_line_data(), &offset, ParseDWARFLineTableCallback, &info); - if (m_debug_map_symfile) + SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile(); + if (debug_map_symfile) { // We have an object file that has a line table with addresses // that are not linked. We need to link the line table and convert // the addresses that are relative to the .o file into addresses // for the main executable. - sc.comp_unit->SetLineTable (m_debug_map_symfile->LinkOSOLineTable (this, line_table_ap.get())); + sc.comp_unit->SetLineTable (debug_map_symfile->LinkOSOLineTable (this, line_table_ap.get())); } else { @@ -1474,60 +1462,27 @@ SymbolFileDWARF::ParseDeclsForContext (CompilerDeclContext decl_ctx) CompilerDecl SymbolFileDWARF::GetDeclForUID (lldb::user_id_t type_uid) { - if (UserIDMatches(type_uid)) - { - DWARFDebugInfo* debug_info = DebugInfo(); - if (debug_info) - { - DWARFDIE die = debug_info->GetDIE(DIERef(type_uid)); - if (die) - { - DWARFASTParser *dwarf_ast = die.GetDWARFParser(); - if (dwarf_ast) - return dwarf_ast->GetDeclForUIDFromDWARF(die); - } - } - } + DWARFDIE die = GetDIE(DIERef(type_uid, this)); + if (die) + return die.GetDecl(); return CompilerDecl(); } CompilerDeclContext SymbolFileDWARF::GetDeclContextForUID (lldb::user_id_t type_uid) { - if (UserIDMatches(type_uid)) - { - DWARFDebugInfo* debug_info = DebugInfo(); - if (debug_info) - { - DWARFDIE die = debug_info->GetDIE(DIERef(type_uid)); - if (die) - { - DWARFASTParser *dwarf_ast = die.GetDWARFParser(); - if (dwarf_ast) - return dwarf_ast->GetDeclContextForUIDFromDWARF(die); - } - } - } + DWARFDIE die = GetDIE(DIERef(type_uid, this)); + if (die) + return die.GetDeclContext(); return CompilerDeclContext(); } CompilerDeclContext SymbolFileDWARF::GetDeclContextContainingUID (lldb::user_id_t type_uid) { - if (UserIDMatches(type_uid)) - { - DWARFDebugInfo* debug_info = DebugInfo(); - if (debug_info) - { - DWARFDIE die = debug_info->GetDIE(DIERef(type_uid)); - if (die) - { - DWARFASTParser *dwarf_ast = die.GetDWARFParser(); - if (dwarf_ast) - return dwarf_ast->GetDeclContextContainingUIDFromDWARF(die); - } - } - } + DWARFDIE die = GetDIE (DIERef(type_uid, this)); + if (die) + return die.GetContainingDeclContext(); return CompilerDeclContext(); } @@ -1535,23 +1490,22 @@ SymbolFileDWARF::GetDeclContextContainingUID (lldb::user_id_t type_uid) Type* SymbolFileDWARF::ResolveTypeUID (lldb::user_id_t type_uid) { - if (UserIDMatches(type_uid)) + DWARFDIE type_die = GetDIE (DIERef(type_uid, this)); + if (type_die) { - DWARFDebugInfo* debug_info = DebugInfo(); - if (debug_info) - { - DWARFDIE type_die = debug_info->GetDIE (DIERef(type_uid)); - if (type_die) - { - const bool assert_not_being_parsed = true; - return ResolveTypeUID (type_die, assert_not_being_parsed); - } - } + const bool assert_not_being_parsed = true; + return ResolveTypeUID (type_die, assert_not_being_parsed); } return NULL; } Type* +SymbolFileDWARF::ResolveTypeUID (const DIERef &die_ref) +{ + return ResolveType (GetDIE(die_ref), true); +} + +Type* SymbolFileDWARF::ResolveTypeUID (const DWARFDIE &die, bool assert_not_being_parsed) { if (die) @@ -1642,30 +1596,29 @@ SymbolFileDWARF::CompleteType (CompilerType &compiler_type) return true; } - DWARFDebugInfo* debug_info = DebugInfo(); - DWARFDIE dwarf_die = debug_info->GetDIE(die_it->getSecond()); - - assert(UserIDMatches(die_it->getSecond().GetUID()) && "CompleteType called on the wrong SymbolFile"); - - // 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. - GetForwardDeclClangTypeToDie().erase (die_it); + 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. + GetForwardDeclClangTypeToDie().erase (die_it); - Type *type = GetDIEToType().lookup (dwarf_die.GetDIE()); + Type *type = GetDIEToType().lookup (dwarf_die.GetDIE()); - Log *log (LogChannelDWARF::GetLogIfAny(DWARF_LOG_DEBUG_INFO|DWARF_LOG_TYPE_COMPLETION)); - if (log) - GetObjectFile()->GetModule()->LogMessageVerboseBacktrace (log, - "0x%8.8" PRIx64 ": %s '%s' resolving forward declaration...", - dwarf_die.GetID(), - dwarf_die.GetTagAsCString(), - type->GetName().AsCString()); - assert (compiler_type); - DWARFASTParser *dwarf_ast = dwarf_die.GetDWARFParser(); - if (dwarf_ast) - return dwarf_ast->CompleteTypeFromDWARF (dwarf_die, type, compiler_type); + Log *log (LogChannelDWARF::GetLogIfAny(DWARF_LOG_DEBUG_INFO|DWARF_LOG_TYPE_COMPLETION)); + if (log) + GetObjectFile()->GetModule()->LogMessageVerboseBacktrace (log, + "0x%8.8" PRIx64 ": %s '%s' resolving forward declaration...", + dwarf_die.GetID(), + dwarf_die.GetTagAsCString(), + type->GetName().AsCString()); + assert (compiler_type); + DWARFASTParser *dwarf_ast = dwarf_die.GetDWARFParser(); + if (dwarf_ast) + return dwarf_ast->CompleteTypeFromDWARF (dwarf_die, type, compiler_type); + } return false; } @@ -1674,10 +1627,7 @@ SymbolFileDWARF::ResolveType (const DWARFDIE &die, bool assert_not_being_parsed, { if (die) { - Type *type = GetDIEToType().lookup (die.GetDIE()); - - if (type == NULL) - type = GetTypeForDIE (die, resolve_function_context).get(); + Type *type = GetTypeForDIE (die, resolve_function_context).get(); if (assert_not_being_parsed) { @@ -1763,6 +1713,17 @@ SymbolFileDWARF::GetDWOModule (ConstString name) return lldb::ModuleSP(); } +DWARFDIE +SymbolFileDWARF::GetDIE (const DIERef &die_ref) +{ + DWARFDebugInfo * debug_info = DebugInfo(); + if (debug_info) + return debug_info->GetDIE(die_ref); + else + return DWARFDIE(); +} + + std::unique_ptr<SymbolFileDWARFDwo> SymbolFileDWARF::GetDwoSymbolFileForCompileUnit(DWARFCompileUnit &dwarf_cu, const DWARFDebugInfoEntry &cu_die) { @@ -2330,12 +2291,11 @@ SymbolFileDWARF::FindGlobalVariables (const ConstString &name, const CompilerDec sc.module_sp = m_obj_file->GetModule(); assert (sc.module_sp); - DWARFDebugInfo* debug_info = DebugInfo(); bool done = false; for (size_t i=0; i<num_die_matches && !done; ++i) { const DIERef& die_ref = die_offsets[i]; - DWARFDIE die = debug_info->GetDIE (die_ref); + DWARFDIE die = GetDIE (die_ref); if (die) { @@ -2448,11 +2408,10 @@ SymbolFileDWARF::FindGlobalVariables(const RegularExpression& regex, bool append const size_t num_matches = die_offsets.size(); if (num_matches) { - DWARFDebugInfo* debug_info = DebugInfo(); for (size_t i=0; i<num_matches; ++i) { const DIERef& die_ref = die_offsets[i]; - DWARFDIE die = debug_info->GetDIE (die_ref); + DWARFDIE die = GetDIE (die_ref); if (die) { @@ -3098,11 +3057,10 @@ SymbolFileDWARF::FindTypes (const SymbolContext& sc, if (num_die_matches) { const uint32_t initial_types_size = types.GetSize(); - DWARFDebugInfo* debug_info = DebugInfo(); for (size_t i=0; i<num_die_matches; ++i) { const DIERef& die_ref = die_offsets[i]; - DWARFDIE die = debug_info->GetDIE (die_ref); + DWARFDIE die = GetDIE (die_ref); if (die) { @@ -3221,11 +3179,10 @@ SymbolFileDWARF::FindTypes (const std::vector<CompilerContext> &context, if (num_die_matches) { size_t num_matches = 0; - DWARFDebugInfo* debug_info = DebugInfo(); for (size_t i=0; i<num_die_matches; ++i) { const DIERef& die_ref = die_offsets[i]; - DWARFDIE die = debug_info->GetDIE (die_ref); + DWARFDIE die = GetDIE (die_ref); if (die) { @@ -3304,11 +3261,10 @@ SymbolFileDWARF::FindNamespace (const SymbolContext& sc, const size_t num_matches = die_offsets.size(); if (num_matches) { - DWARFDebugInfo* debug_info = DebugInfo(); for (size_t i=0; i<num_matches; ++i) { const DIERef& die_ref = die_offsets[i]; - DWARFDIE die = debug_info->GetDIE (die_ref); + DWARFDIE die = GetDIE (die_ref); if (die) { @@ -3523,11 +3479,10 @@ SymbolFileDWARF::FindCompleteObjCDefinitionTypeForDIE (const DWARFDIE &die, if (num_matches) { - DWARFDebugInfo* debug_info = DebugInfo(); for (size_t i=0; i<num_matches; ++i) { const DIERef& die_ref = die_offsets[i]; - DWARFDIE type_die = debug_info->GetDIE (die_ref); + DWARFDIE type_die = GetDIE (die_ref); if (type_die) { @@ -3747,11 +3702,10 @@ SymbolFileDWARF::FindDefinitionTypeForDWARFDeclContext (const DWARFDeclContext & if (num_matches) { - DWARFDebugInfo* debug_info = DebugInfo(); for (size_t i=0; i<num_matches; ++i) { const DIERef& die_ref = die_offsets[i]; - DWARFDIE type_die = debug_info->GetDIE (die_ref); + DWARFDIE type_die = GetDIE (die_ref); if (type_die) { @@ -3995,7 +3949,7 @@ SymbolFileDWARF::ParseVariablesForContext (const SymbolContext& sc) if (sc.function) { - DWARFDIE function_die = info->GetDIE(DIERef(sc.function->GetID())); + DWARFDIE function_die = info->GetDIE(DIERef(sc.function->GetID(), this)); const dw_addr_t func_lo_pc = function_die.GetAttributeValueAsAddress (DW_AT_low_pc, LLDB_INVALID_ADDRESS); if (func_lo_pc != LLDB_INVALID_ADDRESS) @@ -4050,11 +4004,10 @@ SymbolFileDWARF::ParseVariablesForContext (const SymbolContext& sc) const size_t num_matches = die_offsets.size(); if (num_matches) { - DWARFDebugInfo* debug_info = DebugInfo(); for (size_t i=0; i<num_matches; ++i) { const DIERef& die_ref = die_offsets[i]; - DWARFDIE die = debug_info->GetDIE (die_ref); + DWARFDIE die = GetDIE (die_ref); if (die) { VariableSP var_sp (ParseVariableDIE(sc, die, LLDB_INVALID_ADDRESS)); @@ -4233,11 +4186,7 @@ SymbolFileDWARF::ParseVariableDIE } break; case DW_AT_specification: - { - DWARFDebugInfo* debug_info = DebugInfo(); - if (debug_info) - spec_die = debug_info->GetDIE(DIERef(form_value)); - } + spec_die = GetDIE(DIERef(form_value)); break; case DW_AT_start_scope: { @@ -4350,7 +4299,7 @@ SymbolFileDWARF::ParseVariableDIE scope = eValueTypeVariableStatic; - SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile (); + SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile(); if (debug_map_symfile) { @@ -4456,7 +4405,7 @@ SymbolFileDWARF::ParseVariableDIE if (symbol_context_scope) { - SymbolFileTypeSP type_sp(new SymbolFileType(*this, DIERef(type_die_form).GetUID())); + SymbolFileTypeSP type_sp(new SymbolFileType(*this, DIERef(type_die_form).GetUID(this))); if (const_value.Form() && type_sp && type_sp->GetType()) location.CopyOpcodeData(const_value.Unsigned(), type_sp->GetType()->GetByteSize(), die.GetCU()->GetAddressByteSize()); @@ -4615,7 +4564,7 @@ SymbolFileDWARF::ParseVariables (const SymbolContext& sc, // a concrete block counterpart in the current function. We need // to find the concrete block so we can correctly add the // variable to it - const DWARFDIE concrete_block_die = FindBlockContainingSpecification (DIERef(sc.function->GetID()), + const DWARFDIE concrete_block_die = FindBlockContainingSpecification (DIERef(sc.function->GetID(), this), sc_parent_die.GetOffset()); if (concrete_block_die) block = sc.function->GetBlock(true).FindBlockByID(concrete_block_die.GetID()); @@ -4706,7 +4655,7 @@ SymbolFileDWARF::DumpIndexes () SymbolFileDWARFDebugMap * -SymbolFileDWARF::GetDebugMapSymfile () +SymbolFileDWARF::GetDebugMapSymfile() { if (m_debug_map_symfile == NULL && !m_debug_map_module_wp.expired()) { |