[llvm-commits] [lld] r171910 - in /lld/trunk: include/lld/Driver/LinkerOptions.h lib/Driver/CoreOptions.td lib/Driver/Drivers.cpp lib/Driver/LDOptions.td lib/Driver/LinkerInvocation.cpp tools/lld/lld.cpp
Michael J. Spencer
bigcheesegs at gmail.com
Tue Jan 8 14:59:28 PST 2013
Author: mspencer
Date: Tue Jan 8 16:59:27 2013
New Revision: 171910
URL: http://llvm.org/viewvc/llvm-project?rev=171910&view=rev
Log:
[lld] Add support for -mllvm.
There is no way to test this at the moment because the options are not
processed until the link starts, and we can't pass an empty file.
Modified:
lld/trunk/include/lld/Driver/LinkerOptions.h
lld/trunk/lib/Driver/CoreOptions.td
lld/trunk/lib/Driver/Drivers.cpp
lld/trunk/lib/Driver/LDOptions.td
lld/trunk/lib/Driver/LinkerInvocation.cpp
lld/trunk/tools/lld/lld.cpp
Modified: lld/trunk/include/lld/Driver/LinkerOptions.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Driver/LinkerOptions.h?rev=171910&r1=171909&r2=171910&view=diff
==============================================================================
--- lld/trunk/include/lld/Driver/LinkerOptions.h (original)
+++ lld/trunk/include/lld/Driver/LinkerOptions.h Tue Jan 8 16:59:27 2013
@@ -26,6 +26,7 @@
#include "llvm/Support/MemoryBuffer.h"
#include <memory>
+#include <vector>
namespace lld {
enum class InputKind {
@@ -105,8 +106,11 @@
struct LinkerOptions {
LinkerOptions() {}
+
+ // This exists because MSVC doesn't support = default :(
LinkerOptions(LinkerOptions &&other)
: _input(std::move(other._input))
+ , _llvmArgs(std::move(other._llvmArgs))
, _target(std::move(other._target))
, _outputPath(std::move(other._outputPath))
, _entrySymbol(std::move(other._entrySymbol))
@@ -115,6 +119,7 @@
, _outputYAML(other._outputYAML) {}
std::vector<LinkerInput> _input;
+ std::vector<std::string> _llvmArgs;
std::string _target;
std::string _outputPath;
std::string _entrySymbol;
Modified: lld/trunk/lib/Driver/CoreOptions.td
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/CoreOptions.td?rev=171910&r1=171909&r2=171910&view=diff
==============================================================================
--- lld/trunk/lib/Driver/CoreOptions.td (original)
+++ lld/trunk/lib/Driver/CoreOptions.td Tue Jan 8 16:59:27 2013
@@ -2,6 +2,7 @@
def flavor : Separate<["-"], "flavor">;
def target : Separate<["-"], "target">, HelpText<"Target triple to link for">;
+def mllvm : Separate<["-"], "mllvm">, HelpText<"Options to pass to LLVM">;
def output : Joined<["-"], "output=">;
def entry : Joined<["-"], "entry=">;
Modified: lld/trunk/lib/Driver/Drivers.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/Drivers.cpp?rev=171910&r1=171909&r2=171910&view=diff
==============================================================================
--- lld/trunk/lib/Driver/Drivers.cpp (original)
+++ lld/trunk/lib/Driver/Drivers.cpp Tue Jan 8 16:59:27 2013
@@ -103,6 +103,13 @@
return std::unique_ptr<llvm::opt::DerivedArgList>();
}
+ for (llvm::opt::arg_iterator it = _inputArgs->filtered_begin(ld::OPT_UNKNOWN),
+ ie = _inputArgs->filtered_end();
+ it != ie; ++it) {
+ llvm::errs() << "warning: ignoring unknown argument: "
+ << (*it)->getAsString(*_inputArgs) << "\n";
+ }
+
std::unique_ptr<llvm::opt::DerivedArgList> newArgs(
new llvm::opt::DerivedArgList(*_inputArgs));
@@ -147,6 +154,14 @@
(*it)->getValue());
}
+ // Copy mllvm
+ for (llvm::opt::arg_iterator it = _inputArgs->filtered_begin(ld::OPT_mllvm),
+ ie = _inputArgs->filtered_end();
+ it != ie; ++it) {
+ newArgs->AddPositionalArg(*it, _core.getOption(core::OPT_mllvm),
+ (*it)->getValue());
+ }
+
return std::move(newArgs);
}
@@ -183,6 +198,17 @@
return std::unique_ptr<llvm::opt::ArgList>();
}
+ bool hasUnknown = false;
+ for (llvm::opt::arg_iterator it = list->filtered_begin(ld::OPT_UNKNOWN),
+ ie = list->filtered_end();
+ it != ie; ++it) {
+ llvm::errs() << "error: ignoring unknown argument: "
+ << (*it)->getAsString(*list) << "\n";
+ hasUnknown = true;
+ }
+ if (hasUnknown)
+ return std::unique_ptr<llvm::opt::ArgList>();
+
return list;
}
@@ -195,6 +221,7 @@
ret._input.push_back(LinkerInput((*it)->getValue(), InputKind::Object));
}
+ ret._llvmArgs = args.getAllArgValues(core::OPT_mllvm);
ret._target = llvm::Triple::normalize(args.getLastArgValue(core::OPT_target));
ret._outputPath = args.getLastArgValue(core::OPT_output);
ret._entrySymbol = args.getLastArgValue(core::OPT_entry);
Modified: lld/trunk/lib/Driver/LDOptions.td
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/LDOptions.td?rev=171910&r1=171909&r2=171910&view=diff
==============================================================================
--- lld/trunk/lib/Driver/LDOptions.td (original)
+++ lld/trunk/lib/Driver/LDOptions.td Tue Jan 8 16:59:27 2013
@@ -2,6 +2,8 @@
def flavor : Separate<["-"], "flavor">;
def target : Separate<["-"], "target">, HelpText<"Target triple to link for">;
+def mllvm : Separate<["-"], "mllvm">, HelpText<"Options to pass to LLVM">;
+
def entry : Joined<["--"], "entry=">;
def entry_e : Separate<["-"], "e">, Alias<entry>;
Modified: lld/trunk/lib/Driver/LinkerInvocation.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/LinkerInvocation.cpp?rev=171910&r1=171909&r2=171910&view=diff
==============================================================================
--- lld/trunk/lib/Driver/LinkerInvocation.cpp (original)
+++ lld/trunk/lib/Driver/LinkerInvocation.cpp Tue Jan 8 16:59:27 2013
@@ -13,11 +13,23 @@
#include "lld/Core/Resolver.h"
#include "lld/Driver/Target.h"
+#include "llvm/Support/CommandLine.h"
#include "llvm/Support/raw_ostream.h"
using namespace lld;
void LinkerInvocation::operator()() {
+ // Honor -mllvm
+ if (!_options._llvmArgs.empty()) {
+ unsigned NumArgs = _options._llvmArgs.size();
+ const char **Args = new const char*[NumArgs + 2];
+ Args[0] = "lld (LLVM option parsing)";
+ for (unsigned i = 0; i != NumArgs; ++i)
+ Args[i + 1] = _options._llvmArgs[i].c_str();
+ Args[NumArgs + 1] = 0;
+ llvm::cl::ParseCommandLineOptions(NumArgs + 1, Args);
+ }
+
// Create target.
std::unique_ptr<Target> target(Target::create(_options));
Modified: lld/trunk/tools/lld/lld.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/tools/lld/lld.cpp?rev=171910&r1=171909&r2=171910&view=diff
==============================================================================
--- lld/trunk/tools/lld/lld.cpp (original)
+++ lld/trunk/tools/lld/lld.cpp Tue Jan 8 16:59:27 2013
@@ -132,12 +132,6 @@
if (!coreArgs)
return 1;
- for (const auto &arg : *coreArgs) {
- if (arg->getOption().getKind() == llvm::opt::Option::UnknownClass) {
- llvm::errs() << "Unknown option: " << arg->getAsString(*coreArgs) << "\n";
- }
- }
-
LinkerOptions lo(generateOptions(*coreArgs));
if (lo._outputCommands) {
More information about the llvm-commits
mailing list