[clang] [clang] Add -fcrash-diagnostics-tar for tarball of crash reproducer files (PR #198838)
via cfe-commits
cfe-commits at lists.llvm.org
Wed May 20 12:02:09 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-driver
Author: Arthur Eubanks (aeubanks)
<details>
<summary>Changes</summary>
Makes it easier to move around crash diagnostics.
---
Full diff: https://github.com/llvm/llvm-project/pull/198838.diff
3 Files Affected:
- (modified) clang/include/clang/Options/Options.td (+4)
- (modified) clang/lib/Driver/Driver.cpp (+30)
- (added) clang/test/Driver/crash-diagnostics-tar.c (+16)
``````````diff
diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td
index 753e3ac1b74a5..8ee8bb544535e 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -2177,6 +2177,10 @@ def fcrash_diagnostics_dir : Joined<["-"], "fcrash-diagnostics-dir=">,
Group<f_clang_Group>, Flags<[NoArgumentUnused]>,
Visibility<[ClangOption, CLOption, DXCOption]>,
HelpText<"Put crash-report files in <dir>">, MetaVarName<"<dir>">;
+def fcrash_diagnostics_tar : Joined<["-"], "fcrash-diagnostics-tar=">,
+ Group<f_clang_Group>, Flags<[NoArgumentUnused]>,
+ Visibility<[ClangOption, CLOption, DXCOption]>,
+ HelpText<"Put crash-report tarball at <path>">, MetaVarName<"<path>">;
def fcreate_profile : Flag<["-"], "fcreate-profile">, Group<f_Group>;
defm cxx_exceptions: BoolFOption<"cxx-exceptions",
LangOpts<"CXXExceptions">, DefaultFalse,
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 4a968a4ce5cc0..82b238924735e 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -98,12 +98,14 @@
#include "llvm/Support/IOSandbox.h"
#include "llvm/Support/JSON.h"
#include "llvm/Support/MD5.h"
+#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/PrettyStackTrace.h"
#include "llvm/Support/Process.h"
#include "llvm/Support/Program.h"
#include "llvm/Support/Regex.h"
#include "llvm/Support/StringSaver.h"
+#include "llvm/Support/TarWriter.h"
#include "llvm/Support/VirtualFileSystem.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/TargetParser/Host.h"
@@ -2271,9 +2273,37 @@ void Driver::generateCompilationDiagnostics(
<< "\n";
if (Report)
Report->TemporaryFiles.push_back(std::string(Script));
+ TempFiles.push_back(std::string(Script));
+ ScriptOS.close();
Diag(clang::diag::note_drv_command_failed_diag_msg) << Script;
}
+ if (Arg *A = C.getArgs().getLastArg(options::OPT_fcrash_diagnostics_tar)) {
+ StringRef CrashDiagnosticsTar = A->getValue();
+ Expected<std::unique_ptr<llvm::TarWriter>> TarOrErr =
+ llvm::TarWriter::create(CrashDiagnosticsTar,
+ llvm::sys::path::stem(CrashDiagnosticsTar));
+ if (!TarOrErr) {
+ Diag(clang::diag::note_drv_command_failed_diag_msg)
+ << "Error creating reproducer tarball: "
+ << llvm::toString(TarOrErr.takeError());
+ } else {
+ std::unique_ptr<llvm::TarWriter> &Tar = *TarOrErr;
+ for (const std::string &TempFile : TempFiles) {
+ auto BufferOrErr = llvm::MemoryBuffer::getFile(TempFile);
+ if (BufferOrErr) {
+ Tar->append(llvm::sys::path::filename(TempFile),
+ (*BufferOrErr)->getBuffer());
+ } else {
+ Diag(clang::diag::note_drv_command_failed_diag_msg)
+ << "Error reading file for tarball: " << TempFile;
+ }
+ }
+ Diag(clang::diag::note_drv_command_failed_diag_msg)
+ << "Crash reproducer tarball created at: " << CrashDiagnosticsTar;
+ }
+ }
+
// On darwin, provide information about the .crash diagnostic report.
if (llvm::Triple(llvm::sys::getProcessTriple()).isOSDarwin()) {
SmallString<128> CrashDiagDir;
diff --git a/clang/test/Driver/crash-diagnostics-tar.c b/clang/test/Driver/crash-diagnostics-tar.c
new file mode 100644
index 0000000000000..232679bb8e67d
--- /dev/null
+++ b/clang/test/Driver/crash-diagnostics-tar.c
@@ -0,0 +1,16 @@
+// RUN: export LSAN_OPTIONS=detect_leaks=0
+// RUN: rm -rf %t
+// RUN: not %crash_opt %clang -fcrash-diagnostics-tar=%t -c %s -o - 2>&1 | FileCheck %s
+// RUN: rm -rf %t_dir
+// RUN: mkdir %t_dir
+// RUN: tar -xf %t -C %t_dir
+// RUN: FileCheck %s --check-prefix=SH < %t_dir/*/crash-diagnostics-tar-*.sh
+// RUN: FileCheck %s --check-prefix=C < %t_dir/*/crash-diagnostics-tar-*.c
+
+#pragma clang __debug parser_crash
+
+// CHECK: Preprocessed source(s) and associated run script(s) are located at:
+// CHECK: Crash reproducer tarball created at:
+
+// SH: # Crash reproducer for
+// C: # 1 "
``````````
</details>
https://github.com/llvm/llvm-project/pull/198838
More information about the cfe-commits
mailing list