Index: lldb/trunk/include/lldb/Core/Section.h =================================================================== --- lldb/trunk/include/lldb/Core/Section.h +++ lldb/trunk/include/lldb/Core/Section.h @@ -38,6 +38,11 @@ typedef collection::iterator iterator; typedef collection::const_iterator const_iterator; + const_iterator begin() const { return m_sections.begin(); } + const_iterator end() const { return m_sections.end(); } + const_iterator begin() { return m_sections.begin(); } + const_iterator end() { return m_sections.end(); } + SectionList(); ~SectionList(); Index: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFContext.h =================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFContext.h +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFContext.h @@ -12,6 +12,7 @@ #include "DWARFDataExtractor.h" #include "lldb/Core/Section.h" #include "llvm/ADT/Optional.h" +#include "llvm/DebugInfo/DWARF/DWARFContext.h" #include "llvm/Support/Threading.h" #include @@ -20,6 +21,7 @@ private: SectionList *m_main_section_list; SectionList *m_dwo_section_list; + mutable std::unique_ptr m_llvm_context; struct SectionData { llvm::once_flag flag; @@ -64,6 +66,8 @@ const DWARFDataExtractor &getOrLoadStrData(); const DWARFDataExtractor &getOrLoadStrOffsetsData(); const DWARFDataExtractor &getOrLoadDebugTypesData(); + + llvm::DWARFContext &GetAsLLVM(); }; } // namespace lldb_private Index: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFContext.cpp =================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFContext.cpp +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFContext.cpp @@ -100,3 +100,37 @@ return LoadOrGetSection(eSectionTypeDWARFDebugTypes, eSectionTypeDWARFDebugTypesDwo, m_data_debug_types); } + +llvm::DWARFContext &DWARFContext::GetAsLLVM() { + if (!m_llvm_context) { + llvm::StringMap> section_map; + uint8_t addr_size = 0; + + auto AddSection = [&](Section §ion) { + DataExtractor section_data; + section.GetSectionData(section_data); + + // Set the address size the first time we see it. + if (addr_size == 0) + addr_size = section_data.GetByteSize(); + + llvm::StringRef data = llvm::toStringRef(section_data.GetData()); + llvm::StringRef name = section.GetName().GetStringRef(); + section_map.try_emplace( + name, llvm::MemoryBuffer::getMemBuffer(data, name, false)); + }; + + if (m_main_section_list) { + for (auto §ion : *m_main_section_list) + AddSection(*section); + } + + if (m_dwo_section_list) { + for (auto §ion : *m_dwo_section_list) + AddSection(*section); + } + + m_llvm_context = llvm::DWARFContext::create(section_map, addr_size); + } + return *m_llvm_context; +} Index: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDataExtractor.h =================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDataExtractor.h +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDataExtractor.h @@ -11,6 +11,7 @@ #include "lldb/Core/dwarf.h" #include "lldb/Utility/DataExtractor.h" +#include "llvm/DebugInfo/DWARF/DWARFDataExtractor.h" namespace lldb_private { @@ -28,6 +29,8 @@ size_t GetDWARFSizeofInitialLength() const { return 4; } size_t GetDWARFSizeOfOffset() const { return 4; } + + llvm::DWARFDataExtractor GetAsLLVM() const; }; } Index: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDataExtractor.cpp =================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDataExtractor.cpp +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDataExtractor.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "DWARFDataExtractor.h" +#include "llvm/ADT/StringRef.h" namespace lldb_private { @@ -19,4 +20,11 @@ DWARFDataExtractor::GetDWARFOffset(lldb::offset_t *offset_ptr) const { return GetMaxU64(offset_ptr, GetDWARFSizeOfOffset()); } + +llvm::DWARFDataExtractor DWARFDataExtractor::GetAsLLVM() const { + return llvm::DWARFDataExtractor( + llvm::StringRef(reinterpret_cast(GetDataStart()), + GetByteSize()), + GetByteOrder() == lldb::eByteOrderLittle, GetAddressByteSize()); } +} // namespace lldb_private Index: lldb/trunk/source/Plugins/SymbolFile/DWARF/DebugNamesDWARFIndex.cpp =================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DebugNamesDWARFIndex.cpp +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DebugNamesDWARFIndex.cpp @@ -16,13 +16,6 @@ using namespace lldb_private; using namespace lldb; -static llvm::DWARFDataExtractor ToLLVM(const DWARFDataExtractor &data) { - return llvm::DWARFDataExtractor( - llvm::StringRef(reinterpret_cast(data.GetDataStart()), - data.GetByteSize()), - data.GetByteOrder() == eByteOrderLittle, data.GetAddressByteSize()); -} - llvm::Expected> DebugNamesDWARFIndex::Create(Module &module, DWARFDataExtractor debug_names, DWARFDataExtractor debug_str, @@ -31,8 +24,8 @@ return llvm::make_error("debug info null", llvm::inconvertibleErrorCode()); } - auto index_up = - llvm::make_unique(ToLLVM(debug_names), ToLLVM(debug_str)); + auto index_up = llvm::make_unique(debug_names.GetAsLLVM(), + debug_str.GetAsLLVM()); if (llvm::Error E = index_up->extract()) return std::move(E); Index: lldb/trunk/tools/lldb-test/lldb-test.cpp =================================================================== --- lldb/trunk/tools/lldb-test/lldb-test.cpp +++ lldb/trunk/tools/lldb-test/lldb-test.cpp @@ -739,7 +739,7 @@ Printer.formatLine("File size: {0}", S->GetFileSize()); if (opts::object::SectionContents) { - DataExtractor Data; + lldb_private::DataExtractor Data; S->GetSectionData(Data); ArrayRef Bytes = {Data.GetDataStart(), Data.GetDataEnd()}; Printer.formatBinary("Data: ", Bytes, 0);