1319780Sdim//===-- llvm/BinaryFormat/MachO.h - The MachO file format -------*- C++/-*-===// 2319780Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6319780Sdim// 7319780Sdim//===----------------------------------------------------------------------===// 8319780Sdim// 9319780Sdim// This file defines manifest constants for the MachO object file format. 10319780Sdim// 11319780Sdim//===----------------------------------------------------------------------===// 12319780Sdim 13319780Sdim#ifndef LLVM_BINARYFORMAT_MACHO_H 14319780Sdim#define LLVM_BINARYFORMAT_MACHO_H 15319780Sdim 16319780Sdim#include "llvm/Support/Compiler.h" 17319780Sdim#include "llvm/Support/DataTypes.h" 18319780Sdim#include "llvm/Support/Host.h" 19319780Sdim 20319780Sdimnamespace llvm { 21319780Sdimnamespace MachO { 22319780Sdim// Enums from <mach-o/loader.h> 23319780Sdimenum : uint32_t { 24319780Sdim // Constants for the "magic" field in llvm::MachO::mach_header and 25319780Sdim // llvm::MachO::mach_header_64 26319780Sdim MH_MAGIC = 0xFEEDFACEu, 27319780Sdim MH_CIGAM = 0xCEFAEDFEu, 28319780Sdim MH_MAGIC_64 = 0xFEEDFACFu, 29319780Sdim MH_CIGAM_64 = 0xCFFAEDFEu, 30319780Sdim FAT_MAGIC = 0xCAFEBABEu, 31319780Sdim FAT_CIGAM = 0xBEBAFECAu, 32319780Sdim FAT_MAGIC_64 = 0xCAFEBABFu, 33319780Sdim FAT_CIGAM_64 = 0xBFBAFECAu 34319780Sdim}; 35319780Sdim 36319780Sdimenum HeaderFileType { 37319780Sdim // Constants for the "filetype" field in llvm::MachO::mach_header and 38319780Sdim // llvm::MachO::mach_header_64 39319780Sdim MH_OBJECT = 0x1u, 40319780Sdim MH_EXECUTE = 0x2u, 41319780Sdim MH_FVMLIB = 0x3u, 42319780Sdim MH_CORE = 0x4u, 43319780Sdim MH_PRELOAD = 0x5u, 44319780Sdim MH_DYLIB = 0x6u, 45319780Sdim MH_DYLINKER = 0x7u, 46319780Sdim MH_BUNDLE = 0x8u, 47319780Sdim MH_DYLIB_STUB = 0x9u, 48319780Sdim MH_DSYM = 0xAu, 49319780Sdim MH_KEXT_BUNDLE = 0xBu 50319780Sdim}; 51319780Sdim 52319780Sdimenum { 53319780Sdim // Constant bits for the "flags" field in llvm::MachO::mach_header and 54319780Sdim // llvm::MachO::mach_header_64 55319780Sdim MH_NOUNDEFS = 0x00000001u, 56319780Sdim MH_INCRLINK = 0x00000002u, 57319780Sdim MH_DYLDLINK = 0x00000004u, 58319780Sdim MH_BINDATLOAD = 0x00000008u, 59319780Sdim MH_PREBOUND = 0x00000010u, 60319780Sdim MH_SPLIT_SEGS = 0x00000020u, 61319780Sdim MH_LAZY_INIT = 0x00000040u, 62319780Sdim MH_TWOLEVEL = 0x00000080u, 63319780Sdim MH_FORCE_FLAT = 0x00000100u, 64319780Sdim MH_NOMULTIDEFS = 0x00000200u, 65319780Sdim MH_NOFIXPREBINDING = 0x00000400u, 66319780Sdim MH_PREBINDABLE = 0x00000800u, 67319780Sdim MH_ALLMODSBOUND = 0x00001000u, 68319780Sdim MH_SUBSECTIONS_VIA_SYMBOLS = 0x00002000u, 69319780Sdim MH_CANONICAL = 0x00004000u, 70319780Sdim MH_WEAK_DEFINES = 0x00008000u, 71319780Sdim MH_BINDS_TO_WEAK = 0x00010000u, 72319780Sdim MH_ALLOW_STACK_EXECUTION = 0x00020000u, 73319780Sdim MH_ROOT_SAFE = 0x00040000u, 74319780Sdim MH_SETUID_SAFE = 0x00080000u, 75319780Sdim MH_NO_REEXPORTED_DYLIBS = 0x00100000u, 76319780Sdim MH_PIE = 0x00200000u, 77319780Sdim MH_DEAD_STRIPPABLE_DYLIB = 0x00400000u, 78319780Sdim MH_HAS_TLV_DESCRIPTORS = 0x00800000u, 79319780Sdim MH_NO_HEAP_EXECUTION = 0x01000000u, 80320397Sdim MH_APP_EXTENSION_SAFE = 0x02000000u, 81320397Sdim MH_NLIST_OUTOFSYNC_WITH_DYLDINFO = 0x04000000u 82319780Sdim}; 83319780Sdim 84319780Sdimenum : uint32_t { 85319780Sdim // Flags for the "cmd" field in llvm::MachO::load_command 86319780Sdim LC_REQ_DYLD = 0x80000000u 87319780Sdim}; 88319780Sdim 89319780Sdim#define HANDLE_LOAD_COMMAND(LCName, LCValue, LCStruct) LCName = LCValue, 90319780Sdim 91319780Sdimenum LoadCommandType : uint32_t { 92319780Sdim#include "llvm/BinaryFormat/MachO.def" 93319780Sdim}; 94319780Sdim 95319780Sdim#undef HANDLE_LOAD_COMMAND 96319780Sdim 97319780Sdimenum : uint32_t { 98319780Sdim // Constant bits for the "flags" field in llvm::MachO::segment_command 99319780Sdim SG_HIGHVM = 0x1u, 100319780Sdim SG_FVMLIB = 0x2u, 101319780Sdim SG_NORELOC = 0x4u, 102319780Sdim SG_PROTECTED_VERSION_1 = 0x8u, 103319780Sdim 104319780Sdim // Constant masks for the "flags" field in llvm::MachO::section and 105319780Sdim // llvm::MachO::section_64 106319780Sdim SECTION_TYPE = 0x000000ffu, // SECTION_TYPE 107319780Sdim SECTION_ATTRIBUTES = 0xffffff00u, // SECTION_ATTRIBUTES 108319780Sdim SECTION_ATTRIBUTES_USR = 0xff000000u, // SECTION_ATTRIBUTES_USR 109319780Sdim SECTION_ATTRIBUTES_SYS = 0x00ffff00u // SECTION_ATTRIBUTES_SYS 110319780Sdim}; 111319780Sdim 112319780Sdim/// These are the section type and attributes fields. A MachO section can 113319780Sdim/// have only one Type, but can have any of the attributes specified. 114319780Sdimenum SectionType : uint32_t { 115319780Sdim // Constant masks for the "flags[7:0]" field in llvm::MachO::section and 116319780Sdim // llvm::MachO::section_64 (mask "flags" with SECTION_TYPE) 117319780Sdim 118319780Sdim /// S_REGULAR - Regular section. 119319780Sdim S_REGULAR = 0x00u, 120319780Sdim /// S_ZEROFILL - Zero fill on demand section. 121319780Sdim S_ZEROFILL = 0x01u, 122319780Sdim /// S_CSTRING_LITERALS - Section with literal C strings. 123319780Sdim S_CSTRING_LITERALS = 0x02u, 124319780Sdim /// S_4BYTE_LITERALS - Section with 4 byte literals. 125319780Sdim S_4BYTE_LITERALS = 0x03u, 126319780Sdim /// S_8BYTE_LITERALS - Section with 8 byte literals. 127319780Sdim S_8BYTE_LITERALS = 0x04u, 128319780Sdim /// S_LITERAL_POINTERS - Section with pointers to literals. 129319780Sdim S_LITERAL_POINTERS = 0x05u, 130319780Sdim /// S_NON_LAZY_SYMBOL_POINTERS - Section with non-lazy symbol pointers. 131319780Sdim S_NON_LAZY_SYMBOL_POINTERS = 0x06u, 132319780Sdim /// S_LAZY_SYMBOL_POINTERS - Section with lazy symbol pointers. 133319780Sdim S_LAZY_SYMBOL_POINTERS = 0x07u, 134319780Sdim /// S_SYMBOL_STUBS - Section with symbol stubs, byte size of stub in 135319780Sdim /// the Reserved2 field. 136319780Sdim S_SYMBOL_STUBS = 0x08u, 137319780Sdim /// S_MOD_INIT_FUNC_POINTERS - Section with only function pointers for 138319780Sdim /// initialization. 139319780Sdim S_MOD_INIT_FUNC_POINTERS = 0x09u, 140319780Sdim /// S_MOD_TERM_FUNC_POINTERS - Section with only function pointers for 141319780Sdim /// termination. 142319780Sdim S_MOD_TERM_FUNC_POINTERS = 0x0au, 143319780Sdim /// S_COALESCED - Section contains symbols that are to be coalesced. 144319780Sdim S_COALESCED = 0x0bu, 145319780Sdim /// S_GB_ZEROFILL - Zero fill on demand section (that can be larger than 4 146319780Sdim /// gigabytes). 147319780Sdim S_GB_ZEROFILL = 0x0cu, 148319780Sdim /// S_INTERPOSING - Section with only pairs of function pointers for 149319780Sdim /// interposing. 150319780Sdim S_INTERPOSING = 0x0du, 151319780Sdim /// S_16BYTE_LITERALS - Section with only 16 byte literals. 152319780Sdim S_16BYTE_LITERALS = 0x0eu, 153319780Sdim /// S_DTRACE_DOF - Section contains DTrace Object Format. 154319780Sdim S_DTRACE_DOF = 0x0fu, 155319780Sdim /// S_LAZY_DYLIB_SYMBOL_POINTERS - Section with lazy symbol pointers to 156319780Sdim /// lazy loaded dylibs. 157319780Sdim S_LAZY_DYLIB_SYMBOL_POINTERS = 0x10u, 158319780Sdim /// S_THREAD_LOCAL_REGULAR - Thread local data section. 159319780Sdim S_THREAD_LOCAL_REGULAR = 0x11u, 160319780Sdim /// S_THREAD_LOCAL_ZEROFILL - Thread local zerofill section. 161319780Sdim S_THREAD_LOCAL_ZEROFILL = 0x12u, 162319780Sdim /// S_THREAD_LOCAL_VARIABLES - Section with thread local variable 163319780Sdim /// structure data. 164319780Sdim S_THREAD_LOCAL_VARIABLES = 0x13u, 165319780Sdim /// S_THREAD_LOCAL_VARIABLE_POINTERS - Section with pointers to thread 166319780Sdim /// local structures. 167319780Sdim S_THREAD_LOCAL_VARIABLE_POINTERS = 0x14u, 168319780Sdim /// S_THREAD_LOCAL_INIT_FUNCTION_POINTERS - Section with thread local 169319780Sdim /// variable initialization pointers to functions. 170319780Sdim S_THREAD_LOCAL_INIT_FUNCTION_POINTERS = 0x15u, 171319780Sdim 172319780Sdim LAST_KNOWN_SECTION_TYPE = S_THREAD_LOCAL_INIT_FUNCTION_POINTERS 173319780Sdim}; 174319780Sdim 175319780Sdimenum : uint32_t { 176319780Sdim // Constant masks for the "flags[31:24]" field in llvm::MachO::section and 177319780Sdim // llvm::MachO::section_64 (mask "flags" with SECTION_ATTRIBUTES_USR) 178319780Sdim 179319780Sdim /// S_ATTR_PURE_INSTRUCTIONS - Section contains only true machine 180319780Sdim /// instructions. 181319780Sdim S_ATTR_PURE_INSTRUCTIONS = 0x80000000u, 182319780Sdim /// S_ATTR_NO_TOC - Section contains coalesced symbols that are not to be 183319780Sdim /// in a ranlib table of contents. 184319780Sdim S_ATTR_NO_TOC = 0x40000000u, 185319780Sdim /// S_ATTR_STRIP_STATIC_SYMS - Ok to strip static symbols in this section 186319780Sdim /// in files with the MY_DYLDLINK flag. 187319780Sdim S_ATTR_STRIP_STATIC_SYMS = 0x20000000u, 188319780Sdim /// S_ATTR_NO_DEAD_STRIP - No dead stripping. 189319780Sdim S_ATTR_NO_DEAD_STRIP = 0x10000000u, 190319780Sdim /// S_ATTR_LIVE_SUPPORT - Blocks are live if they reference live blocks. 191319780Sdim S_ATTR_LIVE_SUPPORT = 0x08000000u, 192319780Sdim /// S_ATTR_SELF_MODIFYING_CODE - Used with i386 code stubs written on by 193319780Sdim /// dyld. 194319780Sdim S_ATTR_SELF_MODIFYING_CODE = 0x04000000u, 195319780Sdim /// S_ATTR_DEBUG - A debug section. 196319780Sdim S_ATTR_DEBUG = 0x02000000u, 197319780Sdim 198319780Sdim // Constant masks for the "flags[23:8]" field in llvm::MachO::section and 199319780Sdim // llvm::MachO::section_64 (mask "flags" with SECTION_ATTRIBUTES_SYS) 200319780Sdim 201319780Sdim /// S_ATTR_SOME_INSTRUCTIONS - Section contains some machine instructions. 202319780Sdim S_ATTR_SOME_INSTRUCTIONS = 0x00000400u, 203319780Sdim /// S_ATTR_EXT_RELOC - Section has external relocation entries. 204319780Sdim S_ATTR_EXT_RELOC = 0x00000200u, 205319780Sdim /// S_ATTR_LOC_RELOC - Section has local relocation entries. 206319780Sdim S_ATTR_LOC_RELOC = 0x00000100u, 207319780Sdim 208319780Sdim // Constant masks for the value of an indirect symbol in an indirect 209319780Sdim // symbol table 210319780Sdim INDIRECT_SYMBOL_LOCAL = 0x80000000u, 211319780Sdim INDIRECT_SYMBOL_ABS = 0x40000000u 212319780Sdim}; 213319780Sdim 214319780Sdimenum DataRegionType { 215319780Sdim // Constants for the "kind" field in a data_in_code_entry structure 216319780Sdim DICE_KIND_DATA = 1u, 217319780Sdim DICE_KIND_JUMP_TABLE8 = 2u, 218319780Sdim DICE_KIND_JUMP_TABLE16 = 3u, 219319780Sdim DICE_KIND_JUMP_TABLE32 = 4u, 220319780Sdim DICE_KIND_ABS_JUMP_TABLE32 = 5u 221319780Sdim}; 222319780Sdim 223319780Sdimenum RebaseType { 224319780Sdim REBASE_TYPE_POINTER = 1u, 225319780Sdim REBASE_TYPE_TEXT_ABSOLUTE32 = 2u, 226319780Sdim REBASE_TYPE_TEXT_PCREL32 = 3u 227319780Sdim}; 228319780Sdim 229319780Sdimenum { REBASE_OPCODE_MASK = 0xF0u, REBASE_IMMEDIATE_MASK = 0x0Fu }; 230319780Sdim 231319780Sdimenum RebaseOpcode { 232319780Sdim REBASE_OPCODE_DONE = 0x00u, 233319780Sdim REBASE_OPCODE_SET_TYPE_IMM = 0x10u, 234319780Sdim REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB = 0x20u, 235319780Sdim REBASE_OPCODE_ADD_ADDR_ULEB = 0x30u, 236319780Sdim REBASE_OPCODE_ADD_ADDR_IMM_SCALED = 0x40u, 237319780Sdim REBASE_OPCODE_DO_REBASE_IMM_TIMES = 0x50u, 238319780Sdim REBASE_OPCODE_DO_REBASE_ULEB_TIMES = 0x60u, 239319780Sdim REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB = 0x70u, 240319780Sdim REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB = 0x80u 241319780Sdim}; 242319780Sdim 243319780Sdimenum BindType { 244319780Sdim BIND_TYPE_POINTER = 1u, 245319780Sdim BIND_TYPE_TEXT_ABSOLUTE32 = 2u, 246319780Sdim BIND_TYPE_TEXT_PCREL32 = 3u 247319780Sdim}; 248319780Sdim 249319780Sdimenum BindSpecialDylib { 250319780Sdim BIND_SPECIAL_DYLIB_SELF = 0, 251319780Sdim BIND_SPECIAL_DYLIB_MAIN_EXECUTABLE = -1, 252319780Sdim BIND_SPECIAL_DYLIB_FLAT_LOOKUP = -2 253319780Sdim}; 254319780Sdim 255319780Sdimenum { 256319780Sdim BIND_SYMBOL_FLAGS_WEAK_IMPORT = 0x1u, 257319780Sdim BIND_SYMBOL_FLAGS_NON_WEAK_DEFINITION = 0x8u, 258319780Sdim 259319780Sdim BIND_OPCODE_MASK = 0xF0u, 260319780Sdim BIND_IMMEDIATE_MASK = 0x0Fu 261319780Sdim}; 262319780Sdim 263319780Sdimenum BindOpcode { 264319780Sdim BIND_OPCODE_DONE = 0x00u, 265319780Sdim BIND_OPCODE_SET_DYLIB_ORDINAL_IMM = 0x10u, 266319780Sdim BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB = 0x20u, 267319780Sdim BIND_OPCODE_SET_DYLIB_SPECIAL_IMM = 0x30u, 268319780Sdim BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM = 0x40u, 269319780Sdim BIND_OPCODE_SET_TYPE_IMM = 0x50u, 270319780Sdim BIND_OPCODE_SET_ADDEND_SLEB = 0x60u, 271319780Sdim BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB = 0x70u, 272319780Sdim BIND_OPCODE_ADD_ADDR_ULEB = 0x80u, 273319780Sdim BIND_OPCODE_DO_BIND = 0x90u, 274319780Sdim BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB = 0xA0u, 275319780Sdim BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED = 0xB0u, 276319780Sdim BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB = 0xC0u 277319780Sdim}; 278319780Sdim 279319780Sdimenum { 280319780Sdim EXPORT_SYMBOL_FLAGS_KIND_MASK = 0x03u, 281319780Sdim EXPORT_SYMBOL_FLAGS_WEAK_DEFINITION = 0x04u, 282319780Sdim EXPORT_SYMBOL_FLAGS_REEXPORT = 0x08u, 283319780Sdim EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER = 0x10u 284319780Sdim}; 285319780Sdim 286319780Sdimenum ExportSymbolKind { 287319780Sdim EXPORT_SYMBOL_FLAGS_KIND_REGULAR = 0x00u, 288319780Sdim EXPORT_SYMBOL_FLAGS_KIND_THREAD_LOCAL = 0x01u, 289319780Sdim EXPORT_SYMBOL_FLAGS_KIND_ABSOLUTE = 0x02u 290319780Sdim}; 291319780Sdim 292319780Sdimenum { 293319780Sdim // Constant masks for the "n_type" field in llvm::MachO::nlist and 294319780Sdim // llvm::MachO::nlist_64 295319780Sdim N_STAB = 0xe0, 296319780Sdim N_PEXT = 0x10, 297319780Sdim N_TYPE = 0x0e, 298319780Sdim N_EXT = 0x01 299319780Sdim}; 300319780Sdim 301319780Sdimenum NListType : uint8_t { 302319780Sdim // Constants for the "n_type & N_TYPE" llvm::MachO::nlist and 303319780Sdim // llvm::MachO::nlist_64 304319780Sdim N_UNDF = 0x0u, 305319780Sdim N_ABS = 0x2u, 306319780Sdim N_SECT = 0xeu, 307319780Sdim N_PBUD = 0xcu, 308319780Sdim N_INDR = 0xau 309319780Sdim}; 310319780Sdim 311319780Sdimenum SectionOrdinal { 312319780Sdim // Constants for the "n_sect" field in llvm::MachO::nlist and 313319780Sdim // llvm::MachO::nlist_64 314319780Sdim NO_SECT = 0u, 315319780Sdim MAX_SECT = 0xffu 316319780Sdim}; 317319780Sdim 318319780Sdimenum { 319319780Sdim // Constant masks for the "n_desc" field in llvm::MachO::nlist and 320319780Sdim // llvm::MachO::nlist_64 321319780Sdim // The low 3 bits are the for the REFERENCE_TYPE. 322319780Sdim REFERENCE_TYPE = 0x7, 323319780Sdim REFERENCE_FLAG_UNDEFINED_NON_LAZY = 0, 324319780Sdim REFERENCE_FLAG_UNDEFINED_LAZY = 1, 325319780Sdim REFERENCE_FLAG_DEFINED = 2, 326319780Sdim REFERENCE_FLAG_PRIVATE_DEFINED = 3, 327319780Sdim REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY = 4, 328319780Sdim REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY = 5, 329319780Sdim // Flag bits (some overlap with the library ordinal bits). 330319780Sdim N_ARM_THUMB_DEF = 0x0008u, 331319780Sdim REFERENCED_DYNAMICALLY = 0x0010u, 332319780Sdim N_NO_DEAD_STRIP = 0x0020u, 333319780Sdim N_WEAK_REF = 0x0040u, 334319780Sdim N_WEAK_DEF = 0x0080u, 335319780Sdim N_SYMBOL_RESOLVER = 0x0100u, 336319780Sdim N_ALT_ENTRY = 0x0200u, 337353358Sdim N_COLD_FUNC = 0x0400u, 338319780Sdim // For undefined symbols coming from libraries, see GET_LIBRARY_ORDINAL() 339319780Sdim // as these are in the top 8 bits. 340319780Sdim SELF_LIBRARY_ORDINAL = 0x0, 341319780Sdim MAX_LIBRARY_ORDINAL = 0xfd, 342319780Sdim DYNAMIC_LOOKUP_ORDINAL = 0xfe, 343319780Sdim EXECUTABLE_ORDINAL = 0xff 344319780Sdim}; 345319780Sdim 346319780Sdimenum StabType { 347319780Sdim // Constant values for the "n_type" field in llvm::MachO::nlist and 348319780Sdim // llvm::MachO::nlist_64 when "(n_type & N_STAB) != 0" 349319780Sdim N_GSYM = 0x20u, 350319780Sdim N_FNAME = 0x22u, 351319780Sdim N_FUN = 0x24u, 352319780Sdim N_STSYM = 0x26u, 353319780Sdim N_LCSYM = 0x28u, 354319780Sdim N_BNSYM = 0x2Eu, 355319780Sdim N_PC = 0x30u, 356319780Sdim N_AST = 0x32u, 357319780Sdim N_OPT = 0x3Cu, 358319780Sdim N_RSYM = 0x40u, 359319780Sdim N_SLINE = 0x44u, 360319780Sdim N_ENSYM = 0x4Eu, 361319780Sdim N_SSYM = 0x60u, 362319780Sdim N_SO = 0x64u, 363319780Sdim N_OSO = 0x66u, 364319780Sdim N_LSYM = 0x80u, 365319780Sdim N_BINCL = 0x82u, 366319780Sdim N_SOL = 0x84u, 367319780Sdim N_PARAMS = 0x86u, 368319780Sdim N_VERSION = 0x88u, 369319780Sdim N_OLEVEL = 0x8Au, 370319780Sdim N_PSYM = 0xA0u, 371319780Sdim N_EINCL = 0xA2u, 372319780Sdim N_ENTRY = 0xA4u, 373319780Sdim N_LBRAC = 0xC0u, 374319780Sdim N_EXCL = 0xC2u, 375319780Sdim N_RBRAC = 0xE0u, 376319780Sdim N_BCOMM = 0xE2u, 377319780Sdim N_ECOMM = 0xE4u, 378319780Sdim N_ECOML = 0xE8u, 379319780Sdim N_LENG = 0xFEu 380319780Sdim}; 381319780Sdim 382319780Sdimenum : uint32_t { 383319780Sdim // Constant values for the r_symbolnum field in an 384319780Sdim // llvm::MachO::relocation_info structure when r_extern is 0. 385319780Sdim R_ABS = 0, 386319780Sdim 387319780Sdim // Constant bits for the r_address field in an 388319780Sdim // llvm::MachO::relocation_info structure. 389319780Sdim R_SCATTERED = 0x80000000 390319780Sdim}; 391319780Sdim 392319780Sdimenum RelocationInfoType { 393319780Sdim // Constant values for the r_type field in an 394319780Sdim // llvm::MachO::relocation_info or llvm::MachO::scattered_relocation_info 395319780Sdim // structure. 396319780Sdim GENERIC_RELOC_VANILLA = 0, 397319780Sdim GENERIC_RELOC_PAIR = 1, 398319780Sdim GENERIC_RELOC_SECTDIFF = 2, 399319780Sdim GENERIC_RELOC_PB_LA_PTR = 3, 400319780Sdim GENERIC_RELOC_LOCAL_SECTDIFF = 4, 401319780Sdim GENERIC_RELOC_TLV = 5, 402319780Sdim 403319780Sdim // Constant values for the r_type field in a PowerPC architecture 404319780Sdim // llvm::MachO::relocation_info or llvm::MachO::scattered_relocation_info 405319780Sdim // structure. 406319780Sdim PPC_RELOC_VANILLA = GENERIC_RELOC_VANILLA, 407319780Sdim PPC_RELOC_PAIR = GENERIC_RELOC_PAIR, 408319780Sdim PPC_RELOC_BR14 = 2, 409319780Sdim PPC_RELOC_BR24 = 3, 410319780Sdim PPC_RELOC_HI16 = 4, 411319780Sdim PPC_RELOC_LO16 = 5, 412319780Sdim PPC_RELOC_HA16 = 6, 413319780Sdim PPC_RELOC_LO14 = 7, 414319780Sdim PPC_RELOC_SECTDIFF = 8, 415319780Sdim PPC_RELOC_PB_LA_PTR = 9, 416319780Sdim PPC_RELOC_HI16_SECTDIFF = 10, 417319780Sdim PPC_RELOC_LO16_SECTDIFF = 11, 418319780Sdim PPC_RELOC_HA16_SECTDIFF = 12, 419319780Sdim PPC_RELOC_JBSR = 13, 420319780Sdim PPC_RELOC_LO14_SECTDIFF = 14, 421319780Sdim PPC_RELOC_LOCAL_SECTDIFF = 15, 422319780Sdim 423319780Sdim // Constant values for the r_type field in an ARM architecture 424319780Sdim // llvm::MachO::relocation_info or llvm::MachO::scattered_relocation_info 425319780Sdim // structure. 426319780Sdim ARM_RELOC_VANILLA = GENERIC_RELOC_VANILLA, 427319780Sdim ARM_RELOC_PAIR = GENERIC_RELOC_PAIR, 428319780Sdim ARM_RELOC_SECTDIFF = GENERIC_RELOC_SECTDIFF, 429319780Sdim ARM_RELOC_LOCAL_SECTDIFF = 3, 430319780Sdim ARM_RELOC_PB_LA_PTR = 4, 431319780Sdim ARM_RELOC_BR24 = 5, 432319780Sdim ARM_THUMB_RELOC_BR22 = 6, 433319780Sdim ARM_THUMB_32BIT_BRANCH = 7, // obsolete 434319780Sdim ARM_RELOC_HALF = 8, 435319780Sdim ARM_RELOC_HALF_SECTDIFF = 9, 436319780Sdim 437319780Sdim // Constant values for the r_type field in an ARM64 architecture 438319780Sdim // llvm::MachO::relocation_info or llvm::MachO::scattered_relocation_info 439319780Sdim // structure. 440319780Sdim 441319780Sdim // For pointers. 442319780Sdim ARM64_RELOC_UNSIGNED = 0, 443319780Sdim // Must be followed by an ARM64_RELOC_UNSIGNED 444319780Sdim ARM64_RELOC_SUBTRACTOR = 1, 445319780Sdim // A B/BL instruction with 26-bit displacement. 446319780Sdim ARM64_RELOC_BRANCH26 = 2, 447319780Sdim // PC-rel distance to page of target. 448319780Sdim ARM64_RELOC_PAGE21 = 3, 449319780Sdim // Offset within page, scaled by r_length. 450319780Sdim ARM64_RELOC_PAGEOFF12 = 4, 451319780Sdim // PC-rel distance to page of GOT slot. 452319780Sdim ARM64_RELOC_GOT_LOAD_PAGE21 = 5, 453319780Sdim // Offset within page of GOT slot, scaled by r_length. 454319780Sdim ARM64_RELOC_GOT_LOAD_PAGEOFF12 = 6, 455319780Sdim // For pointers to GOT slots. 456319780Sdim ARM64_RELOC_POINTER_TO_GOT = 7, 457319780Sdim // PC-rel distance to page of TLVP slot. 458319780Sdim ARM64_RELOC_TLVP_LOAD_PAGE21 = 8, 459319780Sdim // Offset within page of TLVP slot, scaled by r_length. 460319780Sdim ARM64_RELOC_TLVP_LOAD_PAGEOFF12 = 9, 461319780Sdim // Must be followed by ARM64_RELOC_PAGE21 or ARM64_RELOC_PAGEOFF12. 462319780Sdim ARM64_RELOC_ADDEND = 10, 463319780Sdim 464319780Sdim // Constant values for the r_type field in an x86_64 architecture 465319780Sdim // llvm::MachO::relocation_info or llvm::MachO::scattered_relocation_info 466319780Sdim // structure 467319780Sdim X86_64_RELOC_UNSIGNED = 0, 468319780Sdim X86_64_RELOC_SIGNED = 1, 469319780Sdim X86_64_RELOC_BRANCH = 2, 470319780Sdim X86_64_RELOC_GOT_LOAD = 3, 471319780Sdim X86_64_RELOC_GOT = 4, 472319780Sdim X86_64_RELOC_SUBTRACTOR = 5, 473319780Sdim X86_64_RELOC_SIGNED_1 = 6, 474319780Sdim X86_64_RELOC_SIGNED_2 = 7, 475319780Sdim X86_64_RELOC_SIGNED_4 = 8, 476319780Sdim X86_64_RELOC_TLV = 9 477319780Sdim}; 478319780Sdim 479319780Sdim// Values for segment_command.initprot. 480319780Sdim// From <mach/vm_prot.h> 481319780Sdimenum { VM_PROT_READ = 0x1, VM_PROT_WRITE = 0x2, VM_PROT_EXECUTE = 0x4 }; 482319780Sdim 483319780Sdim// Values for platform field in build_version_command. 484327952Sdimenum PlatformType { 485319780Sdim PLATFORM_MACOS = 1, 486319780Sdim PLATFORM_IOS = 2, 487319780Sdim PLATFORM_TVOS = 3, 488319780Sdim PLATFORM_WATCHOS = 4, 489344779Sdim PLATFORM_BRIDGEOS = 5, 490353358Sdim PLATFORM_MACCATALYST = 6, 491344779Sdim PLATFORM_IOSSIMULATOR = 7, 492344779Sdim PLATFORM_TVOSSIMULATOR = 8, 493344779Sdim PLATFORM_WATCHOSSIMULATOR = 9 494319780Sdim}; 495319780Sdim 496319780Sdim// Values for tools enum in build_tool_version. 497319780Sdimenum { TOOL_CLANG = 1, TOOL_SWIFT = 2, TOOL_LD = 3 }; 498319780Sdim 499319780Sdim// Structs from <mach-o/loader.h> 500319780Sdim 501319780Sdimstruct mach_header { 502319780Sdim uint32_t magic; 503319780Sdim uint32_t cputype; 504319780Sdim uint32_t cpusubtype; 505319780Sdim uint32_t filetype; 506319780Sdim uint32_t ncmds; 507319780Sdim uint32_t sizeofcmds; 508319780Sdim uint32_t flags; 509319780Sdim}; 510319780Sdim 511319780Sdimstruct mach_header_64 { 512319780Sdim uint32_t magic; 513319780Sdim uint32_t cputype; 514319780Sdim uint32_t cpusubtype; 515319780Sdim uint32_t filetype; 516319780Sdim uint32_t ncmds; 517319780Sdim uint32_t sizeofcmds; 518319780Sdim uint32_t flags; 519319780Sdim uint32_t reserved; 520319780Sdim}; 521319780Sdim 522319780Sdimstruct load_command { 523319780Sdim uint32_t cmd; 524319780Sdim uint32_t cmdsize; 525319780Sdim}; 526319780Sdim 527319780Sdimstruct segment_command { 528319780Sdim uint32_t cmd; 529319780Sdim uint32_t cmdsize; 530319780Sdim char segname[16]; 531319780Sdim uint32_t vmaddr; 532319780Sdim uint32_t vmsize; 533319780Sdim uint32_t fileoff; 534319780Sdim uint32_t filesize; 535319780Sdim uint32_t maxprot; 536319780Sdim uint32_t initprot; 537319780Sdim uint32_t nsects; 538319780Sdim uint32_t flags; 539319780Sdim}; 540319780Sdim 541319780Sdimstruct segment_command_64 { 542319780Sdim uint32_t cmd; 543319780Sdim uint32_t cmdsize; 544319780Sdim char segname[16]; 545319780Sdim uint64_t vmaddr; 546319780Sdim uint64_t vmsize; 547319780Sdim uint64_t fileoff; 548319780Sdim uint64_t filesize; 549319780Sdim uint32_t maxprot; 550319780Sdim uint32_t initprot; 551319780Sdim uint32_t nsects; 552319780Sdim uint32_t flags; 553319780Sdim}; 554319780Sdim 555319780Sdimstruct section { 556319780Sdim char sectname[16]; 557319780Sdim char segname[16]; 558319780Sdim uint32_t addr; 559319780Sdim uint32_t size; 560319780Sdim uint32_t offset; 561319780Sdim uint32_t align; 562319780Sdim uint32_t reloff; 563319780Sdim uint32_t nreloc; 564319780Sdim uint32_t flags; 565319780Sdim uint32_t reserved1; 566319780Sdim uint32_t reserved2; 567319780Sdim}; 568319780Sdim 569319780Sdimstruct section_64 { 570319780Sdim char sectname[16]; 571319780Sdim char segname[16]; 572319780Sdim uint64_t addr; 573319780Sdim uint64_t size; 574319780Sdim uint32_t offset; 575319780Sdim uint32_t align; 576319780Sdim uint32_t reloff; 577319780Sdim uint32_t nreloc; 578319780Sdim uint32_t flags; 579319780Sdim uint32_t reserved1; 580319780Sdim uint32_t reserved2; 581319780Sdim uint32_t reserved3; 582319780Sdim}; 583319780Sdim 584360784Sdiminline bool isVirtualSection(uint8_t type) { 585360784Sdim return (type == MachO::S_ZEROFILL || type == MachO::S_GB_ZEROFILL || 586360784Sdim type == MachO::S_THREAD_LOCAL_ZEROFILL); 587360784Sdim} 588360784Sdim 589319780Sdimstruct fvmlib { 590319780Sdim uint32_t name; 591319780Sdim uint32_t minor_version; 592319780Sdim uint32_t header_addr; 593319780Sdim}; 594319780Sdim 595319780Sdim// The fvmlib_command is obsolete and no longer supported. 596319780Sdimstruct fvmlib_command { 597319780Sdim uint32_t cmd; 598319780Sdim uint32_t cmdsize; 599319780Sdim struct fvmlib fvmlib; 600319780Sdim}; 601319780Sdim 602319780Sdimstruct dylib { 603319780Sdim uint32_t name; 604319780Sdim uint32_t timestamp; 605319780Sdim uint32_t current_version; 606319780Sdim uint32_t compatibility_version; 607319780Sdim}; 608319780Sdim 609319780Sdimstruct dylib_command { 610319780Sdim uint32_t cmd; 611319780Sdim uint32_t cmdsize; 612319780Sdim struct dylib dylib; 613319780Sdim}; 614319780Sdim 615319780Sdimstruct sub_framework_command { 616319780Sdim uint32_t cmd; 617319780Sdim uint32_t cmdsize; 618319780Sdim uint32_t umbrella; 619319780Sdim}; 620319780Sdim 621319780Sdimstruct sub_client_command { 622319780Sdim uint32_t cmd; 623319780Sdim uint32_t cmdsize; 624319780Sdim uint32_t client; 625319780Sdim}; 626319780Sdim 627319780Sdimstruct sub_umbrella_command { 628319780Sdim uint32_t cmd; 629319780Sdim uint32_t cmdsize; 630319780Sdim uint32_t sub_umbrella; 631319780Sdim}; 632319780Sdim 633319780Sdimstruct sub_library_command { 634319780Sdim uint32_t cmd; 635319780Sdim uint32_t cmdsize; 636319780Sdim uint32_t sub_library; 637319780Sdim}; 638319780Sdim 639319780Sdim// The prebound_dylib_command is obsolete and no longer supported. 640319780Sdimstruct prebound_dylib_command { 641319780Sdim uint32_t cmd; 642319780Sdim uint32_t cmdsize; 643319780Sdim uint32_t name; 644319780Sdim uint32_t nmodules; 645319780Sdim uint32_t linked_modules; 646319780Sdim}; 647319780Sdim 648319780Sdimstruct dylinker_command { 649319780Sdim uint32_t cmd; 650319780Sdim uint32_t cmdsize; 651319780Sdim uint32_t name; 652319780Sdim}; 653319780Sdim 654319780Sdimstruct thread_command { 655319780Sdim uint32_t cmd; 656319780Sdim uint32_t cmdsize; 657319780Sdim}; 658319780Sdim 659319780Sdimstruct routines_command { 660319780Sdim uint32_t cmd; 661319780Sdim uint32_t cmdsize; 662319780Sdim uint32_t init_address; 663319780Sdim uint32_t init_module; 664319780Sdim uint32_t reserved1; 665319780Sdim uint32_t reserved2; 666319780Sdim uint32_t reserved3; 667319780Sdim uint32_t reserved4; 668319780Sdim uint32_t reserved5; 669319780Sdim uint32_t reserved6; 670319780Sdim}; 671319780Sdim 672319780Sdimstruct routines_command_64 { 673319780Sdim uint32_t cmd; 674319780Sdim uint32_t cmdsize; 675319780Sdim uint64_t init_address; 676319780Sdim uint64_t init_module; 677319780Sdim uint64_t reserved1; 678319780Sdim uint64_t reserved2; 679319780Sdim uint64_t reserved3; 680319780Sdim uint64_t reserved4; 681319780Sdim uint64_t reserved5; 682319780Sdim uint64_t reserved6; 683319780Sdim}; 684319780Sdim 685319780Sdimstruct symtab_command { 686319780Sdim uint32_t cmd; 687319780Sdim uint32_t cmdsize; 688319780Sdim uint32_t symoff; 689319780Sdim uint32_t nsyms; 690319780Sdim uint32_t stroff; 691319780Sdim uint32_t strsize; 692319780Sdim}; 693319780Sdim 694319780Sdimstruct dysymtab_command { 695319780Sdim uint32_t cmd; 696319780Sdim uint32_t cmdsize; 697319780Sdim uint32_t ilocalsym; 698319780Sdim uint32_t nlocalsym; 699319780Sdim uint32_t iextdefsym; 700319780Sdim uint32_t nextdefsym; 701319780Sdim uint32_t iundefsym; 702319780Sdim uint32_t nundefsym; 703319780Sdim uint32_t tocoff; 704319780Sdim uint32_t ntoc; 705319780Sdim uint32_t modtaboff; 706319780Sdim uint32_t nmodtab; 707319780Sdim uint32_t extrefsymoff; 708319780Sdim uint32_t nextrefsyms; 709319780Sdim uint32_t indirectsymoff; 710319780Sdim uint32_t nindirectsyms; 711319780Sdim uint32_t extreloff; 712319780Sdim uint32_t nextrel; 713319780Sdim uint32_t locreloff; 714319780Sdim uint32_t nlocrel; 715319780Sdim}; 716319780Sdim 717319780Sdimstruct dylib_table_of_contents { 718319780Sdim uint32_t symbol_index; 719319780Sdim uint32_t module_index; 720319780Sdim}; 721319780Sdim 722319780Sdimstruct dylib_module { 723319780Sdim uint32_t module_name; 724319780Sdim uint32_t iextdefsym; 725319780Sdim uint32_t nextdefsym; 726319780Sdim uint32_t irefsym; 727319780Sdim uint32_t nrefsym; 728319780Sdim uint32_t ilocalsym; 729319780Sdim uint32_t nlocalsym; 730319780Sdim uint32_t iextrel; 731319780Sdim uint32_t nextrel; 732319780Sdim uint32_t iinit_iterm; 733319780Sdim uint32_t ninit_nterm; 734319780Sdim uint32_t objc_module_info_addr; 735319780Sdim uint32_t objc_module_info_size; 736319780Sdim}; 737319780Sdim 738319780Sdimstruct dylib_module_64 { 739319780Sdim uint32_t module_name; 740319780Sdim uint32_t iextdefsym; 741319780Sdim uint32_t nextdefsym; 742319780Sdim uint32_t irefsym; 743319780Sdim uint32_t nrefsym; 744319780Sdim uint32_t ilocalsym; 745319780Sdim uint32_t nlocalsym; 746319780Sdim uint32_t iextrel; 747319780Sdim uint32_t nextrel; 748319780Sdim uint32_t iinit_iterm; 749319780Sdim uint32_t ninit_nterm; 750319780Sdim uint32_t objc_module_info_size; 751319780Sdim uint64_t objc_module_info_addr; 752319780Sdim}; 753319780Sdim 754319780Sdimstruct dylib_reference { 755319780Sdim uint32_t isym : 24, flags : 8; 756319780Sdim}; 757319780Sdim 758319780Sdim// The twolevel_hints_command is obsolete and no longer supported. 759319780Sdimstruct twolevel_hints_command { 760319780Sdim uint32_t cmd; 761319780Sdim uint32_t cmdsize; 762319780Sdim uint32_t offset; 763319780Sdim uint32_t nhints; 764319780Sdim}; 765319780Sdim 766319780Sdim// The twolevel_hints_command is obsolete and no longer supported. 767319780Sdimstruct twolevel_hint { 768319780Sdim uint32_t isub_image : 8, itoc : 24; 769319780Sdim}; 770319780Sdim 771319780Sdim// The prebind_cksum_command is obsolete and no longer supported. 772319780Sdimstruct prebind_cksum_command { 773319780Sdim uint32_t cmd; 774319780Sdim uint32_t cmdsize; 775319780Sdim uint32_t cksum; 776319780Sdim}; 777319780Sdim 778319780Sdimstruct uuid_command { 779319780Sdim uint32_t cmd; 780319780Sdim uint32_t cmdsize; 781319780Sdim uint8_t uuid[16]; 782319780Sdim}; 783319780Sdim 784319780Sdimstruct rpath_command { 785319780Sdim uint32_t cmd; 786319780Sdim uint32_t cmdsize; 787319780Sdim uint32_t path; 788319780Sdim}; 789319780Sdim 790319780Sdimstruct linkedit_data_command { 791319780Sdim uint32_t cmd; 792319780Sdim uint32_t cmdsize; 793319780Sdim uint32_t dataoff; 794319780Sdim uint32_t datasize; 795319780Sdim}; 796319780Sdim 797319780Sdimstruct data_in_code_entry { 798319780Sdim uint32_t offset; 799319780Sdim uint16_t length; 800319780Sdim uint16_t kind; 801319780Sdim}; 802319780Sdim 803319780Sdimstruct source_version_command { 804319780Sdim uint32_t cmd; 805319780Sdim uint32_t cmdsize; 806319780Sdim uint64_t version; 807319780Sdim}; 808319780Sdim 809319780Sdimstruct encryption_info_command { 810319780Sdim uint32_t cmd; 811319780Sdim uint32_t cmdsize; 812319780Sdim uint32_t cryptoff; 813319780Sdim uint32_t cryptsize; 814319780Sdim uint32_t cryptid; 815319780Sdim}; 816319780Sdim 817319780Sdimstruct encryption_info_command_64 { 818319780Sdim uint32_t cmd; 819319780Sdim uint32_t cmdsize; 820319780Sdim uint32_t cryptoff; 821319780Sdim uint32_t cryptsize; 822319780Sdim uint32_t cryptid; 823319780Sdim uint32_t pad; 824319780Sdim}; 825319780Sdim 826319780Sdimstruct version_min_command { 827319780Sdim uint32_t cmd; // LC_VERSION_MIN_MACOSX or 828319780Sdim // LC_VERSION_MIN_IPHONEOS 829319780Sdim uint32_t cmdsize; // sizeof(struct version_min_command) 830319780Sdim uint32_t version; // X.Y.Z is encoded in nibbles xxxx.yy.zz 831319780Sdim uint32_t sdk; // X.Y.Z is encoded in nibbles xxxx.yy.zz 832319780Sdim}; 833319780Sdim 834319780Sdimstruct note_command { 835319780Sdim uint32_t cmd; // LC_NOTE 836319780Sdim uint32_t cmdsize; // sizeof(struct note_command) 837319780Sdim char data_owner[16]; // owner name for this LC_NOTE 838319780Sdim uint64_t offset; // file offset of this data 839319780Sdim uint64_t size; // length of data region 840319780Sdim}; 841319780Sdim 842319780Sdimstruct build_tool_version { 843319780Sdim uint32_t tool; // enum for the tool 844319780Sdim uint32_t version; // version of the tool 845319780Sdim}; 846319780Sdim 847319780Sdimstruct build_version_command { 848319780Sdim uint32_t cmd; // LC_BUILD_VERSION 849319780Sdim uint32_t cmdsize; // sizeof(struct build_version_command) + 850319780Sdim // ntools * sizeof(struct build_tool_version) 851319780Sdim uint32_t platform; // platform 852319780Sdim uint32_t minos; // X.Y.Z is encoded in nibbles xxxx.yy.zz 853319780Sdim uint32_t sdk; // X.Y.Z is encoded in nibbles xxxx.yy.zz 854319780Sdim uint32_t ntools; // number of tool entries following this 855319780Sdim}; 856319780Sdim 857319780Sdimstruct dyld_info_command { 858319780Sdim uint32_t cmd; 859319780Sdim uint32_t cmdsize; 860319780Sdim uint32_t rebase_off; 861319780Sdim uint32_t rebase_size; 862319780Sdim uint32_t bind_off; 863319780Sdim uint32_t bind_size; 864319780Sdim uint32_t weak_bind_off; 865319780Sdim uint32_t weak_bind_size; 866319780Sdim uint32_t lazy_bind_off; 867319780Sdim uint32_t lazy_bind_size; 868319780Sdim uint32_t export_off; 869319780Sdim uint32_t export_size; 870319780Sdim}; 871319780Sdim 872319780Sdimstruct linker_option_command { 873319780Sdim uint32_t cmd; 874319780Sdim uint32_t cmdsize; 875319780Sdim uint32_t count; 876319780Sdim}; 877319780Sdim 878319780Sdim// The symseg_command is obsolete and no longer supported. 879319780Sdimstruct symseg_command { 880319780Sdim uint32_t cmd; 881319780Sdim uint32_t cmdsize; 882319780Sdim uint32_t offset; 883319780Sdim uint32_t size; 884319780Sdim}; 885319780Sdim 886319780Sdim// The ident_command is obsolete and no longer supported. 887319780Sdimstruct ident_command { 888319780Sdim uint32_t cmd; 889319780Sdim uint32_t cmdsize; 890319780Sdim}; 891319780Sdim 892319780Sdim// The fvmfile_command is obsolete and no longer supported. 893319780Sdimstruct fvmfile_command { 894319780Sdim uint32_t cmd; 895319780Sdim uint32_t cmdsize; 896319780Sdim uint32_t name; 897319780Sdim uint32_t header_addr; 898319780Sdim}; 899319780Sdim 900319780Sdimstruct tlv_descriptor_32 { 901319780Sdim uint32_t thunk; 902319780Sdim uint32_t key; 903319780Sdim uint32_t offset; 904319780Sdim}; 905319780Sdim 906319780Sdimstruct tlv_descriptor_64 { 907319780Sdim uint64_t thunk; 908319780Sdim uint64_t key; 909319780Sdim uint64_t offset; 910319780Sdim}; 911319780Sdim 912319780Sdimstruct tlv_descriptor { 913319780Sdim uintptr_t thunk; 914319780Sdim uintptr_t key; 915319780Sdim uintptr_t offset; 916319780Sdim}; 917319780Sdim 918319780Sdimstruct entry_point_command { 919319780Sdim uint32_t cmd; 920319780Sdim uint32_t cmdsize; 921319780Sdim uint64_t entryoff; 922319780Sdim uint64_t stacksize; 923319780Sdim}; 924319780Sdim 925319780Sdim// Structs from <mach-o/fat.h> 926319780Sdimstruct fat_header { 927319780Sdim uint32_t magic; 928319780Sdim uint32_t nfat_arch; 929319780Sdim}; 930319780Sdim 931319780Sdimstruct fat_arch { 932319780Sdim uint32_t cputype; 933319780Sdim uint32_t cpusubtype; 934319780Sdim uint32_t offset; 935319780Sdim uint32_t size; 936319780Sdim uint32_t align; 937319780Sdim}; 938319780Sdim 939319780Sdimstruct fat_arch_64 { 940319780Sdim uint32_t cputype; 941319780Sdim uint32_t cpusubtype; 942319780Sdim uint64_t offset; 943319780Sdim uint64_t size; 944319780Sdim uint32_t align; 945319780Sdim uint32_t reserved; 946319780Sdim}; 947319780Sdim 948319780Sdim// Structs from <mach-o/reloc.h> 949319780Sdimstruct relocation_info { 950319780Sdim int32_t r_address; 951353358Sdim#if defined(BYTE_ORDER) && defined(BIG_ENDIAN) && (BYTE_ORDER == BIG_ENDIAN) 952353358Sdim uint32_t r_type : 4, r_extern : 1, r_length : 2, r_pcrel : 1, 953353358Sdim r_symbolnum : 24; 954353358Sdim#else 955319780Sdim uint32_t r_symbolnum : 24, r_pcrel : 1, r_length : 2, r_extern : 1, 956319780Sdim r_type : 4; 957353358Sdim#endif 958319780Sdim}; 959319780Sdim 960319780Sdimstruct scattered_relocation_info { 961319780Sdim#if defined(BYTE_ORDER) && defined(BIG_ENDIAN) && (BYTE_ORDER == BIG_ENDIAN) 962319780Sdim uint32_t r_scattered : 1, r_pcrel : 1, r_length : 2, r_type : 4, 963319780Sdim r_address : 24; 964319780Sdim#else 965319780Sdim uint32_t r_address : 24, r_type : 4, r_length : 2, r_pcrel : 1, 966319780Sdim r_scattered : 1; 967319780Sdim#endif 968319780Sdim int32_t r_value; 969319780Sdim}; 970319780Sdim 971319780Sdim// Structs NOT from <mach-o/reloc.h>, but that make LLVM's life easier 972319780Sdimstruct any_relocation_info { 973319780Sdim uint32_t r_word0, r_word1; 974319780Sdim}; 975319780Sdim 976319780Sdim// Structs from <mach-o/nlist.h> 977319780Sdimstruct nlist_base { 978319780Sdim uint32_t n_strx; 979319780Sdim uint8_t n_type; 980319780Sdim uint8_t n_sect; 981319780Sdim uint16_t n_desc; 982319780Sdim}; 983319780Sdim 984319780Sdimstruct nlist { 985319780Sdim uint32_t n_strx; 986319780Sdim uint8_t n_type; 987319780Sdim uint8_t n_sect; 988319780Sdim int16_t n_desc; 989319780Sdim uint32_t n_value; 990319780Sdim}; 991319780Sdim 992319780Sdimstruct nlist_64 { 993319780Sdim uint32_t n_strx; 994319780Sdim uint8_t n_type; 995319780Sdim uint8_t n_sect; 996319780Sdim uint16_t n_desc; 997319780Sdim uint64_t n_value; 998319780Sdim}; 999319780Sdim 1000319780Sdim// Byte order swapping functions for MachO structs 1001319780Sdim 1002319780Sdiminline void swapStruct(fat_header &mh) { 1003319780Sdim sys::swapByteOrder(mh.magic); 1004319780Sdim sys::swapByteOrder(mh.nfat_arch); 1005319780Sdim} 1006319780Sdim 1007319780Sdiminline void swapStruct(fat_arch &mh) { 1008319780Sdim sys::swapByteOrder(mh.cputype); 1009319780Sdim sys::swapByteOrder(mh.cpusubtype); 1010319780Sdim sys::swapByteOrder(mh.offset); 1011319780Sdim sys::swapByteOrder(mh.size); 1012319780Sdim sys::swapByteOrder(mh.align); 1013319780Sdim} 1014319780Sdim 1015319780Sdiminline void swapStruct(fat_arch_64 &mh) { 1016319780Sdim sys::swapByteOrder(mh.cputype); 1017319780Sdim sys::swapByteOrder(mh.cpusubtype); 1018319780Sdim sys::swapByteOrder(mh.offset); 1019319780Sdim sys::swapByteOrder(mh.size); 1020319780Sdim sys::swapByteOrder(mh.align); 1021319780Sdim sys::swapByteOrder(mh.reserved); 1022319780Sdim} 1023319780Sdim 1024319780Sdiminline void swapStruct(mach_header &mh) { 1025319780Sdim sys::swapByteOrder(mh.magic); 1026319780Sdim sys::swapByteOrder(mh.cputype); 1027319780Sdim sys::swapByteOrder(mh.cpusubtype); 1028319780Sdim sys::swapByteOrder(mh.filetype); 1029319780Sdim sys::swapByteOrder(mh.ncmds); 1030319780Sdim sys::swapByteOrder(mh.sizeofcmds); 1031319780Sdim sys::swapByteOrder(mh.flags); 1032319780Sdim} 1033319780Sdim 1034319780Sdiminline void swapStruct(mach_header_64 &H) { 1035319780Sdim sys::swapByteOrder(H.magic); 1036319780Sdim sys::swapByteOrder(H.cputype); 1037319780Sdim sys::swapByteOrder(H.cpusubtype); 1038319780Sdim sys::swapByteOrder(H.filetype); 1039319780Sdim sys::swapByteOrder(H.ncmds); 1040319780Sdim sys::swapByteOrder(H.sizeofcmds); 1041319780Sdim sys::swapByteOrder(H.flags); 1042319780Sdim sys::swapByteOrder(H.reserved); 1043319780Sdim} 1044319780Sdim 1045319780Sdiminline void swapStruct(load_command &lc) { 1046319780Sdim sys::swapByteOrder(lc.cmd); 1047319780Sdim sys::swapByteOrder(lc.cmdsize); 1048319780Sdim} 1049319780Sdim 1050319780Sdiminline void swapStruct(symtab_command &lc) { 1051319780Sdim sys::swapByteOrder(lc.cmd); 1052319780Sdim sys::swapByteOrder(lc.cmdsize); 1053319780Sdim sys::swapByteOrder(lc.symoff); 1054319780Sdim sys::swapByteOrder(lc.nsyms); 1055319780Sdim sys::swapByteOrder(lc.stroff); 1056319780Sdim sys::swapByteOrder(lc.strsize); 1057319780Sdim} 1058319780Sdim 1059319780Sdiminline void swapStruct(segment_command_64 &seg) { 1060319780Sdim sys::swapByteOrder(seg.cmd); 1061319780Sdim sys::swapByteOrder(seg.cmdsize); 1062319780Sdim sys::swapByteOrder(seg.vmaddr); 1063319780Sdim sys::swapByteOrder(seg.vmsize); 1064319780Sdim sys::swapByteOrder(seg.fileoff); 1065319780Sdim sys::swapByteOrder(seg.filesize); 1066319780Sdim sys::swapByteOrder(seg.maxprot); 1067319780Sdim sys::swapByteOrder(seg.initprot); 1068319780Sdim sys::swapByteOrder(seg.nsects); 1069319780Sdim sys::swapByteOrder(seg.flags); 1070319780Sdim} 1071319780Sdim 1072319780Sdiminline void swapStruct(segment_command &seg) { 1073319780Sdim sys::swapByteOrder(seg.cmd); 1074319780Sdim sys::swapByteOrder(seg.cmdsize); 1075319780Sdim sys::swapByteOrder(seg.vmaddr); 1076319780Sdim sys::swapByteOrder(seg.vmsize); 1077319780Sdim sys::swapByteOrder(seg.fileoff); 1078319780Sdim sys::swapByteOrder(seg.filesize); 1079319780Sdim sys::swapByteOrder(seg.maxprot); 1080319780Sdim sys::swapByteOrder(seg.initprot); 1081319780Sdim sys::swapByteOrder(seg.nsects); 1082319780Sdim sys::swapByteOrder(seg.flags); 1083319780Sdim} 1084319780Sdim 1085319780Sdiminline void swapStruct(section_64 §) { 1086319780Sdim sys::swapByteOrder(sect.addr); 1087319780Sdim sys::swapByteOrder(sect.size); 1088319780Sdim sys::swapByteOrder(sect.offset); 1089319780Sdim sys::swapByteOrder(sect.align); 1090319780Sdim sys::swapByteOrder(sect.reloff); 1091319780Sdim sys::swapByteOrder(sect.nreloc); 1092319780Sdim sys::swapByteOrder(sect.flags); 1093319780Sdim sys::swapByteOrder(sect.reserved1); 1094319780Sdim sys::swapByteOrder(sect.reserved2); 1095319780Sdim} 1096319780Sdim 1097319780Sdiminline void swapStruct(section §) { 1098319780Sdim sys::swapByteOrder(sect.addr); 1099319780Sdim sys::swapByteOrder(sect.size); 1100319780Sdim sys::swapByteOrder(sect.offset); 1101319780Sdim sys::swapByteOrder(sect.align); 1102319780Sdim sys::swapByteOrder(sect.reloff); 1103319780Sdim sys::swapByteOrder(sect.nreloc); 1104319780Sdim sys::swapByteOrder(sect.flags); 1105319780Sdim sys::swapByteOrder(sect.reserved1); 1106319780Sdim sys::swapByteOrder(sect.reserved2); 1107319780Sdim} 1108319780Sdim 1109319780Sdiminline void swapStruct(dyld_info_command &info) { 1110319780Sdim sys::swapByteOrder(info.cmd); 1111319780Sdim sys::swapByteOrder(info.cmdsize); 1112319780Sdim sys::swapByteOrder(info.rebase_off); 1113319780Sdim sys::swapByteOrder(info.rebase_size); 1114319780Sdim sys::swapByteOrder(info.bind_off); 1115319780Sdim sys::swapByteOrder(info.bind_size); 1116319780Sdim sys::swapByteOrder(info.weak_bind_off); 1117319780Sdim sys::swapByteOrder(info.weak_bind_size); 1118319780Sdim sys::swapByteOrder(info.lazy_bind_off); 1119319780Sdim sys::swapByteOrder(info.lazy_bind_size); 1120319780Sdim sys::swapByteOrder(info.export_off); 1121319780Sdim sys::swapByteOrder(info.export_size); 1122319780Sdim} 1123319780Sdim 1124319780Sdiminline void swapStruct(dylib_command &d) { 1125319780Sdim sys::swapByteOrder(d.cmd); 1126319780Sdim sys::swapByteOrder(d.cmdsize); 1127319780Sdim sys::swapByteOrder(d.dylib.name); 1128319780Sdim sys::swapByteOrder(d.dylib.timestamp); 1129319780Sdim sys::swapByteOrder(d.dylib.current_version); 1130319780Sdim sys::swapByteOrder(d.dylib.compatibility_version); 1131319780Sdim} 1132319780Sdim 1133319780Sdiminline void swapStruct(sub_framework_command &s) { 1134319780Sdim sys::swapByteOrder(s.cmd); 1135319780Sdim sys::swapByteOrder(s.cmdsize); 1136319780Sdim sys::swapByteOrder(s.umbrella); 1137319780Sdim} 1138319780Sdim 1139319780Sdiminline void swapStruct(sub_umbrella_command &s) { 1140319780Sdim sys::swapByteOrder(s.cmd); 1141319780Sdim sys::swapByteOrder(s.cmdsize); 1142319780Sdim sys::swapByteOrder(s.sub_umbrella); 1143319780Sdim} 1144319780Sdim 1145319780Sdiminline void swapStruct(sub_library_command &s) { 1146319780Sdim sys::swapByteOrder(s.cmd); 1147319780Sdim sys::swapByteOrder(s.cmdsize); 1148319780Sdim sys::swapByteOrder(s.sub_library); 1149319780Sdim} 1150319780Sdim 1151319780Sdiminline void swapStruct(sub_client_command &s) { 1152319780Sdim sys::swapByteOrder(s.cmd); 1153319780Sdim sys::swapByteOrder(s.cmdsize); 1154319780Sdim sys::swapByteOrder(s.client); 1155319780Sdim} 1156319780Sdim 1157319780Sdiminline void swapStruct(routines_command &r) { 1158319780Sdim sys::swapByteOrder(r.cmd); 1159319780Sdim sys::swapByteOrder(r.cmdsize); 1160319780Sdim sys::swapByteOrder(r.init_address); 1161319780Sdim sys::swapByteOrder(r.init_module); 1162319780Sdim sys::swapByteOrder(r.reserved1); 1163319780Sdim sys::swapByteOrder(r.reserved2); 1164319780Sdim sys::swapByteOrder(r.reserved3); 1165319780Sdim sys::swapByteOrder(r.reserved4); 1166319780Sdim sys::swapByteOrder(r.reserved5); 1167319780Sdim sys::swapByteOrder(r.reserved6); 1168319780Sdim} 1169319780Sdim 1170319780Sdiminline void swapStruct(routines_command_64 &r) { 1171319780Sdim sys::swapByteOrder(r.cmd); 1172319780Sdim sys::swapByteOrder(r.cmdsize); 1173319780Sdim sys::swapByteOrder(r.init_address); 1174319780Sdim sys::swapByteOrder(r.init_module); 1175319780Sdim sys::swapByteOrder(r.reserved1); 1176319780Sdim sys::swapByteOrder(r.reserved2); 1177319780Sdim sys::swapByteOrder(r.reserved3); 1178319780Sdim sys::swapByteOrder(r.reserved4); 1179319780Sdim sys::swapByteOrder(r.reserved5); 1180319780Sdim sys::swapByteOrder(r.reserved6); 1181319780Sdim} 1182319780Sdim 1183319780Sdiminline void swapStruct(thread_command &t) { 1184319780Sdim sys::swapByteOrder(t.cmd); 1185319780Sdim sys::swapByteOrder(t.cmdsize); 1186319780Sdim} 1187319780Sdim 1188319780Sdiminline void swapStruct(dylinker_command &d) { 1189319780Sdim sys::swapByteOrder(d.cmd); 1190319780Sdim sys::swapByteOrder(d.cmdsize); 1191319780Sdim sys::swapByteOrder(d.name); 1192319780Sdim} 1193319780Sdim 1194319780Sdiminline void swapStruct(uuid_command &u) { 1195319780Sdim sys::swapByteOrder(u.cmd); 1196319780Sdim sys::swapByteOrder(u.cmdsize); 1197319780Sdim} 1198319780Sdim 1199319780Sdiminline void swapStruct(rpath_command &r) { 1200319780Sdim sys::swapByteOrder(r.cmd); 1201319780Sdim sys::swapByteOrder(r.cmdsize); 1202319780Sdim sys::swapByteOrder(r.path); 1203319780Sdim} 1204319780Sdim 1205319780Sdiminline void swapStruct(source_version_command &s) { 1206319780Sdim sys::swapByteOrder(s.cmd); 1207319780Sdim sys::swapByteOrder(s.cmdsize); 1208319780Sdim sys::swapByteOrder(s.version); 1209319780Sdim} 1210319780Sdim 1211319780Sdiminline void swapStruct(entry_point_command &e) { 1212319780Sdim sys::swapByteOrder(e.cmd); 1213319780Sdim sys::swapByteOrder(e.cmdsize); 1214319780Sdim sys::swapByteOrder(e.entryoff); 1215319780Sdim sys::swapByteOrder(e.stacksize); 1216319780Sdim} 1217319780Sdim 1218319780Sdiminline void swapStruct(encryption_info_command &e) { 1219319780Sdim sys::swapByteOrder(e.cmd); 1220319780Sdim sys::swapByteOrder(e.cmdsize); 1221319780Sdim sys::swapByteOrder(e.cryptoff); 1222319780Sdim sys::swapByteOrder(e.cryptsize); 1223319780Sdim sys::swapByteOrder(e.cryptid); 1224319780Sdim} 1225319780Sdim 1226319780Sdiminline void swapStruct(encryption_info_command_64 &e) { 1227319780Sdim sys::swapByteOrder(e.cmd); 1228319780Sdim sys::swapByteOrder(e.cmdsize); 1229319780Sdim sys::swapByteOrder(e.cryptoff); 1230319780Sdim sys::swapByteOrder(e.cryptsize); 1231319780Sdim sys::swapByteOrder(e.cryptid); 1232319780Sdim sys::swapByteOrder(e.pad); 1233319780Sdim} 1234319780Sdim 1235319780Sdiminline void swapStruct(dysymtab_command &dst) { 1236319780Sdim sys::swapByteOrder(dst.cmd); 1237319780Sdim sys::swapByteOrder(dst.cmdsize); 1238319780Sdim sys::swapByteOrder(dst.ilocalsym); 1239319780Sdim sys::swapByteOrder(dst.nlocalsym); 1240319780Sdim sys::swapByteOrder(dst.iextdefsym); 1241319780Sdim sys::swapByteOrder(dst.nextdefsym); 1242319780Sdim sys::swapByteOrder(dst.iundefsym); 1243319780Sdim sys::swapByteOrder(dst.nundefsym); 1244319780Sdim sys::swapByteOrder(dst.tocoff); 1245319780Sdim sys::swapByteOrder(dst.ntoc); 1246319780Sdim sys::swapByteOrder(dst.modtaboff); 1247319780Sdim sys::swapByteOrder(dst.nmodtab); 1248319780Sdim sys::swapByteOrder(dst.extrefsymoff); 1249319780Sdim sys::swapByteOrder(dst.nextrefsyms); 1250319780Sdim sys::swapByteOrder(dst.indirectsymoff); 1251319780Sdim sys::swapByteOrder(dst.nindirectsyms); 1252319780Sdim sys::swapByteOrder(dst.extreloff); 1253319780Sdim sys::swapByteOrder(dst.nextrel); 1254319780Sdim sys::swapByteOrder(dst.locreloff); 1255319780Sdim sys::swapByteOrder(dst.nlocrel); 1256319780Sdim} 1257319780Sdim 1258319780Sdiminline void swapStruct(any_relocation_info &reloc) { 1259319780Sdim sys::swapByteOrder(reloc.r_word0); 1260319780Sdim sys::swapByteOrder(reloc.r_word1); 1261319780Sdim} 1262319780Sdim 1263319780Sdiminline void swapStruct(nlist_base &S) { 1264319780Sdim sys::swapByteOrder(S.n_strx); 1265319780Sdim sys::swapByteOrder(S.n_desc); 1266319780Sdim} 1267319780Sdim 1268319780Sdiminline void swapStruct(nlist &sym) { 1269319780Sdim sys::swapByteOrder(sym.n_strx); 1270319780Sdim sys::swapByteOrder(sym.n_desc); 1271319780Sdim sys::swapByteOrder(sym.n_value); 1272319780Sdim} 1273319780Sdim 1274319780Sdiminline void swapStruct(nlist_64 &sym) { 1275319780Sdim sys::swapByteOrder(sym.n_strx); 1276319780Sdim sys::swapByteOrder(sym.n_desc); 1277319780Sdim sys::swapByteOrder(sym.n_value); 1278319780Sdim} 1279319780Sdim 1280319780Sdiminline void swapStruct(linkedit_data_command &C) { 1281319780Sdim sys::swapByteOrder(C.cmd); 1282319780Sdim sys::swapByteOrder(C.cmdsize); 1283319780Sdim sys::swapByteOrder(C.dataoff); 1284319780Sdim sys::swapByteOrder(C.datasize); 1285319780Sdim} 1286319780Sdim 1287319780Sdiminline void swapStruct(linker_option_command &C) { 1288319780Sdim sys::swapByteOrder(C.cmd); 1289319780Sdim sys::swapByteOrder(C.cmdsize); 1290319780Sdim sys::swapByteOrder(C.count); 1291319780Sdim} 1292319780Sdim 1293319780Sdiminline void swapStruct(version_min_command &C) { 1294319780Sdim sys::swapByteOrder(C.cmd); 1295319780Sdim sys::swapByteOrder(C.cmdsize); 1296319780Sdim sys::swapByteOrder(C.version); 1297319780Sdim sys::swapByteOrder(C.sdk); 1298319780Sdim} 1299319780Sdim 1300319780Sdiminline void swapStruct(note_command &C) { 1301319780Sdim sys::swapByteOrder(C.cmd); 1302319780Sdim sys::swapByteOrder(C.cmdsize); 1303319780Sdim sys::swapByteOrder(C.offset); 1304319780Sdim sys::swapByteOrder(C.size); 1305319780Sdim} 1306319780Sdim 1307319780Sdiminline void swapStruct(build_version_command &C) { 1308319780Sdim sys::swapByteOrder(C.cmd); 1309319780Sdim sys::swapByteOrder(C.cmdsize); 1310319780Sdim sys::swapByteOrder(C.platform); 1311319780Sdim sys::swapByteOrder(C.minos); 1312319780Sdim sys::swapByteOrder(C.sdk); 1313319780Sdim sys::swapByteOrder(C.ntools); 1314319780Sdim} 1315319780Sdim 1316319780Sdiminline void swapStruct(build_tool_version &C) { 1317319780Sdim sys::swapByteOrder(C.tool); 1318319780Sdim sys::swapByteOrder(C.version); 1319319780Sdim} 1320319780Sdim 1321319780Sdiminline void swapStruct(data_in_code_entry &C) { 1322319780Sdim sys::swapByteOrder(C.offset); 1323319780Sdim sys::swapByteOrder(C.length); 1324319780Sdim sys::swapByteOrder(C.kind); 1325319780Sdim} 1326319780Sdim 1327319780Sdiminline void swapStruct(uint32_t &C) { sys::swapByteOrder(C); } 1328319780Sdim 1329319780Sdim// The prebind_cksum_command is obsolete and no longer supported. 1330319780Sdiminline void swapStruct(prebind_cksum_command &C) { 1331319780Sdim sys::swapByteOrder(C.cmd); 1332319780Sdim sys::swapByteOrder(C.cmdsize); 1333319780Sdim sys::swapByteOrder(C.cksum); 1334319780Sdim} 1335319780Sdim 1336319780Sdim// The twolevel_hints_command is obsolete and no longer supported. 1337319780Sdiminline void swapStruct(twolevel_hints_command &C) { 1338319780Sdim sys::swapByteOrder(C.cmd); 1339319780Sdim sys::swapByteOrder(C.cmdsize); 1340319780Sdim sys::swapByteOrder(C.offset); 1341319780Sdim sys::swapByteOrder(C.nhints); 1342319780Sdim} 1343319780Sdim 1344319780Sdim// The prebound_dylib_command is obsolete and no longer supported. 1345319780Sdiminline void swapStruct(prebound_dylib_command &C) { 1346319780Sdim sys::swapByteOrder(C.cmd); 1347319780Sdim sys::swapByteOrder(C.cmdsize); 1348319780Sdim sys::swapByteOrder(C.name); 1349319780Sdim sys::swapByteOrder(C.nmodules); 1350319780Sdim sys::swapByteOrder(C.linked_modules); 1351319780Sdim} 1352319780Sdim 1353319780Sdim// The fvmfile_command is obsolete and no longer supported. 1354319780Sdiminline void swapStruct(fvmfile_command &C) { 1355319780Sdim sys::swapByteOrder(C.cmd); 1356319780Sdim sys::swapByteOrder(C.cmdsize); 1357319780Sdim sys::swapByteOrder(C.name); 1358319780Sdim sys::swapByteOrder(C.header_addr); 1359319780Sdim} 1360319780Sdim 1361319780Sdim// The symseg_command is obsolete and no longer supported. 1362319780Sdiminline void swapStruct(symseg_command &C) { 1363319780Sdim sys::swapByteOrder(C.cmd); 1364319780Sdim sys::swapByteOrder(C.cmdsize); 1365319780Sdim sys::swapByteOrder(C.offset); 1366319780Sdim sys::swapByteOrder(C.size); 1367319780Sdim} 1368319780Sdim 1369319780Sdim// The ident_command is obsolete and no longer supported. 1370319780Sdiminline void swapStruct(ident_command &C) { 1371319780Sdim sys::swapByteOrder(C.cmd); 1372319780Sdim sys::swapByteOrder(C.cmdsize); 1373319780Sdim} 1374319780Sdim 1375319780Sdiminline void swapStruct(fvmlib &C) { 1376319780Sdim sys::swapByteOrder(C.name); 1377319780Sdim sys::swapByteOrder(C.minor_version); 1378319780Sdim sys::swapByteOrder(C.header_addr); 1379319780Sdim} 1380319780Sdim 1381319780Sdim// The fvmlib_command is obsolete and no longer supported. 1382319780Sdiminline void swapStruct(fvmlib_command &C) { 1383319780Sdim sys::swapByteOrder(C.cmd); 1384319780Sdim sys::swapByteOrder(C.cmdsize); 1385319780Sdim swapStruct(C.fvmlib); 1386319780Sdim} 1387319780Sdim 1388319780Sdim// Get/Set functions from <mach-o/nlist.h> 1389319780Sdim 1390327952Sdiminline uint16_t GET_LIBRARY_ORDINAL(uint16_t n_desc) { 1391319780Sdim return (((n_desc) >> 8u) & 0xffu); 1392319780Sdim} 1393319780Sdim 1394327952Sdiminline void SET_LIBRARY_ORDINAL(uint16_t &n_desc, uint8_t ordinal) { 1395319780Sdim n_desc = (((n_desc)&0x00ff) | (((ordinal)&0xff) << 8)); 1396319780Sdim} 1397319780Sdim 1398327952Sdiminline uint8_t GET_COMM_ALIGN(uint16_t n_desc) { 1399319780Sdim return (n_desc >> 8u) & 0x0fu; 1400319780Sdim} 1401319780Sdim 1402327952Sdiminline void SET_COMM_ALIGN(uint16_t &n_desc, uint8_t align) { 1403319780Sdim n_desc = ((n_desc & 0xf0ffu) | ((align & 0x0fu) << 8u)); 1404319780Sdim} 1405319780Sdim 1406319780Sdim// Enums from <mach/machine.h> 1407319780Sdimenum : uint32_t { 1408319780Sdim // Capability bits used in the definition of cpu_type. 1409319780Sdim CPU_ARCH_MASK = 0xff000000, // Mask for architecture bits 1410353358Sdim CPU_ARCH_ABI64 = 0x01000000, // 64 bit ABI 1411353358Sdim CPU_ARCH_ABI64_32 = 0x02000000, // ILP32 ABI on 64-bit hardware 1412319780Sdim}; 1413319780Sdim 1414319780Sdim// Constants for the cputype field. 1415319780Sdimenum CPUType { 1416319780Sdim CPU_TYPE_ANY = -1, 1417319780Sdim CPU_TYPE_X86 = 7, 1418319780Sdim CPU_TYPE_I386 = CPU_TYPE_X86, 1419319780Sdim CPU_TYPE_X86_64 = CPU_TYPE_X86 | CPU_ARCH_ABI64, 1420319780Sdim /* CPU_TYPE_MIPS = 8, */ 1421319780Sdim CPU_TYPE_MC98000 = 10, // Old Motorola PowerPC 1422319780Sdim CPU_TYPE_ARM = 12, 1423319780Sdim CPU_TYPE_ARM64 = CPU_TYPE_ARM | CPU_ARCH_ABI64, 1424353358Sdim CPU_TYPE_ARM64_32 = CPU_TYPE_ARM | CPU_ARCH_ABI64_32, 1425319780Sdim CPU_TYPE_SPARC = 14, 1426319780Sdim CPU_TYPE_POWERPC = 18, 1427319780Sdim CPU_TYPE_POWERPC64 = CPU_TYPE_POWERPC | CPU_ARCH_ABI64 1428319780Sdim}; 1429319780Sdim 1430319780Sdimenum : uint32_t { 1431319780Sdim // Capability bits used in the definition of cpusubtype. 1432319780Sdim CPU_SUBTYPE_MASK = 0xff000000, // Mask for architecture bits 1433319780Sdim CPU_SUBTYPE_LIB64 = 0x80000000, // 64 bit libraries 1434319780Sdim 1435319780Sdim // Special CPU subtype constants. 1436319780Sdim CPU_SUBTYPE_MULTIPLE = ~0u 1437319780Sdim}; 1438319780Sdim 1439319780Sdim// Constants for the cpusubtype field. 1440319780Sdimenum CPUSubTypeX86 { 1441319780Sdim CPU_SUBTYPE_I386_ALL = 3, 1442319780Sdim CPU_SUBTYPE_386 = 3, 1443319780Sdim CPU_SUBTYPE_486 = 4, 1444319780Sdim CPU_SUBTYPE_486SX = 0x84, 1445319780Sdim CPU_SUBTYPE_586 = 5, 1446319780Sdim CPU_SUBTYPE_PENT = CPU_SUBTYPE_586, 1447319780Sdim CPU_SUBTYPE_PENTPRO = 0x16, 1448319780Sdim CPU_SUBTYPE_PENTII_M3 = 0x36, 1449319780Sdim CPU_SUBTYPE_PENTII_M5 = 0x56, 1450319780Sdim CPU_SUBTYPE_CELERON = 0x67, 1451319780Sdim CPU_SUBTYPE_CELERON_MOBILE = 0x77, 1452319780Sdim CPU_SUBTYPE_PENTIUM_3 = 0x08, 1453319780Sdim CPU_SUBTYPE_PENTIUM_3_M = 0x18, 1454319780Sdim CPU_SUBTYPE_PENTIUM_3_XEON = 0x28, 1455319780Sdim CPU_SUBTYPE_PENTIUM_M = 0x09, 1456319780Sdim CPU_SUBTYPE_PENTIUM_4 = 0x0a, 1457319780Sdim CPU_SUBTYPE_PENTIUM_4_M = 0x1a, 1458319780Sdim CPU_SUBTYPE_ITANIUM = 0x0b, 1459319780Sdim CPU_SUBTYPE_ITANIUM_2 = 0x1b, 1460319780Sdim CPU_SUBTYPE_XEON = 0x0c, 1461319780Sdim CPU_SUBTYPE_XEON_MP = 0x1c, 1462319780Sdim 1463319780Sdim CPU_SUBTYPE_X86_ALL = 3, 1464319780Sdim CPU_SUBTYPE_X86_64_ALL = 3, 1465319780Sdim CPU_SUBTYPE_X86_ARCH1 = 4, 1466319780Sdim CPU_SUBTYPE_X86_64_H = 8 1467319780Sdim}; 1468327952Sdiminline int CPU_SUBTYPE_INTEL(int Family, int Model) { 1469319780Sdim return Family | (Model << 4); 1470319780Sdim} 1471327952Sdiminline int CPU_SUBTYPE_INTEL_FAMILY(CPUSubTypeX86 ST) { 1472319780Sdim return ((int)ST) & 0x0f; 1473319780Sdim} 1474327952Sdiminline int CPU_SUBTYPE_INTEL_MODEL(CPUSubTypeX86 ST) { return ((int)ST) >> 4; } 1475319780Sdimenum { CPU_SUBTYPE_INTEL_FAMILY_MAX = 15, CPU_SUBTYPE_INTEL_MODEL_ALL = 0 }; 1476319780Sdim 1477319780Sdimenum CPUSubTypeARM { 1478319780Sdim CPU_SUBTYPE_ARM_ALL = 0, 1479319780Sdim CPU_SUBTYPE_ARM_V4T = 5, 1480319780Sdim CPU_SUBTYPE_ARM_V6 = 6, 1481319780Sdim CPU_SUBTYPE_ARM_V5 = 7, 1482319780Sdim CPU_SUBTYPE_ARM_V5TEJ = 7, 1483319780Sdim CPU_SUBTYPE_ARM_XSCALE = 8, 1484319780Sdim CPU_SUBTYPE_ARM_V7 = 9, 1485319780Sdim // unused ARM_V7F = 10, 1486319780Sdim CPU_SUBTYPE_ARM_V7S = 11, 1487319780Sdim CPU_SUBTYPE_ARM_V7K = 12, 1488319780Sdim CPU_SUBTYPE_ARM_V6M = 14, 1489319780Sdim CPU_SUBTYPE_ARM_V7M = 15, 1490319780Sdim CPU_SUBTYPE_ARM_V7EM = 16 1491319780Sdim}; 1492319780Sdim 1493353358Sdimenum CPUSubTypeARM64 { 1494353358Sdim CPU_SUBTYPE_ARM64_ALL = 0, 1495353358Sdim CPU_SUBTYPE_ARM64E = 2, 1496353358Sdim}; 1497319780Sdim 1498353358Sdimenum CPUSubTypeARM64_32 { CPU_SUBTYPE_ARM64_32_V8 = 1 }; 1499353358Sdim 1500319780Sdimenum CPUSubTypeSPARC { CPU_SUBTYPE_SPARC_ALL = 0 }; 1501319780Sdim 1502319780Sdimenum CPUSubTypePowerPC { 1503319780Sdim CPU_SUBTYPE_POWERPC_ALL = 0, 1504319780Sdim CPU_SUBTYPE_POWERPC_601 = 1, 1505319780Sdim CPU_SUBTYPE_POWERPC_602 = 2, 1506319780Sdim CPU_SUBTYPE_POWERPC_603 = 3, 1507319780Sdim CPU_SUBTYPE_POWERPC_603e = 4, 1508319780Sdim CPU_SUBTYPE_POWERPC_603ev = 5, 1509319780Sdim CPU_SUBTYPE_POWERPC_604 = 6, 1510319780Sdim CPU_SUBTYPE_POWERPC_604e = 7, 1511319780Sdim CPU_SUBTYPE_POWERPC_620 = 8, 1512319780Sdim CPU_SUBTYPE_POWERPC_750 = 9, 1513319780Sdim CPU_SUBTYPE_POWERPC_7400 = 10, 1514319780Sdim CPU_SUBTYPE_POWERPC_7450 = 11, 1515319780Sdim CPU_SUBTYPE_POWERPC_970 = 100, 1516319780Sdim 1517319780Sdim CPU_SUBTYPE_MC980000_ALL = CPU_SUBTYPE_POWERPC_ALL, 1518319780Sdim CPU_SUBTYPE_MC98601 = CPU_SUBTYPE_POWERPC_601 1519319780Sdim}; 1520319780Sdim 1521319780Sdimstruct x86_thread_state32_t { 1522319780Sdim uint32_t eax; 1523319780Sdim uint32_t ebx; 1524319780Sdim uint32_t ecx; 1525319780Sdim uint32_t edx; 1526319780Sdim uint32_t edi; 1527319780Sdim uint32_t esi; 1528319780Sdim uint32_t ebp; 1529319780Sdim uint32_t esp; 1530319780Sdim uint32_t ss; 1531319780Sdim uint32_t eflags; 1532319780Sdim uint32_t eip; 1533319780Sdim uint32_t cs; 1534319780Sdim uint32_t ds; 1535319780Sdim uint32_t es; 1536319780Sdim uint32_t fs; 1537319780Sdim uint32_t gs; 1538319780Sdim}; 1539319780Sdim 1540319780Sdimstruct x86_thread_state64_t { 1541319780Sdim uint64_t rax; 1542319780Sdim uint64_t rbx; 1543319780Sdim uint64_t rcx; 1544319780Sdim uint64_t rdx; 1545319780Sdim uint64_t rdi; 1546319780Sdim uint64_t rsi; 1547319780Sdim uint64_t rbp; 1548319780Sdim uint64_t rsp; 1549319780Sdim uint64_t r8; 1550319780Sdim uint64_t r9; 1551319780Sdim uint64_t r10; 1552319780Sdim uint64_t r11; 1553319780Sdim uint64_t r12; 1554319780Sdim uint64_t r13; 1555319780Sdim uint64_t r14; 1556319780Sdim uint64_t r15; 1557319780Sdim uint64_t rip; 1558319780Sdim uint64_t rflags; 1559319780Sdim uint64_t cs; 1560319780Sdim uint64_t fs; 1561319780Sdim uint64_t gs; 1562319780Sdim}; 1563319780Sdim 1564319780Sdimenum x86_fp_control_precis { 1565319780Sdim x86_FP_PREC_24B = 0, 1566319780Sdim x86_FP_PREC_53B = 2, 1567319780Sdim x86_FP_PREC_64B = 3 1568319780Sdim}; 1569319780Sdim 1570319780Sdimenum x86_fp_control_rc { 1571319780Sdim x86_FP_RND_NEAR = 0, 1572319780Sdim x86_FP_RND_DOWN = 1, 1573319780Sdim x86_FP_RND_UP = 2, 1574319780Sdim x86_FP_CHOP = 3 1575319780Sdim}; 1576319780Sdim 1577319780Sdimstruct fp_control_t { 1578319780Sdim unsigned short invalid : 1, denorm : 1, zdiv : 1, ovrfl : 1, undfl : 1, 1579319780Sdim precis : 1, : 2, pc : 2, rc : 2, : 1, : 3; 1580319780Sdim}; 1581319780Sdim 1582319780Sdimstruct fp_status_t { 1583319780Sdim unsigned short invalid : 1, denorm : 1, zdiv : 1, ovrfl : 1, undfl : 1, 1584319780Sdim precis : 1, stkflt : 1, errsumm : 1, c0 : 1, c1 : 1, c2 : 1, tos : 3, 1585319780Sdim c3 : 1, busy : 1; 1586319780Sdim}; 1587319780Sdim 1588319780Sdimstruct mmst_reg_t { 1589319780Sdim char mmst_reg[10]; 1590319780Sdim char mmst_rsrv[6]; 1591319780Sdim}; 1592319780Sdim 1593319780Sdimstruct xmm_reg_t { 1594319780Sdim char xmm_reg[16]; 1595319780Sdim}; 1596319780Sdim 1597319780Sdimstruct x86_float_state64_t { 1598319780Sdim int32_t fpu_reserved[2]; 1599319780Sdim fp_control_t fpu_fcw; 1600319780Sdim fp_status_t fpu_fsw; 1601319780Sdim uint8_t fpu_ftw; 1602319780Sdim uint8_t fpu_rsrv1; 1603319780Sdim uint16_t fpu_fop; 1604319780Sdim uint32_t fpu_ip; 1605319780Sdim uint16_t fpu_cs; 1606319780Sdim uint16_t fpu_rsrv2; 1607319780Sdim uint32_t fpu_dp; 1608319780Sdim uint16_t fpu_ds; 1609319780Sdim uint16_t fpu_rsrv3; 1610319780Sdim uint32_t fpu_mxcsr; 1611319780Sdim uint32_t fpu_mxcsrmask; 1612319780Sdim mmst_reg_t fpu_stmm0; 1613319780Sdim mmst_reg_t fpu_stmm1; 1614319780Sdim mmst_reg_t fpu_stmm2; 1615319780Sdim mmst_reg_t fpu_stmm3; 1616319780Sdim mmst_reg_t fpu_stmm4; 1617319780Sdim mmst_reg_t fpu_stmm5; 1618319780Sdim mmst_reg_t fpu_stmm6; 1619319780Sdim mmst_reg_t fpu_stmm7; 1620319780Sdim xmm_reg_t fpu_xmm0; 1621319780Sdim xmm_reg_t fpu_xmm1; 1622319780Sdim xmm_reg_t fpu_xmm2; 1623319780Sdim xmm_reg_t fpu_xmm3; 1624319780Sdim xmm_reg_t fpu_xmm4; 1625319780Sdim xmm_reg_t fpu_xmm5; 1626319780Sdim xmm_reg_t fpu_xmm6; 1627319780Sdim xmm_reg_t fpu_xmm7; 1628319780Sdim xmm_reg_t fpu_xmm8; 1629319780Sdim xmm_reg_t fpu_xmm9; 1630319780Sdim xmm_reg_t fpu_xmm10; 1631319780Sdim xmm_reg_t fpu_xmm11; 1632319780Sdim xmm_reg_t fpu_xmm12; 1633319780Sdim xmm_reg_t fpu_xmm13; 1634319780Sdim xmm_reg_t fpu_xmm14; 1635319780Sdim xmm_reg_t fpu_xmm15; 1636319780Sdim char fpu_rsrv4[6 * 16]; 1637319780Sdim uint32_t fpu_reserved1; 1638319780Sdim}; 1639319780Sdim 1640319780Sdimstruct x86_exception_state64_t { 1641319780Sdim uint16_t trapno; 1642319780Sdim uint16_t cpu; 1643319780Sdim uint32_t err; 1644319780Sdim uint64_t faultvaddr; 1645319780Sdim}; 1646319780Sdim 1647319780Sdiminline void swapStruct(x86_thread_state32_t &x) { 1648319780Sdim sys::swapByteOrder(x.eax); 1649319780Sdim sys::swapByteOrder(x.ebx); 1650319780Sdim sys::swapByteOrder(x.ecx); 1651319780Sdim sys::swapByteOrder(x.edx); 1652319780Sdim sys::swapByteOrder(x.edi); 1653319780Sdim sys::swapByteOrder(x.esi); 1654319780Sdim sys::swapByteOrder(x.ebp); 1655319780Sdim sys::swapByteOrder(x.esp); 1656319780Sdim sys::swapByteOrder(x.ss); 1657319780Sdim sys::swapByteOrder(x.eflags); 1658319780Sdim sys::swapByteOrder(x.eip); 1659319780Sdim sys::swapByteOrder(x.cs); 1660319780Sdim sys::swapByteOrder(x.ds); 1661319780Sdim sys::swapByteOrder(x.es); 1662319780Sdim sys::swapByteOrder(x.fs); 1663319780Sdim sys::swapByteOrder(x.gs); 1664319780Sdim} 1665319780Sdim 1666319780Sdiminline void swapStruct(x86_thread_state64_t &x) { 1667319780Sdim sys::swapByteOrder(x.rax); 1668319780Sdim sys::swapByteOrder(x.rbx); 1669319780Sdim sys::swapByteOrder(x.rcx); 1670319780Sdim sys::swapByteOrder(x.rdx); 1671319780Sdim sys::swapByteOrder(x.rdi); 1672319780Sdim sys::swapByteOrder(x.rsi); 1673319780Sdim sys::swapByteOrder(x.rbp); 1674319780Sdim sys::swapByteOrder(x.rsp); 1675319780Sdim sys::swapByteOrder(x.r8); 1676319780Sdim sys::swapByteOrder(x.r9); 1677319780Sdim sys::swapByteOrder(x.r10); 1678319780Sdim sys::swapByteOrder(x.r11); 1679319780Sdim sys::swapByteOrder(x.r12); 1680319780Sdim sys::swapByteOrder(x.r13); 1681319780Sdim sys::swapByteOrder(x.r14); 1682319780Sdim sys::swapByteOrder(x.r15); 1683319780Sdim sys::swapByteOrder(x.rip); 1684319780Sdim sys::swapByteOrder(x.rflags); 1685319780Sdim sys::swapByteOrder(x.cs); 1686319780Sdim sys::swapByteOrder(x.fs); 1687319780Sdim sys::swapByteOrder(x.gs); 1688319780Sdim} 1689319780Sdim 1690319780Sdiminline void swapStruct(x86_float_state64_t &x) { 1691319780Sdim sys::swapByteOrder(x.fpu_reserved[0]); 1692319780Sdim sys::swapByteOrder(x.fpu_reserved[1]); 1693319780Sdim // TODO swap: fp_control_t fpu_fcw; 1694319780Sdim // TODO swap: fp_status_t fpu_fsw; 1695319780Sdim sys::swapByteOrder(x.fpu_fop); 1696319780Sdim sys::swapByteOrder(x.fpu_ip); 1697319780Sdim sys::swapByteOrder(x.fpu_cs); 1698319780Sdim sys::swapByteOrder(x.fpu_rsrv2); 1699319780Sdim sys::swapByteOrder(x.fpu_dp); 1700319780Sdim sys::swapByteOrder(x.fpu_ds); 1701319780Sdim sys::swapByteOrder(x.fpu_rsrv3); 1702319780Sdim sys::swapByteOrder(x.fpu_mxcsr); 1703319780Sdim sys::swapByteOrder(x.fpu_mxcsrmask); 1704319780Sdim sys::swapByteOrder(x.fpu_reserved1); 1705319780Sdim} 1706319780Sdim 1707319780Sdiminline void swapStruct(x86_exception_state64_t &x) { 1708319780Sdim sys::swapByteOrder(x.trapno); 1709319780Sdim sys::swapByteOrder(x.cpu); 1710319780Sdim sys::swapByteOrder(x.err); 1711319780Sdim sys::swapByteOrder(x.faultvaddr); 1712319780Sdim} 1713319780Sdim 1714319780Sdimstruct x86_state_hdr_t { 1715319780Sdim uint32_t flavor; 1716319780Sdim uint32_t count; 1717319780Sdim}; 1718319780Sdim 1719319780Sdimstruct x86_thread_state_t { 1720319780Sdim x86_state_hdr_t tsh; 1721319780Sdim union { 1722319780Sdim x86_thread_state64_t ts64; 1723319780Sdim x86_thread_state32_t ts32; 1724319780Sdim } uts; 1725319780Sdim}; 1726319780Sdim 1727319780Sdimstruct x86_float_state_t { 1728319780Sdim x86_state_hdr_t fsh; 1729319780Sdim union { 1730319780Sdim x86_float_state64_t fs64; 1731319780Sdim } ufs; 1732319780Sdim}; 1733319780Sdim 1734319780Sdimstruct x86_exception_state_t { 1735319780Sdim x86_state_hdr_t esh; 1736319780Sdim union { 1737319780Sdim x86_exception_state64_t es64; 1738319780Sdim } ues; 1739319780Sdim}; 1740319780Sdim 1741319780Sdiminline void swapStruct(x86_state_hdr_t &x) { 1742319780Sdim sys::swapByteOrder(x.flavor); 1743319780Sdim sys::swapByteOrder(x.count); 1744319780Sdim} 1745319780Sdim 1746319780Sdimenum X86ThreadFlavors { 1747319780Sdim x86_THREAD_STATE32 = 1, 1748319780Sdim x86_FLOAT_STATE32 = 2, 1749319780Sdim x86_EXCEPTION_STATE32 = 3, 1750319780Sdim x86_THREAD_STATE64 = 4, 1751319780Sdim x86_FLOAT_STATE64 = 5, 1752319780Sdim x86_EXCEPTION_STATE64 = 6, 1753319780Sdim x86_THREAD_STATE = 7, 1754319780Sdim x86_FLOAT_STATE = 8, 1755319780Sdim x86_EXCEPTION_STATE = 9, 1756319780Sdim x86_DEBUG_STATE32 = 10, 1757319780Sdim x86_DEBUG_STATE64 = 11, 1758319780Sdim x86_DEBUG_STATE = 12 1759319780Sdim}; 1760319780Sdim 1761319780Sdiminline void swapStruct(x86_thread_state_t &x) { 1762319780Sdim swapStruct(x.tsh); 1763319780Sdim if (x.tsh.flavor == x86_THREAD_STATE64) 1764319780Sdim swapStruct(x.uts.ts64); 1765319780Sdim} 1766319780Sdim 1767319780Sdiminline void swapStruct(x86_float_state_t &x) { 1768319780Sdim swapStruct(x.fsh); 1769319780Sdim if (x.fsh.flavor == x86_FLOAT_STATE64) 1770319780Sdim swapStruct(x.ufs.fs64); 1771319780Sdim} 1772319780Sdim 1773319780Sdiminline void swapStruct(x86_exception_state_t &x) { 1774319780Sdim swapStruct(x.esh); 1775319780Sdim if (x.esh.flavor == x86_EXCEPTION_STATE64) 1776319780Sdim swapStruct(x.ues.es64); 1777319780Sdim} 1778319780Sdim 1779319780Sdimconst uint32_t x86_THREAD_STATE32_COUNT = 1780319780Sdim sizeof(x86_thread_state32_t) / sizeof(uint32_t); 1781319780Sdim 1782319780Sdimconst uint32_t x86_THREAD_STATE64_COUNT = 1783319780Sdim sizeof(x86_thread_state64_t) / sizeof(uint32_t); 1784319780Sdimconst uint32_t x86_FLOAT_STATE64_COUNT = 1785319780Sdim sizeof(x86_float_state64_t) / sizeof(uint32_t); 1786319780Sdimconst uint32_t x86_EXCEPTION_STATE64_COUNT = 1787319780Sdim sizeof(x86_exception_state64_t) / sizeof(uint32_t); 1788319780Sdim 1789319780Sdimconst uint32_t x86_THREAD_STATE_COUNT = 1790319780Sdim sizeof(x86_thread_state_t) / sizeof(uint32_t); 1791319780Sdimconst uint32_t x86_FLOAT_STATE_COUNT = 1792319780Sdim sizeof(x86_float_state_t) / sizeof(uint32_t); 1793319780Sdimconst uint32_t x86_EXCEPTION_STATE_COUNT = 1794319780Sdim sizeof(x86_exception_state_t) / sizeof(uint32_t); 1795319780Sdim 1796319780Sdimstruct arm_thread_state32_t { 1797319780Sdim uint32_t r[13]; 1798319780Sdim uint32_t sp; 1799319780Sdim uint32_t lr; 1800319780Sdim uint32_t pc; 1801319780Sdim uint32_t cpsr; 1802319780Sdim}; 1803319780Sdim 1804319780Sdiminline void swapStruct(arm_thread_state32_t &x) { 1805319780Sdim for (int i = 0; i < 13; i++) 1806319780Sdim sys::swapByteOrder(x.r[i]); 1807319780Sdim sys::swapByteOrder(x.sp); 1808319780Sdim sys::swapByteOrder(x.lr); 1809319780Sdim sys::swapByteOrder(x.pc); 1810319780Sdim sys::swapByteOrder(x.cpsr); 1811319780Sdim} 1812319780Sdim 1813319780Sdimstruct arm_thread_state64_t { 1814319780Sdim uint64_t x[29]; 1815319780Sdim uint64_t fp; 1816319780Sdim uint64_t lr; 1817319780Sdim uint64_t sp; 1818319780Sdim uint64_t pc; 1819319780Sdim uint32_t cpsr; 1820319780Sdim uint32_t pad; 1821319780Sdim}; 1822319780Sdim 1823319780Sdiminline void swapStruct(arm_thread_state64_t &x) { 1824319780Sdim for (int i = 0; i < 29; i++) 1825319780Sdim sys::swapByteOrder(x.x[i]); 1826319780Sdim sys::swapByteOrder(x.fp); 1827319780Sdim sys::swapByteOrder(x.lr); 1828319780Sdim sys::swapByteOrder(x.sp); 1829319780Sdim sys::swapByteOrder(x.pc); 1830319780Sdim sys::swapByteOrder(x.cpsr); 1831319780Sdim} 1832319780Sdim 1833319780Sdimstruct arm_state_hdr_t { 1834319780Sdim uint32_t flavor; 1835319780Sdim uint32_t count; 1836319780Sdim}; 1837319780Sdim 1838319780Sdimstruct arm_thread_state_t { 1839319780Sdim arm_state_hdr_t tsh; 1840319780Sdim union { 1841319780Sdim arm_thread_state32_t ts32; 1842319780Sdim } uts; 1843319780Sdim}; 1844319780Sdim 1845319780Sdiminline void swapStruct(arm_state_hdr_t &x) { 1846319780Sdim sys::swapByteOrder(x.flavor); 1847319780Sdim sys::swapByteOrder(x.count); 1848319780Sdim} 1849319780Sdim 1850319780Sdimenum ARMThreadFlavors { 1851319780Sdim ARM_THREAD_STATE = 1, 1852319780Sdim ARM_VFP_STATE = 2, 1853319780Sdim ARM_EXCEPTION_STATE = 3, 1854319780Sdim ARM_DEBUG_STATE = 4, 1855319780Sdim ARN_THREAD_STATE_NONE = 5, 1856319780Sdim ARM_THREAD_STATE64 = 6, 1857319780Sdim ARM_EXCEPTION_STATE64 = 7 1858319780Sdim}; 1859319780Sdim 1860319780Sdiminline void swapStruct(arm_thread_state_t &x) { 1861319780Sdim swapStruct(x.tsh); 1862319780Sdim if (x.tsh.flavor == ARM_THREAD_STATE) 1863319780Sdim swapStruct(x.uts.ts32); 1864319780Sdim} 1865319780Sdim 1866319780Sdimconst uint32_t ARM_THREAD_STATE_COUNT = 1867319780Sdim sizeof(arm_thread_state32_t) / sizeof(uint32_t); 1868319780Sdim 1869319780Sdimconst uint32_t ARM_THREAD_STATE64_COUNT = 1870319780Sdim sizeof(arm_thread_state64_t) / sizeof(uint32_t); 1871319780Sdim 1872319780Sdimstruct ppc_thread_state32_t { 1873319780Sdim uint32_t srr0; 1874319780Sdim uint32_t srr1; 1875319780Sdim uint32_t r0; 1876319780Sdim uint32_t r1; 1877319780Sdim uint32_t r2; 1878319780Sdim uint32_t r3; 1879319780Sdim uint32_t r4; 1880319780Sdim uint32_t r5; 1881319780Sdim uint32_t r6; 1882319780Sdim uint32_t r7; 1883319780Sdim uint32_t r8; 1884319780Sdim uint32_t r9; 1885319780Sdim uint32_t r10; 1886319780Sdim uint32_t r11; 1887319780Sdim uint32_t r12; 1888319780Sdim uint32_t r13; 1889319780Sdim uint32_t r14; 1890319780Sdim uint32_t r15; 1891319780Sdim uint32_t r16; 1892319780Sdim uint32_t r17; 1893319780Sdim uint32_t r18; 1894319780Sdim uint32_t r19; 1895319780Sdim uint32_t r20; 1896319780Sdim uint32_t r21; 1897319780Sdim uint32_t r22; 1898319780Sdim uint32_t r23; 1899319780Sdim uint32_t r24; 1900319780Sdim uint32_t r25; 1901319780Sdim uint32_t r26; 1902319780Sdim uint32_t r27; 1903319780Sdim uint32_t r28; 1904319780Sdim uint32_t r29; 1905319780Sdim uint32_t r30; 1906319780Sdim uint32_t r31; 1907319780Sdim uint32_t ct; 1908319780Sdim uint32_t xer; 1909319780Sdim uint32_t lr; 1910319780Sdim uint32_t ctr; 1911319780Sdim uint32_t mq; 1912319780Sdim uint32_t vrsave; 1913319780Sdim}; 1914319780Sdim 1915319780Sdiminline void swapStruct(ppc_thread_state32_t &x) { 1916319780Sdim sys::swapByteOrder(x.srr0); 1917319780Sdim sys::swapByteOrder(x.srr1); 1918319780Sdim sys::swapByteOrder(x.r0); 1919319780Sdim sys::swapByteOrder(x.r1); 1920319780Sdim sys::swapByteOrder(x.r2); 1921319780Sdim sys::swapByteOrder(x.r3); 1922319780Sdim sys::swapByteOrder(x.r4); 1923319780Sdim sys::swapByteOrder(x.r5); 1924319780Sdim sys::swapByteOrder(x.r6); 1925319780Sdim sys::swapByteOrder(x.r7); 1926319780Sdim sys::swapByteOrder(x.r8); 1927319780Sdim sys::swapByteOrder(x.r9); 1928319780Sdim sys::swapByteOrder(x.r10); 1929319780Sdim sys::swapByteOrder(x.r11); 1930319780Sdim sys::swapByteOrder(x.r12); 1931319780Sdim sys::swapByteOrder(x.r13); 1932319780Sdim sys::swapByteOrder(x.r14); 1933319780Sdim sys::swapByteOrder(x.r15); 1934319780Sdim sys::swapByteOrder(x.r16); 1935319780Sdim sys::swapByteOrder(x.r17); 1936319780Sdim sys::swapByteOrder(x.r18); 1937319780Sdim sys::swapByteOrder(x.r19); 1938319780Sdim sys::swapByteOrder(x.r20); 1939319780Sdim sys::swapByteOrder(x.r21); 1940319780Sdim sys::swapByteOrder(x.r22); 1941319780Sdim sys::swapByteOrder(x.r23); 1942319780Sdim sys::swapByteOrder(x.r24); 1943319780Sdim sys::swapByteOrder(x.r25); 1944319780Sdim sys::swapByteOrder(x.r26); 1945319780Sdim sys::swapByteOrder(x.r27); 1946319780Sdim sys::swapByteOrder(x.r28); 1947319780Sdim sys::swapByteOrder(x.r29); 1948319780Sdim sys::swapByteOrder(x.r30); 1949319780Sdim sys::swapByteOrder(x.r31); 1950319780Sdim sys::swapByteOrder(x.ct); 1951319780Sdim sys::swapByteOrder(x.xer); 1952319780Sdim sys::swapByteOrder(x.lr); 1953319780Sdim sys::swapByteOrder(x.ctr); 1954319780Sdim sys::swapByteOrder(x.mq); 1955319780Sdim sys::swapByteOrder(x.vrsave); 1956319780Sdim} 1957319780Sdim 1958319780Sdimstruct ppc_state_hdr_t { 1959319780Sdim uint32_t flavor; 1960319780Sdim uint32_t count; 1961319780Sdim}; 1962319780Sdim 1963319780Sdimstruct ppc_thread_state_t { 1964319780Sdim ppc_state_hdr_t tsh; 1965319780Sdim union { 1966319780Sdim ppc_thread_state32_t ts32; 1967319780Sdim } uts; 1968319780Sdim}; 1969319780Sdim 1970319780Sdiminline void swapStruct(ppc_state_hdr_t &x) { 1971319780Sdim sys::swapByteOrder(x.flavor); 1972319780Sdim sys::swapByteOrder(x.count); 1973319780Sdim} 1974319780Sdim 1975319780Sdimenum PPCThreadFlavors { 1976319780Sdim PPC_THREAD_STATE = 1, 1977319780Sdim PPC_FLOAT_STATE = 2, 1978319780Sdim PPC_EXCEPTION_STATE = 3, 1979319780Sdim PPC_VECTOR_STATE = 4, 1980319780Sdim PPC_THREAD_STATE64 = 5, 1981319780Sdim PPC_EXCEPTION_STATE64 = 6, 1982319780Sdim PPC_THREAD_STATE_NONE = 7 1983319780Sdim}; 1984319780Sdim 1985319780Sdiminline void swapStruct(ppc_thread_state_t &x) { 1986319780Sdim swapStruct(x.tsh); 1987319780Sdim if (x.tsh.flavor == PPC_THREAD_STATE) 1988319780Sdim swapStruct(x.uts.ts32); 1989319780Sdim} 1990319780Sdim 1991319780Sdimconst uint32_t PPC_THREAD_STATE_COUNT = 1992319780Sdim sizeof(ppc_thread_state32_t) / sizeof(uint32_t); 1993319780Sdim 1994319780Sdim// Define a union of all load command structs 1995319780Sdim#define LOAD_COMMAND_STRUCT(LCStruct) LCStruct LCStruct##_data; 1996319780Sdim 1997341825SdimLLVM_PACKED_START 1998341825Sdimunion alignas(4) macho_load_command { 1999319780Sdim#include "llvm/BinaryFormat/MachO.def" 2000319780Sdim}; 2001341825SdimLLVM_PACKED_END 2002319780Sdim 2003319780Sdim} // end namespace MachO 2004319780Sdim} // end namespace llvm 2005319780Sdim 2006319780Sdim#endif 2007