1de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===- MachOYAML.h - Mach-O YAMLIO implementation ---------------*- C++ -*-===//
2de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
3de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//                     The LLVM Compiler Infrastructure
4de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
5de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source
6de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// License. See LICENSE.TXT for details.
7de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
8de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===//
9de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar///
10de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// \file
11de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// \brief This file declares classes for handling the YAML representation
12de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// of Mach-O.
13de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar///
14de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===//
15de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
16de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#ifndef LLVM_OBJECTYAML_MACHOYAML_H
17de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#define LLVM_OBJECTYAML_MACHOYAML_H
18de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
19de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ObjectYAML/YAML.h"
20de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/MachO.h"
21de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
22de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace llvm {
23de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace MachOYAML {
24de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
25de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct Section {
26de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  char sectname[16];
27de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  char segname[16];
28de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  llvm::yaml::Hex64 addr;
29de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint64_t size;
30de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  llvm::yaml::Hex32 offset;
31de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t align;
32de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  llvm::yaml::Hex32 reloff;
33de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t nreloc;
34de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  llvm::yaml::Hex32 flags;
35de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  llvm::yaml::Hex32 reserved1;
36de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  llvm::yaml::Hex32 reserved2;
37de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  llvm::yaml::Hex32 reserved3;
38de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
39de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
40de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct FileHeader {
41de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  llvm::yaml::Hex32 magic;
42de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  llvm::yaml::Hex32 cputype;
43de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  llvm::yaml::Hex32 cpusubtype;
44de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  llvm::yaml::Hex32 filetype;
45de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t ncmds;
46de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t sizeofcmds;
47de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  llvm::yaml::Hex32 flags;
48de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  llvm::yaml::Hex32 reserved;
49de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
50de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
51de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct LoadCommand {
52de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  virtual ~LoadCommand();
53de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  llvm::MachO::macho_load_command Data;
54de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::vector<Section> Sections;
55de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::vector<llvm::yaml::Hex8> PayloadBytes;
56de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::string PayloadString;
57de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint64_t ZeroPadBytes;
58de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
59de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
60de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct NListEntry {
61de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t n_strx;
62de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint8_t n_type;
63de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint8_t n_sect;
64de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint16_t n_desc;
65de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint64_t n_value;
66de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
67de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct RebaseOpcode {
68de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  MachO::RebaseOpcode Opcode;
69de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint8_t Imm;
70de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::vector<yaml::Hex64> ExtraData;
71de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
72de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
73de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct BindOpcode {
74de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  MachO::BindOpcode Opcode;
75de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint8_t Imm;
76de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::vector<yaml::Hex64> ULEBExtraData;
77de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::vector<int64_t> SLEBExtraData;
78de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Symbol;
79de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
80de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
81de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct ExportEntry {
82de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ExportEntry()
83de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : TerminalSize(0), NodeOffset(0), Name(), Flags(0), Address(0), Other(0),
84de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        ImportName(), Children() {}
85de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint64_t TerminalSize;
86de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint64_t NodeOffset;
87de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::string Name;
88de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  llvm::yaml::Hex64 Flags;
89de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  llvm::yaml::Hex64 Address;
90de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  llvm::yaml::Hex64 Other;
91de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::string ImportName;
92de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::vector<MachOYAML::ExportEntry> Children;
93de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
94de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
95de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct LinkEditData {
96de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::vector<MachOYAML::RebaseOpcode> RebaseOpcodes;
97de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::vector<MachOYAML::BindOpcode> BindOpcodes;
98de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::vector<MachOYAML::BindOpcode> WeakBindOpcodes;
99de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::vector<MachOYAML::BindOpcode> LazyBindOpcodes;
100de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  MachOYAML::ExportEntry ExportTrie;
101de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::vector<NListEntry> NameList;
102de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::vector<StringRef> StringTable;
103de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
104de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
105de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct Object {
106de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  FileHeader Header;
107de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::vector<LoadCommand> LoadCommands;
108de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::vector<Section> Sections;
109de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LinkEditData LinkEdit;
110de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
111de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
112de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct FatHeader {
113de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  llvm::yaml::Hex32 magic;
114de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t nfat_arch;
115de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
116de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
117de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct FatArch {
118de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  llvm::yaml::Hex32 cputype;
119de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  llvm::yaml::Hex32 cpusubtype;
120de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  llvm::yaml::Hex64 offset;
121de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint64_t size;
122de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t align;
123de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  llvm::yaml::Hex32 reserved;
124de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
125de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
126de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct UniversalBinary {
127de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  FatHeader Header;
128de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::vector<FatArch> FatArchs;
129de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::vector<Object> Slices;
130de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
131de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
132de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} // namespace llvm::MachOYAML
133de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} // namespace llvm
134de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
135de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarLLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::LoadCommand)
136de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarLLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::Section)
137de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarLLVM_YAML_IS_SEQUENCE_VECTOR(llvm::yaml::Hex8)
138de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarLLVM_YAML_IS_SEQUENCE_VECTOR(llvm::yaml::Hex64)
139de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarLLVM_YAML_IS_SEQUENCE_VECTOR(int64_t)
140de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarLLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::RebaseOpcode)
141de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarLLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::BindOpcode)
142de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarLLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::ExportEntry)
143de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarLLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::NListEntry)
144de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarLLVM_YAML_IS_SEQUENCE_VECTOR(llvm::StringRef)
145de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarLLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::Object)
146de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarLLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::FatArch)
147de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
148de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace llvm {
149de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace yaml {
150de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
151de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <> struct MappingTraits<MachOYAML::FileHeader> {
152de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static void mapping(IO &IO, MachOYAML::FileHeader &FileHeader);
153de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
154de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
155de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <> struct MappingTraits<MachOYAML::Object> {
156de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static void mapping(IO &IO, MachOYAML::Object &Object);
157de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
158de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
159de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <> struct MappingTraits<MachOYAML::FatHeader> {
160de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static void mapping(IO &IO, MachOYAML::FatHeader &FatHeader);
161de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
162de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
163de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <> struct MappingTraits<MachOYAML::FatArch> {
164de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static void mapping(IO &IO, MachOYAML::FatArch &FatArch);
165de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
166de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
167de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <> struct MappingTraits<MachOYAML::UniversalBinary> {
168de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static void mapping(IO &IO, MachOYAML::UniversalBinary &UniversalBinary);
169de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
170de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
171de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <> struct MappingTraits<MachOYAML::LoadCommand> {
172de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static void mapping(IO &IO, MachOYAML::LoadCommand &LoadCommand);
173de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
174de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
175de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <> struct MappingTraits<MachOYAML::LinkEditData> {
176de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static void mapping(IO &IO, MachOYAML::LinkEditData &LinkEditData);
177de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
178de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
179de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <> struct MappingTraits<MachOYAML::RebaseOpcode> {
180de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static void mapping(IO &IO, MachOYAML::RebaseOpcode &RebaseOpcode);
181de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
182de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
183de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <> struct MappingTraits<MachOYAML::BindOpcode> {
184de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static void mapping(IO &IO, MachOYAML::BindOpcode &BindOpcode);
185de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
186de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
187de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <> struct MappingTraits<MachOYAML::ExportEntry> {
188de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static void mapping(IO &IO, MachOYAML::ExportEntry &ExportEntry);
189de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
190de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
191de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <> struct MappingTraits<MachOYAML::Section> {
192de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static void mapping(IO &IO, MachOYAML::Section &Section);
193de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
194de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
195de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <> struct MappingTraits<MachOYAML::NListEntry> {
196de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static void mapping(IO &IO, MachOYAML::NListEntry &NListEntry);
197de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
198de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
199de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#define HANDLE_LOAD_COMMAND(LCName, LCValue, LCStruct)                         \
200de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  io.enumCase(value, #LCName, MachO::LCName);
201de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
202de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <> struct ScalarEnumerationTraits<MachO::LoadCommandType> {
203de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static void enumeration(IO &io, MachO::LoadCommandType &value) {
204de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/MachO.def"
205de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    io.enumFallback<Hex32>(value);
206de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
207de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
208de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
209de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#define ENUM_CASE(Enum) io.enumCase(value, #Enum, MachO::Enum);
210de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
211de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <> struct ScalarEnumerationTraits<MachO::RebaseOpcode> {
212de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static void enumeration(IO &io, MachO::RebaseOpcode &value) {
213de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ENUM_CASE(REBASE_OPCODE_DONE)
214de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ENUM_CASE(REBASE_OPCODE_SET_TYPE_IMM)
215de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ENUM_CASE(REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB)
216de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ENUM_CASE(REBASE_OPCODE_ADD_ADDR_ULEB)
217de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ENUM_CASE(REBASE_OPCODE_ADD_ADDR_IMM_SCALED)
218de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ENUM_CASE(REBASE_OPCODE_DO_REBASE_IMM_TIMES)
219de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ENUM_CASE(REBASE_OPCODE_DO_REBASE_ULEB_TIMES)
220de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ENUM_CASE(REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB)
221de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ENUM_CASE(REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB)
222de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    io.enumFallback<Hex8>(value);
223de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
224de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
225de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
226de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <> struct ScalarEnumerationTraits<MachO::BindOpcode> {
227de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static void enumeration(IO &io, MachO::BindOpcode &value) {
228de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ENUM_CASE(BIND_OPCODE_DONE)
229de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ENUM_CASE(BIND_OPCODE_SET_DYLIB_ORDINAL_IMM)
230de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ENUM_CASE(BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB)
231de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ENUM_CASE(BIND_OPCODE_SET_DYLIB_SPECIAL_IMM)
232de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ENUM_CASE(BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM)
233de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ENUM_CASE(BIND_OPCODE_SET_TYPE_IMM)
234de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ENUM_CASE(BIND_OPCODE_SET_ADDEND_SLEB)
235de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ENUM_CASE(BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB)
236de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ENUM_CASE(BIND_OPCODE_ADD_ADDR_ULEB)
237de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ENUM_CASE(BIND_OPCODE_DO_BIND)
238de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ENUM_CASE(BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB)
239de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ENUM_CASE(BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED)
240de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ENUM_CASE(BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB)
241de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    io.enumFallback<Hex8>(value);
242de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
243de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
244de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
245de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// This trait is used for 16-byte chars in Mach structures used for strings
246de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartypedef char char_16[16];
247de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
248de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <> struct ScalarTraits<char_16> {
249de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static void output(const char_16 &Val, void *, llvm::raw_ostream &Out);
250de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
251de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static StringRef input(StringRef Scalar, void *, char_16 &Val);
252de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static bool mustQuote(StringRef S);
253de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
254de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
255de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// This trait is used for UUIDs. It reads and writes them matching otool's
256de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// formatting style.
257de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartypedef uint8_t uuid_t[16];
258de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
259de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <> struct ScalarTraits<uuid_t> {
260de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static void output(const uuid_t &Val, void *, llvm::raw_ostream &Out);
261de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
262de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static StringRef input(StringRef Scalar, void *, uuid_t &Val);
263de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static bool mustQuote(StringRef S);
264de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
265de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
266de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// Load Command struct mapping traits
267de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
268de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#define LOAD_COMMAND_STRUCT(LCStruct)                                          \
269de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  template <> struct MappingTraits<MachO::LCStruct> {                          \
270de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    static void mapping(IO &IO, MachO::LCStruct &LoadCommand);                 \
271de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
272de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
273de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/MachO.def"
274de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
275de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// Extra structures used by load commands
276de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <> struct MappingTraits<MachO::dylib> {
277de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static void mapping(IO &IO, MachO::dylib &LoadCommand);
278de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
279de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
280de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <> struct MappingTraits<MachO::fvmlib> {
281de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static void mapping(IO &IO, MachO::fvmlib &LoadCommand);
282de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
283de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
284de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <> struct MappingTraits<MachO::section> {
285de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static void mapping(IO &IO, MachO::section &LoadCommand);
286de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
287de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
288de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <> struct MappingTraits<MachO::section_64> {
289de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static void mapping(IO &IO, MachO::section_64 &LoadCommand);
290de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
291de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
292de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} // namespace llvm::yaml
293de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
294de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} // namespace llvm
295de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
296de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#endif
297