diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt index ed44b16bf9aeb..bb130aef36b96 100644 --- a/llvm/CMakeLists.txt +++ b/llvm/CMakeLists.txt @@ -874,6 +874,10 @@ option (LLVM_VERSION_PRINTER_SHOW_HOST_TARGET_INFO option(LLVM_VERSION_PRINTER_SHOW_BUILD_CONFIG "Show the optional build config flags when tools are invoked with --version." ON) +set(LLVM_CRASH_DIAGNOSTICS "" CACHE STRING "Controls whether to generate crash reproducers. Can be OFF, COMPILER, ALL") +set(LLVM_CRASH_DIAGNOSTICS_DIR "" CACHE PATH "Path to use for crash reproducers") +set(LLVM_GEN_REPRODUCER OFF CACHE STRING "Controls when to generate compiler reproducers. Can be OFF, CRASH, ERROR, ALWAYS") + # You can configure which libraries from LLVM you want to include in the # shared library by setting LLVM_DYLIB_COMPONENTS to a semi-colon delimited # list of LLVM components. All component names handled by llvm-config are valid. diff --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake index 2912f45953c41..347ceeef55af9 100644 --- a/llvm/cmake/modules/HandleLLVMOptions.cmake +++ b/llvm/cmake/modules/HandleLLVMOptions.cmake @@ -1433,3 +1433,23 @@ if(LLVM_ENABLE_LLVM_LIBC) message(WARNING "Unable to link against LLVM libc. LLVM will be built without linking against the LLVM libc overlay.") endif() endif() + +if(LLVM_CRASH_DIAGNOSTICS) + string(TOLOWER "${LLVM_CRASH_DIAGNOSTICS}" LLVM_CRASH_DIAGNOSTICS) + check_c_compiler_flag("-fcrash-diagnostics=${LLVM_CRASH_DIAGNOSTICS}" SUPPORTS_FCRASH_DIAGNOSTICS) + append_if(SUPPORTS_FCRASH_DIAGNOSTICS "-fcrash-diagnostics=${LLVM_CRASH_DIAGNOSTICS}" + CMAKE_C_FLAGS CMAKE_CXX_FLAGS CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS) +endif() + +if(LLVM_CRASH_DIAGNOSTICS_DIR) + check_c_compiler_flag("-fcrash-diagnostics-dir=foo" SUPPORTS_FCRASH_DIAGNOSTICS_DIR) + append_if(SUPPORTS_FCRASH_DIAGNOSTICS_DIR "-fcrash-diagnostics-dir=${LLVM_CRASH_DIAGNOSTICS_DIR}" + CMAKE_C_FLAGS CMAKE_CXX_FLAGS CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS) +endif() + +if(LLVM_GEN_REPRODUCER) + string(TOLOWER "${LLVM_GEN_REPRODUCER}" LLVM_GEN_REPRODUCER) + check_c_compiler_flag("-gen-reproducer=${LLVM_GEN_REPRODUCER}" SUPPORTS_GEN_REPRODUCER) + append_if(SUPPORTS_GEN_REPRODUCER "-gen-reproducer=${LLVM_GEN_REPRODUCER}" + CMAKE_C_FLAGS CMAKE_CXX_FLAGS CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS) +endif() diff --git a/llvm/cmake/modules/LLVMConfig.cmake.in b/llvm/cmake/modules/LLVMConfig.cmake.in index c15b9576cd5d5..04790d16adeec 100644 --- a/llvm/cmake/modules/LLVMConfig.cmake.in +++ b/llvm/cmake/modules/LLVMConfig.cmake.in @@ -139,6 +139,10 @@ set(LLVM_HAVE_OPT_VIEWER_MODULES @LLVM_HAVE_OPT_VIEWER_MODULES@) set(LLVM_CONFIGURATION_TYPES @CMAKE_CONFIGURATION_TYPES@) set(LLVM_ENABLE_SHARED_LIBS @BUILD_SHARED_LIBS@) +set(LLVM_CRASH_DIAGNOSTICS "@LLVM_CRASH_DIAGNOSTICS@") +set(LLVM_CRASH_DIAGNOSTICS_DIR "@LLVM_CRASH_DIAGNOSTICS_DIR@") +set(LLVM_GEN_REPRODUCER "@LLVM_GEN_REPRODUCER@") + set(LLVM_DEFAULT_EXTERNAL_LIT "@LLVM_CONFIG_DEFAULT_EXTERNAL_LIT@") set(LLVM_LIT_ARGS "@LLVM_LIT_ARGS@") diff --git a/llvm/docs/CMake.rst b/llvm/docs/CMake.rst index 674e4969c6912..1d4353f4dae6b 100644 --- a/llvm/docs/CMake.rst +++ b/llvm/docs/CMake.rst @@ -900,6 +900,17 @@ enabled sub-projects. Nearly all of these variable names begin with the linker needs to resolve. It is recommended for platforms using the ELF object format, like Linux systems when linker memory usage is too high. +**LLVM_CRASH_DIAGNOSTICS**:STRING + Controls whether to generate crash reproducers. Possible values are ``OFF``, + ``COMPILER`` for compiler, and ``ALL`` for compiler and linker reproducers. + +**LLVM_CRASH_DIAGNOSTICS_DIR**:PATH + Path to use for crash reproducers (controlled by ``LLVM_CRASH_DIAGNOSTICS``). + +**LLVM_GEN_REPRODUCER**:STRING + Controls when to generate compiler reproducers. Can be ``OFF``, ``CRASH`` for + crashes, ``ERROR`` for compiler errors, and ``ALWAYS`` for every invocation. + **SPHINX_EXECUTABLE**:STRING The path to the ``sphinx-build`` executable detected by CMake. For installation instructions, see