[lld] r238482 - COFF: Split Driver.cpp to Driver.cpp and DriverUtils.cpp. NFC.
Rui Ueyama
ruiu at google.com
Thu May 28 13:30:06 PDT 2015
Author: ruiu
Date: Thu May 28 15:30:06 2015
New Revision: 238482
URL: http://llvm.org/viewvc/llvm-project?rev=238482&view=rev
Log:
COFF: Split Driver.cpp to Driver.cpp and DriverUtils.cpp. NFC.
The previous implementation's driver file is cluttered by lots of
small functions, and it was hard to find important functions.
Make a separate file to prevent that issue.
Added:
lld/trunk/COFF/DriverUtils.cpp
Modified:
lld/trunk/COFF/CMakeLists.txt
lld/trunk/COFF/Driver.cpp
lld/trunk/COFF/Driver.h
Modified: lld/trunk/COFF/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/CMakeLists.txt?rev=238482&r1=238481&r2=238482&view=diff
==============================================================================
--- lld/trunk/COFF/CMakeLists.txt (original)
+++ lld/trunk/COFF/CMakeLists.txt Thu May 28 15:30:06 2015
@@ -5,6 +5,7 @@ add_public_tablegen_target(COFFOptionsTa
add_llvm_library(lldCOFF
Chunks.cpp
Driver.cpp
+ DriverUtils.cpp
InputFiles.cpp
SymbolTable.cpp
Symbols.cpp
Modified: lld/trunk/COFF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.cpp?rev=238482&r1=238481&r2=238482&view=diff
==============================================================================
--- lld/trunk/COFF/Driver.cpp (original)
+++ lld/trunk/COFF/Driver.cpp Thu May 28 15:30:06 2015
@@ -16,67 +16,21 @@
#include "lld/Core/Error.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/STLExtras.h"
-#include "llvm/Object/COFF.h"
#include "llvm/Option/Arg.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Option/Option.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
-#include "llvm/Support/Format.h"
#include "llvm/Support/Path.h"
-#include "llvm/Support/Process.h"
#include "llvm/Support/raw_ostream.h"
#include <memory>
using namespace llvm;
-// Create enum with OPT_xxx values for each option in Options.td
-enum {
- OPT_INVALID = 0,
-#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
- HELP, META) \
- OPT_##ID,
-#include "Options.inc"
-#undef OPTION
-};
-
-// 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 llvm::opt::OptTable::Info infoTable[] = {
-#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
- HELPTEXT, METAVAR) \
- { \
- PREFIX, NAME, HELPTEXT, METAVAR, OPT_##ID, llvm::opt::Option::KIND##Class, \
- PARAM, FLAGS, OPT_##GROUP, OPT_##ALIAS, ALIASARGS \
- } \
- ,
-#include "Options.inc"
-#undef OPTION
-};
-
-namespace {
-
-class COFFOptTable : public llvm::opt::OptTable {
-public:
- COFFOptTable() : OptTable(infoTable, llvm::array_lengthof(infoTable), true) {}
-};
-
-class BumpPtrStringSaver : public llvm::cl::StringSaver {
-public:
- BumpPtrStringSaver(lld::coff::StringAllocator *A) : Alloc(A) {}
-
- const char *SaveString(const char *S) override {
- return Alloc->save(S).data();
- }
+namespace lld {
+namespace coff {
-private:
- lld::coff::StringAllocator *Alloc;
-};
-}
+Configuration *Config;
static std::string getOutputPath(llvm::opt::InputArgList *Args) {
if (auto *Arg = Args->getLastArg(OPT_out))
@@ -91,86 +45,23 @@ static std::string getOutputPath(llvm::o
llvm_unreachable("internal error");
}
-// Split the given string with the path separator.
-static std::vector<StringRef> splitPathList(StringRef str) {
- std::vector<StringRef> ret;
- while (!str.empty()) {
- StringRef path;
- std::tie(path, str) = str.split(';');
- ret.push_back(path);
- }
- return ret;
-}
-
-namespace lld {
-namespace coff {
-
-Configuration *Config;
-
-ErrorOr<std::unique_ptr<llvm::opt::InputArgList>>
-parseArgs(int Argc, const char *Argv[]) {
- COFFOptTable Table;
- unsigned MissingIndex;
- unsigned MissingCount;
- std::unique_ptr<llvm::opt::InputArgList> Args(
- Table.ParseArgs(&Argv[1], &Argv[Argc], MissingIndex, MissingCount));
- if (MissingCount) {
- std::string S;
- llvm::raw_string_ostream OS(S);
- OS << llvm::format("missing arg value for \"%s\", expected %d argument%s.",
- Args->getArgString(MissingIndex), MissingCount,
- (MissingCount == 1 ? "" : "s"));
- OS.flush();
- return make_dynamic_error_code(StringRef(S));
- }
- for (auto *Arg : Args->filtered(OPT_UNKNOWN))
- llvm::errs() << "ignoring unknown argument: " << Arg->getSpelling() << "\n";
- return std::move(Args);
-}
-
-std::string findLib(StringRef Filename) {
- if (llvm::sys::fs::exists(Filename))
- return Filename;
- std::string Name;
- if (Filename.endswith_lower(".lib")) {
- Name = Filename;
- } else {
- Name = (Filename + ".lib").str();
- }
-
- llvm::Optional<std::string> Env = llvm::sys::Process::GetEnv("LIB");
- if (!Env.hasValue())
- return Filename;
- for (StringRef Dir : splitPathList(*Env)) {
- SmallString<128> Path = Dir;
- llvm::sys::path::append(Path, Name);
- if (llvm::sys::fs::exists(Path.str()))
- return Path.str();
- }
- return Filename;
-}
-
-std::string findFile(StringRef Filename) {
- if (llvm::sys::fs::exists(Filename))
- return Filename;
- llvm::Optional<std::string> Env = llvm::sys::Process::GetEnv("LIB");
- if (!Env.hasValue())
- return Filename;
- for (StringRef Dir : splitPathList(*Env)) {
- SmallString<128> Path = Dir;
- llvm::sys::path::append(Path, Filename);
- if (llvm::sys::fs::exists(Path.str()))
- return Path.str();
- }
- return Filename;
-}
-
std::unique_ptr<InputFile> createFile(StringRef Path) {
if (StringRef(Path).endswith_lower(".lib"))
return llvm::make_unique<ArchiveFile>(Path);
return llvm::make_unique<ObjectFile>(Path);
}
+namespace {
+class BumpPtrStringSaver : public llvm::cl::StringSaver {
+public:
+ BumpPtrStringSaver(lld::coff::StringAllocator *A) : Alloc(A) {}
+ const char *SaveString(const char *S) override {
+ return Alloc->save(S).data();
+ }
+ lld::coff::StringAllocator *Alloc;
+};
+}
+
// Parses .drectve section contents and returns a list of files
// specified by /defaultlib.
std::error_code parseDirectives(StringRef S,
Modified: lld/trunk/COFF/Driver.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.h?rev=238482&r1=238481&r2=238482&view=diff
==============================================================================
--- lld/trunk/COFF/Driver.h (original)
+++ lld/trunk/COFF/Driver.h Thu May 28 15:30:06 2015
@@ -12,6 +12,9 @@
#include "Memory.h"
#include "llvm/ADT/StringRef.h"
+#include "llvm/Object/COFF.h"
+#include "llvm/Option/Arg.h"
+#include "llvm/Option/ArgList.h"
#include <memory>
#include <system_error>
#include <vector>
@@ -21,10 +24,27 @@ namespace coff {
class InputFile;
+ErrorOr<std::unique_ptr<llvm::opt::InputArgList>>
+parseArgs(int Argc, const char *Argv[]);
+
std::error_code parseDirectives(StringRef S,
std::vector<std::unique_ptr<InputFile>> *Res,
StringAllocator *Alloc);
+// Functions below this line are defined in DriverUtils.cpp.
+
+// "ENV" environment variable-aware file finders.
+std::string findLib(StringRef Filename);
+std::string findFile(StringRef Filename);
+
+// Create enum with OPT_xxx values for each option in Options.td
+enum {
+ OPT_INVALID = 0,
+#define OPTION(_1, _2, ID, _4, _5, _6, _7, _8, _9, _10, _11) OPT_##ID,
+#include "Options.inc"
+#undef OPTION
+};
+
} // namespace coff
} // namespace lld
Added: lld/trunk/COFF/DriverUtils.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/DriverUtils.cpp?rev=238482&view=auto
==============================================================================
--- lld/trunk/COFF/DriverUtils.cpp (added)
+++ lld/trunk/COFF/DriverUtils.cpp Thu May 28 15:30:06 2015
@@ -0,0 +1,135 @@
+//===- 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 "Memory.h"
+#include "lld/Core/Error.h"
+#include "llvm/ADT/Optional.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/ADT/StringSwitch.h"
+#include "llvm/Object/COFF.h"
+#include "llvm/Option/Arg.h"
+#include "llvm/Option/ArgList.h"
+#include "llvm/Option/Option.h"
+#include "llvm/Support/CommandLine.h"
+#include "llvm/Support/Format.h"
+#include "llvm/Support/Path.h"
+#include "llvm/Support/Process.h"
+#include "llvm/Support/raw_ostream.h"
+#include <memory>
+
+using namespace llvm::COFF;
+using namespace llvm;
+using llvm::sys::Process;
+using llvm::sys::fs::file_magic;
+using llvm::sys::fs::identify_magic;
+
+namespace lld {
+namespace coff {
+
+// Split the given string with the path separator.
+static std::vector<StringRef> splitPathList(StringRef str) {
+ std::vector<StringRef> ret;
+ while (!str.empty()) {
+ StringRef path;
+ std::tie(path, str) = str.split(';');
+ ret.push_back(path);
+ }
+ return ret;
+}
+
+std::string findLib(StringRef Filename) {
+ if (llvm::sys::fs::exists(Filename))
+ return Filename;
+ std::string Name;
+ if (Filename.endswith_lower(".lib")) {
+ Name = Filename;
+ } else {
+ Name = (Filename + ".lib").str();
+ }
+
+ Optional<std::string> Env = Process::GetEnv("LIB");
+ if (!Env.hasValue())
+ return Filename;
+ for (StringRef Dir : splitPathList(*Env)) {
+ SmallString<128> Path = Dir;
+ llvm::sys::path::append(Path, Name);
+ if (llvm::sys::fs::exists(Path.str()))
+ return Path.str();
+ }
+ return Filename;
+}
+
+std::string findFile(StringRef Filename) {
+ if (llvm::sys::fs::exists(Filename))
+ return Filename;
+ Optional<std::string> Env = Process::GetEnv("LIB");
+ if (!Env.hasValue())
+ return Filename;
+ for (StringRef Dir : splitPathList(*Env)) {
+ SmallString<128> Path = Dir;
+ llvm::sys::path::append(Path, Filename);
+ if (llvm::sys::fs::exists(Path.str()))
+ return Path.str();
+ }
+ return Filename;
+}
+
+// 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 llvm::opt::OptTable::Info infoTable[] = {
+#define OPTION(X1, X2, ID, KIND, GROUP, ALIAS, X6, X7, X8, X9, X10) \
+ { \
+ X1, X2, X9, X10, OPT_##ID, llvm::opt::Option::KIND##Class, X8, X7, \
+ OPT_##GROUP, OPT_##ALIAS, X6 \
+ },
+#include "Options.inc"
+#undef OPTION
+};
+
+class COFFOptTable : public llvm::opt::OptTable {
+public:
+ COFFOptTable() : OptTable(infoTable, llvm::array_lengthof(infoTable), true) {}
+};
+
+ErrorOr<std::unique_ptr<llvm::opt::InputArgList>>
+parseArgs(int Argc, const char *Argv[]) {
+ COFFOptTable Table;
+ unsigned MissingIndex;
+ unsigned MissingCount;
+ std::unique_ptr<llvm::opt::InputArgList> Args(
+ Table.ParseArgs(&Argv[1], &Argv[Argc], MissingIndex, MissingCount));
+ if (MissingCount) {
+ std::string S;
+ llvm::raw_string_ostream OS(S);
+ OS << llvm::format("missing arg value for \"%s\", expected %d argument%s.",
+ Args->getArgString(MissingIndex), MissingCount,
+ (MissingCount == 1 ? "" : "s"));
+ OS.flush();
+ return make_dynamic_error_code(StringRef(S));
+ }
+ for (auto *Arg : Args->filtered(OPT_UNKNOWN))
+ llvm::errs() << "ignoring unknown argument: " << Arg->getSpelling() << "\n";
+ return std::move(Args);
+}
+
+} // namespace coff
+} // namespace lld
More information about the llvm-commits
mailing list