//===-- llvm/Support/COFF.h -------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file contains an definitions used in Windows COFF Files.
//
// Structures and enums defined within this file where created using
// information from Microsoft's publicly available PE/COFF format document:
//
// Microsoft Portable Executable and Common Object File Format Specification
// Revision 8.1 - February 15, 2008
//
// As of 5/2/2010, hosted by Microsoft at:
// http://www.microsoft.com/whdc/system/platform/firmware/pecoff.mspx
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_SUPPORT_COFF_H
#define LLVM_SUPPORT_COFF_H

#include "llvm/Support/DataTypes.h"
#include <cassert>
#include <cstring>

namespace llvm {
namespace COFF {

  // The maximum number of sections that a COFF object can have (inclusive).
  const int MaxNumberOfSections = 65299;

  // The PE signature bytes that follows the DOS stub header.
  static const char PEMagic[] = { 'P', 'E', '\0', '\0' };

  // Sizes in bytes of various things in the COFF format.
  enum {
    HeaderSize     = 20,
    NameSize       = 8,
    SymbolSize     = 18,
    SectionSize    = 40,
    RelocationSize = 10
  };

  struct header {
    uint16_t Machine;
    uint16_t NumberOfSections;
    uint32_t TimeDateStamp;
    uint32_t PointerToSymbolTable;
    uint32_t NumberOfSymbols;
    uint16_t SizeOfOptionalHeader;
    uint16_t Characteristics;
  };

  enum MachineTypes {
    MT_Invalid = 0xffff,

    IMAGE_FILE_MACHINE_UNKNOWN   = 0x0,
    IMAGE_FILE_MACHINE_AM33      = 0x13,
    IMAGE_FILE_MACHINE_AMD64     = 0x8664,
    IMAGE_FILE_MACHINE_ARM       = 0x1C0,
    IMAGE_FILE_MACHINE_ARMNT     = 0x1C4,
    IMAGE_FILE_MACHINE_EBC       = 0xEBC,
    IMAGE_FILE_MACHINE_I386      = 0x14C,
    IMAGE_FILE_MACHINE_IA64      = 0x200,
    IMAGE_FILE_MACHINE_M32R      = 0x9041,
    IMAGE_FILE_MACHINE_MIPS16    = 0x266,
    IMAGE_FILE_MACHINE_MIPSFPU   = 0x366,
    IMAGE_FILE_MACHINE_MIPSFPU16 = 0x466,
    IMAGE_FILE_MACHINE_POWERPC   = 0x1F0,
    IMAGE_FILE_MACHINE_POWERPCFP = 0x1F1,
    IMAGE_FILE_MACHINE_R4000     = 0x166,
    IMAGE_FILE_MACHINE_SH3       = 0x1A2,
    IMAGE_FILE_MACHINE_SH3DSP    = 0x1A3,
    IMAGE_FILE_MACHINE_SH4       = 0x1A6,
    IMAGE_FILE_MACHINE_SH5       = 0x1A8,
    IMAGE_FILE_MACHINE_THUMB     = 0x1C2,
    IMAGE_FILE_MACHINE_WCEMIPSV2 = 0x169
  };

  enum Characteristics {
    C_Invalid = 0,

