//===- DriverUtils.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 // //===----------------------------------------------------------------------===// // // This file contains utility functions for the ctx.driver. Because there // are so many small functions, we created this separate file to make // Driver.cpp less cluttered. // //===----------------------------------------------------------------------===// #include "Config.h" #include "Driver.h" #include "lld/Common/CommonLinkerContext.h" #include "lld/Common/Reproduce.h" #include "llvm/Option/Option.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" #include "llvm/Support/TimeProfiler.h" #include "llvm/TargetParser/Host.h" #include "llvm/TargetParser/Triple.h" #include <optional> usingnamespacellvm; usingnamespacellvm::sys; usingnamespacellvm::opt; usingnamespacelld; usingnamespacelld::elf; // Create OptTable // 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 optInfo[] = …; ELFOptTable::ELFOptTable() : … { … } // Set color diagnostics according to --color-diagnostics={auto,always,never} // or --no-color-diagnostics flags. static void handleColorDiagnostics(opt::InputArgList &args) { … } static cl::TokenizerCallback getQuotingStyle(opt::InputArgList &args) { … } // Gold LTO plugin takes a `--plugin-opt foo=bar` option as an alias for // `--plugin-opt=foo=bar`. We want to handle `--plugin-opt=foo=` as an // option name and `bar` as a value. Unfortunately, OptParser cannot // handle an option with a space in it. // // In this function, we concatenate command line arguments so that // `--plugin-opt <foo>` is converted to `--plugin-opt=<foo>`. This is a // bit hacky, but looks like it is still better than handling --plugin-opt // options by hand. static void concatLTOPluginOptions(SmallVectorImpl<const char *> &args) { … } // Parses a given list of options. opt::InputArgList ELFOptTable::parse(ArrayRef<const char *> argv) { … } void elf::printHelp(Ctx &ctx) { … } static std::string rewritePath(StringRef s) { … } // Reconstructs command line arguments so that so that you can re-run // the same command with the same inputs. This is for --reproduce. std::string elf::createResponseFile(const opt::InputArgList &args) { … } // Find a file by concatenating given paths. If a resulting path // starts with "=", the character is replaced with a --sysroot value. static std::optional<std::string> findFile(StringRef path1, const Twine &path2) { … } std::optional<std::string> elf::findFromSearchPaths(Ctx &ctx, StringRef path) { … } // This is for -l<basename>. We'll look for lib<basename>.so or lib<basename>.a from // search paths. std::optional<std::string> elf::searchLibraryBaseName(Ctx &ctx, StringRef name) { … } // This is for -l<namespec>. std::optional<std::string> elf::searchLibrary(Ctx &ctx, StringRef name) { … } // If a linker/version script doesn't exist in the current directory, we also // look for the script in the '-L' search paths. This matches the behaviour of // '-T', --version-script=, and linker script INPUT() command in ld.bfd. std::optional<std::string> elf::searchScript(Ctx &ctx, StringRef name) { … }