xref: /freebsd/contrib/llvm-project/lld/COFF/MinGW.h (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
10b57cec5SDimitry Andric //===- MinGW.h --------------------------------------------------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #ifndef LLD_COFF_MINGW_H
100b57cec5SDimitry Andric #define LLD_COFF_MINGW_H
110b57cec5SDimitry Andric 
120b57cec5SDimitry Andric #include "Config.h"
130b57cec5SDimitry Andric #include "Symbols.h"
140b57cec5SDimitry Andric #include "lld/Common/LLVM.h"
15e8d8bef9SDimitry Andric #include "llvm/ADT/ArrayRef.h"
1661cfbce3SDimitry Andric #include "llvm/ADT/DenseSet.h"
17480093f4SDimitry Andric #include "llvm/ADT/StringSet.h"
18e8d8bef9SDimitry Andric #include "llvm/Option/ArgList.h"
19e8d8bef9SDimitry Andric #include <vector>
200b57cec5SDimitry Andric 
21*bdd1243dSDimitry Andric namespace lld::coff {
22349cc55cSDimitry Andric class COFFLinkerContext;
230b57cec5SDimitry Andric 
240b57cec5SDimitry Andric // Logic for deciding what symbols to export, when exporting all
250b57cec5SDimitry Andric // symbols for MinGW.
260b57cec5SDimitry Andric class AutoExporter {
270b57cec5SDimitry Andric public:
28*bdd1243dSDimitry Andric   AutoExporter(COFFLinkerContext &ctx,
29*bdd1243dSDimitry Andric                const llvm::DenseSet<StringRef> &manualExcludeSymbols);
300b57cec5SDimitry Andric 
310b57cec5SDimitry Andric   void addWholeArchive(StringRef path);
3261cfbce3SDimitry Andric   void addExcludedSymbol(StringRef symbol);
330b57cec5SDimitry Andric 
340b57cec5SDimitry Andric   llvm::StringSet<> excludeSymbols;
350b57cec5SDimitry Andric   llvm::StringSet<> excludeSymbolPrefixes;
360b57cec5SDimitry Andric   llvm::StringSet<> excludeSymbolSuffixes;
370b57cec5SDimitry Andric   llvm::StringSet<> excludeLibs;
380b57cec5SDimitry Andric   llvm::StringSet<> excludeObjects;
390b57cec5SDimitry Andric 
4061cfbce3SDimitry Andric   const llvm::DenseSet<StringRef> &manualExcludeSymbols;
4161cfbce3SDimitry Andric 
42*bdd1243dSDimitry Andric   bool shouldExport(Defined *sym) const;
43*bdd1243dSDimitry Andric 
44*bdd1243dSDimitry Andric private:
45*bdd1243dSDimitry Andric   COFFLinkerContext &ctx;
460b57cec5SDimitry Andric };
470b57cec5SDimitry Andric 
48*bdd1243dSDimitry Andric void writeDefFile(StringRef name, const std::vector<Export> &exports);
490b57cec5SDimitry Andric 
50e8d8bef9SDimitry Andric // The -wrap option is a feature to rename symbols so that you can write
51e8d8bef9SDimitry Andric // wrappers for existing functions. If you pass `-wrap:foo`, all
52e8d8bef9SDimitry Andric // occurrences of symbol `foo` are resolved to `__wrap_foo` (so, you are
53e8d8bef9SDimitry Andric // expected to write `__wrap_foo` function as a wrapper). The original
54e8d8bef9SDimitry Andric // symbol becomes accessible as `__real_foo`, so you can call that from your
55e8d8bef9SDimitry Andric // wrapper.
56e8d8bef9SDimitry Andric //
57e8d8bef9SDimitry Andric // This data structure is instantiated for each -wrap option.
58e8d8bef9SDimitry Andric struct WrappedSymbol {
59e8d8bef9SDimitry Andric   Symbol *sym;
60e8d8bef9SDimitry Andric   Symbol *real;
61e8d8bef9SDimitry Andric   Symbol *wrap;
62e8d8bef9SDimitry Andric };
63e8d8bef9SDimitry Andric 
64349cc55cSDimitry Andric std::vector<WrappedSymbol> addWrappedSymbols(COFFLinkerContext &ctx,
65349cc55cSDimitry Andric                                              llvm::opt::InputArgList &args);
66e8d8bef9SDimitry Andric 
67349cc55cSDimitry Andric void wrapSymbols(COFFLinkerContext &ctx, ArrayRef<WrappedSymbol> wrapped);
68e8d8bef9SDimitry Andric 
69*bdd1243dSDimitry Andric } // namespace lld::coff
700b57cec5SDimitry Andric 
710b57cec5SDimitry Andric #endif
72