1//===- MinGW.h --------------------------------------------------*- C++ -*-===// 2// 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 6// 7//===----------------------------------------------------------------------===// 8 9#ifndef LLD_COFF_MINGW_H 10#define LLD_COFF_MINGW_H 11 12#include "Config.h" 13#include "Symbols.h" 14#include "lld/Common/LLVM.h" 15#include "llvm/ADT/ArrayRef.h" 16#include "llvm/ADT/DenseSet.h" 17#include "llvm/ADT/StringSet.h" 18#include "llvm/Option/ArgList.h" 19#include <vector> 20 21namespace lld::coff { 22class COFFLinkerContext; 23 24// Logic for deciding what symbols to export, when exporting all 25// symbols for MinGW. 26class AutoExporter { 27public: 28 AutoExporter(COFFLinkerContext &ctx, 29 const llvm::DenseSet<StringRef> &manualExcludeSymbols); 30 31 void addWholeArchive(StringRef path); 32 void addExcludedSymbol(StringRef symbol); 33 34 llvm::StringSet<> excludeSymbols; 35 llvm::StringSet<> excludeSymbolPrefixes; 36 llvm::StringSet<> excludeSymbolSuffixes; 37 llvm::StringSet<> excludeLibs; 38 llvm::StringSet<> excludeObjects; 39 40 const llvm::DenseSet<StringRef> &manualExcludeSymbols; 41 42 bool shouldExport(Defined *sym) const; 43 44private: 45 COFFLinkerContext &ctx; 46}; 47 48void writeDefFile(StringRef name, const std::vector<Export> &exports); 49 50// The -wrap option is a feature to rename symbols so that you can write 51// wrappers for existing functions. If you pass `-wrap:foo`, all 52// occurrences of symbol `foo` are resolved to `__wrap_foo` (so, you are 53// expected to write `__wrap_foo` function as a wrapper). The original 54// symbol becomes accessible as `__real_foo`, so you can call that from your 55// wrapper. 56// 57// This data structure is instantiated for each -wrap option. 58struct WrappedSymbol { 59 Symbol *sym; 60 Symbol *real; 61 Symbol *wrap; 62}; 63 64std::vector<WrappedSymbol> addWrappedSymbols(COFFLinkerContext &ctx, 65 llvm::opt::InputArgList &args); 66 67void wrapSymbols(COFFLinkerContext &ctx, ArrayRef<WrappedSymbol> wrapped); 68 69} // namespace lld::coff 70 71#endif 72