[Driver] Look for -m in response files as well
Also expand response files in the MinGW driver.
This should fix PR42135.
Differential Revision: https://reviews.llvm.org/D63024
git-svn-id: https://llvm.org/svn/llvm-project/lld/trunk@362977 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/MinGW/Driver.cpp b/MinGW/Driver.cpp
index acab0d4..672ddfc 100644
--- a/MinGW/Driver.cpp
+++ b/MinGW/Driver.cpp
@@ -30,11 +30,13 @@
#include "lld/Common/Driver.h"
#include "lld/Common/ErrorHandler.h"
+#include "lld/Common/Memory.h"
#include "lld/Common/Version.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/Triple.h"
#include "llvm/Option/Arg.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Option/Option.h"
@@ -86,11 +88,18 @@
outs() << "\n";
}
+static cl::TokenizerCallback getQuotingStyle() {
+ if (Triple(sys::getProcessTriple()).getOS() == Triple::Win32)
+ return cl::TokenizeWindowsCommandLine;
+ return cl::TokenizeGNUCommandLine;
+}
+
opt::InputArgList MinGWOptTable::parse(ArrayRef<const char *> Argv) {
unsigned MissingIndex;
unsigned MissingCount;
SmallVector<const char *, 256> Vec(Argv.data(), Argv.data() + Argv.size());
+ cl::ExpandResponseFiles(Saver, getQuotingStyle(), Vec);
opt::InputArgList Args = this->ParseArgs(Vec, MissingIndex, MissingCount);
if (MissingCount)
diff --git a/test/MinGW/driver.test b/test/MinGW/driver.test
index 6795f3f..0f06286 100644
--- a/test/MinGW/driver.test
+++ b/test/MinGW/driver.test
@@ -4,6 +4,9 @@
X86-SAME: -alternatename:__image_base__=___ImageBase
X86-SAME: foo.o
+RUN: echo "-### foo.o -m i386pe" > %t.rsp
+RUN: ld.lld @%t.rsp | FileCheck -check-prefix=X86 %s
+
RUN: ld.lld -### foo.o -m i386pep | FileCheck -check-prefix=X64 %s
X64: -out:a.exe
X64-SAME: -machine:x64
diff --git a/tools/lld/lld.cpp b/tools/lld/lld.cpp
index c6be7f8..cd0eaf7 100644
--- a/tools/lld/lld.cpp
+++ b/tools/lld/lld.cpp
@@ -26,9 +26,13 @@
//===----------------------------------------------------------------------===//
#include "lld/Common/Driver.h"
+#include "lld/Common/Memory.h"
#include "llvm/ADT/STLExtras.h"
+#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringSwitch.h"
+#include "llvm/ADT/Triple.h"
#include "llvm/ADT/Twine.h"
+#include "llvm/Support/CommandLine.h"
#include "llvm/Support/InitLLVM.h"
#include "llvm/Support/Path.h"
#include <cstdlib>
@@ -59,12 +63,30 @@
.Default(Invalid);
}
-static bool isPETarget(const std::vector<const char *> &V) {
+static cl::TokenizerCallback getDefaultQuotingStyle() {
+ if (Triple(sys::getProcessTriple()).getOS() == Triple::Win32)
+ return cl::TokenizeWindowsCommandLine;
+ return cl::TokenizeGNUCommandLine;
+}
+
+static bool isPETargetName(StringRef S) {
+ return S == "i386pe" || S == "i386pep" || S == "thumb2pe" || S == "arm64pe";
+}
+
+static bool isPETarget(std::vector<const char *> &V) {
for (auto It = V.begin(); It + 1 != V.end(); ++It) {
if (StringRef(*It) != "-m")
continue;
- StringRef S = *(It + 1);
- return S == "i386pe" || S == "i386pep" || S == "thumb2pe" || S == "arm64pe";
+ return isPETargetName(*(It + 1));
+ }
+ // Expand response files (arguments in the form of @<filename>)
+ // to allow detecting the -m argument from arguments in them.
+ SmallVector<const char *, 256> ExpandedArgs(V.data(), V.data() + V.size());
+ cl::ExpandResponseFiles(Saver, getDefaultQuotingStyle(), ExpandedArgs);
+ for (auto It = ExpandedArgs.begin(); It + 1 != ExpandedArgs.end(); ++It) {
+ if (StringRef(*It) != "-m")
+ continue;
+ return isPETargetName(*(It + 1));
}
return false;
}