Add convenience methods to convert LLDB to LLVM data structures.

This patch adds two convenience methods named GetAsLLVM to the LLDB
counterparts of the DWARF DataExtractor and the DWARF context. The
DWARFContext, once created, is cached for future usage.

Differential revision: https://reviews.llvm.org/D64535

llvm-svn: 365819
This commit is contained in:
Jonas Devlieghere 2019-07-11 20:26:53 +00:00
parent fcffa7c201
commit f4af9a9d80
7 changed files with 57 additions and 10 deletions

View File

@ -38,6 +38,11 @@ public:
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();

View File

@ -100,3 +100,37 @@ const DWARFDataExtractor &DWARFContext::getOrLoadDebugTypesData() {
return LoadOrGetSection(eSectionTypeDWARFDebugTypes,
eSectionTypeDWARFDebugTypesDwo, m_data_debug_types);
}
llvm::DWARFContext &DWARFContext::GetAsLLVM() {
if (!m_llvm_context) {
llvm::StringMap<std::unique_ptr<llvm::MemoryBuffer>> section_map;
uint8_t addr_size = 0;
auto AddSection = [&](Section &section) {
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 &section : *m_main_section_list)
AddSection(*section);
}
if (m_dwo_section_list) {
for (auto &section : *m_dwo_section_list)
AddSection(*section);
}
m_llvm_context = llvm::DWARFContext::create(section_map, addr_size);
}
return *m_llvm_context;
}

View File

@ -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 <memory>
@ -20,6 +21,7 @@ class DWARFContext {
private:
SectionList *m_main_section_list;
SectionList *m_dwo_section_list;
mutable std::unique_ptr<llvm::DWARFContext> m_llvm_context;
struct SectionData {
llvm::once_flag flag;
@ -64,6 +66,8 @@ public:
const DWARFDataExtractor &getOrLoadStrData();
const DWARFDataExtractor &getOrLoadStrOffsetsData();
const DWARFDataExtractor &getOrLoadDebugTypesData();
llvm::DWARFContext &GetAsLLVM();
};
} // namespace lldb_private

View File

@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "DWARFDataExtractor.h"
#include "llvm/ADT/StringRef.h"
namespace lldb_private {
@ -19,4 +20,11 @@ dw_offset_t
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<const char *>(GetDataStart()),
GetByteSize()),
GetByteOrder() == lldb::eByteOrderLittle, GetAddressByteSize());
}
} // namespace lldb_private

View File

@ -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 @@ public:
size_t GetDWARFSizeofInitialLength() const { return 4; }
size_t GetDWARFSizeOfOffset() const { return 4; }
llvm::DWARFDataExtractor GetAsLLVM() const;
};
}

View File

@ -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<const char *>(data.GetDataStart()),
data.GetByteSize()),
data.GetByteOrder() == eByteOrderLittle, data.GetAddressByteSize());
}
llvm::Expected<std::unique_ptr<DebugNamesDWARFIndex>>
DebugNamesDWARFIndex::Create(Module &module, DWARFDataExtractor debug_names,
DWARFDataExtractor debug_str,
@ -31,8 +24,8 @@ DebugNamesDWARFIndex::Create(Module &module, DWARFDataExtractor debug_names,
return llvm::make_error<llvm::StringError>("debug info null",
llvm::inconvertibleErrorCode());
}
auto index_up =
llvm::make_unique<DebugNames>(ToLLVM(debug_names), ToLLVM(debug_str));
auto index_up = llvm::make_unique<DebugNames>(debug_names.GetAsLLVM(),
debug_str.GetAsLLVM());
if (llvm::Error E = index_up->extract())
return std::move(E);

View File

@ -739,7 +739,7 @@ static void dumpSectionList(LinePrinter &Printer, const SectionList &List, bool
Printer.formatLine("File size: {0}", S->GetFileSize());
if (opts::object::SectionContents) {
DataExtractor Data;
lldb_private::DataExtractor Data;
S->GetSectionData(Data);
ArrayRef<uint8_t> Bytes = {Data.GetDataStart(), Data.GetDataEnd()};
Printer.formatBinary("Data: ", Bytes, 0);