    /// The file does not contain base relocations and must be loaded at its
    /// preferred base. If this cannot be done, the loader will error.
    IMAGE_FILE_RELOCS_STRIPPED         = 0x0001,
    /// The file is valid and can be run.
    IMAGE_FILE_EXECUTABLE_IMAGE        = 0x0002,
    /// COFF line numbers have been stripped. This is deprecated and should be
    /// 0.
    IMAGE_FILE_LINE_NUMS_STRIPPED      = 0x0004,
    /// COFF symbol table entries for local symbols have been removed. This is
    /// deprecated and should be 0.
    IMAGE_FILE_LOCAL_SYMS_STRIPPED     = 0x0008,
    /// Aggressively trim working set. This is deprecated and must be 0.
    IMAGE_FILE_AGGRESSIVE_WS_TRIM      = 0x0010,
    /// Image can handle > 2GiB addresses.
    IMAGE_FILE_LARGE_ADDRESS_AWARE     = 0x0020,
    /// Little endian: the LSB precedes the MSB in memory. This is deprecated
    /// and should be 0.
    IMAGE_FILE_BYTES_REVERSED_LO       = 0x0080,
    /// Machine is based on a 32bit word architecture.
    IMAGE_FILE_32BIT_MACHINE           = 0x0100,
    /// Debugging info has been removed.
    IMAGE_FILE_DEBUG_STRIPPED          = 0x0200,
    /// If the image is on removable media, fully load it and copy it to swap.
    IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = 0x0400,
    /// If the image is on network media, fully load it and copy it to swap.
    IMAGE_FILE_NET_RUN_FROM_SWAP       = 0x0800,
    /// The image file is a system file, not a user program.
    IMAGE_FILE_SYSTEM                  = 0x1000,
    /// The image file is a DLL.
    IMAGE_FILE_DLL                     = 0x2000,
    /// This file should only be run on a uniprocessor machine.
    IMAGE_FILE_UP_SYSTEM_ONLY          = 0x4000,
    /// Big endian: the MSB precedes the LSB in memory. This is deprecated
    /// and should be 0.
    IMAGE_FILE_BYTES_REVERSED_HI       = 0x8000
  };

  struct symbol {
    char     Name[NameSize];
    uint32_t Value;
    uint16_t SectionNumber;
    uint16_t Type;
    uint8_t  StorageClass;
    uint8_t  NumberOfAuxSymbols;
  };

  enum SymbolFlags {
    SF_TypeMask = 0x0000FFFF,
    SF_TypeShift = 0,

    SF_ClassMask = 0x00FF0000,
    SF_ClassShift = 16,

    SF_WeakExternal = 0x01000000
  };

  enum SymbolSectionNumber {
    IMAGE_SYM_DEBUG     = 0xFFFE,
    IMAGE_SYM_ABSOLUTE  = 0xFFFF,
    IMAGE_SYM_UNDEFINED = 0
  };

  /// Storage class tells where and what the symbol represents
  enum SymbolStorageClass {
    SSC_Invalid = 0xff,

    IMAGE_SYM_CLASS_END_OF_FUNCTION  = -1,  ///< Physical end of function
    IMAGE_SYM_CLASS_NULL             = 0,   ///< No symbol
    IMAGE_SYM_CLASS_AUTOMATIC        = 1,   ///< Stack variable
    IMAGE_SYM_CLASS_EXTERNAL         = 2,   ///< External symbol
    IMAGE_SYM_CLASS_STATIC           = 3,   ///< Static
    IMAGE_SYM_CLASS_REGISTER         = 4,   ///< Register variable
    IMAGE_SYM_CLASS_EXTERNAL_DEF     = 5,   ///< External definition
    IMAGE_SYM_CLASS_LABEL            = 6,   ///< Label
    IMAGE_SYM_CLASS_UNDEFINED_LABEL  = 7,   ///< Undefined label
    IMAGE_SYM_CLASS_MEMBER_OF_STRUCT = 8,   ///< Member of structure
    IMAGE_SYM_CLASS_ARGUMENT         = 9,   ///< Function argument
    IMAGE_SYM_CLASS_STRUCT_TAG       = 10,  ///< Structure tag
    IMAGE_SYM_CLASS_MEMBER_OF_UNION  = 11,  ///< Member of union
    IMAGE_SYM_CLASS_UNION_TAG        = 12,  ///< Union tag
    IMAGE_SYM_CLASS_TYPE_DEFINITION  = 13,  ///< Type definition
    IMAGE_SYM_CLASS_UNDEFINED_STATIC = 14,  ///< Undefined static
    IMAGE_SYM_CLASS_ENUM_TAG         = 15,  ///< Enumeration tag
    IMAGE_SYM_CLASS_MEMBER_OF_ENUM   = 16,  ///< Member of enumeration
    IMAGE_SYM_CLASS_REGISTER_PARAM   = 17,  ///< Register parameter
    IMAGE_SYM_CLASS_BIT_FIELD        = 18,  ///< Bit field
    /// ".bb" or ".eb" - beginning or end of block
    IMAGE_SYM_CLASS_BLOCK            = 100,
    /// ".bf" or ".ef" - beginning or end of function
    IMAGE_SYM_CLASS_FUNCTION         = 101,
    IMAGE_SYM_CLASS_END_OF_STRUCT    = 102, ///< End of structure
    IMAGE_SYM_CLASS_FILE             = 103, ///< File name
    /// Line number, reformatted as symbol
    IMAGE_SYM_CLASS_SECTION          = 104,
    IMAGE_SYM_CLASS_WEAK_EXTERNAL    = 105, ///< Duplicate tag
    /// External symbol in dmert public lib
    IMAGE_SYM_CLASS_CLR_TOKEN        = 107
  };

