From 11cdc45cf66600f15dad4d5af548215dbf2735bd Mon Sep 17 00:00:00 2001 From: Petr Hosek Date: Thu, 5 Jun 2025 21:24:43 +0000 Subject: [PATCH 1/3] [CMake] Options to control generation of reproducers Clang automatically generates a reproducer on crash, but we don't provide any control over the reproducers (whether to generate them only for compiler crashes or linker crashes as well) or their location. This change also additional provides an option to enable generating reproducers in case of an error (and not just crash) which can be helpful in environments such as automated builders to help with reproducing issues. --- llvm/CMakeLists.txt | 4 ++++ llvm/cmake/modules/HandleLLVMOptions.cmake | 19 +++++++++++++++++++ llvm/cmake/modules/LLVMConfig.cmake.in | 4 ++++ 3 files changed, 27 insertions(+) diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt index ed44b16bf9aeb..80db33dfe5336 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 "Control when to generate reproducer. Can be OFF, COMPILER, ALL") +set(LLVM_CRASH_DIAGNOSTICS_DIR "" CACHE STRING "Path to use for crash reproducers") +set(LLVM_ERROR_REPRODUCERS OFF CACHE BOOL "Generate a reproducer in the case of an error") + # 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..8d0eca75d003a 100644 --- a/llvm/cmake/modules/HandleLLVMOptions.cmake +++ b/llvm/cmake/modules/HandleLLVMOptions.cmake @@ -1433,3 +1433,22 @@ 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_ERROR_REPRODUCERS) + check_c_compiler_flag("-gen-reproducer=error" SUPPORTS_GEN_REPRODUCER_ERROR) + append_if(SUPPORTS_GEN_REPRODUCER_ERROR "-gen-reproducer=error" + 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..c33db454e07e2 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_ERROR_REPRODUCERS "@LLVM_ERROR_REPRODUCERS@") + set(LLVM_DEFAULT_EXTERNAL_LIT "@LLVM_CONFIG_DEFAULT_EXTERNAL_LIT@") set(LLVM_LIT_ARGS "@LLVM_LIT_ARGS@") From 24a8b62fa1ccb1de9addcd5d2671013d0409571e Mon Sep 17 00:00:00 2001 From: Petr Hosek Date: Thu, 5 Jun 2025 22:30:43 +0000 Subject: [PATCH 2/3] Rename LLVM_ERROR_REPRODUCERS to LLVM_GEN_REPRODUCER --- llvm/CMakeLists.txt | 2 +- llvm/cmake/modules/HandleLLVMOptions.cmake | 7 ++++--- llvm/cmake/modules/LLVMConfig.cmake.in | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt index 80db33dfe5336..0f6605a80de72 100644 --- a/llvm/CMakeLists.txt +++ b/llvm/CMakeLists.txt @@ -876,7 +876,7 @@ option(LLVM_VERSION_PRINTER_SHOW_BUILD_CONFIG set(LLVM_CRASH_DIAGNOSTICS "" CACHE STRING "Control when to generate reproducer. Can be OFF, COMPILER, ALL") set(LLVM_CRASH_DIAGNOSTICS_DIR "" CACHE STRING "Path to use for crash reproducers") -set(LLVM_ERROR_REPRODUCERS OFF CACHE BOOL "Generate a reproducer in the case of an error") +set(LLVM_GEN_REPRODUCER OFF CACHE BOOL "Generate a reproducer. 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 diff --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake index 8d0eca75d003a..347ceeef55af9 100644 --- a/llvm/cmake/modules/HandleLLVMOptions.cmake +++ b/llvm/cmake/modules/HandleLLVMOptions.cmake @@ -1447,8 +1447,9 @@ if(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_ERROR_REPRODUCERS) - check_c_compiler_flag("-gen-reproducer=error" SUPPORTS_GEN_REPRODUCER_ERROR) - append_if(SUPPORTS_GEN_REPRODUCER_ERROR "-gen-reproducer=error" +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 c33db454e07e2..04790d16adeec 100644 --- a/llvm/cmake/modules/LLVMConfig.cmake.in +++ b/llvm/cmake/modules/LLVMConfig.cmake.in @@ -141,7 +141,7 @@ 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_ERROR_REPRODUCERS "@LLVM_ERROR_REPRODUCERS@") +set(LLVM_GEN_REPRODUCER "@LLVM_GEN_REPRODUCER@") set(LLVM_DEFAULT_EXTERNAL_LIT "@LLVM_CONFIG_DEFAULT_EXTERNAL_LIT@") set(LLVM_LIT_ARGS "@LLVM_LIT_ARGS@") From abd3a6910047994881eee9f0ccd8cb7fa5c12880 Mon Sep 17 00:00:00 2001 From: Petr Hosek Date: Fri, 13 Jun 2025 19:22:52 +0000 Subject: [PATCH 3/3] Update documentation --- llvm/CMakeLists.txt | 6 +++--- llvm/docs/CMake.rst | 11 +++++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt index 0f6605a80de72..bb130aef36b96 100644 --- a/llvm/CMakeLists.txt +++ b/llvm/CMakeLists.txt @@ -874,9 +874,9 @@ 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 "Control when to generate reproducer. Can be OFF, COMPILER, ALL") -set(LLVM_CRASH_DIAGNOSTICS_DIR "" CACHE STRING "Path to use for crash reproducers") -set(LLVM_GEN_REPRODUCER OFF CACHE BOOL "Generate a reproducer. Can be OFF, CRASH, ERROR, ALWAYS") +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 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