Home | History | Annotate | Download | only in Object
      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 
     28 namespace llvm {
     29 namespace object {
     30 
     31 class COFFImportFile : public SymbolicFile {
     32 public:
     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 
     67 private:
     68   bool isData() const {
     69     return getCOFFImportHeader()->getType() == COFF::IMPORT_DATA;
     70   }
     71 };
     72 
     73 struct 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 
     98 std::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