[llvm] r288955 - [ObjectYAML] Support for DWARF __debug_abbrev section
Chris Bieneman via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 7 10:52:59 PST 2016
Author: cbieneman
Date: Wed Dec 7 12:52:59 2016
New Revision: 288955
URL: http://llvm.org/viewvc/llvm-project?rev=288955&view=rev
Log:
[ObjectYAML] Support for DWARF __debug_abbrev section
This patch adds support for round-tripping DWARF debug abbreviations through the obj<->yaml tools.
Added:
llvm/trunk/test/ObjectYAML/MachO/DWARF-debug_abbrev.yaml
Modified:
llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugAbbrev.h
llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h
llvm/trunk/lib/ObjectYAML/MachOYAML.cpp
llvm/trunk/tools/obj2yaml/macho2yaml.cpp
llvm/trunk/tools/yaml2obj/yaml2macho.cpp
Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugAbbrev.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugAbbrev.h?rev=288955&r1=288954&r2=288955&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugAbbrev.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugAbbrev.h Wed Dec 7 12:52:59 2016
@@ -23,6 +23,9 @@ class DWARFAbbreviationDeclarationSet {
uint32_t FirstAbbrCode;
std::vector<DWARFAbbreviationDeclaration> Decls;
+ typedef std::vector<DWARFAbbreviationDeclaration>::const_iterator
+ const_iterator;
+
public:
DWARFAbbreviationDeclarationSet();
@@ -33,6 +36,14 @@ public:
const DWARFAbbreviationDeclaration *
getAbbreviationDeclaration(uint32_t AbbrCode) const;
+ const_iterator begin() const {
+ return Decls.begin();
+ }
+
+ const_iterator end() const {
+ return Decls.end();
+ }
+
private:
void clear();
};
@@ -53,6 +64,14 @@ public:
void dump(raw_ostream &OS) const;
void extract(DataExtractor Data);
+ DWARFAbbreviationDeclarationSetMap::const_iterator begin() const {
+ return AbbrDeclSets.begin();
+ }
+
+ DWARFAbbreviationDeclarationSetMap::const_iterator end() const {
+ return AbbrDeclSets.end();
+ }
+
private:
void clear();
};
Modified: llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h?rev=288955&r1=288954&r2=288955&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h (original)
+++ llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h Wed Dec 7 12:52:59 2016
@@ -18,6 +18,7 @@
#include "llvm/ObjectYAML/YAML.h"
#include "llvm/Support/MachO.h"
+#include "llvm/Support/Dwarf.h"
namespace llvm {
namespace MachOYAML {
@@ -104,7 +105,20 @@ struct LinkEditData {
bool isEmpty() const;
};
+struct DWARFAttributeAbbrev {
+ llvm::dwarf::Attribute Attribute;
+ llvm::dwarf::Form Form;
+};
+
+struct DWARFAbbrev {
+ llvm::yaml::Hex32 Code;
+ llvm::dwarf::Tag Tag;
+ llvm::dwarf::Constants Children;
+ std::vector<DWARFAttributeAbbrev> Attributes;
+};
+
struct DWARFData {
+ std::vector<DWARFAbbrev> AbbrevDecls;
std::vector<StringRef> DebugStrings;
bool isEmpty() const;
@@ -153,6 +167,8 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachO
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::StringRef)
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::Object)
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::FatArch)
+LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::DWARFAttributeAbbrev)
+LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::DWARFAbbrev)
namespace llvm {
namespace yaml {
@@ -209,6 +225,14 @@ template <> struct MappingTraits<MachOYA
static void mapping(IO &IO, MachOYAML::DWARFData &DWARF);
};
+template <> struct MappingTraits<MachOYAML::DWARFAbbrev> {
+ static void mapping(IO &IO, MachOYAML::DWARFAbbrev &Abbrev);
+};
+
+template <> struct MappingTraits<MachOYAML::DWARFAttributeAbbrev> {
+ static void mapping(IO &IO, MachOYAML::DWARFAttributeAbbrev &AttAbbrev);
+};
+
#define HANDLE_LOAD_COMMAND(LCName, LCValue, LCStruct) \
io.enumCase(value, #LCName, MachO::LCName);
@@ -255,6 +279,44 @@ template <> struct ScalarEnumerationTrai
}
};
+#define HANDLE_DW_TAG(unused, name) \
+ io.enumCase(value, "DW_TAG_" #name, dwarf::DW_TAG_##name);
+
+template <> struct ScalarEnumerationTraits<dwarf::Tag> {
+ static void enumeration(IO &io, dwarf::Tag &value) {
+#include "llvm/Support/Dwarf.def"
+ io.enumFallback<Hex16>(value);
+ }
+};
+
+#define HANDLE_DW_AT(unused, name) \
+ io.enumCase(value, "DW_AT_" #name, dwarf::DW_AT_##name);
+
+template <> struct ScalarEnumerationTraits<dwarf::Attribute> {
+ static void enumeration(IO &io, dwarf::Attribute &value) {
+#include "llvm/Support/Dwarf.def"
+ io.enumFallback<Hex16>(value);
+ }
+};
+
+#define HANDLE_DW_FORM(unused, name) \
+ io.enumCase(value, "DW_FORM_" #name, dwarf::DW_FORM_##name);
+
+template <> struct ScalarEnumerationTraits<dwarf::Form> {
+ static void enumeration(IO &io, dwarf::Form &value) {
+#include "llvm/Support/Dwarf.def"
+ io.enumFallback<Hex16>(value);
+ }
+};
+
+template <> struct ScalarEnumerationTraits<dwarf::Constants> {
+ static void enumeration(IO &io, dwarf::Constants &value) {
+ io.enumCase(value, "DW_CHILDREN_no", dwarf::DW_CHILDREN_no);
+ io.enumCase(value, "DW_CHILDREN_yes", dwarf::DW_CHILDREN_yes);
+ io.enumFallback<Hex16>(value);
+ }
+};
+
// This trait is used for 16-byte chars in Mach structures used for strings
typedef char char_16[16];
Modified: llvm/trunk/lib/ObjectYAML/MachOYAML.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ObjectYAML/MachOYAML.cpp?rev=288955&r1=288954&r2=288955&view=diff
==============================================================================
--- llvm/trunk/lib/ObjectYAML/MachOYAML.cpp (original)
+++ llvm/trunk/lib/ObjectYAML/MachOYAML.cpp Wed Dec 7 12:52:59 2016
@@ -30,7 +30,7 @@ bool MachOYAML::LinkEditData::isEmpty()
}
bool MachOYAML::DWARFData::isEmpty() const {
- return 0 == DebugStrings.size();
+ return 0 == DebugStrings.size() + AbbrevDecls.size();
}
namespace yaml {
@@ -559,7 +559,22 @@ void MappingTraits<MachO::version_min_co
void MappingTraits<MachOYAML::DWARFData>::mapping(
IO &IO, MachOYAML::DWARFData &DWARF) {
- IO.mapRequired("DebugStrings", DWARF.DebugStrings);
+ IO.mapOptional("DebugStrings", DWARF.DebugStrings);
+ IO.mapOptional("AbbrevDecls", DWARF.AbbrevDecls);
+}
+
+void MappingTraits<MachOYAML::DWARFAbbrev>::mapping(
+ IO &IO, MachOYAML::DWARFAbbrev &Abbrev) {
+ IO.mapRequired("Code", Abbrev.Code);
+ IO.mapRequired("Tag", Abbrev.Tag);
+ IO.mapRequired("Children", Abbrev.Children);
+ IO.mapRequired("Attributes", Abbrev.Attributes);
+}
+
+void MappingTraits<MachOYAML::DWARFAttributeAbbrev>::mapping(
+ IO &IO, MachOYAML::DWARFAttributeAbbrev &AttAbbrev) {
+ IO.mapRequired("Attribute", AttAbbrev.Attribute);
+ IO.mapRequired("Form", AttAbbrev.Form);
}
} // namespace llvm::yaml
Added: llvm/trunk/test/ObjectYAML/MachO/DWARF-debug_abbrev.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ObjectYAML/MachO/DWARF-debug_abbrev.yaml?rev=288955&view=auto
==============================================================================
--- llvm/trunk/test/ObjectYAML/MachO/DWARF-debug_abbrev.yaml (added)
+++ llvm/trunk/test/ObjectYAML/MachO/DWARF-debug_abbrev.yaml Wed Dec 7 12:52:59 2016
@@ -0,0 +1,433 @@
+# RUN: yaml2obj %s | obj2yaml | 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:
+ AbbrevDecls:
+ - Code: 0x00000001
+ Tag: DW_TAG_compile_unit
+ Children: DW_CHILDREN_yes
+ Attributes:
+ - Attribute: DW_AT_producer
+ Form: DW_FORM_strp
+ - Attribute: DW_AT_language
+ Form: DW_FORM_data2
+ - Attribute: DW_AT_name
+ Form: DW_FORM_strp
+ - Attribute: DW_AT_stmt_list
+ Form: DW_FORM_sec_offset
+ - Attribute: DW_AT_comp_dir
+ Form: DW_FORM_strp
+ - Attribute: DW_AT_low_pc
+ Form: DW_FORM_addr
+ - Attribute: DW_AT_high_pc
+ Form: DW_FORM_data4
+ - Code: 0x00000002
+ Tag: DW_TAG_subprogram
+ Children: DW_CHILDREN_yes
+ Attributes:
+ - Attribute: DW_AT_low_pc
+ Form: DW_FORM_addr
+ - Attribute: DW_AT_high_pc
+ Form: DW_FORM_data4
+ - Attribute: DW_AT_frame_base
+ Form: DW_FORM_exprloc
+ - Attribute: DW_AT_name
+ Form: DW_FORM_strp
+ - Attribute: DW_AT_decl_file
+ Form: DW_FORM_data1
+ - Attribute: DW_AT_decl_line
+ Form: DW_FORM_data1
+ - Attribute: DW_AT_prototyped
+ Form: DW_FORM_flag_present
+ - Attribute: DW_AT_type
+ Form: DW_FORM_ref4
+ - Attribute: DW_AT_external
+ Form: DW_FORM_flag_present
+ - Code: 0x00000003
+ Tag: DW_TAG_formal_parameter
+ Children: DW_CHILDREN_no
+ Attributes:
+ - Attribute: DW_AT_location
+ Form: DW_FORM_exprloc
+ - Attribute: DW_AT_name
+ Form: DW_FORM_strp
+ - Attribute: DW_AT_decl_file
+ Form: DW_FORM_data1
+ - Attribute: DW_AT_decl_line
+ Form: DW_FORM_data1
+ - Attribute: DW_AT_type
+ Form: DW_FORM_ref4
+ - Code: 0x00000004
+ Tag: DW_TAG_base_type
+ Children: DW_CHILDREN_no
+ Attributes:
+ - Attribute: DW_AT_name
+ Form: DW_FORM_strp
+ - Attribute: DW_AT_encoding
+ Form: DW_FORM_data1
+ - Attribute: DW_AT_byte_size
+ Form: DW_FORM_data1
+ - Code: 0x00000005
+ Tag: DW_TAG_pointer_type
+ Children: DW_CHILDREN_no
+ Attributes:
+ - Attribute: DW_AT_type
+ Form: DW_FORM_ref4
+...
+
+#CHECK: DWARF:
+#CHECK: AbbrevDecls:
+#CHECK: - Code: 0x00000001
+#CHECK: Tag: DW_TAG_compile_unit
+#CHECK: Children: DW_CHILDREN_yes
+#CHECK: Attributes:
+#CHECK: - Attribute: DW_AT_producer
+#CHECK: Form: DW_FORM_strp
+#CHECK: - Attribute: DW_AT_language
+#CHECK: Form: DW_FORM_data2
+#CHECK: - Attribute: DW_AT_name
+#CHECK: Form: DW_FORM_strp
+#CHECK: - Attribute: DW_AT_stmt_list
+#CHECK: Form: DW_FORM_sec_offset
+#CHECK: - Attribute: DW_AT_comp_dir
+#CHECK: Form: DW_FORM_strp
+#CHECK: - Attribute: DW_AT_low_pc
+#CHECK: Form: DW_FORM_addr
+#CHECK: - Attribute: DW_AT_high_pc
+#CHECK: Form: DW_FORM_data4
+#CHECK: - Code: 0x00000002
+#CHECK: Tag: DW_TAG_subprogram
+#CHECK: Children: DW_CHILDREN_yes
+#CHECK: Attributes:
+#CHECK: - Attribute: DW_AT_low_pc
+#CHECK: Form: DW_FORM_addr
+#CHECK: - Attribute: DW_AT_high_pc
+#CHECK: Form: DW_FORM_data4
+#CHECK: - Attribute: DW_AT_frame_base
+#CHECK: Form: DW_FORM_exprloc
+#CHECK: - Attribute: DW_AT_name
+#CHECK: Form: DW_FORM_strp
+#CHECK: - Attribute: DW_AT_decl_file
+#CHECK: Form: DW_FORM_data1
+#CHECK: - Attribute: DW_AT_decl_line
+#CHECK: Form: DW_FORM_data1
+#CHECK: - Attribute: DW_AT_prototyped
+#CHECK: Form: DW_FORM_flag_present
+#CHECK: - Attribute: DW_AT_type
+#CHECK: Form: DW_FORM_ref4
+#CHECK: - Attribute: DW_AT_external
+#CHECK: Form: DW_FORM_flag_present
+#CHECK: - Code: 0x00000003
+#CHECK: Tag: DW_TAG_formal_parameter
+#CHECK: Children: DW_CHILDREN_no
+#CHECK: Attributes:
+#CHECK: - Attribute: DW_AT_location
+#CHECK: Form: DW_FORM_exprloc
+#CHECK: - Attribute: DW_AT_name
+#CHECK: Form: DW_FORM_strp
+#CHECK: - Attribute: DW_AT_decl_file
+#CHECK: Form: DW_FORM_data1
+#CHECK: - Attribute: DW_AT_decl_line
+#CHECK: Form: DW_FORM_data1
+#CHECK: - Attribute: DW_AT_type
+#CHECK: Form: DW_FORM_ref4
+#CHECK: - Code: 0x00000004
+#CHECK: Tag: DW_TAG_base_type
+#CHECK: Children: DW_CHILDREN_no
+#CHECK: Attributes:
+#CHECK: - Attribute: DW_AT_name
+#CHECK: Form: DW_FORM_strp
+#CHECK: - Attribute: DW_AT_encoding
+#CHECK: Form: DW_FORM_data1
+#CHECK: - Attribute: DW_AT_byte_size
+#CHECK: Form: DW_FORM_data1
+#CHECK: - Code: 0x00000005
+#CHECK: Tag: DW_TAG_pointer_type
+#CHECK: Children: DW_CHILDREN_no
+#CHECK: Attributes:
+#CHECK: - Attribute: DW_AT_type
+#CHECK: Form: DW_FORM_ref4
Modified: llvm/trunk/tools/obj2yaml/macho2yaml.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/obj2yaml/macho2yaml.cpp?rev=288955&r1=288954&r2=288955&view=diff
==============================================================================
--- llvm/trunk/tools/obj2yaml/macho2yaml.cpp (original)
+++ llvm/trunk/tools/obj2yaml/macho2yaml.cpp Wed Dec 7 12:52:59 2016
@@ -36,7 +36,10 @@ class MachODumper {
void dumpExportTrie(std::unique_ptr<MachOYAML::Object> &Y);
void dumpSymbols(std::unique_ptr<MachOYAML::Object> &Y);
void dumpDWARF(std::unique_ptr<MachOYAML::Object> &Y);
- void dumpDebugStrings(DWARFContextInMemory &DCtx, std::unique_ptr<MachOYAML::Object> &Y);
+ void dumpDebugAbbrev(DWARFContextInMemory &DCtx,
+ std::unique_ptr<MachOYAML::Object> &Y);
+ void dumpDebugStrings(DWARFContextInMemory &DCtx,
+ std::unique_ptr<MachOYAML::Object> &Y);
public:
MachODumper(const object::MachOObjectFile &O) : Obj(O) {}
@@ -466,6 +469,7 @@ void MachODumper::dumpSymbols(std::uniqu
void MachODumper::dumpDWARF(std::unique_ptr<MachOYAML::Object> &Y) {
DWARFContextInMemory DICtx(Obj);
dumpDebugStrings(DICtx, Y);
+ dumpDebugAbbrev(DICtx, Y);
}
void MachODumper::dumpDebugStrings(DWARFContextInMemory &DICtx,
@@ -478,6 +482,29 @@ void MachODumper::dumpDebugStrings(DWARF
}
}
+void MachODumper::dumpDebugAbbrev(DWARFContextInMemory &DCtx,
+ std::unique_ptr<MachOYAML::Object> &Y) {
+ auto AbbrevSetPtr = DCtx.getDebugAbbrev();
+ if(AbbrevSetPtr) {
+ for(auto AbbrvDeclSet : *AbbrevSetPtr) {
+ for(auto AbbrvDecl : AbbrvDeclSet.second) {
+ MachOYAML::DWARFAbbrev Abbrv;
+ Abbrv.Code = AbbrvDecl.getCode();
+ Abbrv.Tag = AbbrvDecl.getTag();
+ Abbrv.Children = AbbrvDecl.hasChildren() ? dwarf::DW_CHILDREN_yes
+ : dwarf::DW_CHILDREN_no;
+ for(auto Attribute : AbbrvDecl.attributes()) {
+ MachOYAML::DWARFAttributeAbbrev AttAbrv;
+ AttAbrv.Attribute = Attribute.Attr;
+ AttAbrv.Form = Attribute.Form;
+ Abbrv.Attributes.push_back(AttAbrv);
+ }
+ Y->DWARF.AbbrevDecls.push_back(Abbrv);
+ }
+ }
+ }
+}
+
Error macho2yaml(raw_ostream &Out, const object::MachOObjectFile &Obj) {
MachODumper Dumper(Obj);
Expected<std::unique_ptr<MachOYAML::Object>> YAML = Dumper.dump();
Modified: llvm/trunk/tools/yaml2obj/yaml2macho.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2macho.cpp?rev=288955&r1=288954&r2=288955&view=diff
==============================================================================
--- llvm/trunk/tools/yaml2obj/yaml2macho.cpp (original)
+++ llvm/trunk/tools/yaml2obj/yaml2macho.cpp Wed Dec 7 12:52:59 2016
@@ -393,6 +393,18 @@ Error MachOWriter::writeDWARFData(raw_os
OS.write(Str.data(), Str.size());
OS.write('\0');
}
+ } else if (0 == strncmp(&Section.sectname[0], "__debug_abbrev", 16)) {
+ for (auto AbbrevDecl : Obj.DWARF.AbbrevDecls) {
+ encodeULEB128(AbbrevDecl.Code, OS);
+ encodeULEB128(AbbrevDecl.Tag, OS);
+ OS.write(AbbrevDecl.Children);
+ for (auto Attr : AbbrevDecl.Attributes) {
+ encodeULEB128(Attr.Attribute, OS);
+ encodeULEB128(Attr.Form, OS);
+ }
+ encodeULEB128(0, OS);
+ encodeULEB128(0, OS);
+ }
}
}
return Error::success();
More information about the llvm-commits
mailing list