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 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
