COFF.h revision 235633
1224133Sdim//===- COFF.h - COFF object file implementation -----------------*- C++ -*-===// 2224133Sdim// 3224133Sdim// The LLVM Compiler Infrastructure 4224133Sdim// 5224133Sdim// This file is distributed under the University of Illinois Open Source 6224133Sdim// License. See LICENSE.TXT for details. 7224133Sdim// 8224133Sdim//===----------------------------------------------------------------------===// 9224133Sdim// 10224133Sdim// This file declares the COFFObjectFile class. 11224133Sdim// 12224133Sdim//===----------------------------------------------------------------------===// 13224133Sdim 14224133Sdim#ifndef LLVM_OBJECT_COFF_H 15224133Sdim#define LLVM_OBJECT_COFF_H 16224133Sdim 17224133Sdim#include "llvm/Object/ObjectFile.h" 18224133Sdim#include "llvm/Support/COFF.h" 19224133Sdim#include "llvm/Support/Endian.h" 20224133Sdim 21224133Sdimnamespace llvm { 22235633Sdim template <typename T> 23235633Sdim class ArrayRef; 24235633Sdim 25224133Sdimnamespace object { 26224133Sdim 27224133Sdimstruct coff_file_header { 28224133Sdim support::ulittle16_t Machine; 29224133Sdim support::ulittle16_t NumberOfSections; 30224133Sdim support::ulittle32_t TimeDateStamp; 31224133Sdim support::ulittle32_t PointerToSymbolTable; 32224133Sdim support::ulittle32_t NumberOfSymbols; 33224133Sdim support::ulittle16_t SizeOfOptionalHeader; 34224133Sdim support::ulittle16_t Characteristics; 35224133Sdim}; 36224133Sdim 37224133Sdimstruct coff_symbol { 38224133Sdim struct StringTableOffset { 39224133Sdim support::ulittle32_t Zeroes; 40224133Sdim support::ulittle32_t Offset; 41224133Sdim }; 42224133Sdim 43224133Sdim union { 44224133Sdim char ShortName[8]; 45224133Sdim StringTableOffset Offset; 46224133Sdim } Name; 47224133Sdim 48224133Sdim support::ulittle32_t Value; 49224133Sdim support::little16_t SectionNumber; 50224133Sdim 51235633Sdim support::ulittle16_t Type; 52224133Sdim 53224133Sdim support::ulittle8_t StorageClass; 54224133Sdim support::ulittle8_t NumberOfAuxSymbols; 55235633Sdim 56235633Sdim uint8_t getBaseType() const { 57235633Sdim return Type & 0x0F; 58235633Sdim } 59235633Sdim 60235633Sdim uint8_t getComplexType() const { 61235633Sdim return (Type & 0xF0) >> 4; 62235633Sdim } 63224133Sdim}; 64224133Sdim 65224133Sdimstruct coff_section { 66224133Sdim char Name[8]; 67224133Sdim support::ulittle32_t VirtualSize; 68224133Sdim support::ulittle32_t VirtualAddress; 69224133Sdim support::ulittle32_t SizeOfRawData; 70224133Sdim support::ulittle32_t PointerToRawData; 71224133Sdim support::ulittle32_t PointerToRelocations; 72224133Sdim support::ulittle32_t PointerToLinenumbers; 73224133Sdim support::ulittle16_t NumberOfRelocations; 74224133Sdim support::ulittle16_t NumberOfLinenumbers; 75224133Sdim support::ulittle32_t Characteristics; 76224133Sdim}; 77224133Sdim 78226890Sdimstruct coff_relocation { 79226890Sdim support::ulittle32_t VirtualAddress; 80226890Sdim support::ulittle32_t SymbolTableIndex; 81226890Sdim support::ulittle16_t Type; 82226890Sdim}; 83226890Sdim 84235633Sdimstruct coff_aux_section_definition { 85235633Sdim support::ulittle32_t Length; 86235633Sdim support::ulittle16_t NumberOfRelocations; 87235633Sdim support::ulittle16_t NumberOfLinenumbers; 88235633Sdim support::ulittle32_t CheckSum; 89235633Sdim support::ulittle16_t Number; 90235633Sdim support::ulittle8_t Selection; 91235633Sdim char Unused[3]; 92235633Sdim}; 93235633Sdim 94224133Sdimclass COFFObjectFile : public ObjectFile { 95224133Sdimprivate: 96224133Sdim const coff_file_header *Header; 97224133Sdim const coff_section *SectionTable; 98224133Sdim const coff_symbol *SymbolTable; 99224133Sdim const char *StringTable; 100224133Sdim uint32_t StringTableSize; 101224133Sdim 102224133Sdim error_code getString(uint32_t offset, StringRef &Res) const; 103224133Sdim 104224133Sdim const coff_symbol *toSymb(DataRefImpl Symb) const; 105224133Sdim const coff_section *toSec(DataRefImpl Sec) const; 106226890Sdim const coff_relocation *toRel(DataRefImpl Rel) const; 107224133Sdim 108224133Sdimprotected: 109224133Sdim virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const; 110224133Sdim virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const; 111235633Sdim virtual error_code getSymbolFileOffset(DataRefImpl Symb, uint64_t &Res) const; 112224133Sdim virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const; 113224133Sdim virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const; 114224133Sdim virtual error_code getSymbolNMTypeChar(DataRefImpl Symb, char &Res) const; 115235633Sdim virtual error_code getSymbolFlags(DataRefImpl Symb, uint32_t &Res) const; 116235633Sdim virtual error_code getSymbolType(DataRefImpl Symb, SymbolRef::Type &Res) const; 117235633Sdim virtual error_code getSymbolSection(DataRefImpl Symb, 118235633Sdim section_iterator &Res) const; 119224133Sdim 120224133Sdim virtual error_code getSectionNext(DataRefImpl Sec, SectionRef &Res) const; 121224133Sdim virtual error_code getSectionName(DataRefImpl Sec, StringRef &Res) const; 122224133Sdim virtual error_code getSectionAddress(DataRefImpl Sec, uint64_t &Res) const; 123224133Sdim virtual error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const; 124224133Sdim virtual error_code getSectionContents(DataRefImpl Sec, StringRef &Res) const; 125226890Sdim virtual error_code getSectionAlignment(DataRefImpl Sec, uint64_t &Res) const; 126224133Sdim virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const; 127226890Sdim virtual error_code isSectionData(DataRefImpl Sec, bool &Res) const; 128226890Sdim virtual error_code isSectionBSS(DataRefImpl Sec, bool &Res) const; 129235633Sdim virtual error_code isSectionVirtual(DataRefImpl Sec, bool &Res) const; 130235633Sdim virtual error_code isSectionZeroInit(DataRefImpl Sec, bool &Res) const; 131235633Sdim virtual error_code isSectionRequiredForExecution(DataRefImpl Sec, 132235633Sdim bool &Res) const; 133224133Sdim virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb, 134224133Sdim bool &Result) const; 135226890Sdim virtual relocation_iterator getSectionRelBegin(DataRefImpl Sec) const; 136226890Sdim virtual relocation_iterator getSectionRelEnd(DataRefImpl Sec) const; 137224133Sdim 138226890Sdim virtual error_code getRelocationNext(DataRefImpl Rel, 139226890Sdim RelocationRef &Res) const; 140226890Sdim virtual error_code getRelocationAddress(DataRefImpl Rel, 141226890Sdim uint64_t &Res) const; 142235633Sdim virtual error_code getRelocationOffset(DataRefImpl Rel, 143235633Sdim uint64_t &Res) const; 144226890Sdim virtual error_code getRelocationSymbol(DataRefImpl Rel, 145226890Sdim SymbolRef &Res) const; 146226890Sdim virtual error_code getRelocationType(DataRefImpl Rel, 147235633Sdim uint64_t &Res) const; 148226890Sdim virtual error_code getRelocationTypeName(DataRefImpl Rel, 149226890Sdim SmallVectorImpl<char> &Result) const; 150226890Sdim virtual error_code getRelocationAdditionalInfo(DataRefImpl Rel, 151226890Sdim int64_t &Res) const; 152226890Sdim virtual error_code getRelocationValueString(DataRefImpl Rel, 153226890Sdim SmallVectorImpl<char> &Result) const; 154226890Sdim 155235633Sdim virtual error_code getLibraryNext(DataRefImpl LibData, 156235633Sdim LibraryRef &Result) const; 157235633Sdim virtual error_code getLibraryPath(DataRefImpl LibData, 158235633Sdim StringRef &Result) const; 159235633Sdim 160224133Sdimpublic: 161224133Sdim COFFObjectFile(MemoryBuffer *Object, error_code &ec); 162224133Sdim virtual symbol_iterator begin_symbols() const; 163224133Sdim virtual symbol_iterator end_symbols() const; 164235633Sdim virtual symbol_iterator begin_dynamic_symbols() const; 165235633Sdim virtual symbol_iterator end_dynamic_symbols() const; 166235633Sdim virtual library_iterator begin_libraries_needed() const; 167235633Sdim virtual library_iterator end_libraries_needed() const; 168224133Sdim virtual section_iterator begin_sections() const; 169224133Sdim virtual section_iterator end_sections() const; 170224133Sdim 171224133Sdim virtual uint8_t getBytesInAddress() const; 172224133Sdim virtual StringRef getFileFormatName() const; 173224133Sdim virtual unsigned getArch() const; 174235633Sdim virtual StringRef getLoadName() const; 175235633Sdim 176235633Sdim error_code getHeader(const coff_file_header *&Res) const; 177235633Sdim error_code getSection(int32_t index, const coff_section *&Res) const; 178235633Sdim error_code getSymbol(uint32_t index, const coff_symbol *&Res) const; 179235633Sdim template <typename T> 180235633Sdim error_code getAuxSymbol(uint32_t index, const T *&Res) const { 181235633Sdim const coff_symbol *s; 182235633Sdim error_code ec = getSymbol(index, s); 183235633Sdim Res = reinterpret_cast<const T*>(s); 184235633Sdim return ec; 185235633Sdim } 186235633Sdim error_code getSymbolName(const coff_symbol *symbol, StringRef &Res) const; 187235633Sdim error_code getSectionName(const coff_section *Sec, StringRef &Res) const; 188235633Sdim error_code getSectionContents(const coff_section *Sec, 189235633Sdim ArrayRef<uint8_t> &Res) const; 190235633Sdim 191235633Sdim static inline bool classof(const Binary *v) { 192235633Sdim return v->isCOFF(); 193235633Sdim } 194235633Sdim static inline bool classof(const COFFObjectFile *v) { return true; } 195224133Sdim}; 196224133Sdim 197224133Sdim} 198224133Sdim} 199224133Sdim 200224133Sdim#endif 201