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
17001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer#include "llvm/Object/ObjectFile.h"
18001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer#include "llvm/Support/COFF.h"
19001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer#include "llvm/Support/Endian.h"
20001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer
21001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencernamespace llvm {
221f6e3f9544c93213111a2f8b314c926c0d0e30e5Michael J. Spencer  template <typename T>
231f6e3f9544c93213111a2f8b314c926c0d0e30e5Michael J. Spencer  class ArrayRef;
241f6e3f9544c93213111a2f8b314c926c0d0e30e5Michael J. Spencer
25001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencernamespace object {
26001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer
270a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama/// The DOS compatible header at the front of all PE/COFF executables.
280a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyamastruct dos_header {
290a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t Magic;
300a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t UsedBytesInTheLastPage;
310a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t FileSizeInPages;
320a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t NumberOfRelocationItems;
330a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t HeaderSizeInParagraphs;
340a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t MinimumExtraParagraphs;
350a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t MaximumExtraParagraphs;
360a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t InitialRelativeSS;
370a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t InitialSP;
380a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t Checksum;
390a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t InitialIP;
400a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t InitialRelativeCS;
410a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t AddressOfRelocationTable;
420a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t OverlayNumber;
430a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t Reserved[4];
440a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t OEMid;
450a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t OEMinfo;
460a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t Reserved2[10];
470a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t AddressOfNewExeHeader;
480a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama};
490a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama
50001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerstruct coff_file_header {
51001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  support::ulittle16_t Machine;
52001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  support::ulittle16_t NumberOfSections;
53001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  support::ulittle32_t TimeDateStamp;
54001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  support::ulittle32_t PointerToSymbolTable;
55001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  support::ulittle32_t NumberOfSymbols;
56001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  support::ulittle16_t SizeOfOptionalHeader;
57001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  support::ulittle16_t Characteristics;
58001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer};
59001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer
601a4f2a33fbd94c840d620ff572dd25540c650f70Rui Ueyama/// The 32-bit PE header that follows the COFF header.
610a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyamastruct pe32_header {
620a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t Magic;
630a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  uint8_t  MajorLinkerVersion;
640a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  uint8_t  MinorLinkerVersion;
650a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t SizeOfCode;
660a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t SizeOfInitializedData;
670a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t SizeOfUninitializedData;
680a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t AddressOfEntryPoint;
690a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t BaseOfCode;
700a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t BaseOfData;
710a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t ImageBase;
720a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t SectionAlignment;
730a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t FileAlignment;
740a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t MajorOperatingSystemVersion;
750a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t MinorOperatingSystemVersion;
760a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t MajorImageVersion;
770a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t MinorImageVersion;
780a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t MajorSubsystemVersion;
790a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t MinorSubsystemVersion;
800a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t Win32VersionValue;
810a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t SizeOfImage;
820a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t SizeOfHeaders;
830a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t CheckSum;
840a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t Subsystem;
850a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t DLLCharacteristics;
860a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t SizeOfStackReserve;
870a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t SizeOfStackCommit;
880a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t SizeOfHeapReserve;
890a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t SizeOfHeapCommit;
900a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t LoaderFlags;
910a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t NumberOfRvaAndSize;
920a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama};
930a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama
941a4f2a33fbd94c840d620ff572dd25540c650f70Rui Ueyama/// The 64-bit PE header that follows the COFF header.
950a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyamastruct pe32plus_header {
960a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t Magic;
970a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  uint8_t  MajorLinkerVersion;
980a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  uint8_t  MinorLinkerVersion;
990a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t SizeOfCode;
1000a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t SizeOfInitializedData;
1010a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t SizeOfUninitializedData;
1020a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t AddressOfEntryPoint;
1030a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t BaseOfCode;
1040a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle64_t ImageBase;
1050a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t SectionAlignment;
1060a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t FileAlignment;
1070a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t MajorOperatingSystemVersion;
1080a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t MinorOperatingSystemVersion;
1090a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t MajorImageVersion;
1100a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t MinorImageVersion;
1110a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t MajorSubsystemVersion;
1120a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t MinorSubsystemVersion;
1130a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t Win32VersionValue;
1140a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t SizeOfImage;
1150a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t SizeOfHeaders;
1160a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t CheckSum;
1170a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t Subsystem;
1180a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle16_t DLLCharacteristics;
1190a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle64_t SizeOfStackReserve;
1200a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle64_t SizeOfStackCommit;
1210a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle64_t SizeOfHeapReserve;
1220a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle64_t SizeOfHeapCommit;
1230a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t LoaderFlags;
1240a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t NumberOfRvaAndSize;
1250a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama};
1260a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama
1270a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyamastruct data_directory {
1280a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t RelativeVirtualAddress;
1290a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama  support::ulittle32_t Size;
1300a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama};
1310a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama
13220a91bfd362bf119a1bbaf27d19518328c5e3e90Rui Ueyamastruct import_directory_table_entry {
13320a91bfd362bf119a1bbaf27d19518328c5e3e90Rui Ueyama  support::ulittle32_t ImportLookupTableRVA;
13420a91bfd362bf119a1bbaf27d19518328c5e3e90Rui Ueyama  support::ulittle32_t TimeDateStamp;
13520a91bfd362bf119a1bbaf27d19518328c5e3e90Rui Ueyama  support::ulittle32_t ForwarderChain;
13620a91bfd362bf119a1bbaf27d19518328c5e3e90Rui Ueyama  support::ulittle32_t NameRVA;
13720a91bfd362bf119a1bbaf27d19518328c5e3e90Rui Ueyama  support::ulittle32_t ImportAddressTableRVA;
13820a91bfd362bf119a1bbaf27d19518328c5e3e90Rui Ueyama};
13920a91bfd362bf119a1bbaf27d19518328c5e3e90Rui Ueyama
140001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerstruct coff_symbol {
141001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  struct StringTableOffset {
142001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer    support::ulittle32_t Zeroes;
143001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer    support::ulittle32_t Offset;
144001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  };
145001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer
146001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  union {
147001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer    char ShortName[8];
148001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer    StringTableOffset Offset;
149001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  } Name;
150001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer
151001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  support::ulittle32_t Value;
152001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  support::little16_t SectionNumber;
153001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer
1545e3a082c797f0214d44858b05a13543872dfd413Michael J. Spencer  support::ulittle16_t Type;
155001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer
156001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  support::ulittle8_t  StorageClass;
157001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  support::ulittle8_t  NumberOfAuxSymbols;
1585e3a082c797f0214d44858b05a13543872dfd413Michael J. Spencer
1595e3a082c797f0214d44858b05a13543872dfd413Michael J. Spencer  uint8_t getBaseType() const {
1605e3a082c797f0214d44858b05a13543872dfd413Michael J. Spencer    return Type & 0x0F;
1615e3a082c797f0214d44858b05a13543872dfd413Michael J. Spencer  }
1625e3a082c797f0214d44858b05a13543872dfd413Michael J. Spencer
1635e3a082c797f0214d44858b05a13543872dfd413Michael J. Spencer  uint8_t getComplexType() const {
1645e3a082c797f0214d44858b05a13543872dfd413Michael J. Spencer    return (Type & 0xF0) >> 4;
1655e3a082c797f0214d44858b05a13543872dfd413Michael J. Spencer  }
166001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer};
167001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer
168001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerstruct coff_section {
169001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  char Name[8];
170001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  support::ulittle32_t VirtualSize;
171001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  support::ulittle32_t VirtualAddress;
172001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  support::ulittle32_t SizeOfRawData;
173001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  support::ulittle32_t PointerToRawData;
174001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  support::ulittle32_t PointerToRelocations;
175001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  support::ulittle32_t PointerToLinenumbers;
176001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  support::ulittle16_t NumberOfRelocations;
177001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  support::ulittle16_t NumberOfLinenumbers;
178001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  support::ulittle32_t Characteristics;
179001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer};
180001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer
1810fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerstruct coff_relocation {
1820fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  support::ulittle32_t VirtualAddress;
1830fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  support::ulittle32_t SymbolTableIndex;
1840fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  support::ulittle16_t Type;
1850fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer};
1860fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
1870e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencerstruct coff_aux_section_definition {
1880e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer  support::ulittle32_t Length;
1890e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer  support::ulittle16_t NumberOfRelocations;
1900e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer  support::ulittle16_t NumberOfLinenumbers;
1910e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer  support::ulittle32_t CheckSum;
1920e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer  support::ulittle16_t Number;
1930e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer  support::ulittle8_t Selection;
1940e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer  char Unused[3];
1950e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer};
1960e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer
197001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerclass COFFObjectFile : public ObjectFile {
198001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerprivate:
1994bf771b4e6d37ae1d6ae08ea27c4070a3a09784dRui Ueyama  const coff_file_header *COFFHeader;
2004bf771b4e6d37ae1d6ae08ea27c4070a3a09784dRui Ueyama  const pe32_header      *PE32Header;
2012f6c0484d68270f09eecac03b7e56053153203f3Rui Ueyama  const data_directory   *DataDirectory;
202001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  const coff_section     *SectionTable;
203001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  const coff_symbol      *SymbolTable;
204001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  const char             *StringTable;
20525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer        uint32_t          StringTableSize;
206001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer
20725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer        error_code        getString(uint32_t offset, StringRef &Res) const;
20825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer
20925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  const coff_symbol      *toSymb(DataRefImpl Symb) const;
21025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  const coff_section     *toSec(DataRefImpl Sec) const;
2110fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  const coff_relocation  *toRel(DataRefImpl Rel) const;
212001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer
213001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerprotected:
21425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const;
21525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const;
216b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev  virtual error_code getSymbolFileOffset(DataRefImpl Symb, uint64_t &Res) const;
21725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const;
21825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const;
21925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolNMTypeChar(DataRefImpl Symb, char &Res) const;
220c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer  virtual error_code getSymbolFlags(DataRefImpl Symb, uint32_t &Res) const;
2211130a799ab2fd7042625163a2506518960394884Michael J. Spencer  virtual error_code getSymbolType(DataRefImpl Symb, SymbolRef::Type &Res) const;
2229b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  virtual error_code getSymbolSection(DataRefImpl Symb,
2239b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer                                      section_iterator &Res) const;
224a41dce3c642e50775352cce49e3a3d0cd004d393Tim Northover  virtual error_code getSymbolValue(DataRefImpl Symb, uint64_t &Val) const;
22525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer
22625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionNext(DataRefImpl Sec, SectionRef &Res) const;
22725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionName(DataRefImpl Sec, StringRef &Res) const;
22825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionAddress(DataRefImpl Sec, uint64_t &Res) const;
22925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const;
23025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionContents(DataRefImpl Sec, StringRef &Res) const;
231e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer  virtual error_code getSectionAlignment(DataRefImpl Sec, uint64_t &Res) const;
23225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const;
23313afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer  virtual error_code isSectionData(DataRefImpl Sec, bool &Res) const;
23413afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer  virtual error_code isSectionBSS(DataRefImpl Sec, bool &Res) const;
235c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  virtual error_code isSectionVirtual(DataRefImpl Sec, bool &Res) const;
236c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  virtual error_code isSectionZeroInit(DataRefImpl Sec, bool &Res) const;
2373a129c85920404e7ccdb7e655c89fa60a0309cfdAndrew Kaylor  virtual error_code isSectionReadOnlyData(DataRefImpl Sec, bool &Res) const;
238c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  virtual error_code isSectionRequiredForExecution(DataRefImpl Sec,
239c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd                                                   bool &Res) const;
24007ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer  virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb,
24107ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer                                           bool &Result) const;
2424344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  virtual relocation_iterator getSectionRelBegin(DataRefImpl Sec) const;
2434344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  virtual relocation_iterator getSectionRelEnd(DataRefImpl Sec) const;
244001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer
2450fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  virtual error_code getRelocationNext(DataRefImpl Rel,
2460fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer                                       RelocationRef &Res) const;
2470fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  virtual error_code getRelocationAddress(DataRefImpl Rel,
2480fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer                                          uint64_t &Res) const;
249b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev  virtual error_code getRelocationOffset(DataRefImpl Rel,
250b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev                                         uint64_t &Res) const;
2516c1202c459ffa6d693ad92fa84e43902bc780bcaRafael Espindola  virtual symbol_iterator getRelocationSymbol(DataRefImpl Rel) const;
2520fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  virtual error_code getRelocationType(DataRefImpl Rel,
2539472b8d220fc746498429f430cb4c4dbfbd38f2aOwen Anderson                                       uint64_t &Res) const;
2544344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  virtual error_code getRelocationTypeName(DataRefImpl Rel,
2554344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer                                           SmallVectorImpl<char> &Result) const;
2564344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  virtual error_code getRelocationValueString(DataRefImpl Rel,
2574344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer                                           SmallVectorImpl<char> &Result) const;
2584344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
2595c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  virtual error_code getLibraryNext(DataRefImpl LibData,
2605c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer                                    LibraryRef &Result) const;
2615c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  virtual error_code getLibraryPath(DataRefImpl LibData,
2625c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer                                    StringRef &Result) const;
2635c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
264001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerpublic:
265001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  COFFObjectFile(MemoryBuffer *Object, error_code &ec);
266001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  virtual symbol_iterator begin_symbols() const;
267001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  virtual symbol_iterator end_symbols() const;
268dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer  virtual symbol_iterator begin_dynamic_symbols() const;
269dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer  virtual symbol_iterator end_dynamic_symbols() const;
2705c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  virtual library_iterator begin_libraries_needed() const;
2715c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  virtual library_iterator end_libraries_needed() const;
272001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  virtual section_iterator begin_sections() const;
273001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  virtual section_iterator end_sections() const;
274001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer
275d4d03e09d3686d317da1166b578ca5ca35593970Marshall Clow  const coff_section *getCOFFSection(section_iterator &It) const;
276d4d03e09d3686d317da1166b578ca5ca35593970Marshall Clow  const coff_symbol *getCOFFSymbol(symbol_iterator &It) const;
2779ac0f1d7255d7941c331b0a62a830a3b033358fdMarshall Clow  const coff_relocation *getCOFFRelocation(relocation_iterator &It) const;
2780a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama
279001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  virtual uint8_t getBytesInAddress() const;
280001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  virtual StringRef getFileFormatName() const;
281001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  virtual unsigned getArch() const;
28297f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer  virtual StringRef getLoadName() const;
283ab6bcf35aefe823894d349773ebd53f465f122b7Michael J. Spencer
2840e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer  error_code getHeader(const coff_file_header *&Res) const;
2854bf771b4e6d37ae1d6ae08ea27c4070a3a09784dRui Ueyama  error_code getCOFFHeader(const coff_file_header *&Res) const;
2864bf771b4e6d37ae1d6ae08ea27c4070a3a09784dRui Ueyama  error_code getPE32Header(const pe32_header *&Res) const;
2872f6c0484d68270f09eecac03b7e56053153203f3Rui Ueyama  error_code getDataDirectory(uint32_t index, const data_directory *&Res) const;
2880e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer  error_code getSection(int32_t index, const coff_section *&Res) const;
2890e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer  error_code getSymbol(uint32_t index, const coff_symbol *&Res) const;
2900e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer  template <typename T>
2910e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer  error_code getAuxSymbol(uint32_t index, const T *&Res) const {
2920e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer    const coff_symbol *s;
2930e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer    error_code ec = getSymbol(index, s);
2940e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer    Res = reinterpret_cast<const T*>(s);
2950e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer    return ec;
2960e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer  }
2970e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer  error_code getSymbolName(const coff_symbol *symbol, StringRef &Res) const;
298d4d03e09d3686d317da1166b578ca5ca35593970Marshall Clow  ArrayRef<uint8_t> getSymbolAuxData(const coff_symbol *symbol) const;
299d4d03e09d3686d317da1166b578ca5ca35593970Marshall Clow
300b35a896e072ff46c38905419b7f55aaccdb1d702Michael J. Spencer  error_code getSectionName(const coff_section *Sec, StringRef &Res) const;
3011f6e3f9544c93213111a2f8b314c926c0d0e30e5Michael J. Spencer  error_code getSectionContents(const coff_section *Sec,
3021f6e3f9544c93213111a2f8b314c926c0d0e30e5Michael J. Spencer                                ArrayRef<uint8_t> &Res) const;
303ab6bcf35aefe823894d349773ebd53f465f122b7Michael J. Spencer
304ab6bcf35aefe823894d349773ebd53f465f122b7Michael J. Spencer  static inline bool classof(const Binary *v) {
3056f9489a86f33624f9ff5388411d12359ce9cef20David Meyer    return v->isCOFF();
306ab6bcf35aefe823894d349773ebd53f465f122b7Michael J. Spencer  }
307001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer};
308001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer
309001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer}
310001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer}
311001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer
312001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer#endif
313