  enum SymbolBaseType {
    IMAGE_SYM_TYPE_NULL   = 0,  ///< No type information or unknown base type.
    IMAGE_SYM_TYPE_VOID   = 1,  ///< Used with void pointers and functions.
    IMAGE_SYM_TYPE_CHAR   = 2,  ///< A character (signed byte).
    IMAGE_SYM_TYPE_SHORT  = 3,  ///< A 2-byte signed integer.
    IMAGE_SYM_TYPE_INT    = 4,  ///< A natural integer type on the target.
    IMAGE_SYM_TYPE_LONG   = 5,  ///< A 4-byte signed integer.
    IMAGE_SYM_TYPE_FLOAT  = 6,  ///< A 4-byte floating-point number.
    IMAGE_SYM_TYPE_DOUBLE = 7,  ///< An 8-byte floating-point number.
    IMAGE_SYM_TYPE_STRUCT = 8,  ///< A structure.
    IMAGE_SYM_TYPE_UNION  = 9,  ///< An union.
    IMAGE_SYM_TYPE_ENUM   = 10, ///< An enumerated type.
    IMAGE_SYM_TYPE_MOE    = 11, ///< A member of enumeration (a specific value).
    IMAGE_SYM_TYPE_BYTE   = 12, ///< A byte; unsigned 1-byte integer.
    IMAGE_SYM_TYPE_WORD   = 13, ///< A word; unsigned 2-byte integer.
    IMAGE_SYM_TYPE_UINT   = 14, ///< An unsigned integer of natural size.
    IMAGE_SYM_TYPE_DWORD  = 15  ///< An unsigned 4-byte integer.
  };

  enum SymbolComplexType {
    IMAGE_SYM_DTYPE_NULL     = 0, ///< No complex type; simple scalar variable.
    IMAGE_SYM_DTYPE_POINTER  = 1, ///< A pointer to base type.
    IMAGE_SYM_DTYPE_FUNCTION = 2, ///< A function that returns a base type.
    IMAGE_SYM_DTYPE_ARRAY    = 3, ///< An array of base type.

    /// Type is formed as (base + (derived << SCT_COMPLEX_TYPE_SHIFT))
    SCT_COMPLEX_TYPE_SHIFT   = 4
  };

  enum AuxSymbolType {
    IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF = 1
  };

  struct section {
    char     Name[NameSize];
    uint32_t VirtualSize;
    uint32_t VirtualAddress;
    uint32_t SizeOfRawData;
    uint32_t PointerToRawData;
    uint32_t PointerToRelocations;
    uint32_t PointerToLineNumbers;
    uint16_t NumberOfRelocations;
    uint16_t NumberOfLineNumbers;
    uint32_t Characteristics;
  };

