diff --git a/clang/test/Driver/crash-report-crashfile.m b/clang/test/Driver/crash-report-crashfile.m --- a/clang/test/Driver/crash-report-crashfile.m +++ b/clang/test/Driver/crash-report-crashfile.m @@ -18,6 +18,7 @@ const int x = MODULE_MACRO; // CRASH_ENV: failing because environment variable 'FORCE_CLANG_DIAGNOSTICS_CRASH' is set +// CRASH_ENV: PLEASE submit a bug report to {{.*}} and include the crash backtrace, preprocessed source, and associated run script. // CRASH_ENV: Preprocessed source(s) and associated run script(s) are located at: // CRASH_ENV-NEXT: note: diagnostic msg: {{.*}}.m // CRASH_ENV-NEXT: note: diagnostic msg: {{.*}}.cache diff --git a/clang/test/Driver/crash-report-modules.m b/clang/test/Driver/crash-report-modules.m --- a/clang/test/Driver/crash-report-modules.m +++ b/clang/test/Driver/crash-report-modules.m @@ -19,6 +19,7 @@ @import simple; const int x = MODULE_MACRO; +// CHECK: PLEASE submit a bug report to {{.*}} and include the crash backtrace, preprocessed source, and associated run script. // CHECK: Preprocessed source(s) and associated run script(s) are located at: // CHECK-NEXT: note: diagnostic msg: {{.*}}.m // CHECK-NEXT: note: diagnostic msg: {{.*}}.cache diff --git a/clang/test/Driver/crash-report-null.test b/clang/test/Driver/crash-report-null.test --- a/clang/test/Driver/crash-report-null.test +++ b/clang/test/Driver/crash-report-null.test @@ -3,5 +3,6 @@ // FIXME: Investigating. "fatal error: file 'nul' modified since it was first processed" // XFAIL: windows-gnu +// CHECK: PLEASE submit a bug report to {{.*}} and include the crash backtrace, preprocessed source, and associated run script. // CHECK: Preprocessed source(s) and associated run script(s) are located at: // CHECK-NEXT: note: diagnostic msg: {{.*}}null-{{.*}}.c diff --git a/clang/tools/driver/driver.cpp b/clang/tools/driver/driver.cpp --- a/clang/tools/driver/driver.cpp +++ b/clang/tools/driver/driver.cpp @@ -511,6 +511,11 @@ for (const auto &J : C->getJobs()) if (const Command *C = dyn_cast(&J)) FailingCommands.push_back(std::make_pair(-1, C)); + + // Print the bug report message that would be printed if we did actually + // crash, but only if we're crashing due to FORCE_CLANG_DIAGNOSTICS_CRASH. + if (::getenv("FORCE_CLANG_DIAGNOSTICS_CRASH")) + llvm::dbgs() << llvm::getBugReportMsg(); } for (const auto &P : FailingCommands) { diff --git a/llvm/include/llvm/Support/PrettyStackTrace.h b/llvm/include/llvm/Support/PrettyStackTrace.h --- a/llvm/include/llvm/Support/PrettyStackTrace.h +++ b/llvm/include/llvm/Support/PrettyStackTrace.h @@ -41,6 +41,9 @@ /// a crash. void setBugReportMsg(const char *Msg); + /// Get the bug report message that will be output upon a crash. + const char *getBugReportMsg(); + /// PrettyStackTraceEntry - This class is used to represent a frame of the /// "pretty" stack trace that is dumped when a program crashes. You can define /// subclasses of this and declare them on the program stack: when they are diff --git a/llvm/lib/Support/PrettyStackTrace.cpp b/llvm/lib/Support/PrettyStackTrace.cpp --- a/llvm/lib/Support/PrettyStackTrace.cpp +++ b/llvm/lib/Support/PrettyStackTrace.cpp @@ -33,6 +33,10 @@ using namespace llvm; +static const char *BugReportMsg = + "PLEASE submit a bug report to " BUG_REPORT_URL + " and include the crash backtrace.\n"; + // If backtrace support is not enabled, compile out support for pretty stack // traces. This has the secondary effect of not requiring thread local storage // when backtrace support is disabled. @@ -142,10 +146,6 @@ static CrashHandlerStringStorage crashHandlerStringStorage; #endif -static const char *BugReportMsg = - "PLEASE submit a bug report to " BUG_REPORT_URL - " and include the crash backtrace.\n"; - /// This callback is run if a fatal signal is delivered to the process, it /// prints the pretty stack trace. static void CrashHandler(void *) { @@ -203,9 +203,11 @@ #endif // ENABLE_BACKTRACES void llvm::setBugReportMsg(const char *Msg) { -#if ENABLE_BACKTRACES BugReportMsg = Msg; -#endif +} + +const char *llvm::getBugReportMsg() { + return BugReportMsg; } PrettyStackTraceEntry::PrettyStackTraceEntry() {