//===-- 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 int32_t MaxNumberOfSections16 = 65279;

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

  static const char BigObjMagic[] = {
      '\xc7', '\xa1', '\xba', '\xd1', '\xee', '\xba', '\xa9', '\x4b',
      '\xaf', '\x20', '\xfa', '\xf6', '\x6a', '\xa4', '\xdc', '\xb8',
  };

  // Sizes in bytes of various things in the COFF format.
  enum {
    Header16Size   = 20,
    Header32Size   = 56,
    NameSize       = 8,
    Symbol16Size   = 18,
    Symbol32Size   = 20,
    SectionSize    = 40,
    RelocationSize = 10
  };

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

  struct BigObjHeader {
    enum : uint16_t { MinBigObjectVersion = 2 };

    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;
    uint8_t  UUID[16];
    uint32_t unused1;
    uint32_t unused2;
    uint32_t unused3;
    uint32_t unused4;
    uint32_t NumberOfSections;
    uint32_t PointerToSymbolTable;
    uint32_t NumberOfSymbols;
  };

  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;
    int32_t  SectionNumber;
    uint16_t Type;
    uint8_t  StorageClass;
    uint8_t  NumberOfAuxSymbols;
  };

  enum SymbolSectionNumber : int32_t {
    IMAGE_SYM_DEBUG     = -2,
    IMAGE_SYM_ABSOLUTE  = -1,
    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 AuxiliarySectionDefinition {
    uint32_t Length;
    uint16_t NumberOfRelocations;
    uint16_t NumberOfLinenumbers;
    uint32_t CheckSum;
    uint32_t Number;
    uint8_t  Selection;
    char     unused;
  };

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

  union Auxiliary {
    AuxiliaryFunctionDefinition FunctionDefinition;
    AuxiliarybfAndefSymbol      bfAndefSymbol;
    AuxiliaryWeakExternal       WeakExternal;
    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;
    // FIXME: This should be DllCharacteristics to match the COFF spec.
    uint16_t DLLCharacteristics;
    uint32_t SizeOfStackReserve;
    uint32_t SizeOfStackCommit;
    uint32_t SizeOfHeapReserve;
    uint32_t SizeOfHeapCommit;
    uint32_t LoaderFlags;
    // FIXME: This should be NumberOfRvaAndSizes to match the COFF spec.
    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,

    NUM_DATA_DIRECTORIES
  };

  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 CodeViewIdentifiers {
    DEBUG_LINE_TABLES_HAVE_COLUMN_RECORDS = 0x1,
    DEBUG_SECTION_MAGIC = 0x4,
    DEBUG_SYMBOL_SUBSECTION = 0xF1,
    DEBUG_LINE_TABLE_SUBSECTION = 0xF2,
    DEBUG_STRING_TABLE_SUBSECTION = 0xF3,
    DEBUG_INDEX_SUBSECTION = 0xF4,

    // Symbol subsections are split into records of different types.
    DEBUG_SYMBOL_TYPE_PROC_START = 0x1147,
    DEBUG_SYMBOL_TYPE_PROC_END = 0x114F
  };

  inline bool isReservedSectionNumber(int32_t SectionNumber) {
    return SectionNumber <= 0;
  }

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

#endif