  enum SectionCharacteristics : uint32_t {
    SC_Invalid = 0xffffffff,

    IMAGE_SCN_TYPE_NO_PAD            = 0x00000008,
    IMAGE_SCN_CNT_CODE               = 0x00000020,
    IMAGE_SCN_CNT_INITIALIZED_DATA   = 0x00000040,
    IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x00000080,
    IMAGE_SCN_LNK_OTHER              = 0x00000100,
    IMAGE_SCN_LNK_INFO               = 0x00000200,
    IMAGE_SCN_LNK_REMOVE             = 0x00000800,
    IMAGE_SCN_LNK_COMDAT             = 0x00001000,
    IMAGE_SCN_GPREL                  = 0x00008000,
    IMAGE_SCN_MEM_PURGEABLE          = 0x00020000,
    IMAGE_SCN_MEM_16BIT              = 0x00020000,
    IMAGE_SCN_MEM_LOCKED             = 0x00040000,
    IMAGE_SCN_MEM_PRELOAD            = 0x00080000,
    IMAGE_SCN_ALIGN_1BYTES           = 0x00100000,
    IMAGE_SCN_ALIGN_2BYTES           = 0x00200000,
    IMAGE_SCN_ALIGN_4BYTES           = 0x00300000,
    IMAGE_SCN_ALIGN_8BYTES           = 0x00400000,
    IMAGE_SCN_ALIGN_16BYTES          = 0x00500000,
    IMAGE_SCN_ALIGN_32BYTES          = 0x00600000,
    IMAGE_SCN_ALIGN_64BYTES          = 0x00700000,
    IMAGE_SCN_ALIGN_128BYTES         = 0x00800000,
    IMAGE_SCN_ALIGN_256BYTES         = 0x00900000,
    IMAGE_SCN_ALIGN_512BYTES         = 0x00A00000,
    IMAGE_SCN_ALIGN_1024BYTES        = 0x00B00000,
    IMAGE_SCN_ALIGN_2048BYTES        = 0x00C00000,
    IMAGE_SCN_ALIGN_4096BYTES        = 0x00D00000,
    IMAGE_SCN_ALIGN_8192BYTES        = 0x00E00000,
    IMAGE_SCN_LNK_NRELOC_OVFL        = 0x01000000,
    IMAGE_SCN_MEM_DISCARDABLE        = 0x02000000,
    IMAGE_SCN_MEM_NOT_CACHED         = 0x04000000,
    IMAGE_SCN_MEM_NOT_PAGED          = 0x08000000,
    IMAGE_SCN_MEM_SHARED             = 0x10000000,
    IMAGE_SCN_MEM_EXECUTE            = 0x20000000,
    IMAGE_SCN_MEM_READ               = 0x40000000,
    IMAGE_SCN_MEM_WRITE              = 0x80000000
  };

  struct relocation {
    uint32_t VirtualAddress;
    uint32_t SymbolTableIndex;
    uint16_t Type;
  };

  enum RelocationTypeI386 {
    IMAGE_REL_I386_ABSOLUTE = 0x0000,
    IMAGE_REL_I386_DIR16    = 0x0001,
    IMAGE_REL_I386_REL16    = 0x0002,
    IMAGE_REL_I386_DIR32    = 0x0006,
    IMAGE_REL_I386_DIR32NB  = 0x0007,
    IMAGE_REL_I386_SEG12    = 0x0009,
    IMAGE_REL_I386_SECTION  = 0x000A,
    IMAGE_REL_I386_SECREL   = 0x000B,
    IMAGE_REL_I386_TOKEN    = 0x000C,
    IMAGE_REL_I386_SECREL7  = 0x000D,
    IMAGE_REL_I386_REL32    = 0x0014
  };

