1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00

[macho2yaml] Refactor the DWARF section dumpers.

This patch refactors the DWARF section dumpers. When dumping a DWARF
section, if the DWARF parser fails to parse the section, we will dump it
as a raw content section. This patch also fixes a bug in
DWARFYAML::Data::isEmpty(). Finally, a test case that tests dumping the
__debug_aranges section is added.

Reviewed By: jhenderson, grimar

Differential Revision: https://reviews.llvm.org/D85506
This commit is contained in:
Xing GUO 2020-08-07 12:07:31 +08:00
parent da6c633ded
commit 99ed94570d
8 changed files with 285 additions and 340 deletions

View File

@ -17,7 +17,7 @@
namespace llvm {
bool DWARFYAML::Data::isEmpty() const {
return DebugStrings.empty() && AbbrevDecls.empty() && DebugAranges &&
return DebugStrings.empty() && AbbrevDecls.empty() && !DebugAranges &&
DebugRanges.empty() && !PubNames && !PubTypes && !GNUPubNames &&
!GNUPubTypes && CompileUnits.empty() && DebugLines.empty();
}

View File

@ -372,7 +372,6 @@ DWARF:
# EMPTY-NEXT: reserved1: 0x00000000
# EMPTY-NEXT: reserved2: 0x00000000
# EMPTY-NEXT: reserved3: 0x00000000
# EMPTY-NEXT: content: ''
# EMPTY-NEXT: - sectname: __debug_pubtypes
# EMPTY-NEXT: segname: __DWARF
# EMPTY-NEXT: addr: 0x0000000000000000
@ -385,7 +384,6 @@ DWARF:
# EMPTY-NEXT: reserved1: 0x00000000
# EMPTY-NEXT: reserved2: 0x00000000
# EMPTY-NEXT: reserved3: 0x00000000
# EMPTY-NEXT: content: ''
# EMPTY-NEXT: ...
--- !mach-o

View File

@ -1,300 +0,0 @@
# RUN: yaml2obj %s | not obj2yaml 2>&1 | FileCheck %s
--- !mach-o
FileHeader:
magic: 0xFEEDFACF
cputype: 0x01000007
cpusubtype: 0x00000003
filetype: 0x0000000A
ncmds: 5
sizeofcmds: 1800
flags: 0x00000000
reserved: 0x00000000
LoadCommands:
- cmd: LC_SEGMENT_64
cmdsize: 72
segname: __PAGEZERO
vmaddr: 0
vmsize: 4294967296
fileoff: 0
filesize: 0
maxprot: 0
initprot: 0
nsects: 0
flags: 0
- cmd: LC_SEGMENT_64
cmdsize: 472
segname: __TEXT
vmaddr: 4294967296
vmsize: 4096
fileoff: 0
filesize: 0
maxprot: 7
initprot: 5
nsects: 5
flags: 0
Sections:
- sectname: __text
segname: __TEXT
addr: 0x0000000100000F50
size: 52
offset: 0x00000000
align: 4
reloff: 0x00000000
nreloc: 0
flags: 0x80000400
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __stubs
segname: __TEXT
addr: 0x0000000100000F84
size: 6
offset: 0x00000000
align: 1
reloff: 0x00000000
nreloc: 0
flags: 0x80000408
reserved1: 0x00000000
reserved2: 0x00000006
reserved3: 0x00000000
- sectname: __stub_helper
segname: __TEXT
addr: 0x0000000100000F8C
size: 26
offset: 0x00000000
align: 2
reloff: 0x00000000
nreloc: 0
flags: 0x80000400
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __cstring
segname: __TEXT
addr: 0x0000000100000FA6
size: 14
offset: 0x00000000
align: 0
reloff: 0x00000000
nreloc: 0
flags: 0x00000002
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __unwind_info
segname: __TEXT
addr: 0x0000000100000FB4
size: 72
offset: 0x00000000
align: 2
reloff: 0x00000000
nreloc: 0
flags: 0x00000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- cmd: LC_SEGMENT_64
cmdsize: 232
segname: __DATA
vmaddr: 4294971392
vmsize: 4096
fileoff: 0
filesize: 0
maxprot: 7
initprot: 3
nsects: 2
flags: 0
Sections:
- sectname: __nl_symbol_ptr
segname: __DATA
addr: 0x0000000100001000
size: 16
offset: 0x00000000
align: 3
reloff: 0x00000000
nreloc: 0
flags: 0x00000006
reserved1: 0x00000001
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __la_symbol_ptr
segname: __DATA
addr: 0x0000000100001010
size: 8
offset: 0x00000000
align: 3
reloff: 0x00000000
nreloc: 0
flags: 0x00000007
reserved1: 0x00000003
reserved2: 0x00000000
reserved3: 0x00000000
- cmd: LC_SEGMENT_64
cmdsize: 72
segname: __LINKEDIT
vmaddr: 4294975488
vmsize: 4096
fileoff: 4096
filesize: 60
maxprot: 7
initprot: 1
nsects: 0
flags: 0
- cmd: LC_SEGMENT_64
cmdsize: 952
segname: __DWARF
vmaddr: 4294979584
vmsize: 4096
fileoff: 8192
filesize: 764
maxprot: 7
initprot: 3
nsects: 11
flags: 0
Sections:
- sectname: __debug_line
segname: __DWARF
addr: 0x0000000100003000
size: 69
offset: 0x00002000
align: 0
reloff: 0x00000000
nreloc: 0
flags: 0x00000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __debug_pubnames
segname: __DWARF
addr: 0x0000000100003045
size: 27
offset: 0x00002045
align: 0
reloff: 0x00000000
nreloc: 0
flags: 0x00000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __debug_pubtypes
segname: __DWARF
addr: 0x0000000100003060
size: 35
offset: 0x00002060
align: 0
reloff: 0x00000000
nreloc: 0
flags: 0x00000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __debug_aranges
segname: __DWARF
addr: 0x0000000100003083
size: 48
offset: 0x00002083
align: 0
reloff: 0x00000000
nreloc: 0
flags: 0x00000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __debug_info
segname: __DWARF
addr: 0x00000001000030B3
size: 121
offset: 0x000020B3
align: 0
reloff: 0x00000000
nreloc: 0
flags: 0x00000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __debug_abbrev
segname: __DWARF
addr: 0x000000010000312C
size: 76
offset: 0x0000212C
align: 0
reloff: 0x00000000
nreloc: 0
flags: 0x00000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __debug_str
segname: __DWARF
addr: 0x0000000100003178
size: 142
offset: 0x00002178
align: 0
reloff: 0x00000000
nreloc: 0
flags: 0x00000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __apple_names
segname: __DWARF
addr: 0x0000000100003206
size: 60
offset: 0x00002206
align: 0
reloff: 0x00000000
nreloc: 0
flags: 0x00000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __apple_namespac
segname: __DWARF
addr: 0x0000000100003242
size: 36
offset: 0x00002242
align: 0
reloff: 0x00000000
nreloc: 0
flags: 0x00000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __apple_types
segname: __DWARF
addr: 0x0000000100003266
size: 114
offset: 0x00002266
align: 0
reloff: 0x00000000
nreloc: 0
flags: 0x00000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __apple_objc
segname: __DWARF
addr: 0x00000001000032D8
size: 36
offset: 0x000022D8
align: 0
reloff: 0x00000000
nreloc: 0
flags: 0x00000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
DWARF:
debug_aranges:
- Length: 45
Version: 2
CuOffset: 0
AddressSize: 8
SegmentSelectorSize: 0
Descriptors:
- Address: 0x0000000100000F50
Length: 52
...
#CHECK: the length of address range table at offset 0x0 exceeds section size

View File

@ -0,0 +1,137 @@
## a) Test that we are able to dump the __debug_aranges section.
## The content of the __debug_aranges section should be written in
## the "DWARF" entry and the "content" field should remain empty.
# RUN: yaml2obj --docnum=1 %s | obj2yaml | FileCheck -DSEGNAME=DWARF %s --check-prefix=ARANGES
# ARANGES: Sections:
# ARANGES-NEXT: - sectname: __debug_aranges
# ARANGES-NEXT: segname: __[[SEGNAME]]
# ARANGES-NEXT: addr: 0x0000000000000000
# ARANGES-NEXT: size: 64
# ARANGES-NEXT: offset: 0x00000210
# ARANGES-NEXT: align: 0
# ARANGES-NEXT: reloff: 0x00000000
# ARANGES-NEXT: nreloc: 0
# ARANGES-NEXT: flags: 0x00000000
# ARANGES-NEXT: reserved1: 0x00000000
# ARANGES-NEXT: reserved2: 0x00000000
# ARANGES-NEXT: reserved3: 0x00000000
# ARANGES-NEXT: DWARF:
# ARANGES-NEXT: debug_aranges:
# ARANGES-NEXT: - Length: 0x000000000000003C
# ARANGES-NEXT: Version: 2
# ARANGES-NEXT: CuOffset: 0x0000000000001234
# ARANGES-NEXT: AddressSize: 0x08
# ARANGES-NEXT: Descriptors:
# ARANGES-NEXT: - Address: 0x0000000000001234
# ARANGES-NEXT: Length: 0x0000000000005678
# ARANGES-NEXT: - Address: 0x0000000000001234
# ARANGES-NEXT: Length: 0x0000000000005678
--- !mach-o
FileHeader:
magic: 0xFEEDFACF
cputype: 0x01000007
cpusubtype: 0x00000003
filetype: 0x0000000A
ncmds: 1
sizeofcmds: 232
flags: 0x00000000
reserved: 0x00000000
LoadCommands:
- cmd: LC_SEGMENT_64
cmdsize: 152
segname: __DWARF
vmaddr: 0x00
vmsize: 0x00
fileoff: 0x00
filesize: 0x00
maxprot: 0
initprot: 0
nsects: 1
flags: 0
Sections:
- sectname: __debug_aranges
segname: __DWARF
addr: 0x00
size: 64
offset: 528
align: 0
reloff: 0x00000000
nreloc: 0
flags: 0x00000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
DWARF:
debug_aranges:
- Length: [[LENGTH=<none>]]
Version: 2
CuOffset: 0x1234
Descriptors:
- Address: 0x1234
Length: 0x5678
- Address: 0x1234
Length: 0x5678
## b) Test dumping a __debug_aranges section whose length field doesn't match the actual length.
## This makes the DWARF parser fail to parse it and we will dump it as a raw content section.
# RUN: yaml2obj --docnum=1 -DLENGTH=0x2 %s | obj2yaml | FileCheck %s --check-prefix=RAW-CONTENT
# RAW-CONTENT: - sectname: __debug_aranges
# RAW-CONTENT-NEXT: segname: __DWARF
# RAW-CONTENT-NEXT: addr: 0x0000000000000000
# RAW-CONTENT-NEXT: size: 64
# RAW-CONTENT-NEXT: offset: 0x00000210
# RAW-CONTENT-NEXT: align: 0
# RAW-CONTENT-NEXT: reloff: 0x00000000
# RAW-CONTENT-NEXT: nreloc: 0
# RAW-CONTENT-NEXT: flags: 0x00000000
# RAW-CONTENT-NEXT: reserved1: 0x00000000
# RAW-CONTENT-NEXT: reserved2: 0x00000000
# RAW-CONTENT-NEXT: reserved3: 0x00000000
# RAW-CONTENT-NEXT: content: '02000000020034120000080000000000341200000000000078560000000000003412000000000000785600000000000000000000000000000000000000000000'
# RAW-CONTENT-NEXT: ...
## c) Test dumping a __debug_aranges section whose segname is __FOO.
# RUN: yaml2obj --docnum=2 %s | obj2yaml | FileCheck %s -DSEGNAME=FOO --check-prefix=ARANGES
--- !mach-o
FileHeader:
magic: 0xFEEDFACF
cputype: 0x01000007
cpusubtype: 0x00000003
filetype: 0x0000000A
ncmds: 1
sizeofcmds: 232
flags: 0x00000000
reserved: 0x00000000
LoadCommands:
- cmd: LC_SEGMENT_64
cmdsize: 152
segname: __DWARF
vmaddr: 0x00
vmsize: 0x00
fileoff: 0x00
filesize: 0x00
maxprot: 0
initprot: 0
nsects: 1
flags: 0
Sections:
- sectname: __debug_aranges
segname: __FOO
addr: 0x00
size: 64
offset: 528
align: 0
reloff: 0x00000000
nreloc: 0
flags: 0x00000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
content: '3C000000020034120000080000000000341200000000000078560000000000003412000000000000785600000000000000000000000000000000000000000000'

View File

@ -0,0 +1,62 @@
## Test that macho2yaml dumps the __debug_foo section (unrecognized debug section)
## as a raw content section.
## Due to the current implementation of yaml2macho being buggy, we cannot generate a DWARF section
## where the sectname starts with '__debug_' and the segname is '__DWARF', from a raw content section.
## We've slightly modified the segname to be '__FOO'. macho2yaml will still treat it as a debug
## section.
# RUN: yaml2obj %s | obj2yaml | FileCheck %s --check-prefix=UNRECOGNIZED
# UNRECOGNIZED: Sections:
# UNRECOGNIZED-NEXT: - sectname: __debug_foo
# UNRECOGNIZED-NEXT: segname: __FOO
# UNRECOGNIZED-NEXT: addr: 0x0000000000000000
# UNRECOGNIZED-NEXT: size: 5
# UNRECOGNIZED-NEXT: offset: 0x00000210
# UNRECOGNIZED-NEXT: align: 0
# UNRECOGNIZED-NEXT: reloff: 0x00000000
# UNRECOGNIZED-NEXT: nreloc: 0
# UNRECOGNIZED-NEXT: flags: 0x00000000
# UNRECOGNIZED-NEXT: reserved1: 0x00000000
# UNRECOGNIZED-NEXT: reserved2: 0x00000000
# UNRECOGNIZED-NEXT: reserved3: 0x00000000
# UNRECOGNIZED-NEXT: content: '0123456789'
# UNRECOGNIZED-NEXT: ...
--- !mach-o
FileHeader:
magic: 0xFEEDFACF
cputype: 0x01000007
cpusubtype: 0x00000003
filetype: 0x0000000A
ncmds: 1
sizeofcmds: 232
flags: 0x00000000
reserved: 0x00000000
LoadCommands:
- cmd: LC_SEGMENT_64
cmdsize: 152
segname: __DWARF
vmaddr: 0x00
vmsize: 0x00
fileoff: 0x00
filesize: 0x00
maxprot: 0
initprot: 0
nsects: 1
flags: 0
Sections:
- sectname: __debug_foo
segname: __FOO
addr: 0x00
size: 5
offset: 528
align: 0
reloff: 0x00000000
nreloc: 0
flags: 0x00000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
content: '0123456789'

View File

@ -411,16 +411,3 @@ void dumpDebugLines(DWARFContext &DCtx, DWARFYAML::Data &Y) {
}
}
}
llvm::Error dwarf2yaml(DWARFContext &DCtx, DWARFYAML::Data &Y) {
dumpDebugAbbrev(DCtx, Y);
dumpDebugStrings(DCtx, Y);
if (Error E = dumpDebugARanges(DCtx, Y))
return E;
if (Error E = dumpDebugRanges(DCtx, Y))
return E;
dumpDebugPubSections(DCtx, Y);
dumpDebugInfo(DCtx, Y);
dumpDebugLines(DCtx, Y);
return ErrorSuccess();
}

