diff options
Diffstat (limited to 'tools/driver/driver.cpp')
-rw-r--r-- | tools/driver/driver.cpp | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/tools/driver/driver.cpp b/tools/driver/driver.cpp index de14425d3616..4d69aaffba23 100644 --- a/tools/driver/driver.cpp +++ b/tools/driver/driver.cpp @@ -130,7 +130,7 @@ static void ApplyOneQAOverride(raw_ostream &OS, } } } else if (Edit[0] == 'x' || Edit[0] == 'X') { - std::string Option = Edit.substr(1, std::string::npos); + auto Option = Edit.substr(1); for (unsigned i = 1; i < Args.size();) { if (Option == Args[i]) { OS << "### Deleting argument " << Args[i] << '\n'; @@ -308,8 +308,9 @@ static int ExecuteCC1Tool(ArrayRef<const char *> argv, StringRef Tool) { } int main(int argc_, const char **argv_) { - llvm::sys::PrintStackTraceOnErrorSignal(); + llvm::sys::PrintStackTraceOnErrorSignal(argv_[0]); llvm::PrettyStackTraceProgram X(argc_, argv_); + llvm::llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. if (llvm::sys::Process::FixupStandardFileDescriptors()) return 1; @@ -338,18 +339,33 @@ int main(int argc_, const char **argv_) { // have to manually search for a --driver-mode=cl argument the hard way. // Finally, our -cc1 tools don't care which tokenization mode we use because // response files written by clang will tokenize the same way in either mode. - llvm::cl::TokenizerCallback Tokenizer = &llvm::cl::TokenizeGNUCommandLine; + bool ClangCLMode = false; if (TargetAndMode.second == "--driver-mode=cl" || std::find_if(argv.begin(), argv.end(), [](const char *F) { return F && strcmp(F, "--driver-mode=cl") == 0; }) != argv.end()) { - Tokenizer = &llvm::cl::TokenizeWindowsCommandLine; + ClangCLMode = true; + } + enum { Default, POSIX, Windows } RSPQuoting = Default; + for (const char *F : argv) { + if (strcmp(F, "--rsp-quoting=posix") == 0) + RSPQuoting = POSIX; + else if (strcmp(F, "--rsp-quoting=windows") == 0) + RSPQuoting = Windows; } // Determines whether we want nullptr markers in argv to indicate response - // files end-of-lines. We only use this for the /LINK driver argument. - bool MarkEOLs = true; - if (argv.size() > 1 && StringRef(argv[1]).startswith("-cc1")) + // files end-of-lines. We only use this for the /LINK driver argument with + // clang-cl.exe on Windows. + bool MarkEOLs = ClangCLMode; + + llvm::cl::TokenizerCallback Tokenizer; + if (RSPQuoting == Windows || (RSPQuoting == Default && ClangCLMode)) + Tokenizer = &llvm::cl::TokenizeWindowsCommandLine; + else + Tokenizer = &llvm::cl::TokenizeGNUCommandLine; + + if (MarkEOLs && argv.size() > 1 && StringRef(argv[1]).startswith("-cc1")) MarkEOLs = false; llvm::cl::ExpandResponseFiles(Saver, Tokenizer, argv, MarkEOLs); @@ -482,8 +498,6 @@ int main(int argc_, const char **argv_) { // results now. This happens in -disable-free mode. llvm::TimerGroup::printAll(llvm::errs()); - llvm::llvm_shutdown(); - #ifdef LLVM_ON_WIN32 // Exit status should not be negative on Win32, unless abnormal termination. // Once abnormal termiation was caught, negative status should not be |