  enum RelocationTypeAMD64 {
    IMAGE_REL_AMD64_ABSOLUTE  = 0x0000,
    IMAGE_REL_AMD64_ADDR64    = 0x0001,
    IMAGE_REL_AMD64_ADDR32    = 0x0002,
    IMAGE_REL_AMD64_ADDR32NB  = 0x0003,
    IMAGE_REL_AMD64_REL32     = 0x0004,
    IMAGE_REL_AMD64_REL32_1   = 0x0005,
    IMAGE_REL_AMD64_REL32_2   = 0x0006,
    IMAGE_REL_AMD64_REL32_3   = 0x0007,
    IMAGE_REL_AMD64_REL32_4   = 0x0008,
    IMAGE_REL_AMD64_REL32_5   = 0x0009,
    IMAGE_REL_AMD64_SECTION   = 0x000A,
    IMAGE_REL_AMD64_SECREL    = 0x000B,
    IMAGE_REL_AMD64_SECREL7   = 0x000C,
    IMAGE_REL_AMD64_TOKEN     = 0x000D,
    IMAGE_REL_AMD64_SREL32    = 0x000E,
    IMAGE_REL_AMD64_PAIR      = 0x000F,
    IMAGE_REL_AMD64_SSPAN32   = 0x0010
  };

  enum RelocationTypesARM {
    IMAGE_REL_ARM_ABSOLUTE  = 0x0000,
    IMAGE_REL_ARM_ADDR32    = 0x0001,
    IMAGE_REL_ARM_ADDR32NB  = 0x0002,
    IMAGE_REL_ARM_BRANCH24  = 0x0003,
    IMAGE_REL_ARM_BRANCH11  = 0x0004,
    IMAGE_REL_ARM_TOKEN     = 0x0005,
    IMAGE_REL_ARM_BLX24     = 0x0008,
    IMAGE_REL_ARM_BLX11     = 0x0009,
    IMAGE_REL_ARM_SECTION   = 0x000E,
    IMAGE_REL_ARM_SECREL    = 0x000F,
    IMAGE_REL_ARM_MOV32A    = 0x0010,
    IMAGE_REL_ARM_MOV32T    = 0x0011,
    IMAGE_REL_ARM_BRANCH20T = 0x0012,
    IMAGE_REL_ARM_BRANCH24T = 0x0014,
    IMAGE_REL_ARM_BLX23T    = 0x0015
  };

  enum COMDATType {
    IMAGE_COMDAT_SELECT_NODUPLICATES = 1,
    IMAGE_COMDAT_SELECT_ANY,
    IMAGE_COMDAT_SELECT_SAME_SIZE,
    IMAGE_COMDAT_SELECT_EXACT_MATCH,
    IMAGE_COMDAT_SELECT_ASSOCIATIVE,
    IMAGE_COMDAT_SELECT_LARGEST,
    IMAGE_COMDAT_SELECT_NEWEST
  };

  // Auxiliary Symbol Formats
  struct AuxiliaryFunctionDefinition {
    uint32_t TagIndex;
    uint32_t TotalSize;
    uint32_t PointerToLinenumber;
    uint32_t PointerToNextFunction;
    char     unused[2];
  };

  struct AuxiliarybfAndefSymbol {
    uint8_t  unused1[4];
    uint16_t Linenumber;
    uint8_t  unused2[6];
    uint32_t PointerToNextFunction;
    uint8_t  unused3[2];
  };

  struct AuxiliaryWeakExternal {
    uint32_t TagIndex;
    uint32_t Characteristics;
    uint8_t  unused[10];
  };

  /// These are not documented in the spec, but are located in WinNT.h.
  enum WeakExternalCharacteristics {
    IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY = 1,
    IMAGE_WEAK_EXTERN_SEARCH_LIBRARY   = 2,
    IMAGE_WEAK_EXTERN_SEARCH_ALIAS     = 3
  };

  struct AuxiliaryFile {
    uint8_t FileName[18];
  };