View File

@ -10,7 +10,9 @@
#include "obj2yaml.h"
#include "llvm/DebugInfo/DWARF/DWARFContext.h"
#include "llvm/Object/MachOUniversal.h"
#include "llvm/ObjectYAML/DWARFYAML.h"
#include "llvm/ObjectYAML/ObjectYAML.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/LEB128.h"
@ -23,9 +25,11 @@ class MachODumper {
template <typename StructType>
Expected<const char *> processLoadCommandData(
MachOYAML::LoadCommand &LC,
const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd);
const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd,
MachOYAML::Object &Y);
const object::MachOObjectFile &Obj;
std::unique_ptr<DWARFContext> DWARFCtx;
void dumpHeader(std::unique_ptr<MachOYAML::Object> &Y);
Error dumpLoadCommands(std::unique_ptr<MachOYAML::Object> &Y);
void dumpLinkEdit(std::unique_ptr<MachOYAML::Object> &Y);
@ -44,10 +48,13 @@ class MachODumper {
template <typename SectionType, typename SegmentType>
Expected<const char *>
extractSections(const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd,
std::vector<MachOYAML::Section> &Sections);
std::vector<MachOYAML::Section> &Sections,
MachOYAML::Object &Y);
public:
MachODumper(const object::MachOObjectFile &O) : Obj(O) {}
MachODumper(const object::MachOObjectFile &O,
std::unique_ptr<DWARFContext> DCtx)
: Obj(O), DWARFCtx(std::move(DCtx)) {}
Expected<std::unique_ptr<MachOYAML::Object>> dump();
};
@ -58,7 +65,7 @@ public:
if (Obj.isLittleEndian() != sys::IsLittleEndianHost) \
MachO::swapStruct(LC.Data.LCStruct##_data); \
if (Expected<const char *> ExpectedEndPtr = \
processLoadCommandData<MachO::LCStruct>(LC, LoadCmd)) \
processLoadCommandData<MachO::LCStruct>(LC, LoadCmd, *Y.get())) \
EndPtr = *ExpectedEndPtr; \
else \
return ExpectedEndPtr.takeError(); \
@ -125,10 +132,41 @@ MachODumper::constructSection(MachO::section_64 Sec, size_t SecIndex) {
return TempSec;
}
static Error dumpDebugSection(StringRef SecName, DWARFContext &DCtx,
DWARFYAML::Data &DWARF) {
if (SecName == "__debug_abbrev") {
dumpDebugAbbrev(DCtx, DWARF);
return Error::success();
}
if (SecName == "__debug_aranges")
return dumpDebugARanges(DCtx, DWARF);
if (SecName == "__debug_info") {
dumpDebugInfo(DCtx, DWARF);
return Error::success();
}
if (SecName == "__debug_line") {
dumpDebugLines(DCtx, DWARF);
return Error::success();
}
if (SecName.startswith("__debug_pub")) {
// FIXME: We should extract pub-section dumpers from this function.
dumpDebugPubSections(DCtx, DWARF);
return Error::success();
}
if (SecName == "__debug_ranges")
return dumpDebugRanges(DCtx, DWARF);
if (SecName == "__debug_str") {
dumpDebugStrings(DCtx, DWARF);
return Error::success();
}
return createStringError(errc::not_supported,
"dumping " + SecName + " section is not supported");
}
template <typename SectionType, typename SegmentType>
Expected<const char *> MachODumper::extractSections(
const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd,
std::vector<MachOYAML::Section> &Sections) {
std::vector<MachOYAML::Section> &Sections, MachOYAML::Object &Y) {
auto End = LoadCmd.Ptr + LoadCmd.C.cmdsize;
const SectionType *Curr =
reinterpret_cast<const SectionType *>(LoadCmd.Ptr + sizeof(SegmentType));
@ -139,9 +177,19 @@ Expected<const char *> MachODumper::extractSections(
MachO::swapStruct(Sec);
// For MachO section indices start from 1.
if (Expected<MachOYAML::Section> S =
constructSection(Sec, Sections.size() + 1))
constructSection(Sec, Sections.size() + 1)) {
StringRef SecName(S->sectname);
DWARFYAML::Data DWARF;
if (SecName.startswith("__debug_")) {
// If the DWARF section cannot be successfully parsed, emit raw content
// instead of an entry in the DWARF section of the YAML.
if (Error Err = dumpDebugSection(SecName, *DWARFCtx.get(), Y.DWARF))
consumeError(std::move(Err));
else
S->content.reset();
}
Sections.push_back(std::move(*S));
else
} else
return S.takeError();
}
return reinterpret_cast<const char *>(Curr);
@ -150,7 +198,8 @@ Expected<const char *> MachODumper::extractSections(
template <typename StructType>
Expected<const char *> MachODumper::processLoadCommandData(
MachOYAML::LoadCommand &LC,
const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd) {
const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd,
MachOYAML::Object &Y) {
return LoadCmd.Ptr + sizeof(StructType);
}
@ -158,18 +207,20 @@ template <>
Expected<const char *>
MachODumper::processLoadCommandData<MachO::segment_command>(
MachOYAML::LoadCommand &LC,
const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd) {
return extractSections<MachO::section, MachO::segment_command>(LoadCmd,
LC.Sections);
const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd,
MachOYAML::Object &Y) {
return extractSections<MachO::section, MachO::segment_command>(
LoadCmd, LC.Sections, Y);
}
template <>
Expected<const char *>
MachODumper::processLoadCommandData<MachO::segment_command_64>(
MachOYAML::LoadCommand &LC,
const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd) {
const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd,
MachOYAML::Object &Y) {
return extractSections<MachO::section_64, MachO::segment_command_64>(
LoadCmd, LC.Sections);
LoadCmd, LC.Sections, Y);
}
template <typename StructType>
@ -187,7 +238,8 @@ template <>
Expected<const char *>
MachODumper::processLoadCommandData<MachO::dylib_command>(
MachOYAML::LoadCommand &LC,
const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd) {
const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd,
MachOYAML::Object &Y) {
return readString<MachO::dylib_command>(LC, LoadCmd);
}
@ -195,7 +247,8 @@ template <>
Expected<const char *>
MachODumper::processLoadCommandData<MachO::dylinker_command>(
MachOYAML::LoadCommand &LC,
const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd) {
const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd,
MachOYAML::Object &Y) {
return readString<MachO::dylinker_command>(LC, LoadCmd);
}
@ -203,7 +256,8 @@ template <>
Expected<const char *>
MachODumper::processLoadCommandData<MachO::rpath_command>(
MachOYAML::LoadCommand &LC,
const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd) {
const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd,
MachOYAML::Object &Y) {
return readString<MachO::rpath_command>(LC, LoadCmd);
}
@ -211,7 +265,8 @@ template <>
Expected<const char *>
MachODumper::processLoadCommandData<MachO::build_version_command>(
MachOYAML::LoadCommand &LC,
const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd) {
const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd,
MachOYAML::Object &Y) {
auto Start = LoadCmd.Ptr + sizeof(MachO::build_version_command);
auto NTools = LC.Data.build_version_command_data.ntools;
for (unsigned i = 0; i < NTools; ++i) {
@ -233,9 +288,6 @@ Expected<std::unique_ptr<MachOYAML::Object>> MachODumper::dump() {
return std::move(Err);
dumpLinkEdit(Y);
std::unique_ptr<DWARFContext> DICtx = DWARFContext::create(Obj);
if (auto Err = dwarf2yaml(*DICtx, Y->DWARF))
return std::move(Err);
return std::move(Y);
}
@ -261,7 +313,8 @@ Error MachODumper::dumpLoadCommands(std::unique_ptr<MachOYAML::Object> &Y) {
if (Obj.isLittleEndian() != sys::IsLittleEndianHost)
MachO::swapStruct(LC.Data.load_command_data);
if (Expected<const char *> ExpectedEndPtr =
processLoadCommandData<MachO::load_command>(LC, LoadCmd))
processLoadCommandData<MachO::load_command>(LC, LoadCmd,
*Y.get()))
EndPtr = *ExpectedEndPtr;
else
return ExpectedEndPtr.takeError();
@ -539,7 +592,8 @@ void MachODumper::dumpSymbols(std::unique_ptr<MachOYAML::Object> &Y) {
}
Error macho2yaml(raw_ostream &Out, const object::MachOObjectFile &Obj) {
MachODumper Dumper(Obj);
std::unique_ptr<DWARFContext> DCtx = DWARFContext::create(Obj);
MachODumper Dumper(Obj, std::move(DCtx));
Expected<std::unique_ptr<MachOYAML::Object>> YAML = Dumper.dump();
if (!YAML)
return YAML.takeError();
@ -573,7 +627,8 @@ Error macho2yaml(raw_ostream &Out, const object::MachOUniversalBinary &Obj) {
if (!SliceObj)
return SliceObj.takeError();
MachODumper Dumper(*SliceObj.get());
std::unique_ptr<DWARFContext> DCtx = DWARFContext::create(*SliceObj.get());
MachODumper Dumper(*SliceObj.get(), std::move(DCtx));
Expected<std::unique_ptr<MachOYAML::Object>> YAMLObj = Dumper.dump();
if (!YAMLObj)
return YAMLObj.takeError();

View File

@ -40,7 +40,13 @@ struct Data;
}
}
llvm::Error dwarf2yaml(llvm::DWARFContext &DCtx, llvm::DWARFYAML::Data &Y);
void dumpDebugAbbrev(llvm::DWARFContext &DCtx, llvm::DWARFYAML::Data &Y);
llvm::Error dumpDebugARanges(llvm::DWARFContext &DCtx,
llvm::DWARFYAML::Data &Y);
void dumpDebugPubSections(llvm::DWARFContext &DCtx, llvm::DWARFYAML::Data &Y);
void dumpDebugInfo(llvm::DWARFContext &DCtx, llvm::DWARFYAML::Data &Y);
void dumpDebugLines(llvm::DWARFContext &DCtx, llvm::DWARFYAML::Data &Y);
llvm::Error dumpDebugRanges(llvm::DWARFContext &DCtx, llvm::DWARFYAML::Data &Y);
void dumpDebugStrings(llvm::DWARFContext &DCtx, llvm::DWARFYAML::Data &Y);
#endif