From 2b6bdfc82b6ebac074b843ccdabc7886936e0aac Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 16 Jan 2026 09:33:25 +0100 Subject: [PATCH] [cmake] Restore exception flags in llvm-config --cxxflags (#176195) https://github.com/llvm/llvm-project/pull/173869 accidentally dropped rtti and eh flags from `llvm-config --cxxflags`. Then https://github.com/llvm/llvm-project/pull/174084 restored the rtti flags. The eh flags were not included with the rationale that they are not ABI relevant. This PR restores the eh flags as well. While they are not strictly necessary, I believe that code that directly interfaces with LLVM almost certainly does not want to build with exceptions if LLVM is not built with exceptions. Building in the peculiar `-fexceptions -fno-rtti` configuration is rarely useful and likely not intended. On MacOS, this is also relevant because it's not possible to use C++17 headers without `-fno-exceptions` when using older deployment targets. In that configuration, `-fno-exceptions` is required to interact with LLVM. (cherry picked from commit 9bbea753a4a45f9c7c7ca9730736c7792adaacf9) --- llvm/cmake/modules/AddLLVM.cmake | 36 ++++++++++++++++----------- llvm/tools/llvm-config/CMakeLists.txt | 5 ++++ 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake index 1fefc2610afc1..d938214f9d0df 100644 --- a/llvm/cmake/modules/AddLLVM.cmake +++ b/llvm/cmake/modules/AddLLVM.cmake @@ -31,6 +31,24 @@ elseif(CMAKE_CXX_COMPILER_ID MATCHES "XL") set(LLVM_CXXFLAGS_RTTI_DISABLE "-qnortti") endif() +# Determine required flags to enable/disable EH. +set(LLVM_CXXFLAGS_EH_DISABLE "") +set(LLVM_CXXFLAGS_EH_ENABLE "") +if(LLVM_COMPILER_IS_GCC_COMPATIBLE) + set(LLVM_CXXFLAGS_EH_DISABLE "-fno-exceptions") + if(LLVM_ENABLE_UNWIND_TABLES) + list(APPEND LLVM_CXXFLAGS_EH_DISABLE "-funwind-tables") + else() + list(APPEND LLVM_CXXFLAGS_EH_DISABLE "-fno-unwind-tables") + list(APPEND LLVM_CXXFLAGS_EH_DISABLE "-fno-asynchronous-unwind-tables") + endif() +elseif(MSVC) + set(LLVM_CXXFLAGS_EH_ENABLE "/EHsc") + set(LLVM_CXXFLAGS_EH_DISABLE "/EHs-c-") +elseif (CMAKE_CXX_COMPILER_ID MATCHES "XL") + set(LLVM_CXXFLAGS_EH_DISABLE "-qnoeh") +endif() + function(llvm_update_compile_flags name) set(LLVM_COMPILE_CXXFLAGS "") @@ -41,24 +59,12 @@ function(llvm_update_compile_flags name) message(AUTHOR_WARNING "Exception handling requires RTTI. Enabling RTTI for ${name}") set(LLVM_REQUIRES_RTTI ON) endif() - if(MSVC) - list(APPEND LLVM_COMPILE_CXXFLAGS "/EHsc") - endif() + list(APPEND LLVM_COMPILE_CXXFLAGS ${LLVM_CXXFLAGS_EH_ENABLE}) else() - if(LLVM_COMPILER_IS_GCC_COMPATIBLE) - list(APPEND LLVM_COMPILE_CXXFLAGS "-fno-exceptions") - if(LLVM_ENABLE_UNWIND_TABLES) - list(APPEND LLVM_COMPILE_CXXFLAGS "-funwind-tables") - else() - list(APPEND LLVM_COMPILE_CXXFLAGS "-fno-unwind-tables") - list(APPEND LLVM_COMPILE_CXXFLAGS "-fno-asynchronous-unwind-tables") - endif() - elseif(MSVC) + if(MSVC) list(APPEND LLVM_COMPILE_DEFINITIONS _HAS_EXCEPTIONS=0) - list(APPEND LLVM_COMPILE_CXXFLAGS "/EHs-c-") - elseif (CMAKE_CXX_COMPILER_ID MATCHES "XL") - list(APPEND LLVM_COMPILE_CXXFLAGS "-qnoeh") endif() + list(APPEND LLVM_COMPILE_CXXFLAGS ${LLVM_CXXFLAGS_EH_DISABLE}) endif() # LLVM_REQUIRES_RTTI is an internal flag that individual diff --git a/llvm/tools/llvm-config/CMakeLists.txt b/llvm/tools/llvm-config/CMakeLists.txt index bf9a012ef5302..fc285b2ba156a 100644 --- a/llvm/tools/llvm-config/CMakeLists.txt +++ b/llvm/tools/llvm-config/CMakeLists.txt @@ -59,6 +59,11 @@ set(LLVM_CFLAGS "${LLVM_C_STD_FLAG} ${LLVM_DEFINITIONS}") # The language standard potentially affects the ABI/API of LLVM, so we want # to make sure it is reported by llvm-config. set(LLVM_CXXFLAGS "${CMAKE_CXX${CMAKE_CXX_STANDARD}_STANDARD_COMPILE_OPTION} ${LLVM_CXX_STDLIB_FLAG} ${LLVM_DEFINITIONS}") +if(LLVM_ENABLE_EH) + append(${LLVM_CXXFLAGS_EH_ENABLE} LLVM_CXXFLAGS) +else() + append(${LLVM_CXXFLAGS_EH_DISABLE} LLVM_CXXFLAGS) +endif() if(LLVM_ENABLE_RTTI) append(${LLVM_CXXFLAGS_RTTI_ENABLE} LLVM_CXXFLAGS) else()