  struct AuxiliarySectionDefinition {
    uint32_t Length;
    uint16_t NumberOfRelocations;
    uint16_t NumberOfLinenumbers;
    uint32_t CheckSum;
    uint16_t Number;
    uint8_t  Selection;
    char     unused[3];
  };

  struct AuxiliaryCLRToken {
    uint8_t  AuxType;
    uint8_t  unused1;
    uint32_t SymbolTableIndex;
    char     unused2[12];
  };

  union Auxiliary {
    AuxiliaryFunctionDefinition FunctionDefinition;
    AuxiliarybfAndefSymbol      bfAndefSymbol;
    AuxiliaryWeakExternal       WeakExternal;
    AuxiliaryFile               File;
    AuxiliarySectionDefinition  SectionDefinition;
  };

  /// @brief The Import Directory Table.
  ///
  /// There is a single array of these and one entry per imported DLL.
  struct ImportDirectoryTableEntry {
    uint32_t ImportLookupTableRVA;
    uint32_t TimeDateStamp;
    uint32_t ForwarderChain;
    uint32_t NameRVA;
    uint32_t ImportAddressTableRVA;
  };

  /// @brief The PE32 Import Lookup Table.
  ///
  /// There is an array of these for each imported DLL. It represents either
  /// the ordinal to import from the target DLL, or a name to lookup and import
  /// from the target DLL.
  ///
  /// This also happens to be the same format used by the Import Address Table
  /// when it is initially written out to the image.
  struct ImportLookupTableEntry32 {
    uint32_t data;

    /// @brief Is this entry specified by ordinal, or name?
    bool isOrdinal() const { return data & 0x80000000; }

    /// @brief Get the ordinal value of this entry. isOrdinal must be true.
    uint16_t getOrdinal() const {
      assert(isOrdinal() && "ILT entry is not an ordinal!");
      return data & 0xFFFF;
    }

    /// @brief Set the ordinal value and set isOrdinal to true.
    void setOrdinal(uint16_t o) {
      data = o;
      data |= 0x80000000;
    }

    /// @brief Get the Hint/Name entry RVA. isOrdinal must be false.
    uint32_t getHintNameRVA() const {
      assert(!isOrdinal() && "ILT entry is not a Hint/Name RVA!");
      return data;
    }

    /// @brief Set the Hint/Name entry RVA and set isOrdinal to false.
    void setHintNameRVA(uint32_t rva) { data = rva; }
  };

  /// @brief The DOS compatible header at the front of all PEs.
  struct DOSHeader {
    uint16_t Magic;
    uint16_t UsedBytesInTheLastPage;
    uint16_t FileSizeInPages;
    uint16_t NumberOfRelocationItems;
    uint16_t HeaderSizeInParagraphs;
    uint16_t MinimumExtraParagraphs;
    uint16_t MaximumExtraParagraphs;
    uint16_t InitialRelativeSS;
    uint16_t InitialSP;
    uint16_t Checksum;
    uint16_t InitialIP;
    uint16_t InitialRelativeCS;
    uint16_t AddressOfRelocationTable;
    uint16_t OverlayNumber;
    uint16_t Reserved[4];
    uint16_t OEMid;
    uint16_t OEMinfo;
    uint16_t Reserved2[10];
    uint32_t AddressOfNewExeHeader;
  };

  struct PE32Header {
    enum {
      PE32 = 0x10b,
      PE32_PLUS = 0x20b
    };

