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" 15*e8d8bef9SDimitry Andric #include "llvm/ADT/ArrayRef.h" 16480093f4SDimitry Andric #include "llvm/ADT/StringSet.h" 17*e8d8bef9SDimitry Andric #include "llvm/Option/ArgList.h" 18*e8d8bef9SDimitry Andric #include <vector> 190b57cec5SDimitry Andric 200b57cec5SDimitry Andric namespace lld { 210b57cec5SDimitry Andric namespace coff { 220b57cec5SDimitry Andric 230b57cec5SDimitry Andric // Logic for deciding what symbols to export, when exporting all 240b57cec5SDimitry Andric // symbols for MinGW. 250b57cec5SDimitry Andric class AutoExporter { 260b57cec5SDimitry Andric public: 270b57cec5SDimitry Andric AutoExporter(); 280b57cec5SDimitry Andric 290b57cec5SDimitry Andric void addWholeArchive(StringRef path); 300b57cec5SDimitry Andric 310b57cec5SDimitry Andric llvm::StringSet<> excludeSymbols; 320b57cec5SDimitry Andric llvm::StringSet<> excludeSymbolPrefixes; 330b57cec5SDimitry Andric llvm::StringSet<> excludeSymbolSuffixes; 340b57cec5SDimitry Andric llvm::StringSet<> excludeLibs; 350b57cec5SDimitry Andric llvm::StringSet<> excludeObjects; 360b57cec5SDimitry Andric 370b57cec5SDimitry Andric bool shouldExport(Defined *sym) const; 380b57cec5SDimitry Andric }; 390b57cec5SDimitry Andric 400b57cec5SDimitry Andric void writeDefFile(StringRef name); 410b57cec5SDimitry Andric 42*e8d8bef9SDimitry Andric // The -wrap option is a feature to rename symbols so that you can write 43*e8d8bef9SDimitry Andric // wrappers for existing functions. If you pass `-wrap:foo`, all 44*e8d8bef9SDimitry Andric // occurrences of symbol `foo` are resolved to `__wrap_foo` (so, you are 45*e8d8bef9SDimitry Andric // expected to write `__wrap_foo` function as a wrapper). The original 46*e8d8bef9SDimitry Andric // symbol becomes accessible as `__real_foo`, so you can call that from your 47*e8d8bef9SDimitry Andric // wrapper. 48*e8d8bef9SDimitry Andric // 49*e8d8bef9SDimitry Andric // This data structure is instantiated for each -wrap option. 50*e8d8bef9SDimitry Andric struct WrappedSymbol { 51*e8d8bef9SDimitry Andric Symbol *sym; 52*e8d8bef9SDimitry Andric Symbol *real; 53*e8d8bef9SDimitry Andric Symbol *wrap; 54*e8d8bef9SDimitry Andric }; 55*e8d8bef9SDimitry Andric 56*e8d8bef9SDimitry Andric std::vector<WrappedSymbol> addWrappedSymbols(llvm::opt::InputArgList &args); 57*e8d8bef9SDimitry Andric 58*e8d8bef9SDimitry Andric void wrapSymbols(ArrayRef<WrappedSymbol> wrapped); 59*e8d8bef9SDimitry Andric 600b57cec5SDimitry Andric } // namespace coff 610b57cec5SDimitry Andric } // namespace lld 620b57cec5SDimitry Andric 630b57cec5SDimitry Andric #endif 64