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