mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-03 19:15:30 +00:00
[ObjectYAML] Support for DWARF debug_aranges
This patch adds support for round tripping DWARF debug_aranges in and out of YAML. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@289161 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c828f5b04a
commit
18245f6cf7
@ -59,6 +59,8 @@ public:
|
||||
|
||||
uint32_t getCompileUnitDIEOffset() const { return HeaderData.CuOffset; }
|
||||
|
||||
const Header &getHeader() const { return HeaderData; }
|
||||
|
||||
desc_iterator_range descriptors() const {
|
||||
return desc_iterator_range(ArangeDescriptors.begin(),
|
||||
ArangeDescriptors.end());
|
||||
|
@ -35,9 +35,24 @@ struct Abbrev {
|
||||
std::vector<AttributeAbbrev> Attributes;
|
||||
};
|
||||
|
||||
struct ARangeDescriptor {
|
||||
llvm::yaml::Hex64 Address;
|
||||
uint64_t Length;
|
||||
};
|
||||
|
||||
struct ARange {
|
||||
uint32_t Length;
|
||||
uint16_t Version;
|
||||
uint32_t CuOffset;
|
||||
uint8_t AddrSize;
|
||||
uint8_t SegSize;
|
||||
std::vector<ARangeDescriptor> Descriptors;
|
||||
};
|
||||
|
||||
struct Data {
|
||||
std::vector<Abbrev> AbbrevDecls;
|
||||
std::vector<StringRef> DebugStrings;
|
||||
std::vector<ARange> ARanges;
|
||||
|
||||
bool isEmpty() const;
|
||||
};
|
||||
@ -48,6 +63,8 @@ struct Data {
|
||||
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::StringRef)
|
||||
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::AttributeAbbrev)
|
||||
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::Abbrev)
|
||||
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::ARangeDescriptor)
|
||||
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DWARFYAML::ARange)
|
||||
|
||||
namespace llvm {
|
||||
namespace yaml {
|
||||
@ -64,6 +81,14 @@ template <> struct MappingTraits<DWARFYAML::AttributeAbbrev> {
|
||||
static void mapping(IO &IO, DWARFYAML::AttributeAbbrev &AttAbbrev);
|
||||
};
|
||||
|
||||
template <> struct MappingTraits<DWARFYAML::ARangeDescriptor> {
|
||||
static void mapping(IO &IO, DWARFYAML::ARangeDescriptor &Descriptor);
|
||||
};
|
||||
|
||||
template <> struct MappingTraits<DWARFYAML::ARange> {
|
||||
static void mapping(IO &IO, DWARFYAML::ARange &Range);
|
||||
};
|
||||
|
||||
#define HANDLE_DW_TAG(unused, name) \
|
||||
io.enumCase(value, "DW_TAG_" #name, dwarf::DW_TAG_##name);
|
||||
|
||||
|
@ -26,6 +26,8 @@ void MappingTraits<DWARFYAML::Data>::mapping(
|
||||
IO &IO, DWARFYAML::Data &DWARF) {
|
||||
IO.mapOptional("debug_str", DWARF.DebugStrings);
|
||||
IO.mapOptional("debug_abbrev", DWARF.AbbrevDecls);
|
||||
if(!DWARF.ARanges.empty() || !IO.outputting())
|
||||
IO.mapOptional("debug_aranges", DWARF.ARanges);
|
||||
}
|
||||
|
||||
void MappingTraits<DWARFYAML::Abbrev>::mapping(
|
||||
@ -42,6 +44,22 @@ void MappingTraits<DWARFYAML::AttributeAbbrev>::mapping(
|
||||
IO.mapRequired("Form", AttAbbrev.Form);
|
||||
}
|
||||
|
||||
void MappingTraits<DWARFYAML::ARangeDescriptor>::mapping(
|
||||
IO &IO, DWARFYAML::ARangeDescriptor &Descriptor) {
|
||||
IO.mapRequired("Address", Descriptor.Address);
|
||||
IO.mapRequired("Length", Descriptor.Length);
|
||||
}
|
||||
|
||||
void MappingTraits<DWARFYAML::ARange>::mapping(IO &IO,
|
||||
DWARFYAML::ARange &Range) {
|
||||
IO.mapRequired("Length", Range.Length);
|
||||
IO.mapRequired("Version", Range.Version);
|
||||
IO.mapRequired("CuOffset", Range.CuOffset);
|
||||
IO.mapRequired("AddrSize", Range.AddrSize);
|
||||
IO.mapRequired("SegSize", Range.SegSize);
|
||||
IO.mapRequired("Descriptors", Range.Descriptors);
|
||||
}
|
||||
|
||||
} // namespace llvm::yaml
|
||||
|
||||
} // namespace llvm
|
||||
|
335
test/ObjectYAML/MachO/DWARF-debug_aranges.yaml
Normal file
335
test/ObjectYAML/MachO/DWARF-debug_aranges.yaml
Normal file
@ -0,0 +1,335 @@
|
||||
# RUN: yaml2obj %s | obj2yaml | FileCheck %s
|
||||
|
||||
--- !mach-o
|
||||
FileHeader:
|
||||
magic: 0xFEEDFACF
|
||||
cputype: 0x01000007
|
||||
cpusubtype: 0x00000003
|
||||
filetype: 0x0000000A
|
||||
ncmds: 7
|
||||
sizeofcmds: 1848
|
||||
flags: 0x00000000
|
||||
reserved: 0x00000000
|
||||
LoadCommands:
|
||||
- cmd: LC_UUID
|
||||
cmdsize: 24
|
||||
uuid: B4D48511-37F4-3ED4-AFA7-1683DCE69AC4
|
||||
- cmd: LC_SYMTAB
|
||||
cmdsize: 24
|
||||
symoff: 4096
|
||||
nsyms: 2
|
||||
stroff: 4128
|
||||
strsize: 28
|
||||
- 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
|
||||
LinkEditData:
|
||||
NameList:
|
||||
- n_strx: 2
|
||||
n_type: 0x0F
|
||||
n_sect: 1
|
||||
n_desc: 16
|
||||
n_value: 4294967296
|
||||
- n_strx: 22
|
||||
n_type: 0x0F
|
||||
n_sect: 1
|
||||
n_desc: 0
|
||||
n_value: 4294971216
|
||||
StringTable:
|
||||
- ''
|
||||
- ''
|
||||
- __mh_execute_header
|
||||
- _main
|
||||
DWARF:
|
||||
debug_aranges:
|
||||
- Length: 44
|
||||
Version: 2
|
||||
CuOffset: 0
|
||||
AddrSize: 8
|
||||
SegSize: 0
|
||||
Descriptors:
|
||||
- Address: 0x0000000100000F50
|
||||
Length: 52
|
||||
...
|
||||
|
||||
#CHECK: DWARF:
|
||||
#CHECK: debug_aranges:
|
||||
#CHECK: - Length: 44
|
||||
#CHECK: Version: 2
|
||||
#CHECK: CuOffset: 0
|
||||
#CHECK: AddrSize: 8
|
||||
#CHECK: SegSize: 0
|
||||
#CHECK: Descriptors:
|
||||
#CHECK: - Address: 0x0000000100000F50
|
||||
#CHECK: Length: 52
|
@ -9,6 +9,7 @@
|
||||
|
||||
#include "Error.h"
|
||||
#include "llvm/DebugInfo/DWARF/DWARFContext.h"
|
||||
#include "llvm/DebugInfo/DWARF/DWARFDebugArangeSet.h"
|
||||
#include "llvm/ObjectYAML/DWARFYAML.h"
|
||||
|
||||
using namespace llvm;
|
||||
@ -44,10 +45,33 @@ void dumpDebugStrings(DWARFContextInMemory &DCtx, DWARFYAML::Data &Y) {
|
||||
}
|
||||
}
|
||||
|
||||
void dumpDebugARanges(DWARFContextInMemory &DCtx, DWARFYAML::Data &Y) {
|
||||
DataExtractor ArangesData(DCtx.getARangeSection(), DCtx.isLittleEndian(), 0);
|
||||
uint32_t Offset = 0;
|
||||
DWARFDebugArangeSet Set;
|
||||
|
||||
while (Set.extract(ArangesData, &Offset)) {
|
||||
DWARFYAML::ARange Range;
|
||||
Range.Length = Set.getHeader().Length;
|
||||
Range.Version = Set.getHeader().Version;
|
||||
Range.CuOffset = Set.getHeader().CuOffset;
|
||||
Range.AddrSize = Set.getHeader().AddrSize;
|
||||
Range.SegSize = Set.getHeader().SegSize;
|
||||
for (auto Descriptor : Set.descriptors()) {
|
||||
DWARFYAML::ARangeDescriptor Desc;
|
||||
Desc.Address = Descriptor.Address;
|
||||
Desc.Length = Descriptor.Length;
|
||||
Range.Descriptors.push_back(Desc);
|
||||
}
|
||||
Y.ARanges.push_back(Range);
|
||||
}
|
||||
}
|
||||
|
||||
std::error_code dwarf2yaml(DWARFContextInMemory &DCtx,
|
||||
DWARFYAML::Data &Y) {
|
||||
dumpDebugAbbrev(DCtx, Y);
|
||||
dumpDebugStrings(DCtx, Y);
|
||||
dumpDebugARanges(DCtx, Y);
|
||||
|
||||
return obj2yaml_error::success;
|
||||
}
|
||||
|
@ -19,6 +19,12 @@
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
void ZeroFillBytes(raw_ostream &OS, size_t Size) {
|
||||
std::vector<uint8_t> FillData;
|
||||
FillData.insert(FillData.begin(), Size, 0);
|
||||
OS.write(reinterpret_cast<char *>(FillData.data()), Size);
|
||||
}
|
||||
|
||||
void yaml2debug_str(raw_ostream &OS, const DWARFYAML::Data &DI) {
|
||||
for (auto Str : DI.DebugStrings) {
|
||||
OS.write(Str.data(), Str.size());
|
||||
@ -39,3 +45,24 @@ void yaml2debug_abbrev(raw_ostream &OS, const DWARFYAML::Data &DI) {
|
||||
encodeULEB128(0, OS);
|
||||
}
|
||||
}
|
||||
|
||||
void yaml2debug_aranges(raw_ostream &OS, const DWARFYAML::Data &DI) {
|
||||
for (auto Range : DI.ARanges) {
|
||||
auto HeaderStart = OS.tell();
|
||||
OS.write(reinterpret_cast<char *>(&Range.Length), 4);
|
||||
OS.write(reinterpret_cast<char *>(&Range.Version), 2);
|
||||
OS.write(reinterpret_cast<char *>(&Range.CuOffset), 4);
|
||||
OS.write(reinterpret_cast<char *>(&Range.AddrSize), 1);
|
||||
OS.write(reinterpret_cast<char *>(&Range.SegSize), 1);
|
||||
|
||||
auto HeaderSize = OS.tell() - HeaderStart;
|
||||
auto FirstDescriptor = alignTo(HeaderSize, Range.AddrSize * 2);
|
||||
ZeroFillBytes(OS, FirstDescriptor - HeaderSize);
|
||||
|
||||
for (auto Descriptor : Range.Descriptors) {
|
||||
OS.write(reinterpret_cast<char *>(&Descriptor.Address), Range.AddrSize);
|
||||
OS.write(reinterpret_cast<char *>(&Descriptor.Length), Range.AddrSize);
|
||||
}
|
||||
ZeroFillBytes(OS, Range.AddrSize * 2);
|
||||
}
|
||||
}
|
||||
|
@ -393,6 +393,9 @@ Error MachOWriter::writeDWARFData(raw_ostream &OS,
|
||||
} else if (0 == strncmp(&Section.sectname[0], "__debug_abbrev", 16)) {
|
||||
yaml2debug_abbrev(OS, Obj.DWARF);
|
||||
}
|
||||
else if (0 == strncmp(&Section.sectname[0], "__debug_aranges", 16)) {
|
||||
yaml2debug_aranges(OS, Obj.DWARF);
|
||||
}
|
||||
}
|
||||
return Error::success();
|
||||
}
|
||||
|
@ -42,4 +42,6 @@ void yaml2debug_abbrev(llvm::raw_ostream &OS,
|
||||
void yaml2debug_str(llvm::raw_ostream &OS,
|
||||
const llvm::DWARFYAML::Data &DI);
|
||||
|
||||
void yaml2debug_aranges(llvm::raw_ostream &OS, const llvm::DWARFYAML::Data &DI);
|
||||
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user