[llvm] [CMake] Options to control generation of reproducers (PR #143037)

Petr Hosek via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 13 12:23:18 PDT 2025


https://github.com/petrhosek updated https://github.com/llvm/llvm-project/pull/143037

>From 11cdc45cf66600f15dad4d5af548215dbf2735bd Mon Sep 17 00:00:00 2001
From: Petr Hosek <phosek at google.com>
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 <phosek at google.com>
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 <phosek at google.com>
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



More information about the llvm-commits mailing list