diff --git a/bolt/CMakeLists.txt b/bolt/CMakeLists.txt --- a/bolt/CMakeLists.txt +++ b/bolt/CMakeLists.txt @@ -4,11 +4,35 @@ set(BOLT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) set(CMAKE_CXX_STANDARD 17) +# Determine default set of targets to build -- the intersection of +# those BOLT supports and those LLVM is targeting. +set(BOLT_TARGETS_TO_BUILD_all "AArch64;X86") +set(BOLT_TARGETS_TO_BUILD_default) +foreach (tgt ${BOLT_TARGETS_TO_BUILD_all}) + if (tgt IN_LIST LLVM_TARGETS_TO_BUILD) + list(APPEND BOLT_TARGETS_TO_BUILD_default ${tgt}) + endif() +endforeach() + +# Allow the user to specify the BOLT targets, and then check that LLVM +# is indeed targeting those. +set(BOLT_TARGETS_TO_BUILD "${BOLT_TARGETS_TO_BUILD_default}" + CACHE STRING "Targets for BOLT to support.") +if (NOT BOLT_TARGETS_TO_BUILD) + message(FATAL_ERROR "BOLT enabled but BOLT_TARGETS_TO_BUILD is empty") +endif() +foreach (tgt ${BOLT_TARGETS_TO_BUILD}) + if (NOT tgt IN_LIST LLVM_TARGETS_TO_BUILD) + message(FATAL_ERROR "BOLT target '${tgt}' is not in LLVM_TARGETS_TO_BUILD") + endif() + message(STATUS "Targeting ${tgt} in llvm-bolt") +endforeach() + set(BOLT_ENABLE_RUNTIME_default OFF) if (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" AND (CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Darwin") - AND "X86" IN_LIST LLVM_TARGETS_TO_BUILD) + AND "X86" IN_LIST BOLT_TARGETS_TO_BUILD) set(BOLT_ENABLE_RUNTIME_default ON) endif() option(BOLT_ENABLE_RUNTIME "Enable BOLT runtime" ${BOLT_ENABLE_RUNTIME_default}) diff --git a/bolt/lib/Rewrite/CMakeLists.txt b/bolt/lib/Rewrite/CMakeLists.txt --- a/bolt/lib/Rewrite/CMakeLists.txt +++ b/bolt/lib/Rewrite/CMakeLists.txt @@ -8,24 +8,6 @@ TargetParser ) -set(TARGET_LINK_LIBRARIES - LLVMBOLTCore - LLVMBOLTPasses - LLVMBOLTProfile - LLVMBOLTRuntimeLibs - LLVMBOLTUtils - ) - -if ("AArch64" IN_LIST LLVM_TARGETS_TO_BUILD) - list(APPEND TARGET_LINK_LIBRARIES LLVMBOLTTargetAArch64) - set(BOLT_AArch64 On) -endif() - -if ("X86" IN_LIST LLVM_TARGETS_TO_BUILD) - list(APPEND TARGET_LINK_LIBRARIES LLVMBOLTTargetX86) - set(BOLT_X64 On) -endif() - add_llvm_library(LLVMBOLTRewrite BinaryPassManager.cpp BoltDiff.cpp @@ -42,13 +24,15 @@ target_link_libraries(LLVMBOLTRewrite PRIVATE - ${TARGET_LINK_LIBRARIES} + LLVMBOLTCore + LLVMBOLTPasses + LLVMBOLTProfile + LLVMBOLTRuntimeLibs + LLVMBOLTUtils ) -if (DEFINED BOLT_AArch64) - target_compile_definitions(LLVMBOLTRewrite PRIVATE AARCH64_AVAILABLE) -endif() - -if (DEFINED BOLT_X64) - target_compile_definitions(LLVMBOLTRewrite PRIVATE X86_AVAILABLE) -endif() +foreach (tgt ${BOLT_TARGETS_TO_BUILD}) + target_link_libraries(LLVMBOLTRewrite PRIVATE LLVMBOLTTarget${tgt}) + string(TOUPPER "${tgt}" upper) + target_compile_definitions(LLVMBOLTRewrite PRIVATE ${upper}_AVAILABLE) +endforeach() diff --git a/bolt/lib/Target/CMakeLists.txt b/bolt/lib/Target/CMakeLists.txt --- a/bolt/lib/Target/CMakeLists.txt +++ b/bolt/lib/Target/CMakeLists.txt @@ -1,9 +1,3 @@ -if ("X86" IN_LIST LLVM_TARGETS_TO_BUILD) - message(STATUS "Targeting X86 in llvm-bolt") - add_subdirectory(X86) -endif() - -if ("AArch64" IN_LIST LLVM_TARGETS_TO_BUILD) - message(STATUS "Targeting AArch64 in llvm-bolt") - add_subdirectory(AArch64) -endif() +foreach (tgt ${BOLT_TARGETS_TO_BUILD}) + add_subdirectory(${tgt}) +endforeach() diff --git a/bolt/test/lit.site.cfg.py.in b/bolt/test/lit.site.cfg.py.in --- a/bolt/test/lit.site.cfg.py.in +++ b/bolt/test/lit.site.cfg.py.in @@ -17,7 +17,7 @@ config.python_executable = "@Python3_EXECUTABLE@" config.bolt_clang = "@BOLT_CLANG_EXE@" config.bolt_lld = "@BOLT_LLD_EXE@" -config.targets_to_build = "@TARGETS_TO_BUILD@" +config.targets_to_build = "@BOLT_TARGETS_TO_BUILD@" config.gnu_ld = "@GNU_LD_EXECUTABLE@" import lit.llvm diff --git a/bolt/unittests/Core/CMakeLists.txt b/bolt/unittests/Core/CMakeLists.txt --- a/bolt/unittests/Core/CMakeLists.txt +++ b/bolt/unittests/Core/CMakeLists.txt @@ -19,20 +19,11 @@ LLVMBOLTRewrite ) -if ("AArch64" IN_LIST LLVM_TARGETS_TO_BUILD) +foreach (tgt ${BOLT_TARGETS_TO_BUILD}) include_directories( - ${LLVM_MAIN_SRC_DIR}/lib/Target/AArch64 - ${LLVM_BINARY_DIR}/lib/Target/AArch64 + ${LLVM_MAIN_SRC_DIR}/lib/Target/${tgt} + ${LLVM_BINARY_DIR}/lib/Target/${tgt} ) - - target_compile_definitions(CoreTests PRIVATE AARCH64_AVAILABLE) -endif() - -if ("X86" IN_LIST LLVM_TARGETS_TO_BUILD) - include_directories( - ${LLVM_MAIN_SRC_DIR}/lib/Target/X86 - ${LLVM_BINARY_DIR}/lib/Target/X86 - ) - - target_compile_definitions(CoreTests PRIVATE X86_AVAILABLE) -endif() + string(TOUPPER "${tgt}" upper) + target_compile_definitions(CoreTests PRIVATE "${upper}_AVAILABLE") +endforeach()