[llvm] c19c329 - [ObjectYAML][MachO] Add support for relocations
Alexander Shaposhnikov via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 22 11:51:30 PDT 2020
Author: Alexander Shaposhnikov
Date: 2020-04-22T11:50:55-07:00
New Revision: c19c3293d3b14b2366d7bd36737b9a1517031f6e
URL: https://github.com/llvm/llvm-project/commit/c19c3293d3b14b2366d7bd36737b9a1517031f6e
DIFF: https://github.com/llvm/llvm-project/commit/c19c3293d3b14b2366d7bd36737b9a1517031f6e.diff
LOG: [ObjectYAML][MachO] Add support for relocations
Add support for relocations for MachO to ObjectYAML / yaml2obj / obj2yaml.
Test plan: make check-all
Differential revision: https://reviews.llvm.org/D77844
Added:
llvm/test/ObjectYAML/MachO/relocations_arm64.yaml
llvm/test/ObjectYAML/MachO/relocations_armv7.yaml
llvm/test/ObjectYAML/MachO/relocations_empty.yaml
llvm/test/ObjectYAML/MachO/relocations_ppc_big_endian.yaml
llvm/test/ObjectYAML/MachO/relocations_x86_64.yaml
Modified:
llvm/include/llvm/ObjectYAML/MachOYAML.h
llvm/lib/ObjectYAML/MachOEmitter.cpp
llvm/lib/ObjectYAML/MachOYAML.cpp
llvm/test/ObjectYAML/MachO/virtual_section.yaml
llvm/tools/obj2yaml/macho2yaml.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/ObjectYAML/MachOYAML.h b/llvm/include/llvm/ObjectYAML/MachOYAML.h
index 327c3b9f892b..fb6780b6d0ed 100644
--- a/llvm/include/llvm/ObjectYAML/MachOYAML.h
+++ b/llvm/include/llvm/ObjectYAML/MachOYAML.h
@@ -27,6 +27,20 @@
namespace llvm {
namespace MachOYAML {
+struct Relocation {
+ // Offset in the section to what is being relocated.
+ llvm::yaml::Hex32 address;
+ // Symbol index if r_extern == 1 else section index.
+ uint32_t symbolnum;
+ bool is_pcrel;
+ // Real length = 2 ^ length.
+ uint8_t length;
+ bool is_extern;
+ uint8_t type;
+ bool is_scattered;
+ int32_t value;
+};
+
struct Section {
char sectname[16];
char segname[16];
@@ -41,6 +55,7 @@ struct Section {
llvm::yaml::Hex32 reserved2;
llvm::yaml::Hex32 reserved3;
Optional<llvm::yaml::BinaryRef> content;
+ std::vector<Relocation> relocations;
};
struct FileHeader {
@@ -143,6 +158,7 @@ struct UniversalBinary {
} // end namespace llvm
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::LoadCommand)
+LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::Relocation)
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::Section)
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::RebaseOpcode)
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::BindOpcode)
@@ -198,6 +214,10 @@ template <> struct MappingTraits<MachOYAML::ExportEntry> {
static void mapping(IO &IO, MachOYAML::ExportEntry &ExportEntry);
};
+template <> struct MappingTraits<MachOYAML::Relocation> {
+ static void mapping(IO &IO, MachOYAML::Relocation &R);
+};
+
template <> struct MappingTraits<MachOYAML::Section> {
static void mapping(IO &IO, MachOYAML::Section &Section);
static StringRef validate(IO &io, MachOYAML::Section &Section);
diff --git a/llvm/lib/ObjectYAML/MachOEmitter.cpp b/llvm/lib/ObjectYAML/MachOEmitter.cpp
index bda4aed885b4..3cf6dc067e70 100644
--- a/llvm/lib/ObjectYAML/MachOEmitter.cpp
+++ b/llvm/lib/ObjectYAML/MachOEmitter.cpp
@@ -39,6 +39,7 @@ class MachOWriter {
void writeHeader(raw_ostream &OS);
void writeLoadCommands(raw_ostream &OS);
void writeSectionData(raw_ostream &OS);
+ void writeRelocations(raw_ostream &OS);
void writeLinkEditData(raw_ostream &OS);
void writeBindOpcodes(raw_ostream &OS,
@@ -58,8 +59,11 @@ class MachOWriter {
MachOYAML::Object &Obj;
bool is64Bit;
uint64_t fileStart;
-
MachO::mach_header_64 Header;
+
+ // Old PPC Object Files didn't have __LINKEDIT segments, the data was just
+ // stuck at the end of the file.
+ bool FoundLinkEditSeg = false;
};
void MachOWriter::writeMachO(raw_ostream &OS) {
@@ -67,6 +71,9 @@ void MachOWriter::writeMachO(raw_ostream &OS) {
writeHeader(OS);
writeLoadCommands(OS);
writeSectionData(OS);
+ writeRelocations(OS);
+ if (!FoundLinkEditSeg)
+ writeLinkEditData(OS);
}
void MachOWriter::writeHeader(raw_ostream &OS) {
@@ -255,7 +262,6 @@ void MachOWriter::writeLoadCommands(raw_ostream &OS) {
}
void MachOWriter::writeSectionData(raw_ostream &OS) {
- bool FoundLinkEditSeg = false;
for (auto &LC : Obj.LoadCommands) {
switch (LC.Data.load_command_data.cmd) {
case MachO::LC_SEGMENT:
@@ -315,10 +321,60 @@ void MachOWriter::writeSectionData(raw_ostream &OS) {
break;
}
}
- // Old PPC Object Files didn't have __LINKEDIT segments, the data was just
- // stuck at the end of the file.
- if (!FoundLinkEditSeg)
- writeLinkEditData(OS);
+}
+
+// The implementation of makeRelocationInfo and makeScatteredRelocationInfo is
+// consistent with how libObject parses MachO binary files. For the reference
+// see getStruct, getRelocation, getPlainRelocationPCRel,
+// getPlainRelocationLength and related methods in MachOObjectFile.cpp
+static MachO::any_relocation_info
+makeRelocationInfo(const MachOYAML::Relocation &R, bool IsLE) {
+ assert(!R.is_scattered && "non-scattered relocation expected");
+ MachO::any_relocation_info MRE;
+ MRE.r_word0 = R.address;
+ if (IsLE)
+ MRE.r_word1 = ((unsigned)R.symbolnum << 0) | ((unsigned)R.is_pcrel << 24) |
+ ((unsigned)R.length << 25) | ((unsigned)R.is_extern << 27) |
+ ((unsigned)R.type << 28);
+ else
+ MRE.r_word1 = ((unsigned)R.symbolnum << 8) | ((unsigned)R.is_pcrel << 7) |
+ ((unsigned)R.length << 5) | ((unsigned)R.is_extern << 4) |
+ ((unsigned)R.type << 0);
+ return MRE;
+}
+
+static MachO::any_relocation_info
+makeScatteredRelocationInfo(const MachOYAML::Relocation &R) {
+ assert(R.is_scattered && "scattered relocation expected");
+ MachO::any_relocation_info MRE;
+ MRE.r_word0 = (((unsigned)R.address << 0) | ((unsigned)R.type << 24) |
+ ((unsigned)R.length << 28) | ((unsigned)R.is_pcrel << 30) |
+ MachO::R_SCATTERED);
+ MRE.r_word1 = R.value;
+ return MRE;
+}
+
+void MachOWriter::writeRelocations(raw_ostream &OS) {
+ for (const MachOYAML::LoadCommand &LC : Obj.LoadCommands) {
+ switch (LC.Data.load_command_data.cmd) {
+ case MachO::LC_SEGMENT:
+ case MachO::LC_SEGMENT_64:
+ for (const MachOYAML::Section &Sec : LC.Sections) {
+ if (Sec.relocations.empty())
+ continue;
+ ZeroToOffset(OS, Sec.reloff);
+ for (const MachOYAML::Relocation &R : Sec.relocations) {
+ MachO::any_relocation_info MRE =
+ R.is_scattered ? makeScatteredRelocationInfo(R)
+ : makeRelocationInfo(R, Obj.IsLittleEndian);
+ if (Obj.IsLittleEndian != sys::IsLittleEndianHost)
+ MachO::swapStruct(MRE);
+ OS.write(reinterpret_cast<const char *>(&MRE),
+ sizeof(MachO::any_relocation_info));
+ }
+ }
+ }
+ }
}
void MachOWriter::writeBindOpcodes(
diff --git a/llvm/lib/ObjectYAML/MachOYAML.cpp b/llvm/lib/ObjectYAML/MachOYAML.cpp
index 0f7cd1e1495c..a5341383e8a8 100644
--- a/llvm/lib/ObjectYAML/MachOYAML.cpp
+++ b/llvm/lib/ObjectYAML/MachOYAML.cpp
@@ -273,6 +273,18 @@ void MappingTraits<MachO::dyld_info_command>::mapping(
IO.mapRequired("export_size", LoadCommand.export_size);
}
+void MappingTraits<MachOYAML::Relocation>::mapping(
+ IO &IO, MachOYAML::Relocation &Relocation) {
+ IO.mapRequired("address", Relocation.address);
+ IO.mapRequired("symbolnum", Relocation.symbolnum);
+ IO.mapRequired("pcrel", Relocation.is_pcrel);
+ IO.mapRequired("length", Relocation.length);
+ IO.mapRequired("extern", Relocation.is_extern);
+ IO.mapRequired("type", Relocation.type);
+ IO.mapRequired("scattered", Relocation.is_scattered);
+ IO.mapRequired("value", Relocation.value);
+}
+
void MappingTraits<MachOYAML::Section>::mapping(IO &IO,
MachOYAML::Section &Section) {
IO.mapRequired("sectname", Section.sectname);
@@ -288,6 +300,7 @@ void MappingTraits<MachOYAML::Section>::mapping(IO &IO,
IO.mapRequired("reserved2", Section.reserved2);
IO.mapOptional("reserved3", Section.reserved3);
IO.mapOptional("content", Section.content);
+ IO.mapOptional("relocations", Section.relocations);
}
StringRef
diff --git a/llvm/test/ObjectYAML/MachO/relocations_arm64.yaml b/llvm/test/ObjectYAML/MachO/relocations_arm64.yaml
new file mode 100644
index 000000000000..208b26fa3246
--- /dev/null
+++ b/llvm/test/ObjectYAML/MachO/relocations_arm64.yaml
@@ -0,0 +1,590 @@
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-objdump --macho --reloc %t | FileCheck %s --check-prefix=OBJDUMP-VERIFY
+
+# OBJDUMP-VERIFY: Relocation information (__TEXT,__text) 4 entries
+# OBJDUMP-VERIFY-NEXT: address pcrel length extern type scattered symbolnum/value
+# OBJDUMP-VERIFY-NEXT: 00000018 False long True PAGOF12 False _w
+# OBJDUMP-VERIFY-NEXT: 00000014 True long True PAGE21 False _w
+# OBJDUMP-VERIFY-NEXT: 0000000c False long True PAGOF12 False _z
+# OBJDUMP-VERIFY-NEXT: 00000008 True long True PAGE21 False _z
+# OBJDUMP-VERIFY-NEXT: Relocation information (__TEXT,__StaticInit) 7 entries
+# OBJDUMP-VERIFY-NEXT: address pcrel length extern type scattered symbolnum/value
+# OBJDUMP-VERIFY-NEXT: 0000002c True long True BR26 False ___cxx_global_var_init
+# OBJDUMP-VERIFY-NEXT: 00000018 False long True PAGOF12 False _w
+# OBJDUMP-VERIFY-NEXT: 00000014 True long True PAGE21 False _w
+# OBJDUMP-VERIFY-NEXT: 0000000c False long True PAGOF12 False _y
+# OBJDUMP-VERIFY-NEXT: 00000008 True long True PAGE21 False _y
+# OBJDUMP-VERIFY-NEXT: 00000004 False long True PAGOF12 False _x
+# OBJDUMP-VERIFY-NEXT: 00000000 True long True PAGE21 False _x
+# OBJDUMP-VERIFY-NEXT: Relocation information (__DATA,__data) 1 entries
+# OBJDUMP-VERIFY-NEXT: address pcrel length extern type scattered symbolnum/value
+# OBJDUMP-VERIFY-NEXT: 00000008 False ?( 3) True UNSIGND False _x
+# OBJDUMP-VERIFY-NEXT: Relocation information (__DATA,__mod_init_func) 1 entries
+# OBJDUMP-VERIFY-NEXT: address pcrel length extern type scattered symbolnum/value
+# OBJDUMP-VERIFY-NEXT: 00000000 False ?( 3) True UNSIGND False __GLOBAL__sub_I_main.cpp
+# OBJDUMP-VERIFY-NEXT: Relocation information (__LD,__compact_unwind) 3 entries
+# OBJDUMP-VERIFY-NEXT: address pcrel length extern type scattered symbolnum/value
+# OBJDUMP-VERIFY-NEXT: 00000040 False ?( 3) False UNSIGND False 2 (__TEXT,__StaticInit)
+# OBJDUMP-VERIFY-NEXT: 00000020 False ?( 3) False UNSIGND False 1 (__TEXT,__text)
+# OBJDUMP-VERIFY-NEXT: 00000000 False ?( 3) False UNSIGND False 2 (__TEXT,__StaticInit)
+
+# RUN: obj2yaml %t | FileCheck %s
+# CHECK: Sections:
+# CHECK-NEXT: - sectname: __text
+# CHECK-NEXT: segname: __TEXT
+# CHECK-NEXT: addr: 0x0000000000000000
+# CHECK-NEXT: size: 48
+# CHECK-NEXT: offset: 0x000002C0
+# CHECK-NEXT: align: 2
+# CHECK-NEXT: reloff: 0x000003A0
+# CHECK-NEXT: nreloc: 4
+# CHECK-NEXT: flags: 0x80000400
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000000
+# CHECK-NEXT: reserved3: 0x00000000
+# CHECK-NEXT: content:
+# CHECK-NEXT: relocations:
+# CHECK-NEXT: - address: 0x00000018
+# CHECK-NEXT: symbolnum: 9
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: true
+# CHECK-NEXT: type: 4
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - address: 0x00000014
+# CHECK-NEXT: symbolnum: 9
+# CHECK-NEXT: pcrel: true
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: true
+# CHECK-NEXT: type: 3
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - address: 0x0000000C
+# CHECK-NEXT: symbolnum: 12
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: true
+# CHECK-NEXT: type: 4
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - address: 0x00000008
+# CHECK-NEXT: symbolnum: 12
+# CHECK-NEXT: pcrel: true
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: true
+# CHECK-NEXT: type: 3
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - sectname: __StaticInit
+# CHECK-NEXT: segname: __TEXT
+# CHECK-NEXT: addr: 0x0000000000000030
+# CHECK-NEXT: size: 56
+# CHECK-NEXT: offset: 0x000002F0
+# CHECK-NEXT: align: 2
+# CHECK-NEXT: reloff: 0x000003C0
+# CHECK-NEXT: nreloc: 7
+# CHECK-NEXT: flags: 0x80000400
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000000
+# CHECK-NEXT: reserved3: 0x00000000
+# CHECK-NEXT: content:
+# CHECK-NEXT: relocations:
+# CHECK-NEXT: - address: 0x0000002C
+# CHECK-NEXT: symbolnum: 2
+# CHECK-NEXT: pcrel: true
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: true
+# CHECK-NEXT: type: 2
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - address: 0x00000018
+# CHECK-NEXT: symbolnum: 9
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: true
+# CHECK-NEXT: type: 4
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - address: 0x00000014
+# CHECK-NEXT: symbolnum: 9
+# CHECK-NEXT: pcrel: true
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: true
+# CHECK-NEXT: type: 3
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - address: 0x0000000C
+# CHECK-NEXT: symbolnum: 11
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: true
+# CHECK-NEXT: type: 4
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - address: 0x00000008
+# CHECK-NEXT: symbolnum: 11
+# CHECK-NEXT: pcrel: true
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: true
+# CHECK-NEXT: type: 3
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - address: 0x00000004
+# CHECK-NEXT: symbolnum: 10
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: true
+# CHECK-NEXT: type: 4
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - address: 0x00000000
+# CHECK-NEXT: symbolnum: 10
+# CHECK-NEXT: pcrel: true
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: true
+# CHECK-NEXT: type: 3
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - sectname: __data
+# CHECK-NEXT: segname: __DATA
+# CHECK-NEXT: addr: 0x0000000000000068
+# CHECK-NEXT: size: 16
+# CHECK-NEXT: offset: 0x00000328
+# CHECK-NEXT: align: 3
+# CHECK-NEXT: reloff: 0x000003F8
+# CHECK-NEXT: nreloc: 1
+# CHECK-NEXT: flags: 0x00000000
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000000
+# CHECK-NEXT: reserved3: 0x00000000
+# CHECK-NEXT: content:
+# CHECK-NEXT: relocations:
+# CHECK-NEXT: - address: 0x00000008
+# CHECK-NEXT: symbolnum: 10
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 3
+# CHECK-NEXT: extern: true
+# CHECK-NEXT: type: 0
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - sectname: __common
+# CHECK-NEXT: segname: __DATA
+# CHECK-NEXT: addr: 0x00000000000000E0
+# CHECK-NEXT: size: 8
+# CHECK-NEXT: offset: 0x00000000
+# CHECK-NEXT: align: 3
+# CHECK-NEXT: reloff: 0x00000000
+# CHECK-NEXT: nreloc: 0
+# CHECK-NEXT: flags: 0x00000001
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000000
+# CHECK-NEXT: reserved3: 0x00000000
+# CHECK-NEXT: - sectname: __mod_init_func
+# CHECK-NEXT: segname: __DATA
+# CHECK-NEXT: addr: 0x0000000000000078
+# CHECK-NEXT: size: 8
+# CHECK-NEXT: offset: 0x00000338
+# CHECK-NEXT: align: 3
+# CHECK-NEXT: reloff: 0x00000400
+# CHECK-NEXT: nreloc: 1
+# CHECK-NEXT: flags: 0x00000009
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000000
+# CHECK-NEXT: reserved3: 0x00000000
+# CHECK-NEXT: content:
+# CHECK-NEXT: relocations:
+# CHECK-NEXT: - address: 0x00000000
+# CHECK-NEXT: symbolnum: 3
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 3
+# CHECK-NEXT: extern: true
+# CHECK-NEXT: type: 0
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - sectname: __compact_unwind
+# CHECK-NEXT: segname: __LD
+# CHECK-NEXT: addr: 0x0000000000000080
+# CHECK-NEXT: size: 96
+# CHECK-NEXT: offset: 0x00000340
+# CHECK-NEXT: align: 3
+# CHECK-NEXT: reloff: 0x00000408
+# CHECK-NEXT: nreloc: 3
+# CHECK-NEXT: flags: 0x02000000
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000000
+# CHECK-NEXT: reserved3: 0x00000000
+# CHECK-NEXT: content:
+# CHECK-NEXT: relocations:
+# CHECK-NEXT: - address: 0x00000040
+# CHECK-NEXT: symbolnum: 2
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 3
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 0
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - address: 0x00000020
+# CHECK-NEXT: symbolnum: 1
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 3
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 0
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - address: 0x00000000
+# CHECK-NEXT: symbolnum: 2
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 3
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 0
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+
+--- !mach-o
+FileHeader:
+ magic: 0xFEEDFACF
+ cputype: 0x0100000C
+ cpusubtype: 0x00000000
+ filetype: 0x00000001
+ ncmds: 4
+ sizeofcmds: 672
+ flags: 0x00002000
+ reserved: 0x00000000
+LoadCommands:
+ - cmd: LC_SEGMENT_64
+ cmdsize: 552
+ segname: ''
+ vmaddr: 0
+ vmsize: 232
+ fileoff: 704
+ filesize: 224
+ maxprot: 7
+ initprot: 7
+ nsects: 6
+ flags: 0
+ Sections:
+ - sectname: __text
+ segname: __TEXT
+ addr: 0x0000000000000000
+ size: 48
+ offset: 0x000002C0
+ align: 2
+ reloff: 0x000003A0
+ nreloc: 4
+ flags: 0x80000400
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ content: FF4300D1FF0F00B90800009008010091080140F90900009029010091290140F90801098BE00308AAFF430091C0035FD6
+ relocations:
+ - address: 0x00000018
+ symbolnum: 9
+ pcrel: false
+ length: 2
+ extern: true
+ type: 4
+ scattered: false
+ value: 0
+ - address: 0x00000014
+ symbolnum: 9
+ pcrel: true
+ length: 2
+ extern: true
+ type: 3
+ scattered: false
+ value: 0
+ - address: 0x0000000C
+ symbolnum: 12
+ pcrel: false
+ length: 2
+ extern: true
+ type: 4
+ scattered: false
+ value: 0
+ - address: 0x00000008
+ symbolnum: 12
+ pcrel: true
+ length: 2
+ extern: true
+ type: 3
+ scattered: false
+ value: 0
+ - sectname: __StaticInit
+ segname: __TEXT
+ addr: 0x0000000000000030
+ size: 56
+ offset: 0x000002F0
+ align: 2
+ reloff: 0x000003C0
+ nreloc: 7
+ flags: 0x80000400
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ content: 08000090080100910900009029010091080109EB0900009029010091280100F9C0035FD6FD7BBFA9FD03009100000094FD7BC1A8C0035FD6
+ relocations:
+ - address: 0x0000002C
+ symbolnum: 2
+ pcrel: true
+ length: 2
+ extern: true
+ type: 2
+ scattered: false
+ value: 0
+ - address: 0x00000018
+ symbolnum: 9
+ pcrel: false
+ length: 2
+ extern: true
+ type: 4
+ scattered: false
+ value: 0
+ - address: 0x00000014
+ symbolnum: 9
+ pcrel: true
+ length: 2
+ extern: true
+ type: 3
+ scattered: false
+ value: 0
+ - address: 0x0000000C
+ symbolnum: 11
+ pcrel: false
+ length: 2
+ extern: true
+ type: 4
+ scattered: false
+ value: 0
+ - address: 0x00000008
+ symbolnum: 11
+ pcrel: true
+ length: 2
+ extern: true
+ type: 3
+ scattered: false
+ value: 0
+ - address: 0x00000004
+ symbolnum: 10
+ pcrel: false
+ length: 2
+ extern: true
+ type: 4
+ scattered: false
+ value: 0
+ - address: 0x00000000
+ symbolnum: 10
+ pcrel: true
+ length: 2
+ extern: true
+ type: 3
+ scattered: false
+ value: 0
+ - sectname: __data
+ segname: __DATA
+ addr: 0x0000000000000068
+ size: 16
+ offset: 0x00000328
+ align: 3
+ reloff: 0x000003F8
+ nreloc: 1
+ flags: 0x00000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ content: '01000000020000000000000000000000'
+ relocations:
+ - address: 0x00000008
+ symbolnum: 10
+ pcrel: false
+ length: 3
+ extern: true
+ type: 0
+ scattered: false
+ value: 0
+ - sectname: __common
+ segname: __DATA
+ addr: 0x00000000000000E0
+ size: 8
+ offset: 0x00000000
+ align: 3
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000001
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __mod_init_func
+ segname: __DATA
+ addr: 0x0000000000000078
+ size: 8
+ offset: 0x00000338
+ align: 3
+ reloff: 0x00000400
+ nreloc: 1
+ flags: 0x00000009
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ content: '0000000000000000'
+ relocations:
+ - address: 0x00000000
+ symbolnum: 3
+ pcrel: false
+ length: 3
+ extern: true
+ type: 0
+ scattered: false
+ value: 0
+ - sectname: __compact_unwind
+ segname: __LD
+ addr: 0x0000000000000080
+ size: 96
+ offset: 0x00000340
+ align: 3
+ reloff: 0x00000408
+ nreloc: 3
+ flags: 0x02000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ content: '300000000000000024000000000000020000000000000000000000000000000000000000000000003000000000100002000000000000000000000000000000005400000000000000140000000000000400000000000000000000000000000000'
+ relocations:
+ - address: 0x00000040
+ symbolnum: 2
+ pcrel: false
+ length: 3
+ extern: false
+ type: 0
+ scattered: false
+ value: 0
+ - address: 0x00000020
+ symbolnum: 1
+ pcrel: false
+ length: 3
+ extern: false
+ type: 0
+ scattered: false
+ value: 0
+ - address: 0x00000000
+ symbolnum: 2
+ pcrel: false
+ length: 3
+ extern: false
+ type: 0
+ scattered: false
+ value: 0
+ - cmd: LC_VERSION_MIN_IPHONEOS
+ cmdsize: 16
+ version: 655360
+ sdk: 0
+ - cmd: LC_SYMTAB
+ cmdsize: 24
+ symoff: 1056
+ nsyms: 13
+ stroff: 1264
+ strsize: 104
+ - cmd: LC_DYSYMTAB
+ cmdsize: 80
+ ilocalsym: 0
+ nlocalsym: 8
+ iextdefsym: 8
+ nextdefsym: 5
+ iundefsym: 13
+ nundefsym: 0
+ tocoff: 0
+ ntoc: 0
+ modtaboff: 0
+ nmodtab: 0
+ extrefsymoff: 0
+ nextrefsyms: 0
+ indirectsymoff: 0
+ nindirectsyms: 0
+ extreloff: 0
+ nextrel: 0
+ locreloff: 0
+ nlocrel: 0
+LinkEditData:
+ NameList:
+ - n_strx: 97
+ n_type: 0x0E
+ n_sect: 1
+ n_desc: 0
+ n_value: 0
+ - n_strx: 91
+ n_type: 0x0E
+ n_sect: 2
+ n_desc: 0
+ n_value: 48
+ - n_strx: 13
+ n_type: 0x0E
+ n_sect: 2
+ n_desc: 0
+ n_value: 48
+ - n_strx: 36
+ n_type: 0x0E
+ n_sect: 2
+ n_desc: 0
+ n_value: 84
+ - n_strx: 85
+ n_type: 0x0E
+ n_sect: 3
+ n_desc: 0
+ n_value: 104
+ - n_strx: 79
+ n_type: 0x0E
+ n_sect: 4
+ n_desc: 0
+ n_value: 224
+ - n_strx: 73
+ n_type: 0x0E
+ n_sect: 5
+ n_desc: 0
+ n_value: 120
+ - n_strx: 67
+ n_type: 0x0E
+ n_sect: 6
+ n_desc: 0
+ n_value: 128
+ - n_strx: 61
+ n_type: 0x0F
+ n_sect: 1
+ n_desc: 0
+ n_value: 0
+ - n_strx: 10
+ n_type: 0x0F
+ n_sect: 4
+ n_desc: 0
+ n_value: 224
+ - n_strx: 7
+ n_type: 0x0F
+ n_sect: 3
+ n_desc: 0
+ n_value: 104
+ - n_strx: 4
+ n_type: 0x0F
+ n_sect: 3
+ n_desc: 0
+ n_value: 108
+ - n_strx: 1
+ n_type: 0x0F
+ n_sect: 3
+ n_desc: 0
+ n_value: 112
+ StringTable:
+ - ''
+ - _z
+ - _y
+ - _x
+ - _w
+ - ___cxx_global_var_init
+ - __GLOBAL__sub_I_main.cpp
+ - _main
+ - ltmp5
+ - ltmp4
+ - ltmp3
+ - ltmp2
+ - ltmp1
+ - ltmp0
+ - ''
+...
diff --git a/llvm/test/ObjectYAML/MachO/relocations_armv7.yaml b/llvm/test/ObjectYAML/MachO/relocations_armv7.yaml
new file mode 100644
index 000000000000..f1c2842e7cd5
--- /dev/null
+++ b/llvm/test/ObjectYAML/MachO/relocations_armv7.yaml
@@ -0,0 +1,642 @@
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-objdump --macho --reloc %t | FileCheck %s --check-prefix=OBJDUMP-VERIFY
+
+# OBJDUMP-VERIFY: Relocation information (__TEXT,__text) 8 entries
+# OBJDUMP-VERIFY-NEXT: address pcrel length extern type scattered symbolnum/value
+# OBJDUMP-VERIFY-NEXT: 00000016 False hi/thm n/a HALFDIF True 0x00000064
+# OBJDUMP-VERIFY-NEXT: False hi/thm n/a PAIR True 0x0000001a half = 0x0046
+# OBJDUMP-VERIFY-NEXT: 00000012 False lo/arm n/a HALFDIF True 0x00000064
+# OBJDUMP-VERIFY-NEXT: False lo/arm n/a PAIR True 0x0000001a half = 0x0000
+# OBJDUMP-VERIFY-NEXT: 0000000a False hi/thm n/a HALFDIF True 0x0000005c
+# OBJDUMP-VERIFY-NEXT: False hi/thm n/a PAIR True 0x0000000e half = 0x004a
+# OBJDUMP-VERIFY-NEXT: 00000006 False lo/arm n/a HALFDIF True 0x0000005c
+# OBJDUMP-VERIFY-NEXT: False lo/arm n/a PAIR True 0x0000000e half = 0x0000
+# OBJDUMP-VERIFY-NEXT: Relocation information (__TEXT,__StaticInit) 13 entries
+# OBJDUMP-VERIFY-NEXT: address pcrel length extern type scattered symbolnum/value
+# OBJDUMP-VERIFY-NEXT: 00000028 True long False T_BR22 False 2 (__TEXT,__StaticInit)
+# OBJDUMP-VERIFY-NEXT: 0000001a False hi/thm n/a HALFDIF True 0x00000064
+# OBJDUMP-VERIFY-NEXT: False hi/thm n/a PAIR True 0x00000042 half = 0x001e
+# OBJDUMP-VERIFY-NEXT: 00000016 False lo/arm n/a HALFDIF True 0x00000064
+# OBJDUMP-VERIFY-NEXT: False lo/arm n/a PAIR True 0x00000042 half = 0x0000
+# OBJDUMP-VERIFY-NEXT: 0000000e False hi/thm n/a HALFDIF True 0x00000054
+# OBJDUMP-VERIFY-NEXT: False hi/thm n/a PAIR True 0x00000036 half = 0x001a
+# OBJDUMP-VERIFY-NEXT: 0000000a False lo/arm n/a HALFDIF True 0x00000054
+# OBJDUMP-VERIFY-NEXT: False lo/arm n/a PAIR True 0x00000036 half = 0x0000
+# OBJDUMP-VERIFY-NEXT: 00000004 False hi/thm n/a HALFDIF True 0x00000058
+# OBJDUMP-VERIFY-NEXT: False hi/thm n/a PAIR True 0x0000002c half = 0x0028
+# OBJDUMP-VERIFY-NEXT: 00000000 False lo/arm n/a HALFDIF True 0x00000058
+# OBJDUMP-VERIFY-NEXT: False lo/arm n/a PAIR True 0x0000002c half = 0x0000
+# OBJDUMP-VERIFY-NEXT: Relocation information (__DATA,__data) 1 entries
+# OBJDUMP-VERIFY-NEXT: address pcrel length extern type scattered symbolnum/value
+# OBJDUMP-VERIFY-NEXT: 00000008 False long False VANILLA False 3 (__DATA,__data)
+# OBJDUMP-VERIFY-NEXT: Relocation information (__DATA,__mod_init_func) 1 entries
+# OBJDUMP-VERIFY-NEXT: address pcrel length extern type scattered symbolnum/value
+# OBJDUMP-VERIFY-NEXT: 00000000 False long False VANILLA False 2 (__TEXT,__StaticInit)
+
+# RUN: obj2yaml %t | FileCheck %s
+# CHECK: Sections:
+# CHECK-NEXT: - sectname: __text
+# CHECK-NEXT: segname: __TEXT
+# CHECK-NEXT: addr: 0x0000000000000000
+# CHECK-NEXT: size: 36
+# CHECK-NEXT: offset: 0x00000220
+# CHECK-NEXT: align: 1
+# CHECK-NEXT: reloff: 0x00000284
+# CHECK-NEXT: nreloc: 8
+# CHECK-NEXT: flags: 0x80000400
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000000
+# CHECK-NEXT: reserved3: 0x00000000
+# CHECK-NEXT: content:
+# CHECK-NEXT: relocations:
+# CHECK-NEXT: - address: 0x00000016
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 3
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 9
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 100
+# CHECK-NEXT: - address: 0x00000046
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 3
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 1
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 26
+# CHECK-NEXT: - address: 0x00000012
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 9
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 100
+# CHECK-NEXT: - address: 0x00000000
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 1
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 26
+# CHECK-NEXT: - address: 0x0000000A
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 3
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 9
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 92
+# CHECK-NEXT: - address: 0x0000004A
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 3
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 1
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 14
+# CHECK-NEXT: - address: 0x00000006
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 9
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 92
+# CHECK-NEXT: - address: 0x00000000
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 1
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 14
+# CHECK-NEXT: - sectname: __StaticInit
+# CHECK-NEXT: segname: __TEXT
+# CHECK-NEXT: addr: 0x0000000000000024
+# CHECK-NEXT: size: 46
+# CHECK-NEXT: offset: 0x00000244
+# CHECK-NEXT: align: 1
+# CHECK-NEXT: reloff: 0x000002C4
+# CHECK-NEXT: nreloc: 13
+# CHECK-NEXT: flags: 0x80000400
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000000
+# CHECK-NEXT: reserved3: 0x00000000
+# CHECK-NEXT: content:
+# CHECK-NEXT: relocations:
+# CHECK-NEXT: - address: 0x00000028
+# CHECK-NEXT: symbolnum: 2
+# CHECK-NEXT: pcrel: true
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 6
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - address: 0x0000001A
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 3
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 9
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 100
+# CHECK-NEXT: - address: 0x0000001E
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 3
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 1
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 66
+# CHECK-NEXT: - address: 0x00000016
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 9
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 100
+# CHECK-NEXT: - address: 0x00000000
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 1
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 66
+# CHECK-NEXT: - address: 0x0000000E
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 3
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 9
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 84
+# CHECK-NEXT: - address: 0x0000001A
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 3
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 1
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 54
+# CHECK-NEXT: - address: 0x0000000A
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 9
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 84
+# CHECK-NEXT: - address: 0x00000000
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 1
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 54
+# CHECK-NEXT: - address: 0x00000004
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 3
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 9
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 88
+# CHECK-NEXT: - address: 0x00000028
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 3
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 1
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 44
+# CHECK-NEXT: - address: 0x00000000
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 9
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 88
+# CHECK-NEXT: - address: 0x00000000
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 1
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 44
+# CHECK-NEXT: - sectname: __data
+# CHECK-NEXT: segname: __DATA
+# CHECK-NEXT: addr: 0x0000000000000054
+# CHECK-NEXT: size: 12
+# CHECK-NEXT: offset: 0x00000274
+# CHECK-NEXT: align: 2
+# CHECK-NEXT: reloff: 0x0000032C
+# CHECK-NEXT: nreloc: 1
+# CHECK-NEXT: flags: 0x00000000
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000000
+# CHECK-NEXT: reserved3: 0x00000000
+# CHECK-NEXT: content:
+# CHECK-NEXT: relocations:
+# CHECK-NEXT: - address: 0x00000008
+# CHECK-NEXT: symbolnum: 3
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 0
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - sectname: __common
+# CHECK-NEXT: segname: __DATA
+# CHECK-NEXT: addr: 0x0000000000000064
+# CHECK-NEXT: size: 4
+# CHECK-NEXT: offset: 0x00000000
+# CHECK-NEXT: align: 2
+# CHECK-NEXT: reloff: 0x00000000
+# CHECK-NEXT: nreloc: 0
+# CHECK-NEXT: flags: 0x00000001
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000000
+# CHECK-NEXT: reserved3: 0x00000000
+# CHECK-NEXT: - sectname: __mod_init_func
+# CHECK-NEXT: segname: __DATA
+# CHECK-NEXT: addr: 0x0000000000000060
+# CHECK-NEXT: size: 4
+# CHECK-NEXT: offset: 0x00000280
+# CHECK-NEXT: align: 2
+# CHECK-NEXT: reloff: 0x00000334
+# CHECK-NEXT: nreloc: 1
+# CHECK-NEXT: flags: 0x00000009
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000000
+# CHECK-NEXT: reserved3: 0x00000000
+# CHECK-NEXT: content: '48000000'
+# CHECK-NEXT: relocations:
+# CHECK-NEXT: - address: 0x00000000
+# CHECK-NEXT: symbolnum: 2
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 0
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+
+--- !mach-o
+FileHeader:
+ magic: 0xFEEDFACE
+ cputype: 0x0000000C
+ cpusubtype: 0x00000009
+ filetype: 0x00000001
+ ncmds: 4
+ sizeofcmds: 516
+ flags: 0x00002000
+LoadCommands:
+ - cmd: LC_SEGMENT
+ cmdsize: 396
+ segname: ''
+ vmaddr: 0
+ vmsize: 104
+ fileoff: 544
+ filesize: 100
+ maxprot: 7
+ initprot: 7
+ nsects: 5
+ flags: 0
+ Sections:
+ - sectname: __text
+ segname: __TEXT
+ addr: 0x0000000000000000
+ size: 36
+ offset: 0x00000220
+ align: 1
+ reloff: 0x00000284
+ nreloc: 8
+ flags: 0x80000400
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ content: 81B00020009040F24A00C0F200007844006840F24601C0F2000179440968084401B07047
+ relocations:
+ - address: 0x00000016
+ symbolnum: 0
+ pcrel: false
+ length: 3
+ extern: false
+ type: 9
+ scattered: true
+ value: 100
+ - address: 0x00000046
+ symbolnum: 0
+ pcrel: false
+ length: 3
+ extern: false
+ type: 1
+ scattered: true
+ value: 26
+ - address: 0x00000012
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 9
+ scattered: true
+ value: 100
+ - address: 0x00000000
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 1
+ scattered: true
+ value: 26
+ - address: 0x0000000A
+ symbolnum: 0
+ pcrel: false
+ length: 3
+ extern: false
+ type: 9
+ scattered: true
+ value: 92
+ - address: 0x0000004A
+ symbolnum: 0
+ pcrel: false
+ length: 3
+ extern: false
+ type: 1
+ scattered: true
+ value: 14
+ - address: 0x00000006
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 9
+ scattered: true
+ value: 92
+ - address: 0x00000000
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 1
+ scattered: true
+ value: 14
+ - sectname: __StaticInit
+ segname: __TEXT
+ addr: 0x0000000000000024
+ size: 46
+ offset: 0x00000244
+ align: 1
+ reloff: 0x000002C4
+ nreloc: 13
+ flags: 0x80000400
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ content: 40F22800C0F20000784440F21A01C0F200017944081A40F21E01C0F2000179440860704780B56F46FFF7EAFF80BD
+ relocations:
+ - address: 0x00000028
+ symbolnum: 2
+ pcrel: true
+ length: 2
+ extern: false
+ type: 6
+ scattered: false
+ value: 0
+ - address: 0x0000001A
+ symbolnum: 0
+ pcrel: false
+ length: 3
+ extern: false
+ type: 9
+ scattered: true
+ value: 100
+ - address: 0x0000001E
+ symbolnum: 0
+ pcrel: false
+ length: 3
+ extern: false
+ type: 1
+ scattered: true
+ value: 66
+ - address: 0x00000016
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 9
+ scattered: true
+ value: 100
+ - address: 0x00000000
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 1
+ scattered: true
+ value: 66
+ - address: 0x0000000E
+ symbolnum: 0
+ pcrel: false
+ length: 3
+ extern: false
+ type: 9
+ scattered: true
+ value: 84
+ - address: 0x0000001A
+ symbolnum: 0
+ pcrel: false
+ length: 3
+ extern: false
+ type: 1
+ scattered: true
+ value: 54
+ - address: 0x0000000A
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 9
+ scattered: true
+ value: 84
+ - address: 0x00000000
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 1
+ scattered: true
+ value: 54
+ - address: 0x00000004
+ symbolnum: 0
+ pcrel: false
+ length: 3
+ extern: false
+ type: 9
+ scattered: true
+ value: 88
+ - address: 0x00000028
+ symbolnum: 0
+ pcrel: false
+ length: 3
+ extern: false
+ type: 1
+ scattered: true
+ value: 44
+ - address: 0x00000000
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 9
+ scattered: true
+ value: 88
+ - address: 0x00000000
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 1
+ scattered: true
+ value: 44
+ - sectname: __data
+ segname: __DATA
+ addr: 0x0000000000000054
+ size: 12
+ offset: 0x00000274
+ align: 2
+ reloff: 0x0000032C
+ nreloc: 1
+ flags: 0x00000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ content: '010000000200000054000000'
+ relocations:
+ - address: 0x00000008
+ symbolnum: 3
+ pcrel: false
+ length: 2
+ extern: false
+ type: 0
+ scattered: false
+ value: 0
+ - sectname: __common
+ segname: __DATA
+ addr: 0x0000000000000064
+ size: 4
+ offset: 0x00000000
+ align: 2
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000001
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __mod_init_func
+ segname: __DATA
+ addr: 0x0000000000000060
+ size: 4
+ offset: 0x00000280
+ align: 2
+ reloff: 0x00000334
+ nreloc: 1
+ flags: 0x00000009
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ content: '48000000'
+ relocations:
+ - address: 0x00000000
+ symbolnum: 2
+ pcrel: false
+ length: 2
+ extern: false
+ type: 0
+ scattered: false
+ value: 0
+ - cmd: LC_VERSION_MIN_IPHONEOS
+ cmdsize: 16
+ version: 589824
+ sdk: 0
+ - cmd: LC_SYMTAB
+ cmdsize: 24
+ symoff: 828
+ nsyms: 7
+ stroff: 912
+ strsize: 68
+ - cmd: LC_DYSYMTAB
+ cmdsize: 80
+ ilocalsym: 0
+ nlocalsym: 2
+ iextdefsym: 2
+ nextdefsym: 5
+ iundefsym: 7
+ nundefsym: 0
+ tocoff: 0
+ ntoc: 0
+ modtaboff: 0
+ nmodtab: 0
+ extrefsymoff: 0
+ nextrefsyms: 0
+ indirectsymoff: 0
+ nindirectsyms: 0
+ extreloff: 0
+ nextrel: 0
+ locreloff: 0
+ nlocrel: 0
+LinkEditData:
+ NameList:
+ - n_strx: 13
+ n_type: 0x0E
+ n_sect: 2
+ n_desc: 8
+ n_value: 36
+ - n_strx: 36
+ n_type: 0x0E
+ n_sect: 2
+ n_desc: 8
+ n_value: 72
+ - n_strx: 61
+ n_type: 0x0F
+ n_sect: 1
+ n_desc: 8
+ n_value: 0
+ - n_strx: 10
+ n_type: 0x0F
+ n_sect: 4
+ n_desc: 0
+ n_value: 100
+ - n_strx: 7
+ n_type: 0x0F
+ n_sect: 3
+ n_desc: 0
+ n_value: 84
+ - n_strx: 4
+ n_type: 0x0F
+ n_sect: 3
+ n_desc: 0
+ n_value: 88
+ - n_strx: 1
+ n_type: 0x0F
+ n_sect: 3
+ n_desc: 0
+ n_value: 92
+ StringTable:
+ - ''
+ - _z
+ - _y
+ - _x
+ - _w
+ - ___cxx_global_var_init
+ - __GLOBAL__sub_I_main.cpp
+ - _main
+ - ''
+...
diff --git a/llvm/test/ObjectYAML/MachO/relocations_empty.yaml b/llvm/test/ObjectYAML/MachO/relocations_empty.yaml
new file mode 100644
index 000000000000..8a6a031da479
--- /dev/null
+++ b/llvm/test/ObjectYAML/MachO/relocations_empty.yaml
@@ -0,0 +1,65 @@
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-objdump --macho --reloc %t | FileCheck %s --check-prefix=OBJDUMP-VERIFY
+
+# OBJDUMP-VERIFY-NOT: Relocation information
+
+# RUN: obj2yaml %t | FileCheck %s
+
+# CHECK: Sections:
+# CHECK-NEXT: - sectname: __text
+# CHECK-NEXT: segname: __TEXT
+# CHECK-NEXT: addr: 0x0000000000000000
+# CHECK-NEXT: size: 0
+# CHECK-NEXT: offset: 0x000000C8
+# CHECK-NEXT: align: 0
+# CHECK-NEXT: reloff: 0x00000000
+# CHECK-NEXT: nreloc: 0
+# CHECK-NEXT: flags: 0x80000000
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000000
+# CHECK-NEXT: reserved3: 0x00000000
+# CHECK-NEXT: content: ''
+# CHECK-NOT: relocations:
+
+--- !mach-o
+FileHeader:
+ magic: 0xFEEDFACF
+ cputype: 0x01000007
+ cpusubtype: 0x00000003
+ filetype: 0x00000001
+ ncmds: 2
+ sizeofcmds: 168
+ flags: 0x00002000
+ reserved: 0x00000000
+LoadCommands:
+ - cmd: LC_SEGMENT_64
+ cmdsize: 152
+ segname: ''
+ vmaddr: 0
+ vmsize: 0
+ fileoff: 200
+ filesize: 0
+ maxprot: 7
+ initprot: 7
+ nsects: 1
+ flags: 0
+ Sections:
+ - sectname: __text
+ segname: __TEXT
+ addr: 0x0000000000000000
+ size: 0
+ offset: 0x000000C8
+ align: 0
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x80000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ content: ''
+ relocations: []
+ - cmd: LC_VERSION_MIN_MACOSX
+ cmdsize: 16
+ version: 658944
+ sdk: 0
+...
diff --git a/llvm/test/ObjectYAML/MachO/relocations_ppc_big_endian.yaml b/llvm/test/ObjectYAML/MachO/relocations_ppc_big_endian.yaml
new file mode 100644
index 000000000000..bfeed67a59e2
--- /dev/null
+++ b/llvm/test/ObjectYAML/MachO/relocations_ppc_big_endian.yaml
@@ -0,0 +1,777 @@
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-objdump --macho --reloc %t | FileCheck %s --check-prefix=OBJDUMP-VERIFY
+
+# OBJDUMP-VERIFY: Relocation information (__TEXT,__text) 8 entries
+# OBJDUMP-VERIFY-NEXT: address pcrel length extern type scattered symbolnum/value
+# OBJDUMP-VERIFY-NEXT: 00000030 False long n/a 11 True 0x00000144
+# OBJDUMP-VERIFY-NEXT: 00000000 False long n/a 1 True 0x00000018
+# OBJDUMP-VERIFY-NEXT: 0000002c False long n/a 12 True 0x00000144
+# OBJDUMP-VERIFY-NEXT: 0000012c False long n/a 1 True 0x00000018
+# OBJDUMP-VERIFY-NEXT: 00000028 False long n/a 11 True 0x000000d4
+# OBJDUMP-VERIFY-NEXT: 00000000 False long n/a 1 True 0x00000018
+# OBJDUMP-VERIFY-NEXT: 00000024 False long n/a 12 True 0x000000d4
+# OBJDUMP-VERIFY-NEXT: 000000bc False long n/a 1 True 0x00000018
+# OBJDUMP-VERIFY-NEXT: Relocation information (__TEXT,__StaticInit) 13 entries
+# OBJDUMP-VERIFY-NEXT: address pcrel length extern type scattered symbolnum/value
+# OBJDUMP-VERIFY-NEXT: 00000064 True long False 3 False 4 (__TEXT,__StaticInit)
+# OBJDUMP-VERIFY-NEXT: 00000034 False long n/a 11 True 0x00000144
+# OBJDUMP-VERIFY-NEXT: 00000000 False long n/a 1 True 0x00000068
+# OBJDUMP-VERIFY-NEXT: 00000030 False long n/a 12 True 0x00000144
+# OBJDUMP-VERIFY-NEXT: 000000dc False long n/a 1 True 0x00000068
+# OBJDUMP-VERIFY-NEXT: 00000028 False long n/a 11 True 0x000000d0
+# OBJDUMP-VERIFY-NEXT: 00000000 False long n/a 1 True 0x00000068
+# OBJDUMP-VERIFY-NEXT: 00000024 False long n/a 12 True 0x000000d0
+# OBJDUMP-VERIFY-NEXT: 00000068 False long n/a 1 True 0x00000068
+# OBJDUMP-VERIFY-NEXT: 00000020 False long n/a 11 True 0x000000cc
+# OBJDUMP-VERIFY-NEXT: 00000000 False long n/a 1 True 0x00000068
+# OBJDUMP-VERIFY-NEXT: 0000001c False long n/a 12 True 0x000000cc
+# OBJDUMP-VERIFY-NEXT: 00000064 False long n/a 1 True 0x00000068
+# OBJDUMP-VERIFY-NEXT: Relocation information (__DATA,__data) 1 entries
+# OBJDUMP-VERIFY-NEXT: address pcrel length extern type scattered symbolnum/value
+# OBJDUMP-VERIFY-NEXT: 00000008 False long False 0 False 5 (__DATA,__data)
+# OBJDUMP-VERIFY-NEXT: Relocation information (__DATA,__mod_init_func) 1 entries
+# OBJDUMP-VERIFY-NEXT: address pcrel length extern type scattered symbolnum/value
+# OBJDUMP-VERIFY-NEXT: 00000000 False long False 0 False 4 (__TEXT,__StaticInit)
+# OBJDUMP-VERIFY-NEXT: Relocation information (__TEXT,__eh_frame) 3 entries
+# OBJDUMP-VERIFY-NEXT: address pcrel length extern type scattered symbolnum/value
+# OBJDUMP-VERIFY-NEXT: 00000054 False long n/a 0 True 0x000000a0
+# OBJDUMP-VERIFY-NEXT: 00000038 False long n/a 0 True 0x00000000
+# OBJDUMP-VERIFY-NEXT: 0000001c False long n/a 0 True 0x00000050
+
+# RUN: obj2yaml %t | FileCheck %s
+
+# CHECK: Sections:
+# CHECK-NEXT: - sectname: __text
+# CHECK-NEXT: segname: __TEXT
+# CHECK-NEXT: addr: 0x0000000000000000
+# CHECK-NEXT: size: 76
+# CHECK-NEXT: offset: 0x000002EC
+# CHECK-NEXT: align: 4
+# CHECK-NEXT: reloff: 0x00000430
+# CHECK-NEXT: nreloc: 8
+# CHECK-NEXT: flags: 0x80000400
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000000
+# CHECK-NEXT: reserved3: 0x00000000
+# CHECK-NEXT: content:
+# CHECK-NEXT: relocations:
+# CHECK-NEXT: - address: 0x00000030
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 11
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 324
+# CHECK-NEXT: - address: 0x00000000
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 1
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 24
+# CHECK-NEXT: - address: 0x0000002C
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 12
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 324
+# CHECK-NEXT: - address: 0x0000012C
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 1
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 24
+# CHECK-NEXT: - address: 0x00000028
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 11
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 212
+# CHECK-NEXT: - address: 0x00000000
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 1
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 24
+# CHECK-NEXT: - address: 0x00000024
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 12
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 212
+# CHECK-NEXT: - address: 0x000000BC
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 1
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 24
+# CHECK-NEXT: - sectname: __textcoal_nt
+# CHECK-NEXT: segname: __TEXT
+# CHECK-NEXT: addr: 0x000000000000004C
+# CHECK-NEXT: size: 0
+# CHECK-NEXT: offset: 0x00000338
+# CHECK-NEXT: align: 0
+# CHECK-NEXT: reloff: 0x00000000
+# CHECK-NEXT: nreloc: 0
+# CHECK-NEXT: flags: 0x8000000B
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000000
+# CHECK-NEXT: reserved3: 0x00000000
+# CHECK-NEXT: content: ''
+# CHECK-NEXT: - sectname: __picsymbolstub1
+# CHECK-NEXT: segname: __TEXT
+# CHECK-NEXT: addr: 0x000000000000004C
+# CHECK-NEXT: size: 0
+# CHECK-NEXT: offset: 0x00000338
+# CHECK-NEXT: align: 0
+# CHECK-NEXT: reloff: 0x00000000
+# CHECK-NEXT: nreloc: 0
+# CHECK-NEXT: flags: 0x80000008
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000020
+# CHECK-NEXT: reserved3: 0x00000000
+# CHECK-NEXT: content: ''
+# CHECK-NEXT: - sectname: __StaticInit
+# CHECK-NEXT: segname: __TEXT
+# CHECK-NEXT: addr: 0x0000000000000050
+# CHECK-NEXT: size: 124
+# CHECK-NEXT: offset: 0x0000033C
+# CHECK-NEXT: align: 4
+# CHECK-NEXT: reloff: 0x00000470
+# CHECK-NEXT: nreloc: 13
+# CHECK-NEXT: flags: 0x80000400
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000000
+# CHECK-NEXT: reserved3: 0x00000000
+# CHECK-NEXT: content:
+# CHECK-NEXT: relocations:
+# CHECK-NEXT: - address: 0x00000064
+# CHECK-NEXT: symbolnum: 4
+# CHECK-NEXT: pcrel: true
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 3
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - address: 0x00000034
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 11
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 324
+# CHECK-NEXT: - address: 0x00000000
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 1
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 104
+# CHECK-NEXT: - address: 0x00000030
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 12
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 324
+# CHECK-NEXT: - address: 0x000000DC
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 1
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 104
+# CHECK-NEXT: - address: 0x00000028
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 11
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 208
+# CHECK-NEXT: - address: 0x00000000
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 1
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 104
+# CHECK-NEXT: - address: 0x00000024
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 12
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 208
+# CHECK-NEXT: - address: 0x00000068
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 1
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 104
+# CHECK-NEXT: - address: 0x00000020
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 11
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 204
+# CHECK-NEXT: - address: 0x00000000
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 1
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 104
+# CHECK-NEXT: - address: 0x0000001C
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 12
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 204
+# CHECK-NEXT: - address: 0x00000064
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 1
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 104
+# CHECK-NEXT: - sectname: __data
+# CHECK-NEXT: segname: __DATA
+# CHECK-NEXT: addr: 0x00000000000000CC
+# CHECK-NEXT: size: 12
+# CHECK-NEXT: offset: 0x000003B8
+# CHECK-NEXT: align: 2
+# CHECK-NEXT: reloff: 0x000004D8
+# CHECK-NEXT: nreloc: 1
+# CHECK-NEXT: flags: 0x00000000
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000000
+# CHECK-NEXT: reserved3: 0x00000000
+# CHECK-NEXT: content:
+# CHECK-NEXT: relocations:
+# CHECK-NEXT: - address: 0x00000008
+# CHECK-NEXT: symbolnum: 5
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 0
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - sectname: __common
+# CHECK-NEXT: segname: __DATA
+# CHECK-NEXT: addr: 0x0000000000000144
+# CHECK-NEXT: size: 4
+# CHECK-NEXT: offset: 0x00000000
+# CHECK-NEXT: align: 2
+# CHECK-NEXT: reloff: 0x00000000
+# CHECK-NEXT: nreloc: 0
+# CHECK-NEXT: flags: 0x00000001
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000000
+# CHECK-NEXT: reserved3: 0x00000000
+# CHECK-NEXT: - sectname: __mod_init_func
+# CHECK-NEXT: segname: __DATA
+# CHECK-NEXT: addr: 0x00000000000000D8
+# CHECK-NEXT: size: 4
+# CHECK-NEXT: offset: 0x000003C4
+# CHECK-NEXT: align: 2
+# CHECK-NEXT: reloff: 0x000004E0
+# CHECK-NEXT: nreloc: 1
+# CHECK-NEXT: flags: 0x00000009
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000000
+# CHECK-NEXT: reserved3: 0x00000000
+# CHECK-NEXT: content: 000000A0
+# CHECK-NEXT: relocations:
+# CHECK-NEXT: - address: 0x00000000
+# CHECK-NEXT: symbolnum: 4
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 0
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - sectname: __eh_frame
+# CHECK-NEXT: segname: __TEXT
+# CHECK-NEXT: addr: 0x00000000000000DC
+# CHECK-NEXT: size: 104
+# CHECK-NEXT: offset: 0x000003C8
+# CHECK-NEXT: align: 2
+# CHECK-NEXT: reloff: 0x000004E8
+# CHECK-NEXT: nreloc: 3
+# CHECK-NEXT: flags: 0x6800000B
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000000
+# CHECK-NEXT: reserved3: 0x00000000
+# CHECK-NEXT: content:
+# CHECK-NEXT: relocations:
+# CHECK-NEXT: - address: 0x00000054
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 0
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 160
+# CHECK-NEXT: - address: 0x00000038
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 0
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - address: 0x0000001C
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 0
+# CHECK-NEXT: scattered: true
+# CHECK-NEXT: value: 80
+
+--- !mach-o
+IsLittleEndian: false
+FileHeader:
+ magic: 0xFEEDFACE
+ cputype: 0x00000012
+ cpusubtype: 0x00000000
+ filetype: 0x00000001
+ ncmds: 4
+ sizeofcmds: 720
+ flags: 0x00002000
+LoadCommands:
+ - cmd: LC_SEGMENT
+ cmdsize: 600
+ segname: ''
+ vmaddr: 0
+ vmsize: 328
+ fileoff: 748
+ filesize: 324
+ maxprot: 7
+ initprot: 7
+ nsects: 8
+ flags: 0
+ Sections:
+ - sectname: __text
+ segname: __TEXT
+ addr: 0x0000000000000000
+ size: 76
+ offset: 0x000002EC
+ align: 4
+ reloff: 0x00000430
+ nreloc: 8
+ flags: 0x80000400
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ content: 7C0802A693E1FFFC900100089421FFE07C3F0B78480000057C4802A638600000907F00183C620000806300BC3C4200008042012C7C631214382100208001000883E1FFFC7C0803A64E800020
+ relocations:
+ - address: 0x00000030
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 11
+ scattered: true
+ value: 324
+ - address: 0x00000000
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 1
+ scattered: true
+ value: 24
+ - address: 0x0000002C
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 12
+ scattered: true
+ value: 324
+ - address: 0x0000012C
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 1
+ scattered: true
+ value: 24
+ - address: 0x00000028
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 11
+ scattered: true
+ value: 212
+ - address: 0x00000000
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 1
+ scattered: true
+ value: 24
+ - address: 0x00000024
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 12
+ scattered: true
+ value: 212
+ - address: 0x000000BC
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 1
+ scattered: true
+ value: 24
+ - sectname: __textcoal_nt
+ segname: __TEXT
+ addr: 0x000000000000004C
+ size: 0
+ offset: 0x00000338
+ align: 0
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x8000000B
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ content: ''
+ - sectname: __picsymbolstub1
+ segname: __TEXT
+ addr: 0x000000000000004C
+ size: 0
+ offset: 0x00000338
+ align: 0
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x80000008
+ reserved1: 0x00000000
+ reserved2: 0x00000020
+ reserved3: 0x00000000
+ content: ''
+ - sectname: __StaticInit
+ segname: __TEXT
+ addr: 0x0000000000000050
+ size: 124
+ offset: 0x0000033C
+ align: 4
+ reloff: 0x00000470
+ nreloc: 13
+ flags: 0x80000400
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ content: 7C0802A693E1FFFC900100089421FFE07C3F0B78480000057C4802A63C620000386300643C820000388400687C6418503C420000906200DC382100208001000883E1FFFC7C0803A64E800020600000007C0802A693E1FFFC900100089421FFC07C3F0B784BFFFF9D382100408001000883E1FFFC7C0803A64E800020
+ relocations:
+ - address: 0x00000064
+ symbolnum: 4
+ pcrel: true
+ length: 2
+ extern: false
+ type: 3
+ scattered: false
+ value: 0
+ - address: 0x00000034
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 11
+ scattered: true
+ value: 324
+ - address: 0x00000000
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 1
+ scattered: true
+ value: 104
+ - address: 0x00000030
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 12
+ scattered: true
+ value: 324
+ - address: 0x000000DC
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 1
+ scattered: true
+ value: 104
+ - address: 0x00000028
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 11
+ scattered: true
+ value: 208
+ - address: 0x00000000
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 1
+ scattered: true
+ value: 104
+ - address: 0x00000024
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 12
+ scattered: true
+ value: 208
+ - address: 0x00000068
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 1
+ scattered: true
+ value: 104
+ - address: 0x00000020
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 11
+ scattered: true
+ value: 204
+ - address: 0x00000000
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 1
+ scattered: true
+ value: 104
+ - address: 0x0000001C
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 12
+ scattered: true
+ value: 204
+ - address: 0x00000064
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 1
+ scattered: true
+ value: 104
+ - sectname: __data
+ segname: __DATA
+ addr: 0x00000000000000CC
+ size: 12
+ offset: 0x000003B8
+ align: 2
+ reloff: 0x000004D8
+ nreloc: 1
+ flags: 0x00000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ content: 0000000100000002000000CC
+ relocations:
+ - address: 0x00000008
+ symbolnum: 5
+ pcrel: false
+ length: 2
+ extern: false
+ type: 0
+ scattered: false
+ value: 0
+ - sectname: __common
+ segname: __DATA
+ addr: 0x0000000000000144
+ size: 4
+ offset: 0x00000000
+ align: 2
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000001
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __mod_init_func
+ segname: __DATA
+ addr: 0x00000000000000D8
+ size: 4
+ offset: 0x000003C4
+ align: 2
+ reloff: 0x000004E0
+ nreloc: 1
+ flags: 0x00000009
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ content: 000000A0
+ relocations:
+ - address: 0x00000000
+ symbolnum: 4
+ pcrel: false
+ length: 2
+ extern: false
+ type: 0
+ scattered: false
+ value: 0
+ - sectname: __eh_frame
+ segname: __TEXT
+ addr: 0x00000000000000DC
+ size: 104
+ offset: 0x000003C8
+ align: 2
+ reloff: 0x000004E8
+ nreloc: 3
+ flags: 0x6800000B
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ content: 0000001000000000017A5200017C4101100C01000000001800000018FFFFFF580000004C00500E209F0111417E440D1F0000001800000034FFFFFEEC0000004C00500E209F0111417E440D1F0000001800000050FFFFFF700000002C00500E409F0111417E440D1F
+ relocations:
+ - address: 0x00000054
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 0
+ scattered: true
+ value: 160
+ - address: 0x00000038
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 0
+ scattered: true
+ value: 0
+ - address: 0x0000001C
+ symbolnum: 0
+ pcrel: false
+ length: 2
+ extern: false
+ type: 0
+ scattered: true
+ value: 80
+ - cmd: LC_VERSION_MIN_MACOSX
+ cmdsize: 16
+ version: 656384
+ sdk: 0
+ - cmd: LC_SYMTAB
+ cmdsize: 24
+ symoff: 1280
+ nsyms: 7
+ stroff: 1364
+ strsize: 68
+ - cmd: LC_DYSYMTAB
+ cmdsize: 80
+ ilocalsym: 0
+ nlocalsym: 2
+ iextdefsym: 2
+ nextdefsym: 5
+ iundefsym: 7
+ nundefsym: 0
+ tocoff: 0
+ ntoc: 0
+ modtaboff: 0
+ nmodtab: 0
+ extrefsymoff: 0
+ nextrefsyms: 0
+ indirectsymoff: 0
+ nindirectsyms: 0
+ extreloff: 0
+ nextrel: 0
+ locreloff: 0
+ nlocrel: 0
+LinkEditData:
+ NameList:
+ - n_strx: 13
+ n_type: 0x0E
+ n_sect: 4
+ n_desc: 0
+ n_value: 80
+ - n_strx: 36
+ n_type: 0x0E
+ n_sect: 4
+ n_desc: 0
+ n_value: 160
+ - n_strx: 61
+ n_type: 0x0F
+ n_sect: 1
+ n_desc: 0
+ n_value: 0
+ - n_strx: 10
+ n_type: 0x0F
+ n_sect: 6
+ n_desc: 0
+ n_value: 324
+ - n_strx: 7
+ n_type: 0x0F
+ n_sect: 5
+ n_desc: 0
+ n_value: 204
+ - n_strx: 4
+ n_type: 0x0F
+ n_sect: 5
+ n_desc: 0
+ n_value: 208
+ - n_strx: 1
+ n_type: 0x0F
+ n_sect: 5
+ n_desc: 0
+ n_value: 212
+ StringTable:
+ - ''
+ - _z
+ - _y
+ - _x
+ - _w
+ - ___cxx_global_var_init
+ - __GLOBAL__sub_I_main.cpp
+ - _main
+ - ''
+...
diff --git a/llvm/test/ObjectYAML/MachO/relocations_x86_64.yaml b/llvm/test/ObjectYAML/MachO/relocations_x86_64.yaml
new file mode 100644
index 000000000000..9c5ba88d70d5
--- /dev/null
+++ b/llvm/test/ObjectYAML/MachO/relocations_x86_64.yaml
@@ -0,0 +1,494 @@
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-objdump --macho --reloc %t | FileCheck %s --check-prefix=OBJDUMP-VERIFY
+
+# OBJDUMP-VERIFY: Relocation information (__TEXT,__text) 2 entries
+# OBJDUMP-VERIFY-NEXT: address pcrel length extern type scattered symbolnum/value
+# OBJDUMP-VERIFY-NEXT: 00000015 True long True SIGNED False _w
+# OBJDUMP-VERIFY-NEXT: 0000000e True long True SIGNED False _z
+# OBJDUMP-VERIFY-NEXT: Relocation information (__TEXT,__StaticInit) 4 entries
+# OBJDUMP-VERIFY-NEXT: address pcrel length extern type scattered symbolnum/value
+# OBJDUMP-VERIFY-NEXT: 00000025 True long True BRANCH False ___cxx_global_var_init
+# OBJDUMP-VERIFY-NEXT: 00000018 True long True SIGNED False _w
+# OBJDUMP-VERIFY-NEXT: 0000000e True long True SIGNED False _x
+# OBJDUMP-VERIFY-NEXT: 00000007 True long True SIGNED False _y
+# OBJDUMP-VERIFY-NEXT: Relocation information (__DATA,__data) 1 entries
+# OBJDUMP-VERIFY-NEXT: address pcrel length extern type scattered symbolnum/value
+# OBJDUMP-VERIFY-NEXT: 00000008 False quad True UNSIGND False _x
+# OBJDUMP-VERIFY-NEXT: Relocation information (__DATA,__mod_init_func) 1 entries
+# OBJDUMP-VERIFY-NEXT: address pcrel length extern type scattered symbolnum/value
+# OBJDUMP-VERIFY-NEXT: 00000000 False quad True UNSIGND False __GLOBAL__sub_I_main.cpp
+# OBJDUMP-VERIFY-NEXT: Relocation information (__LD,__compact_unwind) 3 entries
+# OBJDUMP-VERIFY-NEXT: address pcrel length extern type scattered symbolnum/value
+# OBJDUMP-VERIFY-NEXT: 00000040 False quad False UNSIGND False 2 (__TEXT,__StaticInit)
+# OBJDUMP-VERIFY-NEXT: 00000020 False quad False UNSIGND False 1 (__TEXT,__text)
+# OBJDUMP-VERIFY-NEXT: 00000000 False quad False UNSIGND False 2 (__TEXT,__StaticInit)
+
+# RUN: obj2yaml %t | FileCheck %s
+# CHECK: Sections:
+# CHECK-NEXT: - sectname: __text
+# CHECK-NEXT: segname: __TEXT
+# CHECK-NEXT: addr: 0x0000000000000000
+# CHECK-NEXT: size: 27
+# CHECK-NEXT: offset: 0x00000310
+# CHECK-NEXT: align: 4
+# CHECK-NEXT: reloff: 0x00000468
+# CHECK-NEXT: nreloc: 2
+# CHECK-NEXT: flags: 0x80000400
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000000
+# CHECK-NEXT: reserved3: 0x00000000
+# CHECK-NEXT: content:
+# CHECK-NEXT: relocations:
+# CHECK-NEXT: - address: 0x00000015
+# CHECK-NEXT: symbolnum: 3
+# CHECK-NEXT: pcrel: true
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: true
+# CHECK-NEXT: type: 1
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - address: 0x0000000E
+# CHECK-NEXT: symbolnum: 6
+# CHECK-NEXT: pcrel: true
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: true
+# CHECK-NEXT: type: 1
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - sectname: __StaticInit
+# CHECK-NEXT: segname: __TEXT
+# CHECK-NEXT: addr: 0x0000000000000020
+# CHECK-NEXT: size: 43
+# CHECK-NEXT: offset: 0x00000330
+# CHECK-NEXT: align: 4
+# CHECK-NEXT: reloff: 0x00000478
+# CHECK-NEXT: nreloc: 4
+# CHECK-NEXT: flags: 0x80000400
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000000
+# CHECK-NEXT: reserved3: 0x00000000
+# CHECK-NEXT: content:
+# CHECK-NEXT: relocations:
+# CHECK-NEXT: - address: 0x00000025
+# CHECK-NEXT: symbolnum: 0
+# CHECK-NEXT: pcrel: true
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: true
+# CHECK-NEXT: type: 2
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - address: 0x00000018
+# CHECK-NEXT: symbolnum: 3
+# CHECK-NEXT: pcrel: true
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: true
+# CHECK-NEXT: type: 1
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - address: 0x0000000E
+# CHECK-NEXT: symbolnum: 4
+# CHECK-NEXT: pcrel: true
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: true
+# CHECK-NEXT: type: 1
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - address: 0x00000007
+# CHECK-NEXT: symbolnum: 5
+# CHECK-NEXT: pcrel: true
+# CHECK-NEXT: length: 2
+# CHECK-NEXT: extern: true
+# CHECK-NEXT: type: 1
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - sectname: __data
+# CHECK-NEXT: segname: __DATA
+# CHECK-NEXT: addr: 0x0000000000000050
+# CHECK-NEXT: size: 16
+# CHECK-NEXT: offset: 0x00000360
+# CHECK-NEXT: align: 3
+# CHECK-NEXT: reloff: 0x00000498
+# CHECK-NEXT: nreloc: 1
+# CHECK-NEXT: flags: 0x00000000
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000000
+# CHECK-NEXT: reserved3: 0x00000000
+# CHECK-NEXT: content: '01000000020000000000000000000000'
+# CHECK-NEXT: relocations:
+# CHECK-NEXT: - address: 0x00000008
+# CHECK-NEXT: symbolnum: 4
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 3
+# CHECK-NEXT: extern: true
+# CHECK-NEXT: type: 0
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - sectname: __common
+# CHECK-NEXT: segname: __DATA
+# CHECK-NEXT: addr: 0x0000000000000158
+# CHECK-NEXT: size: 8
+# CHECK-NEXT: offset: 0x00000000
+# CHECK-NEXT: align: 3
+# CHECK-NEXT: reloff: 0x00000000
+# CHECK-NEXT: nreloc: 0
+# CHECK-NEXT: flags: 0x00000001
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000000
+# CHECK-NEXT: reserved3: 0x00000000
+# CHECK-NEXT: - sectname: __mod_init_func
+# CHECK-NEXT: segname: __DATA
+# CHECK-NEXT: addr: 0x0000000000000060
+# CHECK-NEXT: size: 8
+# CHECK-NEXT: offset: 0x00000370
+# CHECK-NEXT: align: 3
+# CHECK-NEXT: reloff: 0x000004A0
+# CHECK-NEXT: nreloc: 1
+# CHECK-NEXT: flags: 0x00000009
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000000
+# CHECK-NEXT: reserved3: 0x00000000
+# CHECK-NEXT: content:
+# CHECK-NEXT: relocations:
+# CHECK-NEXT: - address: 0x00000000
+# CHECK-NEXT: symbolnum: 1
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 3
+# CHECK-NEXT: extern: true
+# CHECK-NEXT: type: 0
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - sectname: __compact_unwind
+# CHECK-NEXT: segname: __LD
+# CHECK-NEXT: addr: 0x0000000000000068
+# CHECK-NEXT: size: 96
+# CHECK-NEXT: offset: 0x00000378
+# CHECK-NEXT: align: 3
+# CHECK-NEXT: reloff: 0x000004A8
+# CHECK-NEXT: nreloc: 3
+# CHECK-NEXT: flags: 0x02000000
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000000
+# CHECK-NEXT: reserved3: 0x00000000
+# CHECK-NEXT: content:
+# CHECK-NEXT: relocations:
+# CHECK-NEXT: - address: 0x00000040
+# CHECK-NEXT: symbolnum: 2
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 3
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 0
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - address: 0x00000020
+# CHECK-NEXT: symbolnum: 1
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 3
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 0
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - address: 0x00000000
+# CHECK-NEXT: symbolnum: 2
+# CHECK-NEXT: pcrel: false
+# CHECK-NEXT: length: 3
+# CHECK-NEXT: extern: false
+# CHECK-NEXT: type: 0
+# CHECK-NEXT: scattered: false
+# CHECK-NEXT: value: 0
+# CHECK-NEXT: - sectname: __eh_frame
+# CHECK-NEXT: segname: __TEXT
+# CHECK-NEXT: addr: 0x00000000000000C8
+# CHECK-NEXT: size: 144
+# CHECK-NEXT: offset: 0x000003D8
+# CHECK-NEXT: align: 3
+# CHECK-NEXT: reloff: 0x00000000
+# CHECK-NEXT: nreloc: 0
+# CHECK-NEXT: flags: 0x6800000B
+# CHECK-NEXT: reserved1: 0x00000000
+# CHECK-NEXT: reserved2: 0x00000000
+# CHECK-NEXT: reserved3: 0x00000000
+
+--- !mach-o
+FileHeader:
+ magic: 0xFEEDFACF
+ cputype: 0x01000007
+ cpusubtype: 0x00000003
+ filetype: 0x00000001
+ ncmds: 4
+ sizeofcmds: 752
+ flags: 0x00002000
+ reserved: 0x00000000
+LoadCommands:
+ - cmd: LC_SEGMENT_64
+ cmdsize: 632
+ segname: ''
+ vmaddr: 0
+ vmsize: 352
+ fileoff: 784
+ filesize: 344
+ maxprot: 7
+ initprot: 7
+ nsects: 7
+ flags: 0
+ Sections:
+ - sectname: __text
+ segname: __TEXT
+ addr: 0x0000000000000000
+ size: 27
+ offset: 0x00000310
+ align: 4
+ reloff: 0x00000468
+ nreloc: 2
+ flags: 0x80000400
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ content: 554889E5C745FC00000000488B0500000000480305000000005DC3
+ relocations:
+ - address: 0x00000015
+ symbolnum: 3
+ pcrel: true
+ length: 2
+ extern: true
+ type: 1
+ scattered: false
+ value: 0
+ - address: 0x0000000E
+ symbolnum: 6
+ pcrel: true
+ length: 2
+ extern: true
+ type: 1
+ scattered: false
+ value: 0
+ - sectname: __StaticInit
+ segname: __TEXT
+ addr: 0x0000000000000020
+ size: 43
+ offset: 0x00000330
+ align: 4
+ reloff: 0x00000478
+ nreloc: 4
+ flags: 0x80000400
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ content: 554889E5488D0500000000488D0D000000004829C148890D000000005DC36690554889E5E8000000005DC3
+ relocations:
+ - address: 0x00000025
+ symbolnum: 0
+ pcrel: true
+ length: 2
+ extern: true
+ type: 2
+ scattered: false
+ value: 0
+ - address: 0x00000018
+ symbolnum: 3
+ pcrel: true
+ length: 2
+ extern: true
+ type: 1
+ scattered: false
+ value: 0
+ - address: 0x0000000E
+ symbolnum: 4
+ pcrel: true
+ length: 2
+ extern: true
+ type: 1
+ scattered: false
+ value: 0
+ - address: 0x00000007
+ symbolnum: 5
+ pcrel: true
+ length: 2
+ extern: true
+ type: 1
+ scattered: false
+ value: 0
+ - sectname: __data
+ segname: __DATA
+ addr: 0x0000000000000050
+ size: 16
+ offset: 0x00000360
+ align: 3
+ reloff: 0x00000498
+ nreloc: 1
+ flags: 0x00000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ content: '01000000020000000000000000000000'
+ relocations:
+ - address: 0x00000008
+ symbolnum: 4
+ pcrel: false
+ length: 3
+ extern: true
+ type: 0
+ scattered: false
+ value: 0
+ - sectname: __common
+ segname: __DATA
+ addr: 0x0000000000000158
+ size: 8
+ offset: 0x00000000
+ align: 3
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000001
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __mod_init_func
+ segname: __DATA
+ addr: 0x0000000000000060
+ size: 8
+ offset: 0x00000370
+ align: 3
+ reloff: 0x000004A0
+ nreloc: 1
+ flags: 0x00000009
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ content: '0000000000000000'
+ relocations:
+ - address: 0x00000000
+ symbolnum: 1
+ pcrel: false
+ length: 3
+ extern: true
+ type: 0
+ scattered: false
+ value: 0
+ - sectname: __compact_unwind
+ segname: __LD
+ addr: 0x0000000000000068
+ size: 96
+ offset: 0x00000378
+ align: 3
+ reloff: 0x000004A8
+ nreloc: 3
+ flags: 0x02000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ content: 20000000000000001E000000000000010000000000000000000000000000000000000000000000001B000000000000010000000000000000000000000000000040000000000000000B0000000000000100000000000000000000000000000000
+ relocations:
+ - address: 0x00000040
+ symbolnum: 2
+ pcrel: false
+ length: 3
+ extern: false
+ type: 0
+ scattered: false
+ value: 0
+ - address: 0x00000020
+ symbolnum: 1
+ pcrel: false
+ length: 3
+ extern: false
+ type: 0
+ scattered: false
+ value: 0
+ - address: 0x00000000
+ symbolnum: 2
+ pcrel: false
+ length: 3
+ extern: false
+ type: 0
+ scattered: false
+ value: 0
+ - sectname: __eh_frame
+ segname: __TEXT
+ addr: 0x00000000000000C8
+ size: 144
+ offset: 0x000003D8
+ align: 3
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x6800000B
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ content: 1400000000000000017A520001781001100C070890010000240000001C00000038FFFFFFFFFFFFFF1E0000000000000000410E108602430D06000000000000002400000044000000F0FEFFFFFFFFFFFF1B0000000000000000410E108602430D0600000000000000240000006C00000008FFFFFFFFFFFFFF0B0000000000000000410E108602430D0600000000000000
+ - cmd: LC_VERSION_MIN_MACOSX
+ cmdsize: 16
+ version: 658944
+ sdk: 0
+ - cmd: LC_SYMTAB
+ cmdsize: 24
+ symoff: 1216
+ nsyms: 7
+ stroff: 1328
+ strsize: 68
+ - cmd: LC_DYSYMTAB
+ cmdsize: 80
+ ilocalsym: 0
+ nlocalsym: 2
+ iextdefsym: 2
+ nextdefsym: 5
+ iundefsym: 7
+ nundefsym: 0
+ tocoff: 0
+ ntoc: 0
+ modtaboff: 0
+ nmodtab: 0
+ extrefsymoff: 0
+ nextrefsyms: 0
+ indirectsymoff: 0
+ nindirectsyms: 0
+ extreloff: 0
+ nextrel: 0
+ locreloff: 0
+ nlocrel: 0
+LinkEditData:
+ NameList:
+ - n_strx: 13
+ n_type: 0x0E
+ n_sect: 2
+ n_desc: 0
+ n_value: 32
+ - n_strx: 36
+ n_type: 0x0E
+ n_sect: 2
+ n_desc: 0
+ n_value: 64
+ - n_strx: 61
+ n_type: 0x0F
+ n_sect: 1
+ n_desc: 0
+ n_value: 0
+ - n_strx: 10
+ n_type: 0x0F
+ n_sect: 4
+ n_desc: 0
+ n_value: 344
+ - n_strx: 7
+ n_type: 0x0F
+ n_sect: 3
+ n_desc: 0
+ n_value: 80
+ - n_strx: 4
+ n_type: 0x0F
+ n_sect: 3
+ n_desc: 0
+ n_value: 84
+ - n_strx: 1
+ n_type: 0x0F
+ n_sect: 3
+ n_desc: 0
+ n_value: 88
+ StringTable:
+ - ''
+ - _z
+ - _y
+ - _x
+ - _w
+ - ___cxx_global_var_init
+ - __GLOBAL__sub_I_main.cpp
+ - _main
+ - ''
+...
diff --git a/llvm/test/ObjectYAML/MachO/virtual_section.yaml b/llvm/test/ObjectYAML/MachO/virtual_section.yaml
index edc13df122d4..73c7b6baa924 100644
--- a/llvm/test/ObjectYAML/MachO/virtual_section.yaml
+++ b/llvm/test/ObjectYAML/MachO/virtual_section.yaml
@@ -29,7 +29,7 @@ LoadCommands:
offset: 0x000002B0
align: 4
reloff: 0x00000350
- nreloc: 7
+ nreloc: 0
flags: 0x80000400
reserved1: 0x00000000
reserved2: 0x00000000
@@ -77,7 +77,7 @@ LoadCommands:
offset: 0x000002FC
align: 0
reloff: 0x00000388
- nreloc: 2
+ nreloc: 0
flags: 0x00000013
reserved1: 0x00000000
reserved2: 0x00000000
@@ -170,7 +170,7 @@ LinkEditData:
# CHECK-NEXT: offset: 0x000002B0
# CHECK-NEXT: align: 4
# CHECK-NEXT: reloff: 0x00000350
-# CHECK-NEXT: nreloc: 7
+# CHECK-NEXT: nreloc: 0
# CHECK-NEXT: flags: 0x80000400
# CHECK-NEXT: reserved1: 0x00000000
# CHECK-NEXT: reserved2: 0x00000000
@@ -220,7 +220,7 @@ LinkEditData:
# CHECK-NEXT: offset: 0x000002FC
# CHECK-NEXT: align: 0
# CHECK-NEXT: reloff: 0x00000388
-# CHECK-NEXT: nreloc: 2
+# CHECK-NEXT: nreloc: 0
# CHECK-NEXT: flags: 0x00000013
# CHECK-NEXT: reserved1: 0x00000000
# CHECK-NEXT: reserved2: 0x00000000
diff --git a/llvm/tools/obj2yaml/macho2yaml.cpp b/llvm/tools/obj2yaml/macho2yaml.cpp
index 0ee8814d35ab..6b0db2aa15fa 100644
--- a/llvm/tools/obj2yaml/macho2yaml.cpp
+++ b/llvm/tools/obj2yaml/macho2yaml.cpp
@@ -21,13 +21,13 @@ using namespace llvm;
class MachODumper {
template <typename StructType>
- const char *processLoadCommandData(
+ Expected<const char *> processLoadCommandData(
MachOYAML::LoadCommand &LC,
const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd);
const object::MachOObjectFile &Obj;
void dumpHeader(std::unique_ptr<MachOYAML::Object> &Y);
- void dumpLoadCommands(std::unique_ptr<MachOYAML::Object> &Y);
+ Error dumpLoadCommands(std::unique_ptr<MachOYAML::Object> &Y);
void dumpLinkEdit(std::unique_ptr<MachOYAML::Object> &Y);
void dumpRebaseOpcodes(std::unique_ptr<MachOYAML::Object> &Y);
void dumpBindOpcodes(std::vector<MachOYAML::BindOpcode> &BindOpcodes,
@@ -40,11 +40,13 @@ class MachODumper {
std::unique_ptr<MachOYAML::Object> &Y);
template <typename SectionType>
- MachOYAML::Section constructSectionCommon(SectionType Sec);
+ Expected<MachOYAML::Section> constructSectionCommon(SectionType Sec,
+ size_t SecIndex);
template <typename SectionType>
- MachOYAML::Section constructSection(SectionType Sec);
+ Expected<MachOYAML::Section> constructSection(SectionType Sec,
+ size_t SecIndex);
template <typename SectionType, typename SegmentType>
- const char *
+ Expected<const char *>
extractSections(const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd,
std::vector<MachOYAML::Section> &Sections);
@@ -59,11 +61,16 @@ class MachODumper {
sizeof(MachO::LCStruct)); \
if (Obj.isLittleEndian() != sys::IsLittleEndianHost) \
MachO::swapStruct(LC.Data.LCStruct##_data); \
- EndPtr = processLoadCommandData<MachO::LCStruct>(LC, LoadCmd); \
+ if (Expected<const char *> ExpectedEndPtr = \
+ processLoadCommandData<MachO::LCStruct>(LC, LoadCmd)) \
+ EndPtr = *ExpectedEndPtr; \
+ else \
+ return ExpectedEndPtr.takeError(); \
break;
template <typename SectionType>
-MachOYAML::Section MachODumper::constructSectionCommon(SectionType Sec) {
+Expected<MachOYAML::Section>
+MachODumper::constructSectionCommon(SectionType Sec, size_t SecIndex) {
MachOYAML::Section TempSec;
memcpy(reinterpret_cast<void *>(&TempSec.sectname[0]), &Sec.sectname[0], 16);
memcpy(reinterpret_cast<void *>(&TempSec.segname[0]), &Sec.segname[0], 16);
@@ -80,52 +87,80 @@ MachOYAML::Section MachODumper::constructSectionCommon(SectionType Sec) {
if (!MachO::isVirtualSection(Sec.flags & MachO::SECTION_TYPE))
TempSec.content =
yaml::BinaryRef(Obj.getSectionContents(Sec.offset, Sec.size));
+
+ if (Expected<object::SectionRef> SecRef = Obj.getSection(SecIndex)) {
+ TempSec.relocations.reserve(TempSec.nreloc);
+ for (const object::RelocationRef &Reloc : SecRef->relocations()) {
+ const object::DataRefImpl Rel = Reloc.getRawDataRefImpl();
+ const MachO::any_relocation_info RE = Obj.getRelocation(Rel);
+ MachOYAML::Relocation R;
+ R.address = Obj.getAnyRelocationAddress(RE);
+ R.is_pcrel = Obj.getAnyRelocationPCRel(RE);
+ R.length = Obj.getAnyRelocationLength(RE);
+ R.type = Obj.getAnyRelocationType(RE);
+ R.is_scattered = Obj.isRelocationScattered(RE);
+ R.symbolnum = (R.is_scattered ? 0 : Obj.getPlainRelocationSymbolNum(RE));
+ R.is_extern =
+ (R.is_scattered ? false : Obj.getPlainRelocationExternal(RE));
+ R.value = (R.is_scattered ? Obj.getScatteredRelocationValue(RE) : 0);
+ TempSec.relocations.push_back(R);
+ }
+ } else {
+ return SecRef.takeError();
+ }
return TempSec;
}
template <>
-MachOYAML::Section MachODumper::constructSection(MachO::section Sec) {
- MachOYAML::Section TempSec = constructSectionCommon(Sec);
- TempSec.reserved3 = 0;
+Expected<MachOYAML::Section> MachODumper::constructSection(MachO::section Sec,
+ size_t SecIndex) {
+ Expected<MachOYAML::Section> TempSec = constructSectionCommon(Sec, SecIndex);
+ if (TempSec)
+ TempSec->reserved3 = 0;
return TempSec;
}
template <>
-MachOYAML::Section MachODumper::constructSection(MachO::section_64 Sec) {
- MachOYAML::Section TempSec = constructSectionCommon(Sec);
- TempSec.reserved3 = Sec.reserved3;
+Expected<MachOYAML::Section>
+MachODumper::constructSection(MachO::section_64 Sec, size_t SecIndex) {
+ Expected<MachOYAML::Section> TempSec = constructSectionCommon(Sec, SecIndex);
+ if (TempSec)
+ TempSec->reserved3 = Sec.reserved3;
return TempSec;
}
template <typename SectionType, typename SegmentType>
-const char *MachODumper::extractSections(
+Expected<const char *> MachODumper::extractSections(
const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd,
std::vector<MachOYAML::Section> &Sections) {
auto End = LoadCmd.Ptr + LoadCmd.C.cmdsize;
const SectionType *Curr =
reinterpret_cast<const SectionType *>(LoadCmd.Ptr + sizeof(SegmentType));
for (; reinterpret_cast<const void *>(Curr) < End; Curr++) {
- if (Obj.isLittleEndian() != sys::IsLittleEndianHost) {
- SectionType Sec;
- memcpy((void *)&Sec, Curr, sizeof(SectionType));
+ SectionType Sec;
+ memcpy((void *)&Sec, Curr, sizeof(SectionType));
+ if (Obj.isLittleEndian() != sys::IsLittleEndianHost)
MachO::swapStruct(Sec);
- Sections.push_back(constructSection(Sec));
- } else {
- Sections.push_back(constructSection(*Curr));
- }
+ // For MachO section indices start from 1.
+ if (Expected<MachOYAML::Section> S =
+ constructSection(Sec, Sections.size() + 1))
+ Sections.push_back(std::move(*S));
+ else
+ return S.takeError();
}
return reinterpret_cast<const char *>(Curr);
}
template <typename StructType>
-const char *MachODumper::processLoadCommandData(
+Expected<const char *> MachODumper::processLoadCommandData(
MachOYAML::LoadCommand &LC,
const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd) {
return LoadCmd.Ptr + sizeof(StructType);
}
template <>
-const char *MachODumper::processLoadCommandData<MachO::segment_command>(
+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,
@@ -133,7 +168,8 @@ const char *MachODumper::processLoadCommandData<MachO::segment_command>(
}
template <>
-const char *MachODumper::processLoadCommandData<MachO::segment_command_64>(
+Expected<const char *>
+MachODumper::processLoadCommandData<MachO::segment_command_64>(
MachOYAML::LoadCommand &LC,
const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd) {
return extractSections<MachO::section_64, MachO::segment_command_64>(
@@ -152,28 +188,32 @@ readString(MachOYAML::LoadCommand &LC,
}
template <>
-const char *MachODumper::processLoadCommandData<MachO::dylib_command>(
+Expected<const char *>
+MachODumper::processLoadCommandData<MachO::dylib_command>(
MachOYAML::LoadCommand &LC,
const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd) {
return readString<MachO::dylib_command>(LC, LoadCmd);
}
template <>
-const char *MachODumper::processLoadCommandData<MachO::dylinker_command>(
+Expected<const char *>
+MachODumper::processLoadCommandData<MachO::dylinker_command>(
MachOYAML::LoadCommand &LC,
const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd) {
return readString<MachO::dylinker_command>(LC, LoadCmd);
}
template <>
-const char *MachODumper::processLoadCommandData<MachO::rpath_command>(
+Expected<const char *>
+MachODumper::processLoadCommandData<MachO::rpath_command>(
MachOYAML::LoadCommand &LC,
const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd) {
return readString<MachO::rpath_command>(LC, LoadCmd);
}
template <>
-const char *MachODumper::processLoadCommandData<MachO::build_version_command>(
+Expected<const char *>
+MachODumper::processLoadCommandData<MachO::build_version_command>(
MachOYAML::LoadCommand &LC,
const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd) {
auto Start = LoadCmd.Ptr + sizeof(MachO::build_version_command);
@@ -193,7 +233,8 @@ Expected<std::unique_ptr<MachOYAML::Object>> MachODumper::dump() {
auto Y = std::make_unique<MachOYAML::Object>();
Y->IsLittleEndian = Obj.isLittleEndian();
dumpHeader(Y);
- dumpLoadCommands(Y);
+ if (Error Err = dumpLoadCommands(Y))
+ return std::move(Err);
dumpLinkEdit(Y);
std::unique_ptr<DWARFContext> DICtx = DWARFContext::create(Obj);
@@ -213,7 +254,7 @@ void MachODumper::dumpHeader(std::unique_ptr<MachOYAML::Object> &Y) {
Y->Header.reserved = 0;
}
-void MachODumper::dumpLoadCommands(std::unique_ptr<MachOYAML::Object> &Y) {
+Error MachODumper::dumpLoadCommands(std::unique_ptr<MachOYAML::Object> &Y) {
for (auto LoadCmd : Obj.load_commands()) {
MachOYAML::LoadCommand LC;
const char *EndPtr = LoadCmd.Ptr;
@@ -223,7 +264,11 @@ void MachODumper::dumpLoadCommands(std::unique_ptr<MachOYAML::Object> &Y) {
sizeof(MachO::load_command));
if (Obj.isLittleEndian() != sys::IsLittleEndianHost)
MachO::swapStruct(LC.Data.load_command_data);
- EndPtr = processLoadCommandData<MachO::load_command>(LC, LoadCmd);
+ if (Expected<const char *> ExpectedEndPtr =
+ processLoadCommandData<MachO::load_command>(LC, LoadCmd))
+ EndPtr = *ExpectedEndPtr;
+ else
+ return ExpectedEndPtr.takeError();
break;
#include "llvm/BinaryFormat/MachO.def"
}
@@ -237,6 +282,7 @@ void MachODumper::dumpLoadCommands(std::unique_ptr<MachOYAML::Object> &Y) {
LC.ZeroPadBytes = RemainingBytes;
Y->LoadCommands.push_back(std::move(LC));
}
+ return Error::success();
}
void MachODumper::dumpLinkEdit(std::unique_ptr<MachOYAML::Object> &Y) {
More information about the llvm-commits
mailing list