mizvekov created this revision. Herald added subscribers: libcxx-commits, cfe-commits, arichardson. Herald added projects: clang, libc++, All. Herald added a reviewer: libc++. mizvekov requested review of this revision. Herald added a subscriber: MaskRay.
This implements setting the equivalent of `-fcrash-diagnostics-dir` through the environment variable `CLANG_CRASH_DIAGNOSTICS_DIR`. If present, the flag still takes precedence. This helps integration with test frameworks and pipelines. With this feature, we change the libcxx bootstrapping build pipeline to produce clang crash reproducers as artifacts. Signed-off-by: Matheus Izvekov <mizve...@gmail.com> Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D133082 Files: clang/docs/ReleaseNotes.rst clang/lib/Driver/Driver.cpp clang/test/Driver/crash-diagnostics-dir-3.c libcxx/test/libcxx/crash.sh.cpp libcxx/utils/ci/buildkite-pipeline.yml Index: libcxx/utils/ci/buildkite-pipeline.yml =================================================================== --- libcxx/utils/ci/buildkite-pipeline.yml +++ 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" Index: libcxx/test/libcxx/crash.sh.cpp =================================================================== --- /dev/null +++ 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 Index: clang/test/Driver/crash-diagnostics-dir-3.c =================================================================== --- /dev/null +++ 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 Index: clang/lib/Driver/Driver.cpp =================================================================== --- clang/lib/Driver/Driver.cpp +++ 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 ""; } Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ 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 -------------------------
Index: libcxx/utils/ci/buildkite-pipeline.yml =================================================================== --- libcxx/utils/ci/buildkite-pipeline.yml +++ 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" Index: libcxx/test/libcxx/crash.sh.cpp =================================================================== --- /dev/null +++ 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 Index: clang/test/Driver/crash-diagnostics-dir-3.c =================================================================== --- /dev/null +++ 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 Index: clang/lib/Driver/Driver.cpp =================================================================== --- clang/lib/Driver/Driver.cpp +++ 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 ""; } Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ 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 -------------------------
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits