summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/tools/lld/ELF/DriverUtils.cpp
diff options
context:
space:
mode:
authorpatrick <patrick@openbsd.org>2020-08-03 15:06:44 +0000
committerpatrick <patrick@openbsd.org>2020-08-03 15:06:44 +0000
commitb64793999546ed8adebaeebd9d8345d18db8927d (patch)
tree4357c27b561d73b0e089727c6ed659f2ceff5f47 /gnu/llvm/tools/lld/ELF/DriverUtils.cpp
parentAdd support for UTF-8 DISPLAY-HINTs with octet length. For now only (diff)
downloadwireguard-openbsd-b64793999546ed8adebaeebd9d8345d18db8927d.tar.xz
wireguard-openbsd-b64793999546ed8adebaeebd9d8345d18db8927d.zip
Remove LLVM 8.0.1 files.
Diffstat (limited to 'gnu/llvm/tools/lld/ELF/DriverUtils.cpp')
-rw-r--r--gnu/llvm/tools/lld/ELF/DriverUtils.cpp264
1 files changed, 0 insertions, 264 deletions
diff --git a/gnu/llvm/tools/lld/ELF/DriverUtils.cpp b/gnu/llvm/tools/lld/ELF/DriverUtils.cpp
deleted file mode 100644
index 2b9f579b3cb..00000000000
--- a/gnu/llvm/tools/lld/ELF/DriverUtils.cpp
+++ /dev/null
@@ -1,264 +0,0 @@
-//===- DriverUtils.cpp ----------------------------------------------------===//
-//
-// The LLVM Linker
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file contains utility functions for the driver. Because there
-// are so many small functions, we created this separate file to make
-// Driver.cpp less cluttered.
-//
-//===----------------------------------------------------------------------===//
-
-#include "Driver.h"
-#include "lld/Common/ErrorHandler.h"
-#include "lld/Common/Memory.h"
-#include "lld/Common/Reproduce.h"
-#include "lld/Common/Version.h"
-#include "llvm/ADT/Optional.h"
-#include "llvm/ADT/STLExtras.h"
-#include "llvm/ADT/Triple.h"
-#include "llvm/Option/Option.h"
-#include "llvm/Support/CommandLine.h"
-#include "llvm/Support/FileSystem.h"
-#include "llvm/Support/Path.h"
-#include "llvm/Support/Process.h"
-
-using namespace llvm;
-using namespace llvm::sys;
-using namespace llvm::opt;
-
-using namespace lld;
-using namespace lld::elf;
-
-// Create OptTable
-
-// Create prefix string literals used in Options.td
-#define PREFIX(NAME, VALUE) const char *const NAME[] = VALUE;
-#include "Options.inc"
-#undef PREFIX
-
-// Create table mapping all options defined in Options.td
-static const opt::OptTable::Info OptInfo[] = {
-#define OPTION(X1, X2, ID, KIND, GROUP, ALIAS, X7, X8, X9, X10, X11, X12) \
- {X1, X2, X10, X11, OPT_##ID, opt::Option::KIND##Class, \
- X9, X8, OPT_##GROUP, OPT_##ALIAS, X7, X12},
-#include "Options.inc"
-#undef OPTION
-};
-
-ELFOptTable::ELFOptTable() : OptTable(OptInfo) {}
-
-// Set color diagnostics according to -color-diagnostics={auto,always,never}
-// or -no-color-diagnostics flags.
-static void handleColorDiagnostics(opt::InputArgList &Args) {
- auto *Arg = Args.getLastArg(OPT_color_diagnostics, OPT_color_diagnostics_eq,
- OPT_no_color_diagnostics);
- if (!Arg)
- return;
- if (Arg->getOption().getID() == OPT_color_diagnostics) {
- errorHandler().ColorDiagnostics = true;
- } else if (Arg->getOption().getID() == OPT_no_color_diagnostics) {
- errorHandler().ColorDiagnostics = false;
- } else {
- StringRef S = Arg->getValue();
- if (S == "always")
- errorHandler().ColorDiagnostics = true;
- else if (S == "never")
- errorHandler().ColorDiagnostics = false;
- else if (S != "auto")
- error("unknown option: --color-diagnostics=" + S);
- }
-}
-
-static cl::TokenizerCallback getQuotingStyle(opt::InputArgList &Args) {
- if (auto *Arg = Args.getLastArg(OPT_rsp_quoting)) {
- StringRef S = Arg->getValue();
- if (S != "windows" && S != "posix")
- error("invalid response file quoting: " + S);
- if (S == "windows")
- return cl::TokenizeWindowsCommandLine;
- return cl::TokenizeGNUCommandLine;
- }
- if (Triple(sys::getProcessTriple()).getOS() == Triple::Win32)
- return cl::TokenizeWindowsCommandLine;
- return cl::TokenizeGNUCommandLine;
-}
-
-// 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) {
- SmallVector<const char *, 256> V;
- for (size_t I = 0, E = Args.size(); I != E; ++I) {
- StringRef S = Args[I];
- if ((S == "-plugin-opt" || S == "--plugin-opt") && I + 1 != E) {
- V.push_back(Saver.save(S + "=" + Args[I + 1]).data());
- ++I;
- } else {
- V.push_back(Args[I]);
- }
- }
- Args = std::move(V);
-}
-
-// Parses a given list of options.
-opt::InputArgList ELFOptTable::parse(ArrayRef<const char *> Argv) {
- // Make InputArgList from string vectors.
- unsigned MissingIndex;
- unsigned MissingCount;
- SmallVector<const char *, 256> Vec(Argv.data(), Argv.data() + Argv.size());
-
- // We need to get the quoting style for response files before parsing all
- // options so we parse here before and ignore all the options but
- // --rsp-quoting.
- opt::InputArgList Args = this->ParseArgs(Vec, MissingIndex, MissingCount);
-
- // Expand response files (arguments in the form of @<filename>)
- // and then parse the argument again.
- cl::ExpandResponseFiles(Saver, getQuotingStyle(Args), Vec);
- concatLTOPluginOptions(Vec);
- Args = this->ParseArgs(Vec, MissingIndex, MissingCount);
-
- handleColorDiagnostics(Args);
- if (MissingCount)
- error(Twine(Args.getArgString(MissingIndex)) + ": missing argument");
-
- for (auto *Arg : Args.filtered(OPT_UNKNOWN))
- error("unknown argument: " + Arg->getSpelling());
- return Args;
-}
-
-void elf::printHelp() {
- ELFOptTable().PrintHelp(
- outs(), (Config->ProgName + " [options] file...").str().c_str(), "lld",
- false /*ShowHidden*/, true /*ShowAllAliases*/);
- outs() << "\n";
-
- // Scripts generated by Libtool versions up to at least 2.4.6 (the most
- // recent version as of March 2017) expect /: supported targets:.* elf/
- // in a message for the -help option. If it doesn't match, the scripts
- // assume that the linker doesn't support very basic features such as
- // shared libraries. Therefore, we need to print out at least "elf".
- outs() << Config->ProgName << ": supported targets: elf\n";
-}
-
-// 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) {
- SmallString<0> Data;
- raw_svector_ostream OS(Data);
- OS << "--chroot .\n";
-
- // Copy the command line to the output while rewriting paths.
- for (auto *Arg : Args) {
- switch (Arg->getOption().getUnaliasedOption().getID()) {
- case OPT_reproduce:
- break;
- case OPT_INPUT:
- OS << quote(rewritePath(Arg->getValue())) << "\n";
- break;
- case OPT_o:
- // If -o path contains directories, "lld @response.txt" will likely
- // fail because the archive we are creating doesn't contain empty
- // directories for the output path (-o doesn't create directories).
- // Strip directories to prevent the issue.
- OS << "-o " << quote(sys::path::filename(Arg->getValue())) << "\n";
- break;
- case OPT_dynamic_list:
- case OPT_library_path:
- case OPT_rpath:
- case OPT_script:
- case OPT_symbol_ordering_file:
- case OPT_sysroot:
- case OPT_version_script:
- OS << Arg->getSpelling() << " " << quote(rewritePath(Arg->getValue()))
- << "\n";
- break;
- default:
- OS << toString(*Arg) << "\n";
- }
- }
- return Data.str();
-}
-
-// Find a file by concatenating given paths. If a resulting path
-// starts with "=", the character is replaced with a --sysroot value.
-static Optional<std::string> findFile(StringRef Path1, const Twine &Path2) {
- SmallString<128> S;
- if (Path1.startswith("="))
- path::append(S, Config->Sysroot, Path1.substr(1), Path2);
- else
- path::append(S, Path1, Path2);
-
- if (fs::exists(S))
- return S.str().str();
- return None;
-}
-
-Optional<std::string> elf::findFromSearchPaths(StringRef Path) {
- for (StringRef Dir : Config->SearchPaths)
- if (Optional<std::string> S = findFile(Dir, Path))
- return S;
- return None;
-}
-
-// This is for -lfoo. We'll look for libfoo.so or libfoo.a from
-// search paths.
-Optional<std::string> elf::searchLibrary(StringRef Name) {
- if (Name.startswith(":"))
- return findFromSearchPaths(Name.substr(1));
-
- for (StringRef Dir : Config->SearchPaths) {
- if (!Config->Static) {
- if (Optional<std::string> S = findFile(Dir, "lib" + Name + ".so"))
- return S;
-
- llvm::SmallString<128> Scratch;
- const StringRef LibName = ("lib" + Name + ".so.").toStringRef(Scratch);
- int MaxMaj = -1, MaxMin = -1;
- std::error_code EC;
- for (fs::directory_iterator LI(Dir, EC), LE;
- LI != LE; LI = LI.increment(EC)) {
- StringRef FilePath = LI->path();
- StringRef FileName = path::filename(FilePath);
- if (!(FileName.startswith(LibName)))
- continue;
- std::pair<StringRef, StringRef> MajMin =
- FileName.substr(LibName.size()).split('.');
- int Maj, Min;
- if (MajMin.first.getAsInteger(10, Maj) || Maj < 0)
- continue;
- if (MajMin.second.getAsInteger(10, Min) || Min < 0)
- continue;
- if (Maj > MaxMaj)
- MaxMaj = Maj, MaxMin = Min;
- if (MaxMaj == Maj && Min > MaxMin)
- MaxMin = Min;
- }
- if (MaxMaj >= 0)
- return findFile(Dir, LibName + Twine(MaxMaj) + "." + Twine(MaxMin));
- }
- if (Optional<std::string> S = findFile(Dir, "lib" + Name + ".a"))
- return S;
- }
- return None;
-}
-
-// 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.
-Optional<std::string> elf::searchScript(StringRef Name) {
- if (fs::exists(Name))
- return Name.str();
- return findFromSearchPaths(Name);
-}