]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/include/llvm/Object/COFFImportFile.h
Merge llvm, clang, lld, lldb, compiler-rt and libc++ r303571, and update
[FreeBSD/FreeBSD.git] / contrib / llvm / include / llvm / Object / COFFImportFile.h
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