diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake index 18c0ac7015efa..d6acb4f984be9 100644 --- a/llvm/cmake/modules/AddLLVM.cmake +++ b/llvm/cmake/modules/AddLLVM.cmake @@ -51,19 +51,13 @@ function(llvm_update_compile_flags name) # LLVM_REQUIRES_RTTI is an internal flag that individual # targets can use to force RTTI - set(LLVM_CONFIG_HAS_RTTI YES CACHE INTERNAL "") if(NOT (LLVM_REQUIRES_RTTI OR LLVM_ENABLE_RTTI)) - set(LLVM_CONFIG_HAS_RTTI NO CACHE INTERNAL "") + # TODO: GTEST_HAS_RTTI should be determined automatically, evaluate whether + # the explicit definition is actually required. list(APPEND LLVM_COMPILE_DEFINITIONS GTEST_HAS_RTTI=0) - if (LLVM_COMPILER_IS_GCC_COMPATIBLE) - list(APPEND LLVM_COMPILE_CXXFLAGS "-fno-rtti") - elseif (MSVC) - list(APPEND LLVM_COMPILE_CXXFLAGS "/GR-") - elseif (CMAKE_CXX_COMPILER_ID MATCHES "XL") - list(APPEND LLVM_COMPILE_CXXFLAGS "-qnortti") - endif () - elseif(MSVC) - list(APPEND LLVM_COMPILE_CXXFLAGS "/GR") + list(APPEND LLVM_COMPILE_CXXFLAGS ${LLVM_CXXFLAGS_RTTI_DISABLE}) + else() + list(APPEND LLVM_COMPILE_CXXFLAGS ${LLVM_CXXFLAGS_RTTI_ENABLE}) endif() target_compile_options(${name} PRIVATE ${LLVM_COMPILE_FLAGS} $<$:${LLVM_COMPILE_CXXFLAGS}>) diff --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake index 575286e9987e1..fa30ac8992a25 100644 --- a/llvm/cmake/modules/HandleLLVMOptions.cmake +++ b/llvm/cmake/modules/HandleLLVMOptions.cmake @@ -1162,13 +1162,22 @@ elseif(MSVC) endif() endif() -if(MSVC) +# llvm_update_compile_flags adds one of these to each target. +set(LLVM_CXXFLAGS_RTTI_DISABLE "") +set(LLVM_CXXFLAGS_RTTI_ENABLE "") +if(LLVM_COMPILER_IS_GCC_COMPATIBLE) + set(LLVM_CXXFLAGS_RTTI_DISABLE "-fno-rtti") +elseif(MSVC) # Remove flags here, for exceptions and RTTI. # Each target property or source property should be responsible to control # them. # CL.EXE complains to override flags like "/GR /GR-". - string(REGEX REPLACE "(^| ) */EH[-cs]+ *( |$)" "\\1 \\2" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - string(REGEX REPLACE "(^| ) */GR-? *( |$)" "\\1 \\2" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + string(REGEX REPLACE "(^| ) */EH[-cs]+ *( |$)" "\\1 \\2" CMAKE_CXXFLAGS "${CMAKE_CXX_FLAGS}") + string(REGEX REPLACE "(^| ) */GR-? *( |$)" "\\1 \\2" CMAKE_CXXFLAGS "${CMAKE_CXX_FLAGS}") + set(LLVM_CXXFLAGS_RTTI_DISABLE "/GR-") + set(LLVM_CXXFLAGS_RTTI_ENABLE "/GR") +elseif(CMAKE_CXXCOMPILER_ID MATCHES "XL") + set(LLVM_CXXFLAGS_RTTI_DISABLE "-qnortti") endif() # Provide public options to globally control RTTI and EH diff --git a/llvm/tools/llvm-config/CMakeLists.txt b/llvm/tools/llvm-config/CMakeLists.txt index 3a8f40b9c6fea..bf9a012ef5302 100644 --- a/llvm/tools/llvm-config/CMakeLists.txt +++ b/llvm/tools/llvm-config/CMakeLists.txt @@ -45,9 +45,6 @@ endforeach() string(REPLACE ";" " " SYSTEM_LIBS "${SYSTEM_LIBS}") -# Fetch target specific compile options, e.g. RTTI option -get_property(COMPILE_FLAGS TARGET llvm-config PROPERTY COMPILE_FLAGS) - # NOTE: We don't want to start extracting any random C/CXX flags that the # user may add that could affect the ABI. We only want to extract flags # that have been added by the LLVM build system. @@ -61,9 +58,14 @@ set(LLVM_CPPFLAGS "${LLVM_DEFINITIONS}") 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} ${COMPILE_FLAGS} ${LLVM_DEFINITIONS}") +set(LLVM_CXXFLAGS "${CMAKE_CXX${CMAKE_CXX_STANDARD}_STANDARD_COMPILE_OPTION} ${LLVM_CXX_STDLIB_FLAG} ${LLVM_DEFINITIONS}") +if(LLVM_ENABLE_RTTI) + append(${LLVM_CXXFLAGS_RTTI_ENABLE} LLVM_CXXFLAGS) +else() + append(${LLVM_CXXFLAGS_RTTI_DISABLE} LLVM_CXXFLAGS) +endif() set(LLVM_BUILD_SYSTEM cmake) -set(LLVM_HAS_RTTI ${LLVM_CONFIG_HAS_RTTI}) +set(LLVM_HAS_RTTI ${LLVM_ENABLE_RTTI}) set(LLVM_DYLIB_VERSION "${LLVM_VERSION_MAJOR}${LLVM_VERSION_SUFFIX}") set(LLVM_SHARED_LIBRARY_PREFIX "${CMAKE_SHARED_LIBRARY_PREFIX}")