summaryrefslogtreecommitdiffstats
path: root/lld/lib/Driver/Drivers.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lld/lib/Driver/Drivers.cpp')
-rw-r--r--lld/lib/Driver/Drivers.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/lld/lib/Driver/Drivers.cpp b/lld/lib/Driver/Drivers.cpp
index 466b49ed36c..9bf11d6abb2 100644
--- a/lld/lib/Driver/Drivers.cpp
+++ b/lld/lib/Driver/Drivers.cpp
@@ -115,6 +115,8 @@ public:
std::unique_ptr<llvm::opt::DerivedArgList> newArgs(
new llvm::opt::DerivedArgList(*_inputArgs));
+ bool isOutputDynamic = false;
+
if (llvm::opt::Arg *A = _inputArgs->getLastArg(ld::OPT_target)) {
newArgs->AddSeparateArg( A, _core.getOption(core::OPT_target)
, A->getValue());
@@ -134,6 +136,15 @@ public:
newArgs->AddJoinedArg(nullptr, _core.getOption(core::OPT_output),
"a.out");
+ if (llvm::opt::Arg *A = _inputArgs->getLastArg(ld::OPT_static))
+ newArgs->AddJoinedArg(A, _core.getOption(core::OPT_output_type),
+ newArgs->MakeArgString("static"));
+ else {
+ newArgs->AddJoinedArg(nullptr, _core.getOption(core::OPT_output_type),
+ newArgs->MakeArgString("dynamic"));
+ isOutputDynamic = true;
+ }
+
if (llvm::opt::Arg *A = _inputArgs->getLastArg(ld::OPT_relocatable))
newArgs->AddFlagArg(A, _core.getOption(core::OPT_relocatable));
@@ -170,6 +181,14 @@ public:
StringRef libName = (*it)->getValue();
SmallString<128> p;
for (const auto &path : _inputSearchPaths) {
+ if (isOutputDynamic) {
+ p = path;
+ llvm::sys::path::append(p, Twine("lib") + libName + ".so");
+ if (llvm::sys::fs::exists(p.str())) {
+ inputPath = newArgs->MakeArgString(p);
+ break;
+ }
+ }
p = path;
llvm::sys::path::append(p, Twine("lib") + libName + ".a");
if (llvm::sys::fs::exists(p.str())) {
OpenPOWER on IntegriCloud