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