blob: d051d7f09d0ed3a6d3d2e132deb066d150efe820 [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===- COFFImportFile.h - COFF short import file implementation -*- C++ -*-===//
2//
Andrew Walbran16937d02019-10-22 13:54:20 +01003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01006//
7//===----------------------------------------------------------------------===//
8//
9// COFF short import file is a special kind of file which contains
10// only symbol names for DLL-exported symbols. This class implements
11// exporting of Symbols to create libraries and a SymbolicFile
12// interface for the file type.
13//
14//===----------------------------------------------------------------------===//
15
16#ifndef LLVM_OBJECT_COFF_IMPORT_FILE_H
17#define LLVM_OBJECT_COFF_IMPORT_FILE_H
18
19#include "llvm/ADT/ArrayRef.h"
20#include "llvm/Object/COFF.h"
21#include "llvm/Object/IRObjectFile.h"
22#include "llvm/Object/ObjectFile.h"
23#include "llvm/Object/SymbolicFile.h"
24#include "llvm/Support/MemoryBuffer.h"
25#include "llvm/Support/raw_ostream.h"
26
27namespace llvm {
28namespace object {
29
30class COFFImportFile : public SymbolicFile {
31public:
32 COFFImportFile(MemoryBufferRef Source)
33 : SymbolicFile(ID_COFFImportFile, Source) {}
34
35 static bool classof(Binary const *V) { return V->isCOFFImportFile(); }
36
37 void moveSymbolNext(DataRefImpl &Symb) const override { ++Symb.p; }
38
39 std::error_code printSymbolName(raw_ostream &OS,
40 DataRefImpl Symb) const override {
41 if (Symb.p == 0)
42 OS << "__imp_";
43 OS << StringRef(Data.getBufferStart() + sizeof(coff_import_header));
44 return std::error_code();
45 }
46
47 uint32_t getSymbolFlags(DataRefImpl Symb) const override {
48 return SymbolRef::SF_Global;
49 }
50
51 basic_symbol_iterator symbol_begin() const override {
52 return BasicSymbolRef(DataRefImpl(), this);
53 }
54
55 basic_symbol_iterator symbol_end() const override {
56 DataRefImpl Symb;
57 Symb.p = isData() ? 1 : 2;
58 return BasicSymbolRef(Symb, this);
59 }
60
61 const coff_import_header *getCOFFImportHeader() const {
62 return reinterpret_cast<const object::coff_import_header *>(
63 Data.getBufferStart());
64 }
65
66private:
67 bool isData() const {
68 return getCOFFImportHeader()->getType() == COFF::IMPORT_DATA;
69 }
70};
71
72struct COFFShortExport {
73 std::string Name;
74 std::string ExtName;
75 std::string SymbolName;
Andrew Scullcdfcccc2018-10-05 20:58:37 +010076 std::string AliasTarget;
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010077
78 uint16_t Ordinal = 0;
79 bool Noname = false;
80 bool Data = false;
81 bool Private = false;
82 bool Constant = false;
83
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010084 friend bool operator==(const COFFShortExport &L, const COFFShortExport &R) {
85 return L.Name == R.Name && L.ExtName == R.ExtName &&
86 L.Ordinal == R.Ordinal && L.Noname == R.Noname &&
87 L.Data == R.Data && L.Private == R.Private;
88 }
89
90 friend bool operator!=(const COFFShortExport &L, const COFFShortExport &R) {
91 return !(L == R);
92 }
93};
94
95Error writeImportLibrary(StringRef ImportName, StringRef Path,
96 ArrayRef<COFFShortExport> Exports,
Andrew Scullcdfcccc2018-10-05 20:58:37 +010097 COFF::MachineTypes Machine, bool MinGW);
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010098
99} // namespace object
100} // namespace llvm
101
102#endif