1 //===- COFFImportFile.h - COFF short import 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 // COFF short import file is a special kind of file which contains 11 // only symbol names for DLL-exported symbols. This class implements 12 // SymbolicFile interface for the file. 13 // 14 //===----------------------------------------------------------------------===// 15 16 #ifndef LLVM_OBJECT_COFF_IMPORT_FILE_H 17 #define LLVM_OBJECT_COFF_IMPORT_FILE_H 18 19 #include "llvm/Object/COFF.h" 20 #include "llvm/Object/IRObjectFile.h" 21 #include "llvm/Object/ObjectFile.h" 22 #include "llvm/Object/SymbolicFile.h" 23 #include "llvm/Support/MemoryBuffer.h" 24 #include "llvm/Support/raw_ostream.h" 25 26 namespace llvm { 27 namespace object { 28 29 class COFFImportFile : public SymbolicFile { 30 public: COFFImportFile(MemoryBufferRef Source)31 COFFImportFile(MemoryBufferRef Source) 32 : SymbolicFile(ID_COFFImportFile, Source) {} 33 classof(Binary const * V)34 static inline bool classof(Binary const *V) { return V->isCOFFImportFile(); } 35 moveSymbolNext(DataRefImpl & Symb)36 void moveSymbolNext(DataRefImpl &Symb) const override { ++Symb.p; } 37 printSymbolName(raw_ostream & OS,DataRefImpl Symb)38 std::error_code printSymbolName(raw_ostream &OS, 39 DataRefImpl Symb) const override { 40 if (Symb.p == 0) 41 OS << "__imp_"; 42 OS << StringRef(Data.getBufferStart() + sizeof(coff_import_header)); 43 return std::error_code(); 44 } 45 getSymbolFlags(DataRefImpl Symb)46 uint32_t getSymbolFlags(DataRefImpl Symb) const override { 47 return SymbolRef::SF_Global; 48 } 49 symbol_begin_impl()50 basic_symbol_iterator symbol_begin_impl() const override { 51 return BasicSymbolRef(DataRefImpl(), this); 52 } 53 symbol_end_impl()54 basic_symbol_iterator symbol_end_impl() const override { 55 DataRefImpl Symb; 56 Symb.p = isCode() ? 2 : 1; 57 return BasicSymbolRef(Symb, this); 58 } 59 getCOFFImportHeader()60 const coff_import_header *getCOFFImportHeader() const { 61 return reinterpret_cast<const object::coff_import_header *>( 62 Data.getBufferStart()); 63 } 64 65 private: isCode()66 bool isCode() const { 67 return getCOFFImportHeader()->getType() == COFF::IMPORT_CODE; 68 } 69 }; 70 71 } // namespace object 72 } // namespace llvm 73 74 #endif 75