    uint16_t Magic;
    uint8_t  MajorLinkerVersion;
    uint8_t  MinorLinkerVersion;
    uint32_t SizeOfCode;
    uint32_t SizeOfInitializedData;
    uint32_t SizeOfUninitializedData;
    uint32_t AddressOfEntryPoint; // RVA
    uint32_t BaseOfCode; // RVA
    uint32_t BaseOfData; // RVA
    uint32_t ImageBase;
    uint32_t SectionAlignment;
    uint32_t FileAlignment;
    uint16_t MajorOperatingSystemVersion;
    uint16_t MinorOperatingSystemVersion;
    uint16_t MajorImageVersion;
    uint16_t MinorImageVersion;
    uint16_t MajorSubsystemVersion;
    uint16_t MinorSubsystemVersion;
    uint32_t Win32VersionValue;
    uint32_t SizeOfImage;
    uint32_t SizeOfHeaders;
    uint32_t CheckSum;
    uint16_t Subsystem;
    uint16_t DLLCharacteristics;
    uint32_t SizeOfStackReserve;
    uint32_t SizeOfStackCommit;
    uint32_t SizeOfHeapReserve;
    uint32_t SizeOfHeapCommit;
    uint32_t LoaderFlags;
    uint32_t NumberOfRvaAndSize;
  };

  struct DataDirectory {
    uint32_t RelativeVirtualAddress;
    uint32_t Size;
  };

  enum DataDirectoryIndex {
    EXPORT_TABLE = 0,
    IMPORT_TABLE,
    RESOURCE_TABLE,
    EXCEPTION_TABLE,
    CERTIFICATE_TABLE,
    BASE_RELOCATION_TABLE,
    DEBUG,
    ARCHITECTURE,
    GLOBAL_PTR,
    TLS_TABLE,
    LOAD_CONFIG_TABLE,
    BOUND_IMPORT,
    IAT,
    DELAY_IMPORT_DESCRIPTOR,
    CLR_RUNTIME_HEADER
  };

  enum WindowsSubsystem {
    IMAGE_SUBSYSTEM_UNKNOWN = 0, ///< An unknown subsystem.
    IMAGE_SUBSYSTEM_NATIVE = 1, ///< Device drivers and native Windows processes
    IMAGE_SUBSYSTEM_WINDOWS_GUI = 2, ///< The Windows GUI subsystem.
    IMAGE_SUBSYSTEM_WINDOWS_CUI = 3, ///< The Windows character subsystem.
    IMAGE_SUBSYSTEM_OS2_CUI = 5, ///< The OS/2 character subsytem.
    IMAGE_SUBSYSTEM_POSIX_CUI = 7, ///< The POSIX character subsystem.
    IMAGE_SUBSYSTEM_NATIVE_WINDOWS = 8, ///< Native Windows 9x driver.
    IMAGE_SUBSYSTEM_WINDOWS_CE_GUI = 9, ///< Windows CE.
    IMAGE_SUBSYSTEM_EFI_APPLICATION = 10, ///< An EFI application.
    IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER = 11, ///< An EFI driver with boot
                                                  ///  services.
    IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER = 12, ///< An EFI driver with run-time
                                             ///  services.
    IMAGE_SUBSYSTEM_EFI_ROM = 13, ///< An EFI ROM image.
    IMAGE_SUBSYSTEM_XBOX = 14, ///< XBOX.
    IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION = 16 ///< A BCD application.
  };

  enum DLLCharacteristics {
    /// ASLR with 64 bit address space.
    IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA = 0x0020,
    /// DLL can be relocated at load time.
    IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE = 0x0040,
    /// Code integrity checks are enforced.
    IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY = 0x0080,
    ///< Image is NX compatible.
    IMAGE_DLL_CHARACTERISTICS_NX_COMPAT = 0x0100,
    /// Isolation aware, but do not isolate the image.
    IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION = 0x0200,
    /// Does not use structured exception handling (SEH). No SEH handler may be
    /// called in this image.
    IMAGE_DLL_CHARACTERISTICS_NO_SEH = 0x0400,
    /// Do not bind the image.
    IMAGE_DLL_CHARACTERISTICS_NO_BIND = 0x0800,
    ///< Image should execute in an AppContainer.
    IMAGE_DLL_CHARACTERISTICS_APPCONTAINER = 0x1000,
    ///< A WDM driver.
    IMAGE_DLL_CHARACTERISTICS_WDM_DRIVER = 0x2000,
    ///< Image supports Control Flow Guard.
    IMAGE_DLL_CHARACTERISTICS_GUARD_CF = 0x4000,
    /// Terminal Server aware.
    IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE = 0x8000
  };

