1001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer//===- COFF.h - COFF object file implementation -----------------*- C++ -*-===// 2001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer// 3001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer// The LLVM Compiler Infrastructure 4001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer// 5001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer// This file is distributed under the University of Illinois Open Source 6001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer// License. See LICENSE.TXT for details. 7001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer// 8001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer//===----------------------------------------------------------------------===// 9001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer// 10001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer// This file declares the COFFObjectFile class. 11001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer// 12001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer//===----------------------------------------------------------------------===// 13001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 14001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer#ifndef LLVM_OBJECT_COFF_H 15001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer#define LLVM_OBJECT_COFF_H 16001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 1737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/ADT/PointerUnion.h" 18001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer#include "llvm/Object/ObjectFile.h" 19001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer#include "llvm/Support/COFF.h" 20001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer#include "llvm/Support/Endian.h" 2137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/Support/ErrorOr.h" 22001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 23001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencernamespace llvm { 2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestemplate <typename T> class ArrayRef; 251f6e3f9544c93213111a2f8b314c926c0d0e30e5Michael J. Spencer 26001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencernamespace object { 27a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyamaclass ImportDirectoryEntryRef; 2837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesclass DelayImportDirectoryEntryRef; 2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass ExportDirectoryEntryRef; 3037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesclass ImportedSymbolRef; 3137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesclass BaseRelocRef; 32a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyamatypedef content_iterator<ImportDirectoryEntryRef> import_directory_iterator; 3337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinestypedef content_iterator<DelayImportDirectoryEntryRef> 3437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines delay_import_directory_iterator; 3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestypedef content_iterator<ExportDirectoryEntryRef> export_directory_iterator; 3637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinestypedef content_iterator<ImportedSymbolRef> imported_symbol_iterator; 3737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinestypedef content_iterator<BaseRelocRef> base_reloc_iterator; 38001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 390a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama/// The DOS compatible header at the front of all PE/COFF executables. 400a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyamastruct dos_header { 4137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines char Magic[2]; 420a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t UsedBytesInTheLastPage; 430a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t FileSizeInPages; 440a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t NumberOfRelocationItems; 450a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t HeaderSizeInParagraphs; 460a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MinimumExtraParagraphs; 470a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MaximumExtraParagraphs; 480a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t InitialRelativeSS; 490a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t InitialSP; 500a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t Checksum; 510a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t InitialIP; 520a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t InitialRelativeCS; 530a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t AddressOfRelocationTable; 540a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t OverlayNumber; 550a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t Reserved[4]; 560a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t OEMid; 570a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t OEMinfo; 580a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t Reserved2[10]; 590a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t AddressOfNewExeHeader; 600a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama}; 610a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama 62001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerstruct coff_file_header { 63001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle16_t Machine; 64001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle16_t NumberOfSections; 65001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle32_t TimeDateStamp; 66001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle32_t PointerToSymbolTable; 67001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle32_t NumberOfSymbols; 68001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle16_t SizeOfOptionalHeader; 69001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle16_t Characteristics; 703a226015a0ca52936763a079da582656164c2908Rui Ueyama 713a226015a0ca52936763a079da582656164c2908Rui Ueyama bool isImportLibrary() const { return NumberOfSections == 0xffff; } 72001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer}; 73001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 7437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesstruct coff_bigobj_file_header { 7537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle16_t Sig1; 7637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle16_t Sig2; 7737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle16_t Version; 7837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle16_t Machine; 7937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle32_t TimeDateStamp; 8037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint8_t UUID[16]; 8137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle32_t unused1; 8237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle32_t unused2; 8337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle32_t unused3; 8437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle32_t unused4; 8537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle32_t NumberOfSections; 8637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle32_t PointerToSymbolTable; 8737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle32_t NumberOfSymbols; 8837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}; 8937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 901a4f2a33fbd94c840d620ff572dd25540c650f70Rui Ueyama/// The 32-bit PE header that follows the COFF header. 910a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyamastruct pe32_header { 920a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t Magic; 9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint8_t MajorLinkerVersion; 9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint8_t MinorLinkerVersion; 950a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfCode; 960a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfInitializedData; 970a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfUninitializedData; 980a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t AddressOfEntryPoint; 990a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t BaseOfCode; 1000a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t BaseOfData; 1010a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t ImageBase; 1020a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SectionAlignment; 1030a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t FileAlignment; 1040a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MajorOperatingSystemVersion; 1050a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MinorOperatingSystemVersion; 1060a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MajorImageVersion; 1070a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MinorImageVersion; 1080a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MajorSubsystemVersion; 1090a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MinorSubsystemVersion; 1100a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t Win32VersionValue; 1110a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfImage; 1120a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfHeaders; 1130a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t CheckSum; 1140a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t Subsystem; 11537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // FIXME: This should be DllCharacteristics. 1160a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t DLLCharacteristics; 1170a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfStackReserve; 1180a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfStackCommit; 1190a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfHeapReserve; 1200a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfHeapCommit; 1210a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t LoaderFlags; 12237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // FIXME: This should be NumberOfRvaAndSizes. 1230a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t NumberOfRvaAndSize; 1240a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama}; 1250a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama 1261a4f2a33fbd94c840d620ff572dd25540c650f70Rui Ueyama/// The 64-bit PE header that follows the COFF header. 1270a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyamastruct pe32plus_header { 1280a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t Magic; 12936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint8_t MajorLinkerVersion; 13036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint8_t MinorLinkerVersion; 1310a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfCode; 1320a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfInitializedData; 1330a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfUninitializedData; 1340a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t AddressOfEntryPoint; 1350a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t BaseOfCode; 1360a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle64_t ImageBase; 1370a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SectionAlignment; 1380a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t FileAlignment; 1390a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MajorOperatingSystemVersion; 1400a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MinorOperatingSystemVersion; 1410a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MajorImageVersion; 1420a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MinorImageVersion; 1430a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MajorSubsystemVersion; 1440a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MinorSubsystemVersion; 1450a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t Win32VersionValue; 1460a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfImage; 1470a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfHeaders; 1480a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t CheckSum; 1490a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t Subsystem; 1500a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t DLLCharacteristics; 1510a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle64_t SizeOfStackReserve; 1520a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle64_t SizeOfStackCommit; 1530a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle64_t SizeOfHeapReserve; 1540a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle64_t SizeOfHeapCommit; 1550a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t LoaderFlags; 1560a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t NumberOfRvaAndSize; 1570a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama}; 1580a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama 1590a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyamastruct data_directory { 1600a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t RelativeVirtualAddress; 1610a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t Size; 1620a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama}; 1630a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama 16420a91bfd362bf119a1bbaf27d19518328c5e3e90Rui Ueyamastruct import_directory_table_entry { 16520a91bfd362bf119a1bbaf27d19518328c5e3e90Rui Ueyama support::ulittle32_t ImportLookupTableRVA; 16620a91bfd362bf119a1bbaf27d19518328c5e3e90Rui Ueyama support::ulittle32_t TimeDateStamp; 16720a91bfd362bf119a1bbaf27d19518328c5e3e90Rui Ueyama support::ulittle32_t ForwarderChain; 16820a91bfd362bf119a1bbaf27d19518328c5e3e90Rui Ueyama support::ulittle32_t NameRVA; 16920a91bfd362bf119a1bbaf27d19518328c5e3e90Rui Ueyama support::ulittle32_t ImportAddressTableRVA; 17020a91bfd362bf119a1bbaf27d19518328c5e3e90Rui Ueyama}; 17120a91bfd362bf119a1bbaf27d19518328c5e3e90Rui Ueyama 17237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinestemplate <typename IntTy> 17337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesstruct import_lookup_table_entry { 17437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines IntTy Data; 175a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama 17637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool isOrdinal() const { return Data < 0; } 177a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama 178a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama uint16_t getOrdinal() const { 179a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama assert(isOrdinal() && "ILT entry is not an ordinal!"); 18037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return Data & 0xFFFF; 181a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama } 182a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama 183a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama uint32_t getHintNameRVA() const { 184a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama assert(!isOrdinal() && "ILT entry is not a Hint/Name RVA!"); 18537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return Data & 0xFFFFFFFF; 186a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama } 187a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama}; 188a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama 18937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinestypedef import_lookup_table_entry<support::little32_t> 19037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines import_lookup_table_entry32; 19137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinestypedef import_lookup_table_entry<support::little64_t> 19237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines import_lookup_table_entry64; 19337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 19437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesstruct delay_import_directory_table_entry { 19537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // dumpbin reports this field as "Characteristics" instead of "Attributes". 19637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle32_t Attributes; 19737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle32_t Name; 19837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle32_t ModuleHandle; 19937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle32_t DelayImportAddressTable; 20037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle32_t DelayImportNameTable; 20137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle32_t BoundDelayImportTable; 20237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle32_t UnloadDelayImportTable; 20337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle32_t TimeStamp; 20437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}; 20537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 20636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct export_directory_table_entry { 20736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t ExportFlags; 20836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t TimeDateStamp; 20936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle16_t MajorVersion; 21036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle16_t MinorVersion; 21136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t NameRVA; 21236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t OrdinalBase; 21336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t AddressTableEntries; 21436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t NumberOfNamePointers; 21536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t ExportAddressTableRVA; 21636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t NamePointerRVA; 21736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t OrdinalTableRVA; 21836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 21936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 22036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesunion export_address_table_entry { 22136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t ExportRVA; 22236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t ForwarderRVA; 22336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 22436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 22536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestypedef support::ulittle32_t export_name_pointer_table_entry; 22636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestypedef support::ulittle16_t export_ordinal_table_entry; 22736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 22837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesstruct StringTableOffset { 22937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle32_t Zeroes; 23037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle32_t Offset; 23137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}; 232001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 23337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinestemplate <typename SectionNumberType> 23437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesstruct coff_symbol { 235001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer union { 23637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines char ShortName[COFF::NameSize]; 237001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer StringTableOffset Offset; 238001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer } Name; 239001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 240001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle32_t Value; 24137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines SectionNumberType SectionNumber; 242001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 2435e3a082c797f0214d44858b05a13543872dfd413Michael J. Spencer support::ulittle16_t Type; 244001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 24537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint8_t StorageClass; 24637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint8_t NumberOfAuxSymbols; 24737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}; 24837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 24937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinestypedef coff_symbol<support::ulittle16_t> coff_symbol16; 25037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinestypedef coff_symbol<support::ulittle32_t> coff_symbol32; 25136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 25237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesclass COFFSymbolRef { 25337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinespublic: 25437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines COFFSymbolRef(const coff_symbol16 *CS) : CS16(CS), CS32(nullptr) {} 25537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines COFFSymbolRef(const coff_symbol32 *CS) : CS16(nullptr), CS32(CS) {} 25637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines COFFSymbolRef() : CS16(nullptr), CS32(nullptr) {} 25737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 25837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const void *getRawPtr() const { 25937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return CS16 ? static_cast<const void *>(CS16) : CS32; 26037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 26137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 26237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines friend bool operator<(COFFSymbolRef A, COFFSymbolRef B) { 26337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return A.getRawPtr() < B.getRawPtr(); 26437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 26537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 26637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool isBigObj() const { 26737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (CS16) 26837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return false; 26937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (CS32) 27037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return true; 27137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines llvm_unreachable("COFFSymbolRef points to nothing!"); 27237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 27337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 27437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const char *getShortName() const { 27537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return CS16 ? CS16->Name.ShortName : CS32->Name.ShortName; 27637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 27737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 27837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const StringTableOffset &getStringTableOffset() const { 279ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines assert(isSet() && "COFFSymbolRef points to nothing!"); 28037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return CS16 ? CS16->Name.Offset : CS32->Name.Offset; 28137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 28237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 28337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint32_t getValue() const { return CS16 ? CS16->Value : CS32->Value; } 28437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 28537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines int32_t getSectionNumber() const { 286ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines assert(isSet() && "COFFSymbolRef points to nothing!"); 28737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (CS16) { 28837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // Reserved sections are returned as negative numbers. 28937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (CS16->SectionNumber <= COFF::MaxNumberOfSections16) 29037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return CS16->SectionNumber; 29137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return static_cast<int16_t>(CS16->SectionNumber); 29237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 29337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return static_cast<int32_t>(CS32->SectionNumber); 29437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 29536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 296ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines uint16_t getType() const { 297ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines assert(isSet() && "COFFSymbolRef points to nothing!"); 298ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return CS16 ? CS16->Type : CS32->Type; 299ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 30037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 30137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint8_t getStorageClass() const { 302ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines assert(isSet() && "COFFSymbolRef points to nothing!"); 30337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return CS16 ? CS16->StorageClass : CS32->StorageClass; 30437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 30537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 30637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint8_t getNumberOfAuxSymbols() const { 307ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines assert(isSet() && "COFFSymbolRef points to nothing!"); 30837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return CS16 ? CS16->NumberOfAuxSymbols : CS32->NumberOfAuxSymbols; 30937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 31037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 31137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint8_t getBaseType() const { return getType() & 0x0F; } 31237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 31337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint8_t getComplexType() const { 31437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return (getType() & 0xF0) >> COFF::SCT_COMPLEX_TYPE_SHIFT; 31537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 31637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 31737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool isExternal() const { 31837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return getStorageClass() == COFF::IMAGE_SYM_CLASS_EXTERNAL; 31937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 32037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 32137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool isCommon() const { 32237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return isExternal() && getSectionNumber() == COFF::IMAGE_SYM_UNDEFINED && 32337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines getValue() != 0; 32437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 32537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 32637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool isUndefined() const { 32737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return isExternal() && getSectionNumber() == COFF::IMAGE_SYM_UNDEFINED && 32837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines getValue() == 0; 32937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 33037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 33137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool isWeakExternal() const { 33237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return getStorageClass() == COFF::IMAGE_SYM_CLASS_WEAK_EXTERNAL; 33337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 33436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 33536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isFunctionDefinition() const { 33637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return isExternal() && getBaseType() == COFF::IMAGE_SYM_TYPE_NULL && 33736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getComplexType() == COFF::IMAGE_SYM_DTYPE_FUNCTION && 33837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines !COFF::isReservedSectionNumber(getSectionNumber()); 33936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 34036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 34136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isFunctionLineInfo() const { 34237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return getStorageClass() == COFF::IMAGE_SYM_CLASS_FUNCTION; 34336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 34436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 34537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool isAnyUndefined() const { 34637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return isUndefined() || isWeakExternal(); 34736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 34836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 34936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isFileRecord() const { 35037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return getStorageClass() == COFF::IMAGE_SYM_CLASS_FILE; 35136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 3525e3a082c797f0214d44858b05a13543872dfd413Michael J. Spencer 35336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isSectionDefinition() const { 35436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // C++/CLI creates external ABS symbols for non-const appdomain globals. 35536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // These are also followed by an auxiliary section definition. 35637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool isAppdomainGlobal = 35737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines getStorageClass() == COFF::IMAGE_SYM_CLASS_EXTERNAL && 35837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines getSectionNumber() == COFF::IMAGE_SYM_ABSOLUTE; 35937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool isOrdinarySection = getStorageClass() == COFF::IMAGE_SYM_CLASS_STATIC; 36037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (!getNumberOfAuxSymbols()) 36137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return false; 36236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isAppdomainGlobal || isOrdinarySection; 3635e3a082c797f0214d44858b05a13543872dfd413Michael J. Spencer } 3645e3a082c797f0214d44858b05a13543872dfd413Michael J. Spencer 36536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isCLRToken() const { 36637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return getStorageClass() == COFF::IMAGE_SYM_CLASS_CLR_TOKEN; 3675e3a082c797f0214d44858b05a13543872dfd413Michael J. Spencer } 36837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 36937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesprivate: 370ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool isSet() const { return CS16 || CS32; } 371ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 37237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const coff_symbol16 *CS16; 37337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const coff_symbol32 *CS32; 374001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer}; 375001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 376001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerstruct coff_section { 37737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines char Name[COFF::NameSize]; 378001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle32_t VirtualSize; 379001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle32_t VirtualAddress; 380001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle32_t SizeOfRawData; 381001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle32_t PointerToRawData; 382001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle32_t PointerToRelocations; 383001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle32_t PointerToLinenumbers; 384001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle16_t NumberOfRelocations; 385001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle16_t NumberOfLinenumbers; 386001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle32_t Characteristics; 38736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 38836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Returns true if the actual number of relocations is stored in 38936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // VirtualAddress field of the first relocation table entry. 39036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool hasExtendedRelocations() const { 39137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return (Characteristics & COFF::IMAGE_SCN_LNK_NRELOC_OVFL) && 39237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines NumberOfRelocations == UINT16_MAX; 39337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 394001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer}; 395001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 3960fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerstruct coff_relocation { 3970fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer support::ulittle32_t VirtualAddress; 3980fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer support::ulittle32_t SymbolTableIndex; 3990fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer support::ulittle16_t Type; 4000fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}; 4010fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 40236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct coff_aux_function_definition { 40336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t TagIndex; 40436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t TotalSize; 40536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t PointerToLinenumber; 40636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t PointerToNextFunction; 40736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 40836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 40936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct coff_aux_bf_and_ef_symbol { 41036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines char Unused1[4]; 41136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle16_t Linenumber; 41236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines char Unused2[6]; 41336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t PointerToNextFunction; 41436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 41536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 416c08bd51181bd9df392065baa40586aabf94fa80fRui Ueyamastruct coff_aux_weak_external { 417c08bd51181bd9df392065baa40586aabf94fa80fRui Ueyama support::ulittle32_t TagIndex; 418c08bd51181bd9df392065baa40586aabf94fa80fRui Ueyama support::ulittle32_t Characteristics; 419dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}; 420dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 4210e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencerstruct coff_aux_section_definition { 4220e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer support::ulittle32_t Length; 4230e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer support::ulittle16_t NumberOfRelocations; 4240e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer support::ulittle16_t NumberOfLinenumbers; 4250e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer support::ulittle32_t CheckSum; 42637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle16_t NumberLowPart; 42737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint8_t Selection; 42837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint8_t Unused; 42937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle16_t NumberHighPart; 43037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines int32_t getNumber(bool IsBigObj) const { 43137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint32_t Number = static_cast<uint32_t>(NumberLowPart); 43237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (IsBigObj) 43337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Number |= static_cast<uint32_t>(NumberHighPart) << 16; 43437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return static_cast<int32_t>(Number); 43537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 4360e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer}; 4370e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer 43836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct coff_aux_clr_token { 43937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint8_t AuxType; 44037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint8_t Reserved; 44136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t SymbolTableIndex; 44236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 44336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 44436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct coff_load_configuration32 { 44536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t Characteristics; 44636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t TimeDateStamp; 44736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle16_t MajorVersion; 44836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle16_t MinorVersion; 44936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t GlobalFlagsClear; 45036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t GlobalFlagsSet; 45136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t CriticalSectionDefaultTimeout; 45236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t DeCommitFreeBlockThreshold; 45336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t DeCommitTotalFreeThreshold; 45436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t LockPrefixTable; 45536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t MaximumAllocationSize; 45636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t VirtualMemoryThreshold; 45736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t ProcessAffinityMask; 45836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t ProcessHeapFlags; 45936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle16_t CSDVersion; 46037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle16_t Reserved; 46136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t EditList; 46236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t SecurityCookie; 46336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t SEHandlerTable; 46436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t SEHandlerCount; 46536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 46636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 46736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct coff_runtime_function_x64 { 46836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t BeginAddress; 46936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t EndAddress; 47036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines support::ulittle32_t UnwindInformation; 47136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 47236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 47337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesstruct coff_base_reloc_block_header { 47437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle32_t PageRVA; 47537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle32_t BlockSize; 47637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}; 47737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 47837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesstruct coff_base_reloc_block_entry { 47937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::ulittle16_t Data; 48037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines int getType() const { return Data >> 12; } 48137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines int getOffset() const { return Data & ((1 << 12) - 1); } 48237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}; 48337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 484001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerclass COFFObjectFile : public ObjectFile { 485001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerprivate: 486a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama friend class ImportDirectoryEntryRef; 48736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines friend class ExportDirectoryEntryRef; 4884bf771b4e6d37ae1d6ae08ea27c4070a3a09784dRui Ueyama const coff_file_header *COFFHeader; 48937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const coff_bigobj_file_header *COFFBigObjHeader; 49036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const pe32_header *PE32Header; 49136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const pe32plus_header *PE32PlusHeader; 49236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const data_directory *DataDirectory; 49336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const coff_section *SectionTable; 49437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const coff_symbol16 *SymbolTable16; 49537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const coff_symbol32 *SymbolTable32; 49636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const char *StringTable; 49736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t StringTableSize; 498a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama const import_directory_table_entry *ImportDirectory; 49936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t NumberOfImportDirectory; 50037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const delay_import_directory_table_entry *DelayImportDirectory; 50137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint32_t NumberOfDelayImportDirectory; 50236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const export_directory_table_entry *ExportDirectory; 50337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const coff_base_reloc_block_header *BaseRelocHeader; 50437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const coff_base_reloc_block_header *BaseRelocEnd; 505001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 506c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getString(uint32_t offset, StringRef &Res) const; 50725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer 50837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines template <typename coff_symbol_type> 50937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const coff_symbol_type *toSymb(DataRefImpl Symb) const; 51036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const coff_section *toSec(DataRefImpl Sec) const; 51136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const coff_relocation *toRel(DataRefImpl Rel) const; 512001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 513c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code initSymbolTablePtr(); 514c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code initImportTablePtr(); 51537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines std::error_code initDelayImportTablePtr(); 516c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code initExportTablePtr(); 51737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines std::error_code initBaseRelocPtr(); 518a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama 51937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinespublic: 52037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uintptr_t getSymbolTable() const { 52137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (SymbolTable16) 52237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return reinterpret_cast<uintptr_t>(SymbolTable16); 52337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (SymbolTable32) 52437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return reinterpret_cast<uintptr_t>(SymbolTable32); 52537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return uintptr_t(0); 52637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 52737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint16_t getMachine() const { 52837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (COFFHeader) 52937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return COFFHeader->Machine; 53037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (COFFBigObjHeader) 53137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return COFFBigObjHeader->Machine; 53237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines llvm_unreachable("no COFF header!"); 53337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 53437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint16_t getSizeOfOptionalHeader() const { 53537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (COFFHeader) 53637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return COFFHeader->isImportLibrary() ? 0 53737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines : COFFHeader->SizeOfOptionalHeader; 53837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // bigobj doesn't have this field. 53937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (COFFBigObjHeader) 54037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return 0; 54137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines llvm_unreachable("no COFF header!"); 54237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 54337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint16_t getCharacteristics() const { 54437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (COFFHeader) 54537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return COFFHeader->isImportLibrary() ? 0 : COFFHeader->Characteristics; 54637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // bigobj doesn't have characteristics to speak of, 54737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // editbin will silently lie to you if you attempt to set any. 54837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (COFFBigObjHeader) 54937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return 0; 55037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines llvm_unreachable("no COFF header!"); 55137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 55237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint32_t getTimeDateStamp() const { 55337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (COFFHeader) 55437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return COFFHeader->TimeDateStamp; 55537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (COFFBigObjHeader) 55637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return COFFBigObjHeader->TimeDateStamp; 55737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines llvm_unreachable("no COFF header!"); 55837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 55937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint32_t getNumberOfSections() const { 56037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (COFFHeader) 56137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return COFFHeader->isImportLibrary() ? 0 : COFFHeader->NumberOfSections; 56237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (COFFBigObjHeader) 56337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return COFFBigObjHeader->NumberOfSections; 56437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines llvm_unreachable("no COFF header!"); 56537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 56637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint32_t getPointerToSymbolTable() const { 56737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (COFFHeader) 56837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return COFFHeader->isImportLibrary() ? 0 56937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines : COFFHeader->PointerToSymbolTable; 57037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (COFFBigObjHeader) 57137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return COFFBigObjHeader->PointerToSymbolTable; 57237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines llvm_unreachable("no COFF header!"); 57337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 57437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint32_t getNumberOfSymbols() const { 57537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (COFFHeader) 57637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return COFFHeader->isImportLibrary() ? 0 : COFFHeader->NumberOfSymbols; 57737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (COFFBigObjHeader) 57837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return COFFBigObjHeader->NumberOfSymbols; 57937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines llvm_unreachable("no COFF header!"); 58037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 581001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerprotected: 58236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void moveSymbolNext(DataRefImpl &Symb) const override; 583c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getSymbolName(DataRefImpl Symb, 584c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines StringRef &Res) const override; 585c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getSymbolAddress(DataRefImpl Symb, 586c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines uint64_t &Res) const override; 587c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const override; 58836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t getSymbolFlags(DataRefImpl Symb) const override; 589c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getSymbolType(DataRefImpl Symb, 590c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines SymbolRef::Type &Res) const override; 591c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getSymbolSection(DataRefImpl Symb, 592c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines section_iterator &Res) const override; 59336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void moveSectionNext(DataRefImpl &Sec) const override; 594c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getSectionName(DataRefImpl Sec, 595c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines StringRef &Res) const override; 59637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint64_t getSectionAddress(DataRefImpl Sec) const override; 59737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint64_t getSectionSize(DataRefImpl Sec) const override; 598c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getSectionContents(DataRefImpl Sec, 599c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines StringRef &Res) const override; 60037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint64_t getSectionAlignment(DataRefImpl Sec) const override; 60137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool isSectionText(DataRefImpl Sec) const override; 60237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool isSectionData(DataRefImpl Sec) const override; 60337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool isSectionBSS(DataRefImpl Sec) const override; 60437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool isSectionVirtual(DataRefImpl Sec) const override; 60537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb) const override; 60636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines relocation_iterator section_rel_begin(DataRefImpl Sec) const override; 60736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines relocation_iterator section_rel_end(DataRefImpl Sec) const override; 60836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 60936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void moveRelocationNext(DataRefImpl &Rel) const override; 610c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getRelocationAddress(DataRefImpl Rel, 611c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines uint64_t &Res) const override; 612c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getRelocationOffset(DataRefImpl Rel, 613c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines uint64_t &Res) const override; 61436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines symbol_iterator getRelocationSymbol(DataRefImpl Rel) const override; 615c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getRelocationType(DataRefImpl Rel, 616c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines uint64_t &Res) const override; 617c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code 61836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getRelocationTypeName(DataRefImpl Rel, 61936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<char> &Result) const override; 620c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code 62136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getRelocationValueString(DataRefImpl Rel, 62236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<char> &Result) const override; 62336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 624001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerpublic: 62537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines COFFObjectFile(MemoryBufferRef Object, std::error_code &EC); 62636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines basic_symbol_iterator symbol_begin_impl() const override; 62736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines basic_symbol_iterator symbol_end_impl() const override; 62836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines section_iterator section_begin() const override; 62936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines section_iterator section_end() const override; 63036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 63136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const coff_section *getCOFFSection(const SectionRef &Section) const; 63237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines COFFSymbolRef getCOFFSymbol(const DataRefImpl &Ref) const; 63337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines COFFSymbolRef getCOFFSymbol(const SymbolRef &Symbol) const; 63436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const coff_relocation *getCOFFRelocation(const RelocationRef &Reloc) const; 63536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 63636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint8_t getBytesInAddress() const override; 63736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef getFileFormatName() const override; 63836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getArch() const override; 639ab6bcf35aefe823894d349773ebd53f465f122b7Michael J. Spencer 64029552222c2e7cbeb37fcd15d247597467f7b8544Rui Ueyama import_directory_iterator import_directory_begin() const; 64129552222c2e7cbeb37fcd15d247597467f7b8544Rui Ueyama import_directory_iterator import_directory_end() const; 64237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines delay_import_directory_iterator delay_import_directory_begin() const; 64337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines delay_import_directory_iterator delay_import_directory_end() const; 64436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines export_directory_iterator export_directory_begin() const; 64536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines export_directory_iterator export_directory_end() const; 64637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines base_reloc_iterator base_reloc_begin() const; 64737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines base_reloc_iterator base_reloc_end() const; 64837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 64937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines iterator_range<import_directory_iterator> import_directories() const; 65037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines iterator_range<delay_import_directory_iterator> 65137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines delay_import_directories() const; 65237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines iterator_range<export_directory_iterator> export_directories() const; 65337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines iterator_range<base_reloc_iterator> base_relocs() const; 65437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 65537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const dos_header *getDOSHeader() const { 65637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (!PE32Header && !PE32PlusHeader) 65737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return nullptr; 65837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return reinterpret_cast<const dos_header *>(base()); 65937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 660c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getPE32Header(const pe32_header *&Res) const; 661c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getPE32PlusHeader(const pe32plus_header *&Res) const; 662c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getDataDirectory(uint32_t index, 663c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines const data_directory *&Res) const; 664c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getSection(int32_t index, const coff_section *&Res) const; 66537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines template <typename coff_symbol_type> 66637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines std::error_code getSymbol(uint32_t Index, 66737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const coff_symbol_type *&Res) const { 66837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (Index >= getNumberOfSymbols()) 66937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return object_error::parse_failed; 67037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 67137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Res = reinterpret_cast<coff_symbol_type *>(getSymbolTable()) + Index; 67237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return object_error::success; 67337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 67437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ErrorOr<COFFSymbolRef> getSymbol(uint32_t index) const { 67537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (SymbolTable16) { 67637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const coff_symbol16 *Symb = nullptr; 67737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (std::error_code EC = getSymbol(index, Symb)) 67837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return EC; 67937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return COFFSymbolRef(Symb); 68037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 68137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (SymbolTable32) { 68237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const coff_symbol32 *Symb = nullptr; 68337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (std::error_code EC = getSymbol(index, Symb)) 68437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return EC; 68537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return COFFSymbolRef(Symb); 68637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 68737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return object_error::parse_failed; 68837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 6890e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer template <typename T> 690c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getAuxSymbol(uint32_t index, const T *&Res) const { 69137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ErrorOr<COFFSymbolRef> s = getSymbol(index); 69237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (std::error_code EC = s.getError()) 69337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return EC; 69437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Res = reinterpret_cast<const T *>(s->getRawPtr()); 69537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return object_error::success; 69637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 69737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines std::error_code getSymbolName(COFFSymbolRef Symbol, StringRef &Res) const; 69837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 69937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ArrayRef<uint8_t> getSymbolAuxData(COFFSymbolRef Symbol) const; 70037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 70137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines size_t getSymbolTableEntrySize() const { 70237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (COFFHeader) 70337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return sizeof(coff_symbol16); 70437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (COFFBigObjHeader) 70537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return sizeof(coff_symbol32); 70637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines llvm_unreachable("null symbol table pointer!"); 7070e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer } 708d4d03e09d3686d317da1166b578ca5ca35593970Marshall Clow 709c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getSectionName(const coff_section *Sec, StringRef &Res) const; 71037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint64_t getSectionSize(const coff_section *Sec) const; 711c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getSectionContents(const coff_section *Sec, 712c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines ArrayRef<uint8_t> &Res) const; 713ab6bcf35aefe823894d349773ebd53f465f122b7Michael J. Spencer 714c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getVaPtr(uint64_t VA, uintptr_t &Res) const; 715c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getRvaPtr(uint32_t Rva, uintptr_t &Res) const; 716c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getHintName(uint32_t Rva, uint16_t &Hint, 717c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines StringRef &Name) const; 718a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama 71937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool isRelocatableObject() const override; 72037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool is64() const { return PE32PlusHeader; } 72137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 72236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines static inline bool classof(const Binary *v) { return v->isCOFF(); } 723001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer}; 724001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 725a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama// The iterator for the import directory table. 726a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyamaclass ImportDirectoryEntryRef { 727a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyamapublic: 728dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ImportDirectoryEntryRef() : OwningObject(nullptr) {} 72936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ImportDirectoryEntryRef(const import_directory_table_entry *Table, uint32_t I, 730a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama const COFFObjectFile *Owner) 73136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines : ImportTable(Table), Index(I), OwningObject(Owner) {} 732a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama 733a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama bool operator==(const ImportDirectoryEntryRef &Other) const; 73436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void moveNext(); 73537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 73637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines imported_symbol_iterator imported_symbol_begin() const; 73737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines imported_symbol_iterator imported_symbol_end() const; 73837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines iterator_range<imported_symbol_iterator> imported_symbols() const; 73937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 740c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getName(StringRef &Result) const; 74137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines std::error_code getImportLookupTableRVA(uint32_t &Result) const; 74237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines std::error_code getImportAddressTableRVA(uint32_t &Result) const; 743a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama 744c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code 745a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama getImportTableEntry(const import_directory_table_entry *&Result) const; 746a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama 747c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code 748a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama getImportLookupEntry(const import_lookup_table_entry32 *&Result) const; 749a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama 750a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyamaprivate: 75136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const import_directory_table_entry *ImportTable; 75236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t Index; 75336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const COFFObjectFile *OwningObject; 75436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 75536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 75637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesclass DelayImportDirectoryEntryRef { 75737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinespublic: 75837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines DelayImportDirectoryEntryRef() : OwningObject(nullptr) {} 75937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines DelayImportDirectoryEntryRef(const delay_import_directory_table_entry *T, 76037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint32_t I, const COFFObjectFile *Owner) 76137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines : Table(T), Index(I), OwningObject(Owner) {} 76237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 76337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool operator==(const DelayImportDirectoryEntryRef &Other) const; 76437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines void moveNext(); 76537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 76637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines imported_symbol_iterator imported_symbol_begin() const; 76737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines imported_symbol_iterator imported_symbol_end() const; 76837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines iterator_range<imported_symbol_iterator> imported_symbols() const; 76937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 77037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines std::error_code getName(StringRef &Result) const; 77137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines std::error_code getDelayImportTable( 77237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const delay_import_directory_table_entry *&Result) const; 77337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines std::error_code getImportAddress(int AddrIndex, uint64_t &Result) const; 77437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 77537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesprivate: 77637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const delay_import_directory_table_entry *Table; 77737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint32_t Index; 77837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const COFFObjectFile *OwningObject; 77937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}; 78037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 78136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// The iterator for the export directory table entry. 78236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass ExportDirectoryEntryRef { 78336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic: 784dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ExportDirectoryEntryRef() : OwningObject(nullptr) {} 78536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ExportDirectoryEntryRef(const export_directory_table_entry *Table, uint32_t I, 78636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const COFFObjectFile *Owner) 78736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines : ExportTable(Table), Index(I), OwningObject(Owner) {} 78836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 78936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool operator==(const ExportDirectoryEntryRef &Other) const; 79036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void moveNext(); 79136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 792c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getDllName(StringRef &Result) const; 793c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getOrdinalBase(uint32_t &Result) const; 794c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getOrdinal(uint32_t &Result) const; 795c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getExportRVA(uint32_t &Result) const; 796c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::error_code getSymbolName(StringRef &Result) const; 79736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 79836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesprivate: 79936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const export_directory_table_entry *ExportTable; 80036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t Index; 801a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama const COFFObjectFile *OwningObject; 802a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama}; 80337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 80437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesclass ImportedSymbolRef { 80537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinespublic: 80637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ImportedSymbolRef() : OwningObject(nullptr) {} 80737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ImportedSymbolRef(const import_lookup_table_entry32 *Entry, uint32_t I, 80837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const COFFObjectFile *Owner) 80937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines : Entry32(Entry), Entry64(nullptr), Index(I), OwningObject(Owner) {} 81037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ImportedSymbolRef(const import_lookup_table_entry64 *Entry, uint32_t I, 81137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const COFFObjectFile *Owner) 81237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines : Entry32(nullptr), Entry64(Entry), Index(I), OwningObject(Owner) {} 81337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 81437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool operator==(const ImportedSymbolRef &Other) const; 81537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines void moveNext(); 81637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 81737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines std::error_code getSymbolName(StringRef &Result) const; 81837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines std::error_code getOrdinal(uint16_t &Result) const; 81937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 82037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesprivate: 82137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const import_lookup_table_entry32 *Entry32; 82237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const import_lookup_table_entry64 *Entry64; 82337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint32_t Index; 82437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const COFFObjectFile *OwningObject; 82537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}; 82637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 82737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesclass BaseRelocRef { 82837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinespublic: 82937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines BaseRelocRef() : OwningObject(nullptr) {} 83037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines BaseRelocRef(const coff_base_reloc_block_header *Header, 83137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const COFFObjectFile *Owner) 83237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines : Header(Header), Index(0), OwningObject(Owner) {} 83337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 83437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool operator==(const BaseRelocRef &Other) const; 83537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines void moveNext(); 83637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 83737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines std::error_code getType(uint8_t &Type) const; 83837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines std::error_code getRVA(uint32_t &Result) const; 83937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 84037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesprivate: 84137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const coff_base_reloc_block_header *Header; 84237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint32_t Index; 84337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const COFFObjectFile *OwningObject; 84437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}; 84537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 846a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama} // end namespace object 847a6610ee882fcb8bcad60d53fc52b80f00a3fddaeRui Ueyama} // end namespace llvm 848001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 849001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer#endif 850