diff options
author | Chad Rosier <mcrosier@apple.com> | 2011-11-02 21:29:05 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@apple.com> | 2011-11-02 21:29:05 +0000 |
commit | ce50c55f8cb569cc1b71770fd62327a883fdb7ba (patch) | |
tree | c0ca52f14dcb03c5215171c494da420f62eec5a6 /lib/Driver/Driver.cpp | |
parent | 21a25167b8279df3d8f889d041a4fd98733d3c27 (diff) |
In addition to dumping preprocessed source, dump a script with the command line
arguments that caused clang to crash.
rdar://8314451
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@143573 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Driver/Driver.cpp')
-rw-r--r-- | lib/Driver/Driver.cpp | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index a4aa2ed025..0a3d69880d 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -373,6 +373,12 @@ void Driver::generateCompilationDiagnostics(Compilation &C, CCCIsCPP = true; CCGenDiagnostics = true; + // Save the original job command(s). + std::string Cmd; + llvm::raw_string_ostream OS(Cmd); + C.PrintJob(OS, C.getJobs(), "\n", false); + OS.flush(); + // Clear stale state and suppress tool output. C.initCompilationForDiagnostics(); Diags.Reset(); @@ -449,11 +455,26 @@ void Driver::generateCompilationDiagnostics(Compilation &C, // If the command succeeded, we are done. if (Res == 0) { Diag(clang::diag::note_drv_command_failed_diag_msg) - << "Preprocessed source(s) are located at:"; + << "Preprocessed source(s) and associated run script(s) are located at:"; ArgStringList Files = C.getTempFiles(); for (ArgStringList::const_iterator it = Files.begin(), ie = Files.end(); - it != ie; ++it) + it != ie; ++it) { Diag(clang::diag::note_drv_command_failed_diag_msg) << *it; + + std::string Err; + std::string Script = StringRef(*it).rsplit('.').first; + Script += ".sh"; + llvm::raw_fd_ostream ScriptOS(Script.c_str(), Err, + llvm::raw_fd_ostream::F_Excl | + llvm::raw_fd_ostream::F_Binary); + if (!Err.empty()) { + Diag(clang::diag::note_drv_command_failed_diag_msg) + << "Error generating run script: " + Script + " " + Err; + } else { + ScriptOS << Cmd; + Diag(clang::diag::note_drv_command_failed_diag_msg) << Script; + } + } } else { // Failure, remove preprocessed files. if (!C.getArgs().hasArg(options::OPT_save_temps)) |