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

Petr Hosek via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 5 15:31:06 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/2] [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/2] 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@")



More information about the llvm-commits mailing list