1 //===- MachOYAML.h - Mach-O YAMLIO implementation ---------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
11 /// \brief This file declares classes for handling the YAML representation
14 //===----------------------------------------------------------------------===//
16 #ifndef LLVM_OBJECTYAML_MACHOYAML_H
17 #define LLVM_OBJECTYAML_MACHOYAML_H
19 #include "llvm/ObjectYAML/YAML.h"
20 #include "llvm/ObjectYAML/DWARFYAML.h"
21 #include "llvm/Support/MachO.h"
29 llvm::yaml::Hex64 addr;
31 llvm::yaml::Hex32 offset;
33 llvm::yaml::Hex32 reloff;
35 llvm::yaml::Hex32 flags;
36 llvm::yaml::Hex32 reserved1;
37 llvm::yaml::Hex32 reserved2;
38 llvm::yaml::Hex32 reserved3;
42 llvm::yaml::Hex32 magic;
43 llvm::yaml::Hex32 cputype;
44 llvm::yaml::Hex32 cpusubtype;
45 llvm::yaml::Hex32 filetype;
48 llvm::yaml::Hex32 flags;
49 llvm::yaml::Hex32 reserved;
53 virtual ~LoadCommand();
54 llvm::MachO::macho_load_command Data;
55 std::vector<Section> Sections;
56 std::vector<MachO::build_tool_version> Tools;
57 std::vector<llvm::yaml::Hex8> PayloadBytes;
58 std::string PayloadString;
59 uint64_t ZeroPadBytes;
64 llvm::yaml::Hex8 n_type;
70 MachO::RebaseOpcode Opcode;
72 std::vector<yaml::Hex64> ExtraData;
76 MachO::BindOpcode Opcode;
78 std::vector<yaml::Hex64> ULEBExtraData;
79 std::vector<int64_t> SLEBExtraData;
85 : TerminalSize(0), NodeOffset(0), Name(), Flags(0), Address(0), Other(0),
86 ImportName(), Children() {}
87 uint64_t TerminalSize;
90 llvm::yaml::Hex64 Flags;
91 llvm::yaml::Hex64 Address;
92 llvm::yaml::Hex64 Other;
93 std::string ImportName;
94 std::vector<MachOYAML::ExportEntry> Children;
98 std::vector<MachOYAML::RebaseOpcode> RebaseOpcodes;
99 std::vector<MachOYAML::BindOpcode> BindOpcodes;
100 std::vector<MachOYAML::BindOpcode> WeakBindOpcodes;
101 std::vector<MachOYAML::BindOpcode> LazyBindOpcodes;
102 MachOYAML::ExportEntry ExportTrie;
103 std::vector<NListEntry> NameList;
104 std::vector<StringRef> StringTable;
106 bool isEmpty() const;
112 std::vector<LoadCommand> LoadCommands;
113 std::vector<Section> Sections;
114 LinkEditData LinkEdit;
115 DWARFYAML::Data DWARF;
119 llvm::yaml::Hex32 magic;
124 llvm::yaml::Hex32 cputype;
125 llvm::yaml::Hex32 cpusubtype;
126 llvm::yaml::Hex64 offset;
129 llvm::yaml::Hex32 reserved;
132 struct UniversalBinary {
134 std::vector<FatArch> FatArchs;
135 std::vector<Object> Slices;
138 } // namespace llvm::MachOYAML
141 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::LoadCommand)
142 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::Section)
143 LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(int64_t)
144 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::RebaseOpcode)
145 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::BindOpcode)
146 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::ExportEntry)
147 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::NListEntry)
148 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::Object)
149 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::FatArch)
150 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachO::build_tool_version)
155 template <> struct MappingTraits<MachOYAML::FileHeader> {
156 static void mapping(IO &IO, MachOYAML::FileHeader &FileHeader);
159 template <> struct MappingTraits<MachOYAML::Object> {
160 static void mapping(IO &IO, MachOYAML::Object &Object);
163 template <> struct MappingTraits<MachOYAML::FatHeader> {
164 static void mapping(IO &IO, MachOYAML::FatHeader &FatHeader);
167 template <> struct MappingTraits<MachOYAML::FatArch> {
168 static void mapping(IO &IO, MachOYAML::FatArch &FatArch);
171 template <> struct MappingTraits<MachOYAML::UniversalBinary> {
172 static void mapping(IO &IO, MachOYAML::UniversalBinary &UniversalBinary);
175 template <> struct MappingTraits<MachOYAML::LoadCommand> {
176 static void mapping(IO &IO, MachOYAML::LoadCommand &LoadCommand);
179 template <> struct MappingTraits<MachOYAML::LinkEditData> {
180 static void mapping(IO &IO, MachOYAML::LinkEditData &LinkEditData);
183 template <> struct MappingTraits<MachOYAML::RebaseOpcode> {
184 static void mapping(IO &IO, MachOYAML::RebaseOpcode &RebaseOpcode);
187 template <> struct MappingTraits<MachOYAML::BindOpcode> {
188 static void mapping(IO &IO, MachOYAML::BindOpcode &BindOpcode);
191 template <> struct MappingTraits<MachOYAML::ExportEntry> {
192 static void mapping(IO &IO, MachOYAML::ExportEntry &ExportEntry);
195 template <> struct MappingTraits<MachOYAML::Section> {
196 static void mapping(IO &IO, MachOYAML::Section &Section);
199 template <> struct MappingTraits<MachOYAML::NListEntry> {
200 static void mapping(IO &IO, MachOYAML::NListEntry &NListEntry);
203 template <> struct MappingTraits<MachO::build_tool_version> {
204 static void mapping(IO &IO, MachO::build_tool_version &tool);
207 #define HANDLE_LOAD_COMMAND(LCName, LCValue, LCStruct) \
208 io.enumCase(value, #LCName, MachO::LCName);
210 template <> struct ScalarEnumerationTraits<MachO::LoadCommandType> {
211 static void enumeration(IO &io, MachO::LoadCommandType &value) {
212 #include "llvm/Support/MachO.def"
213 io.enumFallback<Hex32>(value);
217 #define ENUM_CASE(Enum) io.enumCase(value, #Enum, MachO::Enum);
219 template <> struct ScalarEnumerationTraits<MachO::RebaseOpcode> {
220 static void enumeration(IO &io, MachO::RebaseOpcode &value) {
221 ENUM_CASE(REBASE_OPCODE_DONE)
222 ENUM_CASE(REBASE_OPCODE_SET_TYPE_IMM)
223 ENUM_CASE(REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB)
224 ENUM_CASE(REBASE_OPCODE_ADD_ADDR_ULEB)
225 ENUM_CASE(REBASE_OPCODE_ADD_ADDR_IMM_SCALED)
226 ENUM_CASE(REBASE_OPCODE_DO_REBASE_IMM_TIMES)
227 ENUM_CASE(REBASE_OPCODE_DO_REBASE_ULEB_TIMES)
228 ENUM_CASE(REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB)
229 ENUM_CASE(REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB)
230 io.enumFallback<Hex8>(value);
234 template <> struct ScalarEnumerationTraits<MachO::BindOpcode> {
235 static void enumeration(IO &io, MachO::BindOpcode &value) {
236 ENUM_CASE(BIND_OPCODE_DONE)
237 ENUM_CASE(BIND_OPCODE_SET_DYLIB_ORDINAL_IMM)
238 ENUM_CASE(BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB)
239 ENUM_CASE(BIND_OPCODE_SET_DYLIB_SPECIAL_IMM)
240 ENUM_CASE(BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM)
241 ENUM_CASE(BIND_OPCODE_SET_TYPE_IMM)
242 ENUM_CASE(BIND_OPCODE_SET_ADDEND_SLEB)
243 ENUM_CASE(BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB)
244 ENUM_CASE(BIND_OPCODE_ADD_ADDR_ULEB)
245 ENUM_CASE(BIND_OPCODE_DO_BIND)
246 ENUM_CASE(BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB)
247 ENUM_CASE(BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED)
248 ENUM_CASE(BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB)
249 io.enumFallback<Hex8>(value);
253 // This trait is used for 16-byte chars in Mach structures used for strings
254 typedef char char_16[16];
256 template <> struct ScalarTraits<char_16> {
257 static void output(const char_16 &Val, void *, llvm::raw_ostream &Out);
259 static StringRef input(StringRef Scalar, void *, char_16 &Val);
260 static bool mustQuote(StringRef S);
263 // This trait is used for UUIDs. It reads and writes them matching otool's
265 typedef uint8_t uuid_t[16];
267 template <> struct ScalarTraits<uuid_t> {
268 static void output(const uuid_t &Val, void *, llvm::raw_ostream &Out);
270 static StringRef input(StringRef Scalar, void *, uuid_t &Val);
271 static bool mustQuote(StringRef S);
274 // Load Command struct mapping traits
276 #define LOAD_COMMAND_STRUCT(LCStruct) \
277 template <> struct MappingTraits<MachO::LCStruct> { \
278 static void mapping(IO &IO, MachO::LCStruct &LoadCommand); \
281 #include "llvm/Support/MachO.def"
283 // Extra structures used by load commands
284 template <> struct MappingTraits<MachO::dylib> {
285 static void mapping(IO &IO, MachO::dylib &LoadCommand);
288 template <> struct MappingTraits<MachO::fvmlib> {
289 static void mapping(IO &IO, MachO::fvmlib &LoadCommand);
292 template <> struct MappingTraits<MachO::section> {
293 static void mapping(IO &IO, MachO::section &LoadCommand);
296 template <> struct MappingTraits<MachO::section_64> {
297 static void mapping(IO &IO, MachO::section_64 &LoadCommand);
300 } // namespace llvm::yaml