1210006Srdivacky//===-- llvm/Support/COFF.h -------------------------------------*- C++ -*-===//
2210006Srdivacky//
3210006Srdivacky//                     The LLVM Compiler Infrastructure
4210006Srdivacky//
5210006Srdivacky// This file is distributed under the University of Illinois Open Source
6210006Srdivacky// License. See LICENSE.TXT for details.
7210006Srdivacky//
8210006Srdivacky//===----------------------------------------------------------------------===//
9210006Srdivacky//
10210006Srdivacky// This file contains an definitions used in Windows COFF Files.
11210006Srdivacky//
12210006Srdivacky// Structures and enums defined within this file where created using
13210127Srdivacky// information from Microsoft's publicly available PE/COFF format document:
14218893Sdim//
15210006Srdivacky// Microsoft Portable Executable and Common Object File Format Specification
16210006Srdivacky// Revision 8.1 - February 15, 2008
17210006Srdivacky//
18210127Srdivacky// As of 5/2/2010, hosted by Microsoft at:
19210006Srdivacky// http://www.microsoft.com/whdc/system/platform/firmware/pecoff.mspx
20210006Srdivacky//
21210006Srdivacky//===----------------------------------------------------------------------===//
22210006Srdivacky
23249423Sdim#ifndef LLVM_SUPPORT_COFF_H
24249423Sdim#define LLVM_SUPPORT_COFF_H
25210006Srdivacky
26218893Sdim#include "llvm/Support/DataTypes.h"
27234353Sdim#include <cassert>
28210006Srdivacky#include <cstring>
29210006Srdivacky
30210006Srdivackynamespace llvm {
31210006Srdivackynamespace COFF {
32210006Srdivacky
33210006Srdivacky  // Sizes in bytes of various things in the COFF format.
34210006Srdivacky  enum {
35210006Srdivacky    HeaderSize     = 20,
36210006Srdivacky    NameSize       = 8,
37210006Srdivacky    SymbolSize     = 18,
38210006Srdivacky    SectionSize    = 40,
39210006Srdivacky    RelocationSize = 10
40210006Srdivacky  };
41210006Srdivacky
42210006Srdivacky  struct header {
43210006Srdivacky    uint16_t Machine;
44210006Srdivacky    uint16_t NumberOfSections;
45210006Srdivacky    uint32_t TimeDateStamp;
46210006Srdivacky    uint32_t PointerToSymbolTable;
47210006Srdivacky    uint32_t NumberOfSymbols;
48210006Srdivacky    uint16_t SizeOfOptionalHeader;
49210006Srdivacky    uint16_t Characteristics;
50210006Srdivacky  };
51210006Srdivacky
52212904Sdim  enum MachineTypes {
53239462Sdim    MT_Invalid = 0xffff,
54239462Sdim
55234353Sdim    IMAGE_FILE_MACHINE_UNKNOWN   = 0x0,
56234353Sdim    IMAGE_FILE_MACHINE_AM33      = 0x13,
57234353Sdim    IMAGE_FILE_MACHINE_AMD64     = 0x8664,
58234353Sdim    IMAGE_FILE_MACHINE_ARM       = 0x1C0,
59234353Sdim    IMAGE_FILE_MACHINE_ARMV7     = 0x1C4,
60234353Sdim    IMAGE_FILE_MACHINE_EBC       = 0xEBC,
61234353Sdim    IMAGE_FILE_MACHINE_I386      = 0x14C,
62234353Sdim    IMAGE_FILE_MACHINE_IA64      = 0x200,
63234353Sdim    IMAGE_FILE_MACHINE_M32R      = 0x9041,
64234353Sdim    IMAGE_FILE_MACHINE_MIPS16    = 0x266,
65234353Sdim    IMAGE_FILE_MACHINE_MIPSFPU   = 0x366,
66234353Sdim    IMAGE_FILE_MACHINE_MIPSFPU16 = 0x466,
67234353Sdim    IMAGE_FILE_MACHINE_POWERPC   = 0x1F0,
68234353Sdim    IMAGE_FILE_MACHINE_POWERPCFP = 0x1F1,
69234353Sdim    IMAGE_FILE_MACHINE_R4000     = 0x166,
70234353Sdim    IMAGE_FILE_MACHINE_SH3       = 0x1A2,
71234353Sdim    IMAGE_FILE_MACHINE_SH3DSP    = 0x1A3,
72234353Sdim    IMAGE_FILE_MACHINE_SH4       = 0x1A6,
73234353Sdim    IMAGE_FILE_MACHINE_SH5       = 0x1A8,
74234353Sdim    IMAGE_FILE_MACHINE_THUMB     = 0x1C2,
75234353Sdim    IMAGE_FILE_MACHINE_WCEMIPSV2 = 0x169
76212904Sdim  };
77212904Sdim
78234353Sdim  enum Characteristics {
79239462Sdim    C_Invalid = 0,
80239462Sdim
81234353Sdim    /// The file does not contain base relocations and must be loaded at its
82234353Sdim    /// preferred base. If this cannot be done, the loader will error.
83234353Sdim    IMAGE_FILE_RELOCS_STRIPPED         = 0x0001,
84234353Sdim    /// The file is valid and can be run.
85234353Sdim    IMAGE_FILE_EXECUTABLE_IMAGE        = 0x0002,
86234353Sdim    /// COFF line numbers have been stripped. This is deprecated and should be
87234353Sdim    /// 0.
88234353Sdim    IMAGE_FILE_LINE_NUMS_STRIPPED      = 0x0004,
89234353Sdim    /// COFF symbol table entries for local symbols have been removed. This is
90234353Sdim    /// deprecated and should be 0.
91234353Sdim    IMAGE_FILE_LOCAL_SYMS_STRIPPED     = 0x0008,
92234353Sdim    /// Aggressively trim working set. This is deprecated and must be 0.
93234353Sdim    IMAGE_FILE_AGGRESSIVE_WS_TRIM      = 0x0010,
94234353Sdim    /// Image can handle > 2GiB addresses.
95234353Sdim    IMAGE_FILE_LARGE_ADDRESS_AWARE     = 0x0020,
96234353Sdim    /// Little endian: the LSB precedes the MSB in memory. This is deprecated
97234353Sdim    /// and should be 0.
98234353Sdim    IMAGE_FILE_BYTES_REVERSED_LO       = 0x0080,
99234353Sdim    /// Machine is based on a 32bit word architecture.
100234353Sdim    IMAGE_FILE_32BIT_MACHINE           = 0x0100,
101234353Sdim    /// Debugging info has been removed.
102234353Sdim    IMAGE_FILE_DEBUG_STRIPPED          = 0x0200,
103234353Sdim    /// If the image is on removable media, fully load it and copy it to swap.
104234353Sdim    IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = 0x0400,
105234353Sdim    /// If the image is on network media, fully load it and copy it to swap.
106234353Sdim    IMAGE_FILE_NET_RUN_FROM_SWAP       = 0x0800,
107234353Sdim    /// The image file is a system file, not a user program.
108234353Sdim    IMAGE_FILE_SYSTEM                  = 0x1000,
109234353Sdim    /// The image file is a DLL.
110234353Sdim    IMAGE_FILE_DLL                     = 0x2000,
111234353Sdim    /// This file should only be run on a uniprocessor machine.
112234353Sdim    IMAGE_FILE_UP_SYSTEM_ONLY          = 0x4000,
113234353Sdim    /// Big endian: the MSB precedes the LSB in memory. This is deprecated
114234353Sdim    /// and should be 0.
115234353Sdim    IMAGE_FILE_BYTES_REVERSED_HI       = 0x8000
116234353Sdim  };
117234353Sdim
118210006Srdivacky  struct symbol {
119210006Srdivacky    char     Name[NameSize];
120210006Srdivacky    uint32_t Value;
121239462Sdim    uint16_t SectionNumber;
122210006Srdivacky    uint16_t Type;
123210006Srdivacky    uint8_t  StorageClass;
124210006Srdivacky    uint8_t  NumberOfAuxSymbols;
125210006Srdivacky  };
126210006Srdivacky
127210127Srdivacky  enum SymbolFlags {
128210006Srdivacky    SF_TypeMask = 0x0000FFFF,
129210006Srdivacky    SF_TypeShift = 0,
130210006Srdivacky
131210006Srdivacky    SF_ClassMask = 0x00FF0000,
132210006Srdivacky    SF_ClassShift = 16,
133210006Srdivacky
134218893Sdim    SF_WeakExternal = 0x01000000
135210006Srdivacky  };
136210006Srdivacky
137212904Sdim  enum SymbolSectionNumber {
138212904Sdim    IMAGE_SYM_DEBUG     = -2,
139212904Sdim    IMAGE_SYM_ABSOLUTE  = -1,
140212904Sdim    IMAGE_SYM_UNDEFINED = 0
141212904Sdim  };
142212904Sdim
143210127Srdivacky  /// Storage class tells where and what the symbol represents
144210127Srdivacky  enum SymbolStorageClass {
145239462Sdim    SSC_Invalid = 0xff,
146239462Sdim
147210127Srdivacky    IMAGE_SYM_CLASS_END_OF_FUNCTION  = -1,  ///< Physical end of function
148210127Srdivacky    IMAGE_SYM_CLASS_NULL             = 0,   ///< No symbol
149210127Srdivacky    IMAGE_SYM_CLASS_AUTOMATIC        = 1,   ///< Stack variable
150210127Srdivacky    IMAGE_SYM_CLASS_EXTERNAL         = 2,   ///< External symbol
151210127Srdivacky    IMAGE_SYM_CLASS_STATIC           = 3,   ///< Static
152210127Srdivacky    IMAGE_SYM_CLASS_REGISTER         = 4,   ///< Register variable
153210127Srdivacky    IMAGE_SYM_CLASS_EXTERNAL_DEF     = 5,   ///< External definition
154210127Srdivacky    IMAGE_SYM_CLASS_LABEL            = 6,   ///< Label
155210127Srdivacky    IMAGE_SYM_CLASS_UNDEFINED_LABEL  = 7,   ///< Undefined label
156210127Srdivacky    IMAGE_SYM_CLASS_MEMBER_OF_STRUCT = 8,   ///< Member of structure
157210127Srdivacky    IMAGE_SYM_CLASS_ARGUMENT         = 9,   ///< Function argument
158210127Srdivacky    IMAGE_SYM_CLASS_STRUCT_TAG       = 10,  ///< Structure tag
159210127Srdivacky    IMAGE_SYM_CLASS_MEMBER_OF_UNION  = 11,  ///< Member of union
160210127Srdivacky    IMAGE_SYM_CLASS_UNION_TAG        = 12,  ///< Union tag
161210127Srdivacky    IMAGE_SYM_CLASS_TYPE_DEFINITION  = 13,  ///< Type definition
162210127Srdivacky    IMAGE_SYM_CLASS_UNDEFINED_STATIC = 14,  ///< Undefined static
163210127Srdivacky    IMAGE_SYM_CLASS_ENUM_TAG         = 15,  ///< Enumeration tag
164210127Srdivacky    IMAGE_SYM_CLASS_MEMBER_OF_ENUM   = 16,  ///< Member of enumeration
165210127Srdivacky    IMAGE_SYM_CLASS_REGISTER_PARAM   = 17,  ///< Register parameter
166210127Srdivacky    IMAGE_SYM_CLASS_BIT_FIELD        = 18,  ///< Bit field
167210127Srdivacky    /// ".bb" or ".eb" - beginning or end of block
168210006Srdivacky    IMAGE_SYM_CLASS_BLOCK            = 100,
169210127Srdivacky    /// ".bf" or ".ef" - beginning or end of function
170210006Srdivacky    IMAGE_SYM_CLASS_FUNCTION         = 101,
171210127Srdivacky    IMAGE_SYM_CLASS_END_OF_STRUCT    = 102, ///< End of structure
172210127Srdivacky    IMAGE_SYM_CLASS_FILE             = 103, ///< File name
173210127Srdivacky    /// Line number, reformatted as symbol
174210006Srdivacky    IMAGE_SYM_CLASS_SECTION          = 104,
175210127Srdivacky    IMAGE_SYM_CLASS_WEAK_EXTERNAL    = 105, ///< Duplicate tag
176210127Srdivacky    /// External symbol in dmert public lib
177210006Srdivacky    IMAGE_SYM_CLASS_CLR_TOKEN        = 107
178210006Srdivacky  };
179210006Srdivacky
180210127Srdivacky  enum SymbolBaseType {
181210127Srdivacky    IMAGE_SYM_TYPE_NULL   = 0,  ///< No type information or unknown base type.
182210127Srdivacky    IMAGE_SYM_TYPE_VOID   = 1,  ///< Used with void pointers and functions.
183210127Srdivacky    IMAGE_SYM_TYPE_CHAR   = 2,  ///< A character (signed byte).
184210127Srdivacky    IMAGE_SYM_TYPE_SHORT  = 3,  ///< A 2-byte signed integer.
185210127Srdivacky    IMAGE_SYM_TYPE_INT    = 4,  ///< A natural integer type on the target.
186210127Srdivacky    IMAGE_SYM_TYPE_LONG   = 5,  ///< A 4-byte signed integer.
187210127Srdivacky    IMAGE_SYM_TYPE_FLOAT  = 6,  ///< A 4-byte floating-point number.
188210127Srdivacky    IMAGE_SYM_TYPE_DOUBLE = 7,  ///< An 8-byte floating-point number.
189210127Srdivacky    IMAGE_SYM_TYPE_STRUCT = 8,  ///< A structure.
190210127Srdivacky    IMAGE_SYM_TYPE_UNION  = 9,  ///< An union.
191210127Srdivacky    IMAGE_SYM_TYPE_ENUM   = 10, ///< An enumerated type.
192210127Srdivacky    IMAGE_SYM_TYPE_MOE    = 11, ///< A member of enumeration (a specific value).
193210127Srdivacky    IMAGE_SYM_TYPE_BYTE   = 12, ///< A byte; unsigned 1-byte integer.
194210127Srdivacky    IMAGE_SYM_TYPE_WORD   = 13, ///< A word; unsigned 2-byte integer.
195210127Srdivacky    IMAGE_SYM_TYPE_UINT   = 14, ///< An unsigned integer of natural size.
196210127Srdivacky    IMAGE_SYM_TYPE_DWORD  = 15  ///< An unsigned 4-byte integer.
197210127Srdivacky  };
198210127Srdivacky
199210127Srdivacky  enum SymbolComplexType {
200218893Sdim    IMAGE_SYM_DTYPE_NULL     = 0, ///< No complex type; simple scalar variable.
201210127Srdivacky    IMAGE_SYM_DTYPE_POINTER  = 1, ///< A pointer to base type.
202210127Srdivacky    IMAGE_SYM_DTYPE_FUNCTION = 2, ///< A function that returns a base type.
203210127Srdivacky    IMAGE_SYM_DTYPE_ARRAY    = 3, ///< An array of base type.
204218893Sdim
205210127Srdivacky    /// Type is formed as (base + (derived << SCT_COMPLEX_TYPE_SHIFT))
206218893Sdim    SCT_COMPLEX_TYPE_SHIFT   = 4
207210127Srdivacky  };
208210127Srdivacky
209210006Srdivacky  struct section {
210210006Srdivacky    char     Name[NameSize];
211210006Srdivacky    uint32_t VirtualSize;
212210006Srdivacky    uint32_t VirtualAddress;
213210006Srdivacky    uint32_t SizeOfRawData;
214210006Srdivacky    uint32_t PointerToRawData;
215210006Srdivacky    uint32_t PointerToRelocations;
216210006Srdivacky    uint32_t PointerToLineNumbers;
217210006Srdivacky    uint16_t NumberOfRelocations;
218210006Srdivacky    uint16_t NumberOfLineNumbers;
219210006Srdivacky    uint32_t Characteristics;
220210006Srdivacky  };
221210006Srdivacky
222210127Srdivacky  enum SectionCharacteristics {
223239462Sdim    SC_Invalid = 0xffffffff,
224239462Sdim
225210006Srdivacky    IMAGE_SCN_TYPE_NO_PAD            = 0x00000008,
226210006Srdivacky    IMAGE_SCN_CNT_CODE               = 0x00000020,
227210006Srdivacky    IMAGE_SCN_CNT_INITIALIZED_DATA   = 0x00000040,
228210006Srdivacky    IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x00000080,
229210006Srdivacky    IMAGE_SCN_LNK_OTHER              = 0x00000100,
230210006Srdivacky    IMAGE_SCN_LNK_INFO               = 0x00000200,
231210006Srdivacky    IMAGE_SCN_LNK_REMOVE             = 0x00000800,
232210006Srdivacky    IMAGE_SCN_LNK_COMDAT             = 0x00001000,
233210006Srdivacky    IMAGE_SCN_GPREL                  = 0x00008000,
234210006Srdivacky    IMAGE_SCN_MEM_PURGEABLE          = 0x00020000,
235210006Srdivacky    IMAGE_SCN_MEM_16BIT              = 0x00020000,
236210006Srdivacky    IMAGE_SCN_MEM_LOCKED             = 0x00040000,
237210006Srdivacky    IMAGE_SCN_MEM_PRELOAD            = 0x00080000,
238210006Srdivacky    IMAGE_SCN_ALIGN_1BYTES           = 0x00100000,
239210006Srdivacky    IMAGE_SCN_ALIGN_2BYTES           = 0x00200000,
240210006Srdivacky    IMAGE_SCN_ALIGN_4BYTES           = 0x00300000,
241210006Srdivacky    IMAGE_SCN_ALIGN_8BYTES           = 0x00400000,
242210006Srdivacky    IMAGE_SCN_ALIGN_16BYTES          = 0x00500000,
243210006Srdivacky    IMAGE_SCN_ALIGN_32BYTES          = 0x00600000,
244210006Srdivacky    IMAGE_SCN_ALIGN_64BYTES          = 0x00700000,
245210006Srdivacky    IMAGE_SCN_ALIGN_128BYTES         = 0x00800000,
246210006Srdivacky    IMAGE_SCN_ALIGN_256BYTES         = 0x00900000,
247210006Srdivacky    IMAGE_SCN_ALIGN_512BYTES         = 0x00A00000,
248210006Srdivacky    IMAGE_SCN_ALIGN_1024BYTES        = 0x00B00000,
249210006Srdivacky    IMAGE_SCN_ALIGN_2048BYTES        = 0x00C00000,
250210006Srdivacky    IMAGE_SCN_ALIGN_4096BYTES        = 0x00D00000,
251210006Srdivacky    IMAGE_SCN_ALIGN_8192BYTES        = 0x00E00000,
252210006Srdivacky    IMAGE_SCN_LNK_NRELOC_OVFL        = 0x01000000,
253210006Srdivacky    IMAGE_SCN_MEM_DISCARDABLE        = 0x02000000,
254210006Srdivacky    IMAGE_SCN_MEM_NOT_CACHED         = 0x04000000,
255210006Srdivacky    IMAGE_SCN_MEM_NOT_PAGED          = 0x08000000,
256210006Srdivacky    IMAGE_SCN_MEM_SHARED             = 0x10000000,
257210006Srdivacky    IMAGE_SCN_MEM_EXECUTE            = 0x20000000,
258210006Srdivacky    IMAGE_SCN_MEM_READ               = 0x40000000,
259210006Srdivacky    IMAGE_SCN_MEM_WRITE              = 0x80000000
260210006Srdivacky  };
261210006Srdivacky
262210006Srdivacky  struct relocation {
263210006Srdivacky    uint32_t VirtualAddress;
264210006Srdivacky    uint32_t SymbolTableIndex;
265210006Srdivacky    uint16_t Type;
266210006Srdivacky  };
267210006Srdivacky
268210127Srdivacky  enum RelocationTypeX86 {
269210006Srdivacky    IMAGE_REL_I386_ABSOLUTE = 0x0000,
270210006Srdivacky    IMAGE_REL_I386_DIR16    = 0x0001,
271210006Srdivacky    IMAGE_REL_I386_REL16    = 0x0002,
272210006Srdivacky    IMAGE_REL_I386_DIR32    = 0x0006,
273210006Srdivacky    IMAGE_REL_I386_DIR32NB  = 0x0007,
274210006Srdivacky    IMAGE_REL_I386_SEG12    = 0x0009,
275210006Srdivacky    IMAGE_REL_I386_SECTION  = 0x000A,
276210006Srdivacky    IMAGE_REL_I386_SECREL   = 0x000B,
277210006Srdivacky    IMAGE_REL_I386_TOKEN    = 0x000C,
278210006Srdivacky    IMAGE_REL_I386_SECREL7  = 0x000D,
279212904Sdim    IMAGE_REL_I386_REL32    = 0x0014,
280212904Sdim
281212904Sdim    IMAGE_REL_AMD64_ABSOLUTE  = 0x0000,
282212904Sdim    IMAGE_REL_AMD64_ADDR64    = 0x0001,
283212904Sdim    IMAGE_REL_AMD64_ADDR32    = 0x0002,
284212904Sdim    IMAGE_REL_AMD64_ADDR32NB  = 0x0003,
285212904Sdim    IMAGE_REL_AMD64_REL32     = 0x0004,
286212904Sdim    IMAGE_REL_AMD64_REL32_1   = 0x0005,
287212904Sdim    IMAGE_REL_AMD64_REL32_2   = 0x0006,
288212904Sdim    IMAGE_REL_AMD64_REL32_3   = 0x0007,
289212904Sdim    IMAGE_REL_AMD64_REL32_4   = 0x0008,
290212904Sdim    IMAGE_REL_AMD64_REL32_5   = 0x0009,
291212904Sdim    IMAGE_REL_AMD64_SECTION   = 0x000A,
292212904Sdim    IMAGE_REL_AMD64_SECREL    = 0x000B,
293212904Sdim    IMAGE_REL_AMD64_SECREL7   = 0x000C,
294212904Sdim    IMAGE_REL_AMD64_TOKEN     = 0x000D,
295212904Sdim    IMAGE_REL_AMD64_SREL32    = 0x000E,
296212904Sdim    IMAGE_REL_AMD64_PAIR      = 0x000F,
297212904Sdim    IMAGE_REL_AMD64_SSPAN32   = 0x0010
298210006Srdivacky  };
299210006Srdivacky
300234353Sdim  enum RelocationTypesARM {
301234353Sdim    IMAGE_REL_ARM_ABSOLUTE  = 0x0000,
302234353Sdim    IMAGE_REL_ARM_ADDR32    = 0x0001,
303234353Sdim    IMAGE_REL_ARM_ADDR32NB  = 0x0002,
304234353Sdim    IMAGE_REL_ARM_BRANCH24  = 0x0003,
305234353Sdim    IMAGE_REL_ARM_BRANCH11  = 0x0004,
306234353Sdim    IMAGE_REL_ARM_TOKEN     = 0x0005,
307234353Sdim    IMAGE_REL_ARM_BLX24     = 0x0008,
308234353Sdim    IMAGE_REL_ARM_BLX11     = 0x0009,
309234353Sdim    IMAGE_REL_ARM_SECTION   = 0x000E,
310234353Sdim    IMAGE_REL_ARM_SECREL    = 0x000F,
311234353Sdim    IMAGE_REL_ARM_MOV32A    = 0x0010,
312234353Sdim    IMAGE_REL_ARM_MOV32T    = 0x0011,
313234353Sdim    IMAGE_REL_ARM_BRANCH20T = 0x0012,
314234353Sdim    IMAGE_REL_ARM_BRANCH24T = 0x0014,
315234353Sdim    IMAGE_REL_ARM_BLX23T    = 0x0015
316234353Sdim  };
317234353Sdim
318212904Sdim  enum COMDATType {
319210006Srdivacky    IMAGE_COMDAT_SELECT_NODUPLICATES = 1,
320210006Srdivacky    IMAGE_COMDAT_SELECT_ANY,
321210006Srdivacky    IMAGE_COMDAT_SELECT_SAME_SIZE,
322210006Srdivacky    IMAGE_COMDAT_SELECT_EXACT_MATCH,
323210006Srdivacky    IMAGE_COMDAT_SELECT_ASSOCIATIVE,
324249423Sdim    IMAGE_COMDAT_SELECT_LARGEST,
325249423Sdim    IMAGE_COMDAT_SELECT_NEWEST
326210006Srdivacky  };
327210006Srdivacky
328212904Sdim  // Auxiliary Symbol Formats
329212904Sdim  struct AuxiliaryFunctionDefinition {
330212904Sdim    uint32_t TagIndex;
331212904Sdim    uint32_t TotalSize;
332212904Sdim    uint32_t PointerToLinenumber;
333212904Sdim    uint32_t PointerToNextFunction;
334212904Sdim    uint8_t  unused[2];
335212904Sdim  };
336212904Sdim
337212904Sdim  struct AuxiliarybfAndefSymbol {
338212904Sdim    uint8_t  unused1[4];
339212904Sdim    uint16_t Linenumber;
340212904Sdim    uint8_t  unused2[6];
341212904Sdim    uint32_t PointerToNextFunction;
342212904Sdim    uint8_t  unused3[2];
343212904Sdim  };
344212904Sdim
345212904Sdim  struct AuxiliaryWeakExternal {
346212904Sdim    uint32_t TagIndex;
347212904Sdim    uint32_t Characteristics;
348212904Sdim    uint8_t  unused[10];
349212904Sdim  };
350212904Sdim
351212904Sdim  /// These are not documented in the spec, but are located in WinNT.h.
352212904Sdim  enum WeakExternalCharacteristics {
353212904Sdim    IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY = 1,
354212904Sdim    IMAGE_WEAK_EXTERN_SEARCH_LIBRARY   = 2,
355212904Sdim    IMAGE_WEAK_EXTERN_SEARCH_ALIAS     = 3
356212904Sdim  };
357212904Sdim
358212904Sdim  struct AuxiliaryFile {
359212904Sdim    uint8_t FileName[18];
360212904Sdim  };
361212904Sdim
362212904Sdim  struct AuxiliarySectionDefinition {
363212904Sdim    uint32_t Length;
364212904Sdim    uint16_t NumberOfRelocations;
365212904Sdim    uint16_t NumberOfLinenumbers;
366212904Sdim    uint32_t CheckSum;
367212904Sdim    uint16_t Number;
368212904Sdim    uint8_t  Selection;
369212904Sdim    uint8_t  unused[3];
370212904Sdim  };
371212904Sdim
372212904Sdim  union Auxiliary {
373212904Sdim    AuxiliaryFunctionDefinition FunctionDefinition;
374212904Sdim    AuxiliarybfAndefSymbol      bfAndefSymbol;
375212904Sdim    AuxiliaryWeakExternal       WeakExternal;
376212904Sdim    AuxiliaryFile               File;
377212904Sdim    AuxiliarySectionDefinition  SectionDefinition;
378212904Sdim  };
379212904Sdim
380234353Sdim  /// @brief The Import Directory Table.
381234353Sdim  ///
382234353Sdim  /// There is a single array of these and one entry per imported DLL.
383234353Sdim  struct ImportDirectoryTableEntry {
384234353Sdim    uint32_t ImportLookupTableRVA;
385234353Sdim    uint32_t TimeDateStamp;
386234353Sdim    uint32_t ForwarderChain;
387234353Sdim    uint32_t NameRVA;
388234353Sdim    uint32_t ImportAddressTableRVA;
389234353Sdim  };
390234353Sdim
391234353Sdim  /// @brief The PE32 Import Lookup Table.
392234353Sdim  ///
393234353Sdim  /// There is an array of these for each imported DLL. It represents either
394234353Sdim  /// the ordinal to import from the target DLL, or a name to lookup and import
395234353Sdim  /// from the target DLL.
396234353Sdim  ///
397234353Sdim  /// This also happens to be the same format used by the Import Address Table
398234353Sdim  /// when it is initially written out to the image.
399234353Sdim  struct ImportLookupTableEntry32 {
400234353Sdim    uint32_t data;
401234353Sdim
402234353Sdim    /// @brief Is this entry specified by ordinal, or name?
403234353Sdim    bool isOrdinal() const { return data & 0x80000000; }
404234353Sdim
405234353Sdim    /// @brief Get the ordinal value of this entry. isOrdinal must be true.
406234353Sdim    uint16_t getOrdinal() const {
407234353Sdim      assert(isOrdinal() && "ILT entry is not an ordinal!");
408234353Sdim      return data & 0xFFFF;
409234353Sdim    }
410234353Sdim
411234353Sdim    /// @brief Set the ordinal value and set isOrdinal to true.
412234353Sdim    void setOrdinal(uint16_t o) {
413234353Sdim      data = o;
414234353Sdim      data |= 0x80000000;
415234353Sdim    }
416234353Sdim
417234353Sdim    /// @brief Get the Hint/Name entry RVA. isOrdinal must be false.
418234353Sdim    uint32_t getHintNameRVA() const {
419234353Sdim      assert(!isOrdinal() && "ILT entry is not a Hint/Name RVA!");
420234353Sdim      return data;
421234353Sdim    }
422234353Sdim
423234353Sdim    /// @brief Set the Hint/Name entry RVA and set isOrdinal to false.
424234353Sdim    void setHintNameRVA(uint32_t rva) { data = rva; }
425234353Sdim  };
426234353Sdim
427234353Sdim  /// @brief The DOS compatible header at the front of all PEs.
428234353Sdim  struct DOSHeader {
429234353Sdim    uint16_t Magic;
430234353Sdim    uint16_t UsedBytesInTheLastPage;
431234353Sdim    uint16_t FileSizeInPages;
432234353Sdim    uint16_t NumberOfRelocationItems;
433234353Sdim    uint16_t HeaderSizeInParagraphs;
434234353Sdim    uint16_t MinimumExtraParagraphs;
435234353Sdim    uint16_t MaximumExtraParagraphs;
436234353Sdim    uint16_t InitialRelativeSS;
437234353Sdim    uint16_t InitialSP;
438234353Sdim    uint16_t Checksum;
439234353Sdim    uint16_t InitialIP;
440234353Sdim    uint16_t InitialRelativeCS;
441234353Sdim    uint16_t AddressOfRelocationTable;
442234353Sdim    uint16_t OverlayNumber;
443234353Sdim    uint16_t Reserved[4];
444234353Sdim    uint16_t OEMid;
445234353Sdim    uint16_t OEMinfo;
446234353Sdim    uint16_t Reserved2[10];
447234353Sdim    uint32_t AddressOfNewExeHeader;
448234353Sdim  };
449234353Sdim
450234353Sdim  struct PEHeader {
451234353Sdim    uint32_t Signature;
452234353Sdim    header COFFHeader;
453234353Sdim    uint16_t Magic;
454234353Sdim    uint8_t  MajorLinkerVersion;
455234353Sdim    uint8_t  MinorLinkerVersion;
456234353Sdim    uint32_t SizeOfCode;
457234353Sdim    uint32_t SizeOfInitializedData;
458234353Sdim    uint32_t SizeOfUninitializedData;
459234353Sdim    uint32_t AddressOfEntryPoint; // RVA
460234353Sdim    uint32_t BaseOfCode; // RVA
461234353Sdim    uint32_t BaseOfData; // RVA
462234353Sdim    uint64_t ImageBase;
463234353Sdim    uint32_t SectionAlignment;
464234353Sdim    uint32_t FileAlignment;
465234353Sdim    uint16_t MajorOperatingSystemVersion;
466234353Sdim    uint16_t MinorOperatingSystemVersion;
467234353Sdim    uint16_t MajorImageVersion;
468234353Sdim    uint16_t MinorImageVersion;
469234353Sdim    uint16_t MajorSubsystemVersion;
470234353Sdim    uint16_t MinorSubsystemVersion;
471234353Sdim    uint32_t Win32VersionValue;
472234353Sdim    uint32_t SizeOfImage;
473234353Sdim    uint32_t SizeOfHeaders;
474234353Sdim    uint32_t CheckSum;
475234353Sdim    uint16_t Subsystem;
476234353Sdim    uint16_t DLLCharacteristics;
477234353Sdim    uint64_t SizeOfStackReserve;
478234353Sdim    uint64_t SizeOfStackCommit;
479234353Sdim    uint64_t SizeOfHeapReserve;
480234353Sdim    uint64_t SizeOfHeapCommit;
481234353Sdim    uint32_t LoaderFlags;
482234353Sdim    uint32_t NumberOfRvaAndSize;
483234353Sdim  };
484234353Sdim
485234353Sdim  struct DataDirectory {
486234353Sdim    uint32_t RelativeVirtualAddress;
487234353Sdim    uint32_t Size;
488234353Sdim  };
489234353Sdim
490234353Sdim  enum WindowsSubsystem {
491234353Sdim    IMAGE_SUBSYSTEM_UNKNOWN = 0, ///< An unknown subsystem.
492234353Sdim    IMAGE_SUBSYSTEM_NATIVE = 1, ///< Device drivers and native Windows processes
493234353Sdim    IMAGE_SUBSYSTEM_WINDOWS_GUI = 2, ///< The Windows GUI subsystem.
494234353Sdim    IMAGE_SUBSYSTEM_WINDOWS_CUI = 3, ///< The Windows character subsystem.
495234353Sdim    IMAGE_SUBSYSTEM_POSIX_CUI = 7, ///< The POSIX character subsystem.
496234353Sdim    IMAGE_SUBSYSTEM_WINDOWS_CE_GUI = 9, ///< Windows CE.
497234353Sdim    IMAGE_SUBSYSTEM_EFI_APPLICATION = 10, ///< An EFI application.
498234353Sdim    IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER = 11, ///< An EFI driver with boot
499234353Sdim                                                  ///  services.
500234353Sdim    IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER = 12, ///< An EFI driver with run-time
501234353Sdim                                             ///  services.
502234353Sdim    IMAGE_SUBSYSTEM_EFI_ROM = 13, ///< An EFI ROM image.
503234353Sdim    IMAGE_SUBSYSTEM_XBOX = 14 ///< XBOX.
504234353Sdim  };
505234353Sdim
506234353Sdim  enum DLLCharacteristics {
507234353Sdim    /// DLL can be relocated at load time.
508234353Sdim    IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE = 0x0040,
509234353Sdim    /// Code integrity checks are enforced.
510234353Sdim    IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY = 0x0080,
511234353Sdim    IMAGE_DLL_CHARACTERISTICS_NX_COMPAT = 0x0100, ///< Image is NX compatible.
512234353Sdim    /// Isolation aware, but do not isolate the image.
513234353Sdim    IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION = 0x0200,
514234353Sdim    /// Does not use structured exception handling (SEH). No SEH handler may be
515234353Sdim    /// called in this image.
516234353Sdim    IMAGE_DLL_CHARACTERISTICS_NO_SEH = 0x0400,
517234353Sdim    /// Do not bind the image.
518234353Sdim    IMAGE_DLL_CHARACTERISTICS_NO_BIND = 0x0800,
519234353Sdim    IMAGE_DLL_CHARACTERISTICS_WDM_DRIVER = 0x2000, ///< A WDM driver.
520234353Sdim    /// Terminal Server aware.
521234353Sdim    IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE = 0x8000
522234353Sdim  };
523234353Sdim
524234353Sdim  enum DebugType {
525234353Sdim    IMAGE_DEBUG_TYPE_UNKNOWN       = 0,
526234353Sdim    IMAGE_DEBUG_TYPE_COFF          = 1,
527234353Sdim    IMAGE_DEBUG_TYPE_CODEVIEW      = 2,
528234353Sdim    IMAGE_DEBUG_TYPE_FPO           = 3,
529234353Sdim    IMAGE_DEBUG_TYPE_MISC          = 4,
530234353Sdim    IMAGE_DEBUG_TYPE_EXCEPTION     = 5,
531234353Sdim    IMAGE_DEBUG_TYPE_FIXUP         = 6,
532234353Sdim    IMAGE_DEBUG_TYPE_OMAP_TO_SRC   = 7,
533234353Sdim    IMAGE_DEBUG_TYPE_OMAP_FROM_SRC = 8,
534234353Sdim    IMAGE_DEBUG_TYPE_BORLAND       = 9,
535234353Sdim    IMAGE_DEBUG_TYPE_CLSID         = 11
536234353Sdim  };
537234353Sdim
538234353Sdim  enum BaseRelocationType {
539234353Sdim    IMAGE_REL_BASED_ABSOLUTE       = 0,
540234353Sdim    IMAGE_REL_BASED_HIGH           = 1,
541234353Sdim    IMAGE_REL_BASED_LOW            = 2,
542234353Sdim    IMAGE_REL_BASED_HIGHLOW        = 3,
543234353Sdim    IMAGE_REL_BASED_HIGHADJ        = 4,
544234353Sdim    IMAGE_REL_BASED_MIPS_JMPADDR   = 5,
545234353Sdim    IMAGE_REL_BASED_ARM_MOV32A     = 5,
546234353Sdim    IMAGE_REL_BASED_ARM_MOV32T     = 7,
547234353Sdim    IMAGE_REL_BASED_MIPS_JMPADDR16 = 9,
548234353Sdim    IMAGE_REL_BASED_DIR64          = 10
549234353Sdim  };
550234353Sdim
551234353Sdim  enum ImportType {
552234353Sdim    IMPORT_CODE  = 0,
553234353Sdim    IMPORT_DATA  = 1,
554234353Sdim    IMPORT_CONST = 2
555234353Sdim  };
556234353Sdim
557234353Sdim  enum ImportNameType {
558234353Sdim    /// Import is by ordinal. This indicates that the value in the Ordinal/Hint
559234353Sdim    /// field of the import header is the import's ordinal. If this constant is
560234353Sdim    /// not specified, then the Ordinal/Hint field should always be interpreted
561234353Sdim    /// as the import's hint.
562234353Sdim    IMPORT_ORDINAL         = 0,
563234353Sdim    /// The import name is identical to the public symbol name
564234353Sdim    IMPORT_NAME            = 1,
565234353Sdim    /// The import name is the public symbol name, but skipping the leading ?,
566234353Sdim    /// @, or optionally _.
567234353Sdim    IMPORT_NAME_NOPREFIX   = 2,
568234353Sdim    /// The import name is the public symbol name, but skipping the leading ?,
569234353Sdim    /// @, or optionally _, and truncating at the first @.
570234353Sdim    IMPORT_NAME_UNDECORATE = 3
571234353Sdim  };
572234353Sdim
573234353Sdim  struct ImportHeader {
574234353Sdim    uint16_t Sig1; ///< Must be IMAGE_FILE_MACHINE_UNKNOWN (0).
575234353Sdim    uint16_t Sig2; ///< Must be 0xFFFF.
576234353Sdim    uint16_t Version;
577234353Sdim    uint16_t Machine;
578234353Sdim    uint32_t TimeDateStamp;
579234353Sdim    uint32_t SizeOfData;
580234353Sdim    uint16_t OrdinalHint;
581234353Sdim    uint16_t TypeInfo;
582234353Sdim
583234353Sdim    ImportType getType() const {
584234353Sdim      return static_cast<ImportType>(TypeInfo & 0x3);
585234353Sdim    }
586234353Sdim
587234353Sdim    ImportNameType getNameType() const {
588234353Sdim      return static_cast<ImportNameType>((TypeInfo & 0x1C) >> 3);
589234353Sdim    }
590234353Sdim  };
591234353Sdim
592234353Sdim} // End namespace COFF.
593210006Srdivacky} // End namespace llvm.
594210006Srdivacky
595210006Srdivacky#endif
596