diff --git a/lld/MachO/Driver.cpp b/lld/MachO/Driver.cpp index a693cf6c8033b0..3b1daadf9f0a38 100644 --- a/lld/MachO/Driver.cpp +++ b/lld/MachO/Driver.cpp @@ -8,7 +8,6 @@ #include "Driver.h" #include "Config.h" -#include "DriverUtils.h" #include "InputFiles.h" #include "LTO.h" #include "ObjC.h" @@ -34,7 +33,6 @@ #include "llvm/LTO/LTO.h" #include "llvm/Object/Archive.h" #include "llvm/Option/ArgList.h" -#include "llvm/Option/Option.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Host.h" #include "llvm/Support/MemoryBuffer.h" @@ -53,68 +51,6 @@ using namespace lld::macho; Configuration *lld::macho::config; -// Create prefix string literals used in Options.td -#define PREFIX(NAME, VALUE) const char *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 -}; - -MachOOptTable::MachOOptTable() : 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) { - lld::errs().enable_colors(true); - } else if (arg->getOption().getID() == OPT_no_color_diagnostics) { - lld::errs().enable_colors(false); - } else { - StringRef s = arg->getValue(); - if (s == "always") - lld::errs().enable_colors(true); - else if (s == "never") - lld::errs().enable_colors(false); - else if (s != "auto") - error("unknown option: --color-diagnostics=" + s); - } -} - -opt::InputArgList MachOOptTable::parse(ArrayRef argv) { - // Make InputArgList from string vectors. - unsigned missingIndex; - unsigned missingCount; - SmallVector vec(argv.data(), argv.data() + argv.size()); - - opt::InputArgList args = ParseArgs(vec, missingIndex, missingCount); - - if (missingCount) - error(Twine(args.getArgString(missingIndex)) + ": missing argument"); - - handleColorDiagnostics(args); - - for (opt::Arg *arg : args.filtered(OPT_UNKNOWN)) - error("unknown argument: " + arg->getSpelling()); - return args; -} - -void MachOOptTable::printHelp(const char *argv0, bool showHidden) const { - PrintHelp(lld::outs(), (std::string(argv0) + " [options] file...").c_str(), - "LLVM Linker", showHidden); - lld::outs() << "\n"; -} - static HeaderFileType getOutputType(const opt::InputArgList &args) { // TODO: -r, -dylinker, -preload... opt::Arg *outputArg = args.getLastArg(OPT_bundle, OPT_dylib, OPT_execute); diff --git a/lld/MachO/Driver.h b/lld/MachO/Driver.h index 2233740d1db833..9db628c86de2a0 100644 --- a/lld/MachO/Driver.h +++ b/lld/MachO/Driver.h @@ -10,11 +10,16 @@ #define LLD_MACHO_DRIVER_H #include "lld/Common/LLVM.h" +#include "llvm/ADT/Optional.h" +#include "llvm/ADT/StringRef.h" #include "llvm/Option/OptTable.h" +#include "llvm/Support/MemoryBuffer.h" namespace lld { namespace macho { +class DylibFile; + class MachOOptTable : public llvm::opt::OptTable { public: MachOOptTable(); @@ -30,6 +35,12 @@ enum { #undef OPTION }; +// Check for both libfoo.dylib and libfoo.tbd (in that order). +llvm::Optional resolveDylibPath(llvm::StringRef path); + +llvm::Optional makeDylibFromTAPI(llvm::MemoryBufferRef mbref, + DylibFile *umbrella = nullptr); + } // namespace macho } // namespace lld diff --git a/lld/MachO/DriverUtils.cpp b/lld/MachO/DriverUtils.cpp index fa0b62e11c4935..3899348666b4c1 100644 --- a/lld/MachO/DriverUtils.cpp +++ b/lld/MachO/DriverUtils.cpp @@ -6,20 +6,86 @@ // //===----------------------------------------------------------------------===// -#include "DriverUtils.h" +#include "Driver.h" #include "InputFiles.h" #include "lld/Common/ErrorHandler.h" #include "lld/Common/Memory.h" +#include "llvm/Option/Arg.h" +#include "llvm/Option/ArgList.h" +#include "llvm/Option/Option.h" #include "llvm/Support/Path.h" #include "llvm/TextAPI/MachO/TextAPIReader.h" using namespace llvm; using namespace llvm::MachO; +using namespace llvm::opt; using namespace llvm::sys; using namespace lld; using namespace lld::macho; +// Create prefix string literals used in Options.td +#define PREFIX(NAME, VALUE) const char *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 +}; + +MachOOptTable::MachOOptTable() : 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) { + lld::errs().enable_colors(true); + } else if (arg->getOption().getID() == OPT_no_color_diagnostics) { + lld::errs().enable_colors(false); + } else { + StringRef s = arg->getValue(); + if (s == "always") + lld::errs().enable_colors(true); + else if (s == "never") + lld::errs().enable_colors(false); + else if (s != "auto") + error("unknown option: --color-diagnostics=" + s); + } +} + +opt::InputArgList MachOOptTable::parse(ArrayRef argv) { + // Make InputArgList from string vectors. + unsigned missingIndex; + unsigned missingCount; + SmallVector vec(argv.data(), argv.data() + argv.size()); + + opt::InputArgList args = ParseArgs(vec, missingIndex, missingCount); + + if (missingCount) + error(Twine(args.getArgString(missingIndex)) + ": missing argument"); + + handleColorDiagnostics(args); + + for (opt::Arg *arg : args.filtered(OPT_UNKNOWN)) + error("unknown argument: " + arg->getSpelling()); + return args; +} + +void MachOOptTable::printHelp(const char *argv0, bool showHidden) const { + PrintHelp(lld::outs(), (std::string(argv0) + " [options] file...").c_str(), + "LLVM Linker", showHidden); + lld::outs() << "\n"; +} + Optional macho::resolveDylibPath(StringRef path) { // TODO: if a tbd and dylib are both present, we should check to make sure // they are consistent. diff --git a/lld/MachO/DriverUtils.h b/lld/MachO/DriverUtils.h deleted file mode 100644 index d3d3670ab24643..00000000000000 --- a/lld/MachO/DriverUtils.h +++ /dev/null @@ -1,31 +0,0 @@ -//===- DriverUtils.h --------------------------------------------*- C++ -*-===// -// -// 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 -// -//===----------------------------------------------------------------------===// - -#ifndef LLD_MACHO_DRIVER_UTILS_H -#define LLD_MACHO_DRIVER_UTILS_H - -#include "llvm/ADT/Optional.h" -#include "llvm/ADT/StringRef.h" -#include "llvm/Support/FileSystem.h" -#include "llvm/Support/MemoryBuffer.h" - -namespace lld { -namespace macho { - -class DylibFile; - -// Check for both libfoo.dylib and libfoo.tbd (in that order). -llvm::Optional resolveDylibPath(llvm::StringRef path); - -llvm::Optional makeDylibFromTAPI(llvm::MemoryBufferRef mbref, - DylibFile *umbrella = nullptr); - -} // namespace macho -} // namespace lld - -#endif diff --git a/lld/MachO/InputFiles.cpp b/lld/MachO/InputFiles.cpp index cd6fbc316fe19d..c733878ec1fe8f 100644 --- a/lld/MachO/InputFiles.cpp +++ b/lld/MachO/InputFiles.cpp @@ -43,7 +43,7 @@ #include "InputFiles.h" #include "Config.h" -#include "DriverUtils.h" +#include "Driver.h" #include "ExportTrie.h" #include "InputSection.h" #include "MachOStructs.h"