From: Justin Bogner Date: Mon, 20 Oct 2014 21:02:05 +0000 (+0000) Subject: Driver: Make FailingCommand mandatory for generateCompilationDiagnostics X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8d24a336dea9ffac70f50acf16958db1a9212390;p=clang Driver: Make FailingCommand mandatory for generateCompilationDiagnostics We currently use a null FailingCommand when generating crash reports as an indication that the cause is FORCE_CLANG_DIAGNOSTICS_CRASH, the environment variable that exists to test crash dumps. This means that our tests don't actually cover real crashes at all, and adds a more complicated code path that's only used in the tests. Instead, we can have the driver synthesize that every command failed and just call generateCompilationDiagnostics normally. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@220234 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Driver/Driver.h b/include/clang/Driver/Driver.h index aea857dbc2..bd672446ac 100644 --- a/include/clang/Driver/Driver.h +++ b/include/clang/Driver/Driver.h @@ -304,7 +304,7 @@ public: /// including preprocessed source file(s). /// void generateCompilationDiagnostics(Compilation &C, - const Command *FailingCommand); + const Command &FailingCommand); /// @} /// @name Helper Methods diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index 89713f59ea..a7a5b1ed0a 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -403,13 +403,13 @@ Compilation *Driver::BuildCompilation(ArrayRef ArgList) { // preprocessed source file(s). Request that the developer attach the // diagnostic information to a bug report. void Driver::generateCompilationDiagnostics(Compilation &C, - const Command *FailingCommand) { + const Command &FailingCommand) { if (C.getArgs().hasArg(options::OPT_fno_crash_diagnostics)) return; // Don't try to generate diagnostics for link or dsymutil jobs. - if (FailingCommand && (FailingCommand->getCreator().isLinkJob() || - FailingCommand->getCreator().isDsymutilJob())) + if (FailingCommand.getCreator().isLinkJob() || + FailingCommand.getCreator().isDsymutilJob()) return; // Print the version of the compiler. @@ -426,12 +426,7 @@ void Driver::generateCompilationDiagnostics(Compilation &C, // Save the original job command(s). std::string Cmd; llvm::raw_string_ostream OS(Cmd); - if (FailingCommand) - FailingCommand->Print(OS, "\n", /*Quote*/ false, /*CrashReport*/ true); - else - // Crash triggered by FORCE_CLANG_DIAGNOSTICS_CRASH, which doesn't have an - // associated FailingCommand, so just pass all jobs. - C.getJobs().Print(OS, "\n", /*Quote*/ false, /*CrashReport*/ true); + FailingCommand.Print(OS, "\n", /*Quote*/ false, /*CrashReport*/ true); OS.flush(); // Keep track of whether we produce any errors while trying to produce diff --git a/tools/driver/driver.cpp b/tools/driver/driver.cpp index 5b42783219..de4b07d214 100644 --- a/tools/driver/driver.cpp +++ b/tools/driver/driver.cpp @@ -464,8 +464,12 @@ int main(int argc_, const char **argv_) { // Force a crash to test the diagnostics. if (::getenv("FORCE_CLANG_DIAGNOSTICS_CRASH")) { Diags.Report(diag::err_drv_force_crash) << "FORCE_CLANG_DIAGNOSTICS_CRASH"; - const Command *FailingCommand = nullptr; - FailingCommands.push_back(std::make_pair(-1, FailingCommand)); + + // Pretend that every command failed. + FailingCommands.clear(); + for (const auto &J : C->getJobs()) + if (const Command *C = dyn_cast(&J)) + FailingCommands.push_back(std::make_pair(-1, C)); } for (const auto &P : FailingCommands) { @@ -483,7 +487,7 @@ int main(int argc_, const char **argv_) { DiagnoseCrash |= CommandRes == 3; #endif if (DiagnoseCrash) { - TheDriver.generateCompilationDiagnostics(*C, FailingCommand); + TheDriver.generateCompilationDiagnostics(*C, *FailingCommand); break; } }