Index: lld/trunk/MinGW/Driver.cpp =================================================================== --- lld/trunk/MinGW/Driver.cpp +++ lld/trunk/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 Argv) { unsigned MissingIndex; unsigned MissingCount; SmallVector Vec(Argv.data(), Argv.data() + Argv.size()); + cl::ExpandResponseFiles(Saver, getQuotingStyle(), Vec); opt::InputArgList Args = this->ParseArgs(Vec, MissingIndex, MissingCount); if (MissingCount) Index: lld/trunk/test/MinGW/driver.test =================================================================== --- lld/trunk/test/MinGW/driver.test +++ lld/trunk/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 Index: lld/trunk/tools/lld/lld.cpp =================================================================== --- lld/trunk/tools/lld/lld.cpp +++ lld/trunk/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 @@ -59,12 +63,30 @@ .Default(Invalid); } -static bool isPETarget(const std::vector &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 &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 @) + // to allow detecting the -m argument from arguments in them. + SmallVector 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; }