Add Michael Spencer's iterator class for stepping through relocations. Add method...
[oota-llvm.git] / include / llvm / Object / MachOFormat.h
1 //===- MachOFormat.h - Mach-O Format Structures And Constants ---*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file declares various structures and constants which are platform
11 // independent and can be shared by any client which wishes to interact with
12 // Mach object files.
13 //
14 // The definitions here are purposely chosen to match the LLVM style as opposed
15 // to following the platform specific definition of the format.
16 //
17 // On a Mach system, see the <mach-o/...> includes for more information, in
18 // particular <mach-o/loader.h>.
19 //
20 //===----------------------------------------------------------------------===//
21
22 #ifndef LLVM_OBJECT_MACHOFORMAT_H
23 #define LLVM_OBJECT_MACHOFORMAT_H
24
25 #include "llvm/Support/DataTypes.h"
26
27 namespace llvm {
28 namespace object {
29
30 /// General Mach platform information.
31 namespace mach {
32   /// @name CPU Type and Subtype Information
33   /// {
34
35   /// \brief Capability bits used in CPU type encoding.
36   enum CPUTypeFlagsMask {
37     CTFM_ArchMask =  0xFF000000,
38     CTFM_ArchABI64 = 0x01000000
39   };
40
41   /// \brief Machine type IDs used in CPU type encoding.
42   enum CPUTypeMachine {
43     CTM_i386      = 7,
44     CTM_x86_64    = CTM_i386 | CTFM_ArchABI64,
45     CTM_ARM       = 12,
46     CTM_SPARC     = 14,
47     CTM_PowerPC   = 18,
48     CTM_PowerPC64 = CTM_PowerPC | CTFM_ArchABI64
49   };
50
51   /// \brief Capability bits used in CPU subtype encoding.
52   enum CPUSubtypeFlagsMask {
53     CSFM_SubtypeMask =  0xFF000000,
54     CSFM_SubtypeLib64 = 0x80000000
55   };
56
57   /// \brief ARM Machine Subtypes.
58   enum CPUSubtypeARM {
59     CSARM_ALL    = 0,
60     CSARM_V4T    = 5,
61     CSARM_V6     = 6,
62     CSARM_V5TEJ  = 7,
63     CSARM_XSCALE = 8,
64     CSARM_V7     = 9
65   };
66
67   /// \brief PowerPC Machine Subtypes.
68   enum CPUSubtypePowerPC {
69     CSPPC_ALL = 0
70   };
71
72   /// \brief SPARC Machine Subtypes.
73   enum CPUSubtypeSPARC {
74     CSSPARC_ALL = 0
75   };
76
77   /// \brief x86 Machine Subtypes.
78   enum CPUSubtypeX86 {
79     CSX86_ALL = 3
80   };
81
82   /// @}
83
84 } // end namespace mach
85
86 /// Format information for Mach object files.
87 namespace macho {
88   /// \brief Constants for structure sizes.
89   enum StructureSizes {
90     Header32Size = 28,
91     Header64Size = 32,
92     SegmentLoadCommand32Size = 56,
93     SegmentLoadCommand64Size = 72,
94     Section32Size = 68,
95     Section64Size = 80,
96     SymtabLoadCommandSize = 24,
97     DysymtabLoadCommandSize = 80,
98     Nlist32Size = 12,
99     Nlist64Size = 16,
100     RelocationInfoSize = 8,
101     LinkeditLoadCommandSize = 16
102   };
103
104   /// \brief Constants for header magic field.
105   enum HeaderMagic {
106     HM_Object32 = 0xFEEDFACE,  ///< 32-bit mach object file
107     HM_Object64 = 0xFEEDFACF,  ///< 64-bit mach object file
108     HM_Universal = 0xCAFEBABE  ///< Universal object file
109   };
110
111   /// \brief Header common to all Mach object files.
112   struct Header {
113     uint32_t Magic;
114     uint32_t CPUType;
115     uint32_t CPUSubtype;
116     uint32_t FileType;
117     uint32_t NumLoadCommands;
118     uint32_t SizeOfLoadCommands;
119     uint32_t Flags;
120   };
121
122   /// \brief Extended header for 64-bit object files.
123   struct Header64Ext {
124     uint32_t Reserved;
125   };
126
127   // See <mach-o/loader.h>.
128   enum HeaderFileType {
129     HFT_Object = 0x1
130   };
131
132   enum HeaderFlags {
133     HF_SubsectionsViaSymbols = 0x2000
134   };
135
136   enum LoadCommandType {
137     LCT_Segment = 0x1,
138     LCT_Symtab = 0x2,
139     LCT_Dysymtab = 0xb,
140     LCT_Segment64 = 0x19,
141     LCT_UUID = 0x1b,
142     LCT_CodeSignature = 0x1d,
143     LCT_SegmentSplitInfo = 0x1e,
144     LCT_FunctionStarts = 0x26,
145     LCT_DataInCode = 0x29
146   };
147
148   /// \brief Load command structure.
149   struct LoadCommand {
150     uint32_t Type;
151     uint32_t Size;
152   };
153
154   /// @name Load Command Structures
155   /// @{
156
157   struct SegmentLoadCommand {
158     uint32_t Type;
159     uint32_t Size;
160     char Name[16];
161     uint32_t VMAddress;
162     uint32_t VMSize;
163     uint32_t FileOffset;
164     uint32_t FileSize;
165     uint32_t MaxVMProtection;
166     uint32_t InitialVMProtection;
167     uint32_t NumSections;
168     uint32_t Flags;
169   };
170
171   struct Segment64LoadCommand {
172     uint32_t Type;
173     uint32_t Size;
174     char Name[16];
175     uint64_t VMAddress;
176     uint64_t VMSize;
177     uint64_t FileOffset;
178     uint64_t FileSize;
179     uint32_t MaxVMProtection;
180     uint32_t InitialVMProtection;
181     uint32_t NumSections;
182     uint32_t Flags;
183   };
184
185   struct SymtabLoadCommand {
186     uint32_t Type;
187     uint32_t Size;
188     uint32_t SymbolTableOffset;
189     uint32_t NumSymbolTableEntries;
190     uint32_t StringTableOffset;
191     uint32_t StringTableSize;
192   };
193
194   struct DysymtabLoadCommand {
195     uint32_t Type;
196     uint32_t Size;
197
198     uint32_t LocalSymbolsIndex;
199     uint32_t NumLocalSymbols;
200
201     uint32_t ExternalSymbolsIndex;
202     uint32_t NumExternalSymbols;
203
204     uint32_t UndefinedSymbolsIndex;
205     uint32_t NumUndefinedSymbols;
206
207     uint32_t TOCOffset;
208     uint32_t NumTOCEntries;
209
210     uint32_t ModuleTableOffset;
211     uint32_t NumModuleTableEntries;
212
213     uint32_t ReferenceSymbolTableOffset;
214     uint32_t NumReferencedSymbolTableEntries;
215
216     uint32_t IndirectSymbolTableOffset;
217     uint32_t NumIndirectSymbolTableEntries;
218
219     uint32_t ExternalRelocationTableOffset;
220     uint32_t NumExternalRelocationTableEntries;
221
222     uint32_t LocalRelocationTableOffset;
223     uint32_t NumLocalRelocationTableEntries;
224   };
225
226   struct LinkeditDataLoadCommand {
227     uint32_t Type;
228     uint32_t Size;
229     uint32_t DataOffset;
230     uint32_t DataSize;
231   };
232
233   /// @}
234   /// @name Section Data
235   /// @{
236
237   struct Section {
238     char Name[16];
239     char SegmentName[16];
240     uint32_t Address;
241     uint32_t Size;
242     uint32_t Offset;
243     uint32_t Align;
244     uint32_t RelocationTableOffset;
245     uint32_t NumRelocationTableEntries;
246     uint32_t Flags;
247     uint32_t Reserved1;
248     uint32_t Reserved2;
249   };
250   struct Section64 {
251     char Name[16];
252     char SegmentName[16];
253     uint64_t Address;
254     uint64_t Size;
255     uint32_t Offset;
256     uint32_t Align;
257     uint32_t RelocationTableOffset;
258     uint32_t NumRelocationTableEntries;
259     uint32_t Flags;
260     uint32_t Reserved1;
261     uint32_t Reserved2;
262     uint32_t Reserved3;
263   };
264
265   /// @}
266   /// @name Symbol Table Entries
267   /// @{
268
269   struct SymbolTableEntry {
270     uint32_t StringIndex;
271     uint8_t Type;
272     uint8_t SectionIndex;
273     uint16_t Flags;
274     uint32_t Value;
275   };
276   // Despite containing a uint64_t, this structure is only 4-byte aligned within
277   // a MachO file.
278 #pragma pack(push)
279 #pragma pack(4)
280   struct Symbol64TableEntry {
281     uint32_t StringIndex;
282     uint8_t Type;
283     uint8_t SectionIndex;
284     uint16_t Flags;
285     uint64_t Value;
286   };
287 #pragma pack(pop)
288
289   /// @}
290   /// @name Data-in-code Table Entry
291   /// @{
292
293   // See <mach-o/loader.h>.
294   enum DataRegionType { Data = 1, JumpTable8, JumpTable16, JumpTable32 };
295   struct DataInCodeTableEntry {
296     uint32_t Offset;  /* from mach_header to start of data region */
297     uint16_t Length;  /* number of bytes in data region */
298     uint16_t Kind;    /* a DataRegionType value  */
299   };
300
301   /// @}
302   /// @name Indirect Symbol Table
303   /// @{
304
305   struct IndirectSymbolTableEntry {
306     uint32_t Index;
307   };
308
309   /// @}
310   /// @name Relocation Data
311   /// @{
312
313   struct RelocationEntry {
314     uint32_t Word0;
315     uint32_t Word1;
316   };
317
318   /// @}
319
320   // See <mach-o/nlist.h>.
321   enum SymbolTypeType {
322     STT_Undefined = 0x00,
323     STT_Absolute  = 0x02,
324     STT_Section   = 0x0e
325   };
326
327   enum SymbolTypeFlags {
328     // If any of these bits are set, then the entry is a stab entry number (see
329     // <mach-o/stab.h>. Otherwise the other masks apply.
330     STF_StabsEntryMask = 0xe0,
331
332     STF_TypeMask       = 0x0e,
333     STF_External       = 0x01,
334     STF_PrivateExtern  = 0x10
335   };
336
337   /// IndirectSymbolFlags - Flags for encoding special values in the indirect
338   /// symbol entry.
339   enum IndirectSymbolFlags {
340     ISF_Local    = 0x80000000,
341     ISF_Absolute = 0x40000000
342   };
343
344   /// RelocationFlags - Special flags for addresses.
345   enum RelocationFlags {
346     RF_Scattered = 0x80000000
347   };
348
349   /// Common relocation info types.
350   enum RelocationInfoType {
351     RIT_Vanilla             = 0,
352     RIT_Pair                = 1,
353     RIT_Difference          = 2
354   };
355
356   /// Generic relocation info types, which are shared by some (but not all)
357   /// platforms.
358   enum RelocationInfoType_Generic {
359     RIT_Generic_PreboundLazyPointer = 3,
360     RIT_Generic_LocalDifference     = 4,
361     RIT_Generic_TLV                 = 5
362   };
363
364   /// X86_64 uses its own relocation types.
365   enum RelocationInfoTypeX86_64 {
366     // Note that x86_64 doesn't even share the common relocation types.
367     RIT_X86_64_Unsigned   = 0,
368     RIT_X86_64_Signed     = 1,
369     RIT_X86_64_Branch     = 2,
370     RIT_X86_64_GOTLoad    = 3,
371     RIT_X86_64_GOT        = 4,
372     RIT_X86_64_Subtractor = 5,
373     RIT_X86_64_Signed1    = 6,
374     RIT_X86_64_Signed2    = 7,
375     RIT_X86_64_Signed4    = 8,
376     RIT_X86_64_TLV        = 9
377   };
378
379   /// ARM uses its own relocation types.
380   enum RelocationInfoTypeARM {
381     RIT_ARM_LocalDifference = 3,
382     RIT_ARM_PreboundLazyPointer = 4,
383     RIT_ARM_Branch24Bit = 5,
384     RIT_ARM_ThumbBranch22Bit = 6,
385     RIT_ARM_ThumbBranch32Bit = 7,
386     RIT_ARM_Half = 8,
387     RIT_ARM_HalfDifference = 9
388
389   };
390
391 } // end namespace macho
392
393 } // end namespace object
394 } // end namespace llvm
395
396 #endif