mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-05 07:32:36 +00:00
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:
parent
fcffa7c201
commit
f4af9a9d80
@ -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();
|
||||
|
@ -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 §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;
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user