COFF.h revision 224133
1//===- COFF.h - COFF object file implementation -----------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file declares the COFFObjectFile class. 11// 12//===----------------------------------------------------------------------===// 13 14#ifndef LLVM_OBJECT_COFF_H 15#define LLVM_OBJECT_COFF_H 16 17#include "llvm/Object/ObjectFile.h" 18#include "llvm/Support/COFF.h" 19#include "llvm/Support/Endian.h" 20 21namespace llvm { 22namespace object { 23 24struct coff_file_header { 25 support::ulittle16_t Machine; 26 support::ulittle16_t NumberOfSections; 27 support::ulittle32_t TimeDateStamp; 28 support::ulittle32_t PointerToSymbolTable; 29 support::ulittle32_t NumberOfSymbols; 30 support::ulittle16_t SizeOfOptionalHeader; 31 support::ulittle16_t Characteristics; 32}; 33 34struct coff_symbol { 35 struct StringTableOffset { 36 support::ulittle32_t Zeroes; 37 support::ulittle32_t Offset; 38 }; 39 40 union { 41 char ShortName[8]; 42 StringTableOffset Offset; 43 } Name; 44 45 support::ulittle32_t Value; 46 support::little16_t SectionNumber; 47 48 struct { 49 support::ulittle8_t BaseType; 50 support::ulittle8_t ComplexType; 51 } Type; 52 53 support::ulittle8_t StorageClass; 54 support::ulittle8_t NumberOfAuxSymbols; 55}; 56 57struct coff_section { 58 char Name[8]; 59 support::ulittle32_t VirtualSize; 60 support::ulittle32_t VirtualAddress; 61 support::ulittle32_t SizeOfRawData; 62 support::ulittle32_t PointerToRawData; 63 support::ulittle32_t PointerToRelocations; 64 support::ulittle32_t PointerToLinenumbers; 65 support::ulittle16_t NumberOfRelocations; 66 support::ulittle16_t NumberOfLinenumbers; 67 support::ulittle32_t Characteristics; 68}; 69 70class COFFObjectFile : public ObjectFile { 71private: 72 const coff_file_header *Header; 73 const coff_section *SectionTable; 74 const coff_symbol *SymbolTable; 75 const char *StringTable; 76 uint32_t StringTableSize; 77 78 error_code getSection(int32_t index, 79 const coff_section *&Res) const; 80 error_code getString(uint32_t offset, StringRef &Res) const; 81 82 const coff_symbol *toSymb(DataRefImpl Symb) const; 83 const coff_section *toSec(DataRefImpl Sec) const; 84 85protected: 86 virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const; 87 virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const; 88 virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const; 89 virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const; 90 virtual error_code getSymbolNMTypeChar(DataRefImpl Symb, char &Res) const; 91 virtual error_code isSymbolInternal(DataRefImpl Symb, bool &Res) const; 92 93 virtual error_code getSectionNext(DataRefImpl Sec, SectionRef &Res) const; 94 virtual error_code getSectionName(DataRefImpl Sec, StringRef &Res) const; 95 virtual error_code getSectionAddress(DataRefImpl Sec, uint64_t &Res) const; 96 virtual error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const; 97 virtual error_code getSectionContents(DataRefImpl Sec, StringRef &Res) const; 98 virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const; 99 virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb, 100 bool &Result) const; 101 102public: 103 COFFObjectFile(MemoryBuffer *Object, error_code &ec); 104 virtual symbol_iterator begin_symbols() const; 105 virtual symbol_iterator end_symbols() const; 106 virtual section_iterator begin_sections() const; 107 virtual section_iterator end_sections() const; 108 109 virtual uint8_t getBytesInAddress() const; 110 virtual StringRef getFileFormatName() const; 111 virtual unsigned getArch() const; 112}; 113 114} 115} 116 117#endif 118