  enum DebugType {
    IMAGE_DEBUG_TYPE_UNKNOWN       = 0,
    IMAGE_DEBUG_TYPE_COFF          = 1,
    IMAGE_DEBUG_TYPE_CODEVIEW      = 2,
    IMAGE_DEBUG_TYPE_FPO           = 3,
    IMAGE_DEBUG_TYPE_MISC          = 4,
    IMAGE_DEBUG_TYPE_EXCEPTION     = 5,
    IMAGE_DEBUG_TYPE_FIXUP         = 6,
    IMAGE_DEBUG_TYPE_OMAP_TO_SRC   = 7,
    IMAGE_DEBUG_TYPE_OMAP_FROM_SRC = 8,
    IMAGE_DEBUG_TYPE_BORLAND       = 9,
    IMAGE_DEBUG_TYPE_CLSID         = 11
  };

  enum BaseRelocationType {
    IMAGE_REL_BASED_ABSOLUTE       = 0,
    IMAGE_REL_BASED_HIGH           = 1,
    IMAGE_REL_BASED_LOW            = 2,
    IMAGE_REL_BASED_HIGHLOW        = 3,
    IMAGE_REL_BASED_HIGHADJ        = 4,
    IMAGE_REL_BASED_MIPS_JMPADDR   = 5,
    IMAGE_REL_BASED_ARM_MOV32A     = 5,
    IMAGE_REL_BASED_ARM_MOV32T     = 7,
    IMAGE_REL_BASED_MIPS_JMPADDR16 = 9,
    IMAGE_REL_BASED_DIR64          = 10
  };

  enum ImportType {
    IMPORT_CODE  = 0,
    IMPORT_DATA  = 1,
    IMPORT_CONST = 2
  };

  enum ImportNameType {
    /// Import is by ordinal. This indicates that the value in the Ordinal/Hint
    /// field of the import header is the import's ordinal. If this constant is
    /// not specified, then the Ordinal/Hint field should always be interpreted
    /// as the import's hint.
    IMPORT_ORDINAL         = 0,
    /// The import name is identical to the public symbol name
    IMPORT_NAME            = 1,
    /// The import name is the public symbol name, but skipping the leading ?,
    /// @, or optionally _.
    IMPORT_NAME_NOPREFIX   = 2,
    /// The import name is the public symbol name, but skipping the leading ?,
    /// @, or optionally _, and truncating at the first @.
    IMPORT_NAME_UNDECORATE = 3
  };

  struct ImportHeader {
    uint16_t Sig1; ///< Must be IMAGE_FILE_MACHINE_UNKNOWN (0).
    uint16_t Sig2; ///< Must be 0xFFFF.
    uint16_t Version;
    uint16_t Machine;
    uint32_t TimeDateStamp;
    uint32_t SizeOfData;
    uint16_t OrdinalHint;
    uint16_t TypeInfo;

    ImportType getType() const {
      return static_cast<ImportType>(TypeInfo & 0x3);
    }

    ImportNameType getNameType() const {
      return static_cast<ImportNameType>((TypeInfo & 0x1C) >> 3);
    }
  };

  enum CodeViewLineTableIdentifiers {
    DEBUG_SECTION_MAGIC           = 0x4,
    DEBUG_LINE_TABLE_SUBSECTION   = 0xF2,
    DEBUG_STRING_TABLE_SUBSECTION = 0xF3,
    DEBUG_INDEX_SUBSECTION        = 0xF4
  };

  inline bool isReservedSectionNumber(int N) {
    return N == IMAGE_SYM_UNDEFINED || N > MaxNumberOfSections;
  }

} // End namespace COFF.
} // End namespace llvm.

#endif
