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// exporting of Symbols to create libraries and a SymbolicFile 13// interface for the file type. 14// 15//===----------------------------------------------------------------------===// 16 17#ifndef LLVM_OBJECT_COFF_IMPORT_FILE_H 18#define LLVM_OBJECT_COFF_IMPORT_FILE_H 19 20#include "llvm/ADT/ArrayRef.h" 21#include "llvm/Object/COFF.h" 22#include "llvm/Object/IRObjectFile.h" 23#include "llvm/Object/ObjectFile.h" 24#include "llvm/Object/SymbolicFile.h" 25#include "llvm/Support/MemoryBuffer.h" 26#include "llvm/Support/raw_ostream.h" 27 28namespace llvm { 29namespace object { 30 31class COFFImportFile : public SymbolicFile { 32public: 33 COFFImportFile(MemoryBufferRef Source) 34 : SymbolicFile(ID_COFFImportFile, Source) {} 35 36 static inline bool classof(Binary const *V) { return V->isCOFFImportFile(); } 37 38 void moveSymbolNext(DataRefImpl &Symb) const override { ++Symb.p; } 39 40 std::error_code printSymbolName(raw_ostream &OS, 41 DataRefImpl Symb) const override { 42 if (Symb.p == 0) 43 OS << "__imp_"; 44 OS << StringRef(Data.getBufferStart() + sizeof(coff_import_header)); 45 return std::error_code(); 46 } 47 48 uint32_t getSymbolFlags(DataRefImpl Symb) const override { 49 return SymbolRef::SF_Global; 50 } 51 52 basic_symbol_iterator symbol_begin() const override { 53 return BasicSymbolRef(DataRefImpl(), this); 54 } 55 56 basic_symbol_iterator symbol_end() const override { 57 DataRefImpl Symb; 58 Symb.p = isData() ? 1 : 2; 59 return BasicSymbolRef(Symb, this); 60 } 61 62 const coff_import_header *getCOFFImportHeader() const { 63 return reinterpret_cast<const object::coff_import_header *>( 64 Data.getBufferStart()); 65 } 66 67private: 68 bool isData() const { 69 return getCOFFImportHeader()->getType() == COFF::IMPORT_DATA; 70 } 71}; 72 73struct COFFShortExport { 74 std::string Name; 75 std::string ExtName; 76 77 uint16_t Ordinal = 0; 78 bool Noname = false; 79 bool Data = false; 80 bool Private = false; 81 bool Constant = false; 82 83 bool isWeak() { 84 return ExtName.size() && ExtName != Name; 85 } 86 87 friend bool operator==(const COFFShortExport &L, const COFFShortExport &R) { 88 return L.Name == R.Name && L.ExtName == R.ExtName && 89 L.Ordinal == R.Ordinal && L.Noname == R.Noname && 90 L.Data == R.Data && L.Private == R.Private; 91 } 92 93 friend bool operator!=(const COFFShortExport &L, const COFFShortExport &R) { 94 return !(L == R); 95 } 96}; 97 98std::error_code writeImportLibrary(StringRef DLLName, 99 StringRef Path, 100 ArrayRef<COFFShortExport> Exports, 101 COFF::MachineTypes Machine); 102 103} // namespace object 104} // namespace llvm 105 106#endif 107