10b57cec5SDimitry Andric //===- MachOYAML.h - Mach-O YAMLIO implementation ---------------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric ///
90b57cec5SDimitry Andric /// \file
100b57cec5SDimitry Andric /// This file declares classes for handling the YAML representation
110b57cec5SDimitry Andric /// of Mach-O.
120b57cec5SDimitry Andric ///
130b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
140b57cec5SDimitry Andric 
150b57cec5SDimitry Andric #ifndef LLVM_OBJECTYAML_MACHOYAML_H
160b57cec5SDimitry Andric #define LLVM_OBJECTYAML_MACHOYAML_H
170b57cec5SDimitry Andric 
180b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h"
190b57cec5SDimitry Andric #include "llvm/BinaryFormat/MachO.h"
200b57cec5SDimitry Andric #include "llvm/ObjectYAML/DWARFYAML.h"
218bcb0991SDimitry Andric #include "llvm/ObjectYAML/YAML.h"
220b57cec5SDimitry Andric #include "llvm/Support/YAMLTraits.h"
230b57cec5SDimitry Andric #include <cstdint>
24bdd1243dSDimitry Andric #include <optional>
250b57cec5SDimitry Andric #include <string>
260b57cec5SDimitry Andric #include <vector>
270b57cec5SDimitry Andric 
280b57cec5SDimitry Andric namespace llvm {
290b57cec5SDimitry Andric namespace MachOYAML {
300b57cec5SDimitry Andric 
315ffd83dbSDimitry Andric struct Relocation {
325ffd83dbSDimitry Andric   // Offset in the section to what is being relocated.
335ffd83dbSDimitry Andric   llvm::yaml::Hex32 address;
345ffd83dbSDimitry Andric   // Symbol index if r_extern == 1 else section index.
355ffd83dbSDimitry Andric   uint32_t symbolnum;
365ffd83dbSDimitry Andric   bool is_pcrel;
375ffd83dbSDimitry Andric   // Real length = 2 ^ length.
385ffd83dbSDimitry Andric   uint8_t length;
395ffd83dbSDimitry Andric   bool is_extern;
405ffd83dbSDimitry Andric   uint8_t type;
415ffd83dbSDimitry Andric   bool is_scattered;
425ffd83dbSDimitry Andric   int32_t value;
435ffd83dbSDimitry Andric };
445ffd83dbSDimitry Andric 
450b57cec5SDimitry Andric struct Section {
460b57cec5SDimitry Andric   char sectname[16];
470b57cec5SDimitry Andric   char segname[16];
480b57cec5SDimitry Andric   llvm::yaml::Hex64 addr;
490b57cec5SDimitry Andric   uint64_t size;
500b57cec5SDimitry Andric   llvm::yaml::Hex32 offset;
510b57cec5SDimitry Andric   uint32_t align;
520b57cec5SDimitry Andric   llvm::yaml::Hex32 reloff;
530b57cec5SDimitry Andric   uint32_t nreloc;
540b57cec5SDimitry Andric   llvm::yaml::Hex32 flags;
550b57cec5SDimitry Andric   llvm::yaml::Hex32 reserved1;
560b57cec5SDimitry Andric   llvm::yaml::Hex32 reserved2;
570b57cec5SDimitry Andric   llvm::yaml::Hex32 reserved3;
58bdd1243dSDimitry Andric   std::optional<llvm::yaml::BinaryRef> content;
595ffd83dbSDimitry Andric   std::vector<Relocation> relocations;
600b57cec5SDimitry Andric };
610b57cec5SDimitry Andric 
620b57cec5SDimitry Andric struct FileHeader {
630b57cec5SDimitry Andric   llvm::yaml::Hex32 magic;
640b57cec5SDimitry Andric   llvm::yaml::Hex32 cputype;
650b57cec5SDimitry Andric   llvm::yaml::Hex32 cpusubtype;
660b57cec5SDimitry Andric   llvm::yaml::Hex32 filetype;
670b57cec5SDimitry Andric   uint32_t ncmds;
680b57cec5SDimitry Andric   uint32_t sizeofcmds;
690b57cec5SDimitry Andric   llvm::yaml::Hex32 flags;
700b57cec5SDimitry Andric   llvm::yaml::Hex32 reserved;
710b57cec5SDimitry Andric };
720b57cec5SDimitry Andric 
730b57cec5SDimitry Andric struct LoadCommand {
740b57cec5SDimitry Andric   virtual ~LoadCommand();
750b57cec5SDimitry Andric 
760b57cec5SDimitry Andric   llvm::MachO::macho_load_command Data;
770b57cec5SDimitry Andric   std::vector<Section> Sections;
780b57cec5SDimitry Andric   std::vector<MachO::build_tool_version> Tools;
790b57cec5SDimitry Andric   std::vector<llvm::yaml::Hex8> PayloadBytes;
80fe6060f1SDimitry Andric   std::string Content;
810b57cec5SDimitry Andric   uint64_t ZeroPadBytes;
820b57cec5SDimitry Andric };
830b57cec5SDimitry Andric 
840b57cec5SDimitry Andric struct NListEntry {
850b57cec5SDimitry Andric   uint32_t n_strx;
860b57cec5SDimitry Andric   llvm::yaml::Hex8 n_type;
870b57cec5SDimitry Andric   uint8_t n_sect;
880b57cec5SDimitry Andric   uint16_t n_desc;
890b57cec5SDimitry Andric   uint64_t n_value;
900b57cec5SDimitry Andric };
910b57cec5SDimitry Andric 
920b57cec5SDimitry Andric struct RebaseOpcode {
930b57cec5SDimitry Andric   MachO::RebaseOpcode Opcode;
940b57cec5SDimitry Andric   uint8_t Imm;
950b57cec5SDimitry Andric   std::vector<yaml::Hex64> ExtraData;
960b57cec5SDimitry Andric };
970b57cec5SDimitry Andric 
980b57cec5SDimitry Andric struct BindOpcode {
990b57cec5SDimitry Andric   MachO::BindOpcode Opcode;
1000b57cec5SDimitry Andric   uint8_t Imm;
1010b57cec5SDimitry Andric   std::vector<yaml::Hex64> ULEBExtraData;
1020b57cec5SDimitry Andric   std::vector<int64_t> SLEBExtraData;
1030b57cec5SDimitry Andric   StringRef Symbol;
1040b57cec5SDimitry Andric };
1050b57cec5SDimitry Andric 
1060b57cec5SDimitry Andric struct ExportEntry {
1070b57cec5SDimitry Andric   uint64_t TerminalSize = 0;
1080b57cec5SDimitry Andric   uint64_t NodeOffset = 0;
1090b57cec5SDimitry Andric   std::string Name;
1100b57cec5SDimitry Andric   llvm::yaml::Hex64 Flags = 0;
1110b57cec5SDimitry Andric   llvm::yaml::Hex64 Address = 0;
1120b57cec5SDimitry Andric   llvm::yaml::Hex64 Other = 0;
1130b57cec5SDimitry Andric   std::string ImportName;
1140b57cec5SDimitry Andric   std::vector<MachOYAML::ExportEntry> Children;
1150b57cec5SDimitry Andric };
1160b57cec5SDimitry Andric 
117bdd1243dSDimitry Andric struct DataInCodeEntry {
118bdd1243dSDimitry Andric   llvm::yaml::Hex32 Offset;
119bdd1243dSDimitry Andric   uint16_t Length;
120bdd1243dSDimitry Andric   llvm::yaml::Hex16 Kind;
121bdd1243dSDimitry Andric };
122bdd1243dSDimitry Andric 
1230b57cec5SDimitry Andric struct LinkEditData {
1240b57cec5SDimitry Andric   std::vector<MachOYAML::RebaseOpcode> RebaseOpcodes;
1250b57cec5SDimitry Andric   std::vector<MachOYAML::BindOpcode> BindOpcodes;
1260b57cec5SDimitry Andric   std::vector<MachOYAML::BindOpcode> WeakBindOpcodes;
1270b57cec5SDimitry Andric   std::vector<MachOYAML::BindOpcode> LazyBindOpcodes;
1280b57cec5SDimitry Andric   MachOYAML::ExportEntry ExportTrie;
1290b57cec5SDimitry Andric   std::vector<NListEntry> NameList;
1300b57cec5SDimitry Andric   std::vector<StringRef> StringTable;
1314824e7fdSDimitry Andric   std::vector<yaml::Hex32> IndirectSymbols;
13281ad6265SDimitry Andric   std::vector<yaml::Hex64> FunctionStarts;
133bdd1243dSDimitry Andric   std::vector<DataInCodeEntry> DataInCode;
134bdd1243dSDimitry Andric   std::vector<yaml::Hex8> ChainedFixups;
1350b57cec5SDimitry Andric 
1360b57cec5SDimitry Andric   bool isEmpty() const;
1370b57cec5SDimitry Andric };
1380b57cec5SDimitry Andric 
1390b57cec5SDimitry Andric struct Object {
1400b57cec5SDimitry Andric   bool IsLittleEndian;
1410b57cec5SDimitry Andric   FileHeader Header;
1420b57cec5SDimitry Andric   std::vector<LoadCommand> LoadCommands;
1430b57cec5SDimitry Andric   std::vector<Section> Sections;
1440b57cec5SDimitry Andric   LinkEditData LinkEdit;
145bdd1243dSDimitry Andric   std::optional<llvm::yaml::BinaryRef> RawLinkEditSegment;
1460b57cec5SDimitry Andric   DWARFYAML::Data DWARF;
1470b57cec5SDimitry Andric };
1480b57cec5SDimitry Andric 
1490b57cec5SDimitry Andric struct FatHeader {
1500b57cec5SDimitry Andric   llvm::yaml::Hex32 magic;
1510b57cec5SDimitry Andric   uint32_t nfat_arch;
1520b57cec5SDimitry Andric };
1530b57cec5SDimitry Andric 
1540b57cec5SDimitry Andric struct FatArch {
1550b57cec5SDimitry Andric   llvm::yaml::Hex32 cputype;
1560b57cec5SDimitry Andric   llvm::yaml::Hex32 cpusubtype;
1570b57cec5SDimitry Andric   llvm::yaml::Hex64 offset;
1580b57cec5SDimitry Andric   uint64_t size;
1590b57cec5SDimitry Andric   uint32_t align;
1600b57cec5SDimitry Andric   llvm::yaml::Hex32 reserved;
1610b57cec5SDimitry Andric };
1620b57cec5SDimitry Andric 
1630b57cec5SDimitry Andric struct UniversalBinary {
1640b57cec5SDimitry Andric   FatHeader Header;
1650b57cec5SDimitry Andric   std::vector<FatArch> FatArchs;
1660b57cec5SDimitry Andric   std::vector<Object> Slices;
1670b57cec5SDimitry Andric };
1680b57cec5SDimitry Andric 
1690b57cec5SDimitry Andric } // end namespace MachOYAML
1700b57cec5SDimitry Andric } // end namespace llvm
1710b57cec5SDimitry Andric 
1720b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::LoadCommand)
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::Relocation)1735ffd83dbSDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::Relocation)
1740b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::Section)
1750b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::RebaseOpcode)
1760b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::BindOpcode)
1770b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::ExportEntry)
1780b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::NListEntry)
1790b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::Object)
1800b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::FatArch)
181bdd1243dSDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::DataInCodeEntry)
1820b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachO::build_tool_version)
1830b57cec5SDimitry Andric 
1840b57cec5SDimitry Andric namespace llvm {
1850b57cec5SDimitry Andric 
1860b57cec5SDimitry Andric class raw_ostream;
1870b57cec5SDimitry Andric 
1880b57cec5SDimitry Andric namespace yaml {
1890b57cec5SDimitry Andric 
1900b57cec5SDimitry Andric template <> struct MappingTraits<MachOYAML::FileHeader> {
1910b57cec5SDimitry Andric   static void mapping(IO &IO, MachOYAML::FileHeader &FileHeader);
1920b57cec5SDimitry Andric };
1930b57cec5SDimitry Andric 
1940b57cec5SDimitry Andric template <> struct MappingTraits<MachOYAML::Object> {
1950b57cec5SDimitry Andric   static void mapping(IO &IO, MachOYAML::Object &Object);
1960b57cec5SDimitry Andric };
1970b57cec5SDimitry Andric 
1980b57cec5SDimitry Andric template <> struct MappingTraits<MachOYAML::FatHeader> {
1990b57cec5SDimitry Andric   static void mapping(IO &IO, MachOYAML::FatHeader &FatHeader);
2000b57cec5SDimitry Andric };
2010b57cec5SDimitry Andric 
2020b57cec5SDimitry Andric template <> struct MappingTraits<MachOYAML::FatArch> {
2030b57cec5SDimitry Andric   static void mapping(IO &IO, MachOYAML::FatArch &FatArch);
2040b57cec5SDimitry Andric };
2050b57cec5SDimitry Andric 
2060b57cec5SDimitry Andric template <> struct MappingTraits<MachOYAML::UniversalBinary> {
2070b57cec5SDimitry Andric   static void mapping(IO &IO, MachOYAML::UniversalBinary &UniversalBinary);
2080b57cec5SDimitry Andric };
2090b57cec5SDimitry Andric 
2100b57cec5SDimitry Andric template <> struct MappingTraits<MachOYAML::LoadCommand> {
2110b57cec5SDimitry Andric   static void mapping(IO &IO, MachOYAML::LoadCommand &LoadCommand);
2120b57cec5SDimitry Andric };
2130b57cec5SDimitry Andric 
2140b57cec5SDimitry Andric template <> struct MappingTraits<MachOYAML::LinkEditData> {
2150b57cec5SDimitry Andric   static void mapping(IO &IO, MachOYAML::LinkEditData &LinkEditData);
2160b57cec5SDimitry Andric };
2170b57cec5SDimitry Andric 
2180b57cec5SDimitry Andric template <> struct MappingTraits<MachOYAML::RebaseOpcode> {
2190b57cec5SDimitry Andric   static void mapping(IO &IO, MachOYAML::RebaseOpcode &RebaseOpcode);
2200b57cec5SDimitry Andric };
2210b57cec5SDimitry Andric 
2220b57cec5SDimitry Andric template <> struct MappingTraits<MachOYAML::BindOpcode> {
2230b57cec5SDimitry Andric   static void mapping(IO &IO, MachOYAML::BindOpcode &BindOpcode);
2240b57cec5SDimitry Andric };
2250b57cec5SDimitry Andric 
2260b57cec5SDimitry Andric template <> struct MappingTraits<MachOYAML::ExportEntry> {
2270b57cec5SDimitry Andric   static void mapping(IO &IO, MachOYAML::ExportEntry &ExportEntry);
2280b57cec5SDimitry Andric };
2290b57cec5SDimitry Andric 
2305ffd83dbSDimitry Andric template <> struct MappingTraits<MachOYAML::Relocation> {
2315ffd83dbSDimitry Andric   static void mapping(IO &IO, MachOYAML::Relocation &R);
2325ffd83dbSDimitry Andric };
2335ffd83dbSDimitry Andric 
2340b57cec5SDimitry Andric template <> struct MappingTraits<MachOYAML::Section> {
2350b57cec5SDimitry Andric   static void mapping(IO &IO, MachOYAML::Section &Section);
236e8d8bef9SDimitry Andric   static std::string validate(IO &io, MachOYAML::Section &Section);
2370b57cec5SDimitry Andric };
2380b57cec5SDimitry Andric 
2390b57cec5SDimitry Andric template <> struct MappingTraits<MachOYAML::NListEntry> {
2400b57cec5SDimitry Andric   static void mapping(IO &IO, MachOYAML::NListEntry &NListEntry);
2410b57cec5SDimitry Andric };
2420b57cec5SDimitry Andric 
2430b57cec5SDimitry Andric template <> struct MappingTraits<MachO::build_tool_version> {
2440b57cec5SDimitry Andric   static void mapping(IO &IO, MachO::build_tool_version &tool);
2450b57cec5SDimitry Andric };
2460b57cec5SDimitry Andric 
247bdd1243dSDimitry Andric template <> struct MappingTraits<MachOYAML::DataInCodeEntry> {
248bdd1243dSDimitry Andric   static void mapping(IO &IO, MachOYAML::DataInCodeEntry &DataInCodeEntry);
249bdd1243dSDimitry Andric };
250bdd1243dSDimitry Andric 
2510b57cec5SDimitry Andric #define HANDLE_LOAD_COMMAND(LCName, LCValue, LCStruct)                         \
2520b57cec5SDimitry Andric   io.enumCase(value, #LCName, MachO::LCName);
2530b57cec5SDimitry Andric 
2540b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<MachO::LoadCommandType> {
2550b57cec5SDimitry Andric   static void enumeration(IO &io, MachO::LoadCommandType &value) {
2560b57cec5SDimitry Andric #include "llvm/BinaryFormat/MachO.def"
2570b57cec5SDimitry Andric     io.enumFallback<Hex32>(value);
2580b57cec5SDimitry Andric   }
2590b57cec5SDimitry Andric };
2600b57cec5SDimitry Andric 
2610b57cec5SDimitry Andric #define ENUM_CASE(Enum) io.enumCase(value, #Enum, MachO::Enum);
2620b57cec5SDimitry Andric 
2630b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<MachO::RebaseOpcode> {
2640b57cec5SDimitry Andric   static void enumeration(IO &io, MachO::RebaseOpcode &value) {
2650b57cec5SDimitry Andric     ENUM_CASE(REBASE_OPCODE_DONE)
2660b57cec5SDimitry Andric     ENUM_CASE(REBASE_OPCODE_SET_TYPE_IMM)
2670b57cec5SDimitry Andric     ENUM_CASE(REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB)
2680b57cec5SDimitry Andric     ENUM_CASE(REBASE_OPCODE_ADD_ADDR_ULEB)
2690b57cec5SDimitry Andric     ENUM_CASE(REBASE_OPCODE_ADD_ADDR_IMM_SCALED)
2700b57cec5SDimitry Andric     ENUM_CASE(REBASE_OPCODE_DO_REBASE_IMM_TIMES)
2710b57cec5SDimitry Andric     ENUM_CASE(REBASE_OPCODE_DO_REBASE_ULEB_TIMES)
2720b57cec5SDimitry Andric     ENUM_CASE(REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB)
2730b57cec5SDimitry Andric     ENUM_CASE(REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB)
2740b57cec5SDimitry Andric     io.enumFallback<Hex8>(value);
2750b57cec5SDimitry Andric   }
2760b57cec5SDimitry Andric };
2770b57cec5SDimitry Andric 
2780b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<MachO::BindOpcode> {
2790b57cec5SDimitry Andric   static void enumeration(IO &io, MachO::BindOpcode &value) {
2800b57cec5SDimitry Andric     ENUM_CASE(BIND_OPCODE_DONE)
2810b57cec5SDimitry Andric     ENUM_CASE(BIND_OPCODE_SET_DYLIB_ORDINAL_IMM)
2820b57cec5SDimitry Andric     ENUM_CASE(BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB)
2830b57cec5SDimitry Andric     ENUM_CASE(BIND_OPCODE_SET_DYLIB_SPECIAL_IMM)
2840b57cec5SDimitry Andric     ENUM_CASE(BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM)
2850b57cec5SDimitry Andric     ENUM_CASE(BIND_OPCODE_SET_TYPE_IMM)
2860b57cec5SDimitry Andric     ENUM_CASE(BIND_OPCODE_SET_ADDEND_SLEB)
2870b57cec5SDimitry Andric     ENUM_CASE(BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB)
2880b57cec5SDimitry Andric     ENUM_CASE(BIND_OPCODE_ADD_ADDR_ULEB)
2890b57cec5SDimitry Andric     ENUM_CASE(BIND_OPCODE_DO_BIND)
2900b57cec5SDimitry Andric     ENUM_CASE(BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB)
2910b57cec5SDimitry Andric     ENUM_CASE(BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED)
2920b57cec5SDimitry Andric     ENUM_CASE(BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB)
2930b57cec5SDimitry Andric     io.enumFallback<Hex8>(value);
2940b57cec5SDimitry Andric   }
2950b57cec5SDimitry Andric };
2960b57cec5SDimitry Andric 
2970b57cec5SDimitry Andric // This trait is used for 16-byte chars in Mach structures used for strings
2980b57cec5SDimitry Andric using char_16 = char[16];
2990b57cec5SDimitry Andric 
3000b57cec5SDimitry Andric template <> struct ScalarTraits<char_16> {
3010b57cec5SDimitry Andric   static void output(const char_16 &Val, void *, raw_ostream &Out);
3020b57cec5SDimitry Andric   static StringRef input(StringRef Scalar, void *, char_16 &Val);
3030b57cec5SDimitry Andric   static QuotingType mustQuote(StringRef S);
3040b57cec5SDimitry Andric };
3050b57cec5SDimitry Andric 
3060b57cec5SDimitry Andric // This trait is used for UUIDs. It reads and writes them matching otool's
3070b57cec5SDimitry Andric // formatting style.
3080b57cec5SDimitry Andric using uuid_t = raw_ostream::uuid_t;
3090b57cec5SDimitry Andric 
3100b57cec5SDimitry Andric template <> struct ScalarTraits<uuid_t> {
3110b57cec5SDimitry Andric   static void output(const uuid_t &Val, void *, raw_ostream &Out);
3120b57cec5SDimitry Andric   static StringRef input(StringRef Scalar, void *, uuid_t &Val);
3130b57cec5SDimitry Andric   static QuotingType mustQuote(StringRef S);
3140b57cec5SDimitry Andric };
3150b57cec5SDimitry Andric 
3160b57cec5SDimitry Andric // Load Command struct mapping traits
3170b57cec5SDimitry Andric 
3180b57cec5SDimitry Andric #define LOAD_COMMAND_STRUCT(LCStruct)                                          \
3190b57cec5SDimitry Andric   template <> struct MappingTraits<MachO::LCStruct> {                          \
3200b57cec5SDimitry Andric     static void mapping(IO &IO, MachO::LCStruct &LoadCommand);                 \
3210b57cec5SDimitry Andric   };
3220b57cec5SDimitry Andric 
3230b57cec5SDimitry Andric #include "llvm/BinaryFormat/MachO.def"
3240b57cec5SDimitry Andric 
3250b57cec5SDimitry Andric // Extra structures used by load commands
3260b57cec5SDimitry Andric template <> struct MappingTraits<MachO::dylib> {
3270b57cec5SDimitry Andric   static void mapping(IO &IO, MachO::dylib &LoadCommand);
3280b57cec5SDimitry Andric };
3290b57cec5SDimitry Andric 
3300b57cec5SDimitry Andric template <> struct MappingTraits<MachO::fvmlib> {
3310b57cec5SDimitry Andric   static void mapping(IO &IO, MachO::fvmlib &LoadCommand);
3320b57cec5SDimitry Andric };
3330b57cec5SDimitry Andric 
3340b57cec5SDimitry Andric template <> struct MappingTraits<MachO::section> {
3350b57cec5SDimitry Andric   static void mapping(IO &IO, MachO::section &LoadCommand);
3360b57cec5SDimitry Andric };
3370b57cec5SDimitry Andric 
3380b57cec5SDimitry Andric template <> struct MappingTraits<MachO::section_64> {
3390b57cec5SDimitry Andric   static void mapping(IO &IO, MachO::section_64 &LoadCommand);
3400b57cec5SDimitry Andric };
3410b57cec5SDimitry Andric 
3420b57cec5SDimitry Andric } // end namespace yaml
3430b57cec5SDimitry Andric 
3440b57cec5SDimitry Andric } // end namespace llvm
3450b57cec5SDimitry Andric 
3460b57cec5SDimitry Andric #endif // LLVM_OBJECTYAML_MACHOYAML_H
347