diff options
| author | Chris Bieneman <beanz@apple.com> | 2016-06-24 20:42:28 +0000 |
|---|---|---|
| committer | Chris Bieneman <beanz@apple.com> | 2016-06-24 20:42:28 +0000 |
| commit | 93e711938050e35f5275a1b36fae25226c25fc63 (patch) | |
| tree | 92e6e7e0739f0c986b8d7c821aa0b374ce1a0f0c /llvm/lib/ObjectYAML/MachOYAML.cpp | |
| parent | 2e6d2d48205f272c39a50ae93ae4c700888e11e3 (diff) | |
| download | bcm5719-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.cpp | 63 |
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( |

