//===- MinGW/Driver.cpp ---------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // MinGW is a GNU development environment for Windows. It consists of GNU // tools such as GCC and GNU ld. Unlike Cygwin, there's no POSIX-compatible // layer, as it aims to be a native development toolchain. // // lld/MinGW is a drop-in replacement for GNU ld/MinGW. // // Being a native development tool, a MinGW linker is not very different from // Microsoft link.exe, so a MinGW linker can be implemented as a thin wrapper // for lld/COFF. This driver takes Unix-ish command line options, translates // them to Windows-ish ones, and then passes them to lld/COFF. // // When this driver calls the lld/COFF driver, it passes a hidden option // "-lldmingw" along with other user-supplied options, to run the lld/COFF // linker in "MinGW mode". // // There are subtle differences between MS link.exe and GNU ld/MinGW, and GNU // ld/MinGW implements a few GNU-specific features. Such features are directly // implemented in lld/COFF and enabled only when the linker is running in MinGW // mode. // //===----------------------------------------------------------------------===// #include "lld/Common/Driver.h" #include "lld/Common/CommonLinkerContext.h" #include "lld/Common/ErrorHandler.h" #include "lld/Common/Memory.h" #include "lld/Common/Version.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringRef.h" #include "llvm/Option/Arg.h" #include "llvm/Option/ArgList.h" #include "llvm/Option/Option.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" #include "llvm/TargetParser/Host.h" #include "llvm/TargetParser/Triple.h" #include <optional> usingnamespacelld; usingnamespacellvm::opt; usingnamespacellvm; // Create OptTable enum { … }; // Create prefix string literals used in Options.td #define PREFIX … #include "Options.inc" #undef PREFIX // Create table mapping all options defined in Options.td static constexpr opt::OptTable::Info infoTable[] = …; namespace { class MinGWOptTable : public opt::GenericOptTable { … }; } // namespace static void printHelp(const char *argv0) { … } static cl::TokenizerCallback getQuotingStyle() { … } opt::InputArgList MinGWOptTable::parse(ArrayRef<const char *> argv) { … } // Find a file by concatenating given paths. static std::optional<std::string> findFile(StringRef path1, const Twine &path2) { … } // This is for -lfoo. We'll look for libfoo.dll.a or libfoo.a from search paths. static std::string searchLibrary(StringRef name, ArrayRef<StringRef> searchPaths, bool bStatic) { … } namespace lld { namespace coff { bool link(ArrayRef<const char *> argsArr, llvm::raw_ostream &stdoutOS, llvm::raw_ostream &stderrOS, bool exitEarly, bool disableOutput); } namespace mingw { // Convert Unix-ish command line arguments to Windows-ish ones and // then call coff::link. bool link(ArrayRef<const char *> argsArr, llvm::raw_ostream &stdoutOS, llvm::raw_ostream &stderrOS, bool exitEarly, bool disableOutput) { … } } // namespace mingw } // namespace lld