1 //===- COFFImportFile.h - COFF short import file implementation -*- C++ -*-===//
3 // 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
7 //===----------------------------------------------------------------------===//
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.
14 //===----------------------------------------------------------------------===//
16 #ifndef LLVM_OBJECT_COFF_IMPORT_FILE_H
17 #define LLVM_OBJECT_COFF_IMPORT_FILE_H
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"
30 class COFFImportFile
: public SymbolicFile
{
32 COFFImportFile(MemoryBufferRef Source
)
33 : SymbolicFile(ID_COFFImportFile
, Source
) {}
35 static bool classof(Binary
const *V
) { return V
->isCOFFImportFile(); }
37 void moveSymbolNext(DataRefImpl
&Symb
) const override
{ ++Symb
.p
; }
39 Error
printSymbolName(raw_ostream
&OS
, DataRefImpl Symb
) const override
{
42 OS
<< StringRef(Data
.getBufferStart() + sizeof(coff_import_header
));
43 return Error::success();
46 uint32_t getSymbolFlags(DataRefImpl Symb
) const override
{
47 return SymbolRef::SF_Global
;
50 basic_symbol_iterator
symbol_begin() const override
{
51 return BasicSymbolRef(DataRefImpl(), this);
54 basic_symbol_iterator
symbol_end() const override
{
56 Symb
.p
= isData() ? 1 : 2;
57 return BasicSymbolRef(Symb
, this);
60 const coff_import_header
*getCOFFImportHeader() const {
61 return reinterpret_cast<const object::coff_import_header
*>(
62 Data
.getBufferStart());
67 return getCOFFImportHeader()->getType() == COFF::IMPORT_DATA
;
71 struct COFFShortExport
{
72 /// The name of the export as specified in the .def file or on the command
73 /// line, i.e. "foo" in "/EXPORT:foo", and "bar" in "/EXPORT:foo=bar". This
74 /// may lack mangling, such as underscore prefixing and stdcall suffixing.
77 /// The external, exported name. Only non-empty when export renaming is in
78 /// effect, i.e. "foo" in "/EXPORT:foo=bar".
81 /// The real, mangled symbol name from the object file. Given
82 /// "/export:foo=bar", this could be "_bar@8" if bar is stdcall.
83 std::string SymbolName
;
85 /// Creates a weak alias. This is the name of the weak aliasee. In a .def
86 /// file, this is "baz" in "EXPORTS\nfoo = bar == baz".
87 std::string AliasTarget
;
93 bool Constant
= false;
95 friend bool operator==(const COFFShortExport
&L
, const COFFShortExport
&R
) {
96 return L
.Name
== R
.Name
&& L
.ExtName
== R
.ExtName
&&
97 L
.Ordinal
== R
.Ordinal
&& L
.Noname
== R
.Noname
&&
98 L
.Data
== R
.Data
&& L
.Private
== R
.Private
;
101 friend bool operator!=(const COFFShortExport
&L
, const COFFShortExport
&R
) {
106 Error
writeImportLibrary(StringRef ImportName
, StringRef Path
,
107 ArrayRef
<COFFShortExport
> Exports
,
108 COFF::MachineTypes Machine
, bool MinGW
);
110 } // namespace object