summaryrefslogtreecommitdiffstats
path: root/llvm/lib/ObjectYAML/MachOYAML.cpp
diff options
context:
space:
mode:
authorChris Bieneman <beanz@apple.com>2016-06-24 20:42:28 +0000
committerChris Bieneman <beanz@apple.com>2016-06-24 20:42:28 +0000
commit93e711938050e35f5275a1b36fae25226c25fc63 (patch)
tree92e6e7e0739f0c986b8d7c821aa0b374ce1a0f0c /llvm/lib/ObjectYAML/MachOYAML.cpp
parent2e6d2d48205f272c39a50ae93ae4c700888e11e3 (diff)
downloadbcm5719-llvm-93e711938050e35f5275a1b36fae25226c25fc63.tar.gz
bcm5719-llvm-93e711938050e35f5275a1b36fae25226c25fc63.zip
[obj2yaml] [yaml2obj] Support for MachO Universal binaries
This patch adds round-trip support for MachO Universal binaries to obj2yaml and yaml2obj. Universal binaries have a header and list of architecture structures, followed by a the individual object files at specified offsets. llvm-svn: 273719
Diffstat (limited to 'llvm/lib/ObjectYAML/MachOYAML.cpp')
-rw-r--r--llvm/lib/ObjectYAML/MachOYAML.cpp63
1 files changed, 62 insertions, 1 deletions
diff --git a/llvm/lib/ObjectYAML/MachOYAML.cpp b/llvm/lib/ObjectYAML/MachOYAML.cpp
index 890bc039956..15ff4efb5c3 100644
--- a/llvm/lib/ObjectYAML/MachOYAML.cpp
+++ b/llvm/lib/ObjectYAML/MachOYAML.cpp
@@ -96,7 +96,68 @@ void MappingTraits<MachOYAML::Object>::mapping(IO &IO,
IO.mapRequired("FileHeader", Object.Header);
IO.mapOptional("LoadCommands", Object.LoadCommands);
IO.mapOptional("LinkEditData", Object.LinkEdit);
- IO.setContext(nullptr);
+
+ if (IO.getContext() == &Object)
+ IO.setContext(nullptr);
+}
+
+void MappingTraits<MachOYAML::FatHeader>::mapping(
+ IO &IO, MachOYAML::FatHeader &FatHeader) {
+ IO.mapRequired("magic", FatHeader.magic);
+ IO.mapRequired("nfat_arch", FatHeader.nfat_arch);
+}
+
+void MappingTraits<MachOYAML::FatArch>::mapping(IO &IO,
+ MachOYAML::FatArch &FatArch) {
+ IO.mapRequired("cputype", FatArch.cputype);
+ IO.mapRequired("cpusubtype", FatArch.cpusubtype);
+ IO.mapRequired("offset", FatArch.offset);
+ IO.mapRequired("size", FatArch.size);
+ IO.mapRequired("align", FatArch.align);
+ IO.mapOptional("reserved", FatArch.reserved,
+ static_cast<llvm::yaml::Hex32>(0));
+}
+
+void MappingTraits<MachOYAML::UniversalBinary>::mapping(
+ IO &IO, MachOYAML::UniversalBinary &UniversalBinary) {
+ if (!IO.getContext()) {
+ IO.setContext(&UniversalBinary);
+ IO.mapTag("!fat-mach-o", true);
+ }
+ IO.mapRequired("FatHeader", UniversalBinary.Header);
+ IO.mapRequired("FatArchs", UniversalBinary.FatArchs);
+ IO.mapRequired("Slices", UniversalBinary.Slices);
+
+ if (IO.getContext() == &UniversalBinary)
+ IO.setContext(nullptr);
+}
+
+void MappingTraits<MachOYAML::MachFile>::mapping(
+ IO &IO, MachOYAML::MachFile &MachFile) {
+ if (!IO.getContext()) {
+ IO.setContext(&MachFile);
+ }
+ if (IO.outputting()) {
+ if (MachFile.isFat) {
+ IO.mapTag("!fat-mach-o", true);
+ MappingTraits<MachOYAML::UniversalBinary>::mapping(IO, MachFile.FatFile);
+ } else {
+ IO.mapTag("!mach-o", true);
+ MappingTraits<MachOYAML::Object>::mapping(IO, MachFile.ThinFile);
+ }
+ } else {
+ if (IO.mapTag("!fat-mach-o")) {
+ MachFile.isFat = true;
+ MappingTraits<MachOYAML::UniversalBinary>::mapping(IO, MachFile.FatFile);
+ } else if (IO.mapTag("!mach-o")) {
+ MachFile.isFat = false;
+ MappingTraits<MachOYAML::Object>::mapping(IO, MachFile.ThinFile);
+ } else {
+ assert(false && "No tag found in YAML, cannot identify file type!");
+ }
+ }
+ if (IO.getContext() == &MachFile)
+ IO.setContext(nullptr);
}
void MappingTraits<MachOYAML::LinkEditData>::mapping(
OpenPOWER on IntegriCloud