diff --git a/llvm/cmake/config-ix.cmake b/llvm/cmake/config-ix.cmake index f01d85ece66205..df7c43b701c3ec 100644 --- a/llvm/cmake/config-ix.cmake +++ b/llvm/cmake/config-ix.cmake @@ -12,6 +12,7 @@ include(CheckCCompilerFlag) include(CMakePushCheckState) include(CheckCompilerVersion) +include(CheckProblematicConfigurations) include(HandleLLVMStdlib) if( UNIX AND NOT (APPLE OR BEOS OR HAIKU) ) diff --git a/llvm/cmake/modules/CheckProblematicConfigurations.cmake b/llvm/cmake/modules/CheckProblematicConfigurations.cmake new file mode 100644 index 00000000000000..e133873d756c13 --- /dev/null +++ b/llvm/cmake/modules/CheckProblematicConfigurations.cmake @@ -0,0 +1,19 @@ + +option(LLVM_ALLOW_PROBLEMATIC_CONFIGURATIONS OFF "Set this option to ON to allow problematic toolchain configurations. Use on your own risk.") + +macro(log_problematic MESSAGE) + if(LLVM_ALLOW_PROBLEMATIC_CONFIGURATIONS) + message(WARNING "${MESSAGE}") + else() + message(FATAL_ERROR "${MESSAGE}\nYou can force usage of this configuration by passing -DLLVM_ALLOW_PROBLEMATIC_CONFIGURATIONS=ON") + endif() +endmacro() + +# MSVC and /arch:AVX is untested and have created problems before. See: +# https://github.com/llvm/llvm-project/issues/54645 +if(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC) + string(TOLOWER "${CMAKE_CXX_FLAGS} ${CMAKE_C_FLAGS}" _FLAGS) + if(_FLAGS MATCHES "/arch:avx[0-9]*") + log_problematic("Compiling LLVM with MSVC and the /arch:AVX flag is known to cause issues with parts of LLVM.\nSee https://github.com/llvm/llvm-project/issues/54645 for details.\nUse clang-cl if you want to enable AVX instructions.") + endif() +endif() diff --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake index ef05cc48ce5fe0..5baa42fec3f909 100644 --- a/llvm/cmake/modules/HandleLLVMOptions.cmake +++ b/llvm/cmake/modules/HandleLLVMOptions.cmake @@ -7,6 +7,7 @@ string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE) include(CheckCompilerVersion) +include(CheckProblematicConfigurations) include(HandleLLVMStdlib) include(CheckCCompilerFlag) include(CheckCXXCompilerFlag)