Index: lldb/source/Plugins/SymbolFile/DWARF/CMakeLists.txt =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/CMakeLists.txt +++ lldb/source/Plugins/SymbolFile/DWARF/CMakeLists.txt @@ -7,6 +7,7 @@ DWARFAttribute.cpp DWARFBaseDIE.cpp DWARFCompileUnit.cpp + DWARFContext.cpp DWARFDataExtractor.cpp DWARFDebugAbbrev.cpp DWARFDebugAranges.cpp Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFContext.h =================================================================== --- /dev/null +++ lldb/source/Plugins/SymbolFile/DWARF/DWARFContext.h @@ -0,0 +1,30 @@ +//===-- DWARFContext.h ------------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLDB_PLUGINS_SYMBOLFILE_DWARF_DWARFCONTEXT_H +#define LLDB_PLUGINS_SYMBOLFILE_DWARF_DWARFCONTEXT_H + +#include "DWARFDataExtractor.h" +#include "lldb/Core/Module.h" +#include "llvm/ADT/Optional.h" +#include + +namespace lldb_private { +class DWARFContext { +private: + Module &m_module; + llvm::Optional m_data_debug_aranges; + +public: + explicit DWARFContext(Module &module); + + const DWARFDataExtractor *getOrLoadArangesData(); +}; +} // namespace lldb_private + +#endif Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFContext.cpp =================================================================== --- /dev/null +++ lldb/source/Plugins/SymbolFile/DWARF/DWARFContext.cpp @@ -0,0 +1,43 @@ +//===-- DWARFContext.cpp ----------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "DWARFContext.h" + +#include "lldb/Core/Section.h" + +using namespace lldb; +using namespace lldb_private; + +static const DWARFDataExtractor * +LoadOrGetSection(Module &module, SectionType section_type, + llvm::Optional &extractor) { + if (extractor.hasValue()) + return extractor->GetByteSize() > 0 ? extractor.getPointer() : nullptr; + + // Initialize to an empty extractor so that we always take the fast path going + // forward. + extractor.emplace(); + + const SectionList *section_list = module.GetSectionList(); + if (!section_list) + return nullptr; + + auto section_sp = section_list->FindSectionByType(section_type, true); + if (!section_sp) + return nullptr; + + section_sp->GetSectionData(*extractor); + return extractor.getPointer(); +} + +DWARFContext::DWARFContext(Module &module) : m_module(module) {} + +const DWARFDataExtractor *DWARFContext::getOrLoadArangesData() { + return LoadOrGetSection(m_module, eSectionTypeDWARFDebugAranges, + m_data_debug_aranges); +} Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h +++ lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h @@ -19,6 +19,10 @@ #include "lldb/lldb-private.h" #include "llvm/Support/Error.h" +namespace lldb_private { +class DWARFContext; +} + typedef std::multimap CStringToDIEMap; typedef CStringToDIEMap::iterator CStringToDIEMapIter; @@ -32,7 +36,7 @@ const dw_offset_t next_offset, const uint32_t depth, void *userData); - DWARFDebugInfo(); + explicit DWARFDebugInfo(lldb_private::DWARFContext &context); void SetDwarfData(SymbolFileDWARF *dwarf2Data); size_t GetNumCompileUnits(); @@ -62,6 +66,7 @@ // Member variables //---------------------------------------------------------------------- SymbolFileDWARF *m_dwarf2Data; + lldb_private::DWARFContext &m_context; CompileUnitColl m_compile_units; std::unique_ptr m_cu_aranges_up; // A quick address to compile unit table Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp +++ lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp @@ -17,7 +17,7 @@ #include "lldb/Utility/Stream.h" #include "DWARFCompileUnit.h" -#include "DWARFDebugAranges.h" +#include "DWARFContext.h" #include "DWARFDebugAranges.h" #include "DWARFDebugInfo.h" #include "DWARFDebugInfoEntry.h" @@ -30,8 +30,9 @@ //---------------------------------------------------------------------- // Constructor //---------------------------------------------------------------------- -DWARFDebugInfo::DWARFDebugInfo() - : m_dwarf2Data(NULL), m_compile_units(), m_cu_aranges_up() {} +DWARFDebugInfo::DWARFDebugInfo(lldb_private::DWARFContext &context) + : m_dwarf2Data(NULL), m_context(context), m_compile_units(), + m_cu_aranges_up() {} //---------------------------------------------------------------------- // SetDwarfData @@ -48,10 +49,10 @@ assert(m_dwarf2Data); m_cu_aranges_up = llvm::make_unique(); - const DWARFDataExtractor &debug_aranges_data = - m_dwarf2Data->get_debug_aranges_data(); - if (debug_aranges_data.GetByteSize() > 0) { - llvm::Error error = m_cu_aranges_up->extract(debug_aranges_data); + const DWARFDataExtractor *debug_aranges_data = + m_context.getOrLoadArangesData(); + if (debug_aranges_data) { + llvm::Error error = m_cu_aranges_up->extract(*debug_aranges_data); if (error) return std::move(error); } Index: lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -30,6 +30,7 @@ #include "lldb/Utility/RangeMap.h" #include "lldb/lldb-private.h" +#include "DWARFContext.h" #include "DWARFDataExtractor.h" #include "DWARFDefines.h" #include "DWARFIndex.h" @@ -227,7 +228,6 @@ virtual const lldb_private::DWARFDataExtractor &get_debug_abbrev_data(); virtual const lldb_private::DWARFDataExtractor &get_debug_addr_data(); - const lldb_private::DWARFDataExtractor &get_debug_aranges_data(); const lldb_private::DWARFDataExtractor &get_debug_frame_data(); virtual const lldb_private::DWARFDataExtractor &get_debug_info_data(); const lldb_private::DWARFDataExtractor &get_debug_line_data(); @@ -458,11 +458,10 @@ llvm::once_flag m_dwp_symfile_once_flag; std::unique_ptr m_dwp_symfile; - lldb_private::DWARFDataExtractor m_dwarf_data; + lldb_private::DWARFContext m_context; DWARFDataSegment m_data_debug_abbrev; DWARFDataSegment m_data_debug_addr; - DWARFDataSegment m_data_debug_aranges; DWARFDataSegment m_data_debug_frame; DWARFDataSegment m_data_debug_info; DWARFDataSegment m_data_debug_line; Index: lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -355,12 +355,13 @@ << 32), // Used by SymbolFileDWARFDebugMap to // when this class parses .o files to // contain the .o file index/ID - m_debug_map_module_wp(), m_debug_map_symfile(NULL), m_data_debug_abbrev(), - m_data_debug_aranges(), m_data_debug_frame(), m_data_debug_info(), - m_data_debug_line(), m_data_debug_macro(), m_data_debug_loc(), - m_data_debug_ranges(), m_data_debug_rnglists(), m_data_debug_str(), - m_data_apple_names(), m_data_apple_types(), m_data_apple_namespaces(), - m_abbr(), m_info(), m_line(), m_fetched_external_modules(false), + m_debug_map_module_wp(), m_debug_map_symfile(NULL), + m_context(*objfile->GetModule()), m_data_debug_abbrev(), + m_data_debug_frame(), m_data_debug_info(), m_data_debug_line(), + m_data_debug_macro(), m_data_debug_loc(), m_data_debug_ranges(), + m_data_debug_rnglists(), m_data_debug_str(), m_data_apple_names(), + m_data_apple_types(), m_data_apple_namespaces(), m_abbr(), m_info(), + m_line(), m_fetched_external_modules(false), m_supports_DW_AT_APPLE_objc_complete_type(eLazyBoolCalculate), m_ranges(), m_unique_ast_type_map() {} @@ -394,15 +395,6 @@ void SymbolFileDWARF::InitializeObject() { Log *log = LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO); - ModuleSP module_sp(m_obj_file->GetModule()); - if (module_sp) { - const SectionList *section_list = module_sp->GetSectionList(); - Section *section = - section_list->FindSectionByName(GetDWARFMachOSegmentName()).get(); - - if (section) - m_obj_file->ReadSectionData(section, m_dwarf_data); - } if (!GetGlobalPluginProperties()->IgnoreFileIndexes()) { DWARFDataExtractor apple_names, apple_namespaces, apple_types, apple_objc; @@ -549,19 +541,15 @@ DWARFDataExtractor &data) { ModuleSP module_sp(m_obj_file->GetModule()); const SectionList *section_list = module_sp->GetSectionList(); - if (section_list) { - SectionSP section_sp(section_list->FindSectionByType(sect_type, true)); - if (section_sp) { - // See if we memory mapped the DWARF segment? - if (m_dwarf_data.GetByteSize()) { - data.SetData(m_dwarf_data, section_sp->GetOffset(), - section_sp->GetFileSize()); - } else { - if (m_obj_file->ReadSectionData(section_sp.get(), data) == 0) - data.Clear(); - } - } - } + if (!section_list) + return; + + SectionSP section_sp(section_list->FindSectionByType(sect_type, true)); + if (!section_sp) + return; + + data.Clear(); + m_obj_file->ReadSectionData(section_sp.get(), data); } const DWARFDataExtractor &SymbolFileDWARF::get_debug_abbrev_data() { @@ -573,11 +561,6 @@ return GetCachedSectionData(eSectionTypeDWARFDebugAddr, m_data_debug_addr); } -const DWARFDataExtractor &SymbolFileDWARF::get_debug_aranges_data() { - return GetCachedSectionData(eSectionTypeDWARFDebugAranges, - m_data_debug_aranges); -} - const DWARFDataExtractor &SymbolFileDWARF::get_debug_frame_data() { return GetCachedSectionData(eSectionTypeDWARFDebugFrame, m_data_debug_frame); } @@ -690,10 +673,8 @@ Timer scoped_timer(func_cat, "%s this = %p", LLVM_PRETTY_FUNCTION, static_cast(this)); if (get_debug_info_data().GetByteSize() > 0) { - m_info.reset(new DWARFDebugInfo()); - if (m_info) { - m_info->SetDwarfData(this); - } + m_info = llvm::make_unique(m_context); + m_info->SetDwarfData(this); } } return m_info.get(); Index: lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp +++ lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp @@ -33,12 +33,6 @@ if (section_list) { SectionSP section_sp(section_list->FindSectionByType(sect_type, true)); if (section_sp) { - // See if we memory mapped the DWARF segment? - if (m_dwarf_data.GetByteSize()) { - data.SetData(m_dwarf_data, section_sp->GetOffset(), - section_sp->GetFileSize()); - return; - } if (m_obj_file->ReadSectionData(section_sp.get(), data) != 0) return;