[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.
This commit is contained in:
Nikita Popov 2026-01-16 09:33:25 +01:00 committed by GitHub
parent c30c2f4f3e
commit 9bbea753a4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 26 additions and 15 deletions

View File

@ -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

View File

@ -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()