diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -137,6 +137,10 @@ New Compiler Flags ------------------ +- It's now possible to set the crash diagnostics directory through + the environment variable 'CLANG_CRASH_DIAGNOSTICS_DIR'. + The '-fcrash-diagnostics-dir' flag takes precedence. + Deprecated Compiler Flags ------------------------- diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -5422,15 +5422,17 @@ StringRef BoundArch) const { SmallString<128> TmpName; Arg *A = C.getArgs().getLastArg(options::OPT_fcrash_diagnostics_dir); - if (CCGenDiagnostics && A) { - SmallString<128> CrashDirectory(A->getValue()); + const char *CrashDirectory = CCGenDiagnostics && A + ? A->getValue() + : std::getenv("CLANG_CRASH_DIAGNOSTICS_DIR"); + if (CrashDirectory) { if (!getVFS().exists(CrashDirectory)) llvm::sys::fs::create_directories(CrashDirectory); - llvm::sys::path::append(CrashDirectory, Prefix); + SmallString<128> Path(CrashDirectory); + llvm::sys::path::append(Path, Prefix); const char *Middle = !Suffix.empty() ? "-%%%%%%." : "-%%%%%%"; - std::error_code EC = llvm::sys::fs::createUniqueFile( - CrashDirectory + Middle + Suffix, TmpName); - if (EC) { + if (std::error_code EC = + llvm::sys::fs::createUniqueFile(Path + Middle + Suffix, TmpName)) { Diag(clang::diag::err_unable_to_make_temp) << EC.message(); return ""; } diff --git a/clang/test/Driver/crash-diagnostics-dir-3.c b/clang/test/Driver/crash-diagnostics-dir-3.c new file mode 100644 --- /dev/null +++ b/clang/test/Driver/crash-diagnostics-dir-3.c @@ -0,0 +1,5 @@ +// RUN: rm -rf %t +// RUN: not env CLANG_CRASH_DIAGNOSTICS_DIR=%t %clang -c %s -o - 2>&1 | FileCheck %s +#pragma clang __debug parser_crash +// CHECK: Preprocessed source(s) and associated run script(s) are located at: +// CHECK: diagnostic msg: {{.*}}{{/|\\}}crash-diagnostics-dir-3.c.tmp{{(/|\\).*}}.c diff --git a/libcxx/test/libcxx/crash.sh.cpp b/libcxx/test/libcxx/crash.sh.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/libcxx/crash.sh.cpp @@ -0,0 +1,15 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Test that we produce the crash artifacts in the pipeline +// For exposition only +// FIXME: Delete this file + +// RUN: %{cxx} %{flags} %{compile_flags} -fsyntax-only %s + +#pragma clang __debug parser_crash diff --git a/libcxx/utils/ci/buildkite-pipeline.yml b/libcxx/utils/ci/buildkite-pipeline.yml --- a/libcxx/utils/ci/buildkite-pipeline.yml +++ b/libcxx/utils/ci/buildkite-pipeline.yml @@ -369,10 +369,12 @@ artifact_paths: - "**/test-results.xml" - "**/*.abilist" + - "**/crash_diagnostics/*" env: CC: "clang-${LLVM_HEAD_VERSION}" CXX: "clang++-${LLVM_HEAD_VERSION}" LLVM_SYMBOLIZER_PATH: "/usr/bin/llvm-symbolizer-${LLVM_HEAD_VERSION}" + CLANG_CRASH_DIAGNOSTICS_DIR: "crash_diagnostics" agents: queue: "libcxx-builders" os: "linux"