blob: 52c796518ac0513df19ead00ad5cd656188fed7b [file] [log] [blame]
Tristan Rossabc2eae2024-07-25 15:18:141cmake_minimum_required(VERSION 3.20.0)
2
Michael Krusec5a3f6642024-05-25 15:15:373set(LLVM_SUBPROJECT_TITLE "BOLT")
4
Tristan Rossabc2eae2024-07-25 15:18:145if(NOT DEFINED LLVM_COMMON_CMAKE_UTILS)
6 set(LLVM_COMMON_CMAKE_UTILS ${CMAKE_CURRENT_SOURCE_DIR}/../cmake)
7endif()
8include(${LLVM_COMMON_CMAKE_UTILS}/Modules/CMakePolicy.cmake
9 NO_POLICY_SCOPE)
10
11if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
12 project(bolt)
13 set(BOLT_BUILT_STANDALONE TRUE)
14endif()
Rafael Auler62aa74f2019-07-24 21:03:4315
Rafael Auler8f717dd2018-06-22 20:50:0716set(BOLT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
17set(BOLT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
Kazu Hiratad3651aa2022-08-08 06:12:1618set(CMAKE_CXX_STANDARD 17)
Rafael Auler8f717dd2018-06-22 20:50:0719
Petr Hosekf3269a92023-05-26 22:11:2420# Add path for custom modules.
21list(INSERT CMAKE_MODULE_PATH 0 "${BOLT_SOURCE_DIR}/cmake/modules")
22
Tristan Rossabc2eae2024-07-25 15:18:1423include(GNUInstallDirs)
24
25# standalone build, copied from clang
26if(BOLT_BUILT_STANDALONE)
27 set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to")
28 set(CMAKE_CXX_STANDARD_REQUIRED YES)
29 set(CMAKE_CXX_EXTENSIONS NO)
30
31 if(NOT MSVC_IDE)
32 set(LLVM_ENABLE_ASSERTIONS ${ENABLE_ASSERTIONS}
33 CACHE BOOL "Enable assertions")
34 # Assertions should follow llvm-config's.
35 mark_as_advanced(LLVM_ENABLE_ASSERTIONS)
36 endif()
37
38 find_package(LLVM REQUIRED HINTS "${LLVM_CMAKE_DIR}")
39 list(APPEND CMAKE_MODULE_PATH "${LLVM_DIR}")
40
41 set(LLVM_MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../llvm" CACHE PATH "Path to LLVM source tree")
42 find_program(LLVM_TABLEGEN_EXE "llvm-tblgen" ${LLVM_TOOLS_BINARY_DIR}
43 NO_DEFAULT_PATH)
44
45 # They are used as destination of target generators.
46 set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin)
47 set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
48
49 include(AddLLVM)
50 include(TableGen)
51 include_directories(${LLVM_INCLUDE_DIRS})
52 link_directories("${LLVM_LIBRARY_DIR}")
53
54 set( CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_INSTALL_BINDIR}" )
55 set( CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_INSTALL_LIBDIR}/${LLVM_LIBDIR_SUFFIX}" )
56 set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_INSTALL_LIBDIR}/${LLVM_LIBDIR_SUFFIX}")
57endif() # standalone
58
Nathan Sidwellf84ac482023-04-20 19:22:1859# Determine default set of targets to build -- the intersection of
60# those BOLT supports and those LLVM is targeting.
Job Noormanf8730292023-06-16 09:49:1961set(BOLT_TARGETS_TO_BUILD_all "AArch64;X86;RISCV")
Nathan Sidwellf84ac482023-04-20 19:22:1862set(BOLT_TARGETS_TO_BUILD_default)
63foreach (tgt ${BOLT_TARGETS_TO_BUILD_all})
64 if (tgt IN_LIST LLVM_TARGETS_TO_BUILD)
65 list(APPEND BOLT_TARGETS_TO_BUILD_default ${tgt})
66 endif()
67endforeach()
68
69# Allow the user to specify the BOLT targets, and then check that LLVM
70# is indeed targeting those.
71set(BOLT_TARGETS_TO_BUILD "${BOLT_TARGETS_TO_BUILD_default}"
72 CACHE STRING "Targets for BOLT to support.")
73if (NOT BOLT_TARGETS_TO_BUILD)
74 message(FATAL_ERROR "BOLT enabled but BOLT_TARGETS_TO_BUILD is empty")
75endif()
76foreach (tgt ${BOLT_TARGETS_TO_BUILD})
77 if (NOT tgt IN_LIST LLVM_TARGETS_TO_BUILD)
78 message(FATAL_ERROR "BOLT target '${tgt}' is not in LLVM_TARGETS_TO_BUILD")
79 endif()
80 message(STATUS "Targeting ${tgt} in llvm-bolt")
81endforeach()
82
Nathan Sidwell06b80572023-04-19 20:08:2583set(BOLT_ENABLE_RUNTIME_default OFF)
Elvina Yakubova87e9c422023-08-24 09:39:1184if ((CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64"
wangjuedbb79c32025-04-17 06:01:0085 OR CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm64|aarch64)$"
86 OR CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64")
Nathan Sidwell06b80572023-04-19 20:08:2587 AND (CMAKE_SYSTEM_NAME STREQUAL "Linux"
Rafael Aulerb9deec12023-08-25 22:54:3988 OR CMAKE_SYSTEM_NAME STREQUAL "Darwin")
89 AND (NOT CMAKE_CROSSCOMPILING))
Nathan Sidwell06b80572023-04-19 20:08:2590 set(BOLT_ENABLE_RUNTIME_default ON)
91endif()
92option(BOLT_ENABLE_RUNTIME "Enable BOLT runtime" ${BOLT_ENABLE_RUNTIME_default})
93if (BOLT_ENABLE_RUNTIME)
94 # Some systems prevent reading /proc/self/map_files
95 execute_process(COMMAND ls /proc/self/map_files
96 RESULT_VARIABLE LS OUTPUT_QUIET ERROR_QUIET)
97 if (LS)
Nathan Sidwell06b80572023-04-19 20:08:2598 message(WARNING
Amir Ayupov1918d4b2024-03-20 23:00:1199 "BOLT runtime may not be able to read /proc/self/map_files. Please use
100 `--instrumentation-binpath <path-to-instrumented-binary>` option.")
Nathan Sidwell06b80572023-04-19 20:08:25101 endif()
Rafael Aulerb392ec62021-12-23 13:59:35102endif()
Rafael Auler62aa74f2019-07-24 21:03:43103
Amir Ayupovde3e3fc2022-01-14 22:18:43104set(BOLT_CLANG_EXE "" CACHE FILEPATH "Path to clang executable for the target \
105architecture for use in BOLT tests")
106set(BOLT_LLD_EXE "" CACHE FILEPATH "Path to lld executable for the target \
107architecture for use in BOLT tests")
108
Rafael Aulerb392ec62021-12-23 13:59:35109set(BOLT_INCLUDE_TESTS OFF)
110if (LLVM_INCLUDE_TESTS)
Amir Ayupov8634aa22022-04-23 16:16:53111 set(BOLT_CLANG_PRESENT OFF)
112 set(BOLT_LLD_PRESENT OFF)
113
114 if ("clang" IN_LIST LLVM_ENABLE_PROJECTS AND BOLT_CLANG_EXE)
115 message(WARNING "BOLT_CLANG_EXE is set and clang project is enabled. \
116 BOLT_CLANG_EXE will be used for BOLT tests.")
117 endif()
Amir Ayupovde3e3fc2022-01-14 22:18:43118 if ("clang" IN_LIST LLVM_ENABLE_PROJECTS OR BOLT_CLANG_EXE)
Amir Ayupov8634aa22022-04-23 16:16:53119 set(BOLT_CLANG_PRESENT ON)
120 endif()
121
122 if ("lld" IN_LIST LLVM_ENABLE_PROJECTS AND BOLT_LLD_EXE)
123 message(WARNING "BOLT_LLD_EXE is set and lld project is enabled. \
124 BOLT_LLD_EXE will be used for BOLT tests.")
125 endif()
126 if ("lld" IN_LIST LLVM_ENABLE_PROJECTS OR BOLT_LLD_EXE)
127 set(BOLT_LLD_PRESENT ON)
128 endif()
129
130 if (BOLT_CLANG_PRESENT AND BOLT_LLD_PRESENT)
131 set(BOLT_INCLUDE_TESTS ON)
Rafael Aulerb392ec62021-12-23 13:59:35132 else()
Amir Ayupov8634aa22022-04-23 16:16:53133 message(WARNING "Not including BOLT tests since clang or lld is disabled. \
134 Add clang and lld to LLVM_ENABLE_PROJECTS or provide paths to clang \
135 and lld binaries in BOLT_CLANG_EXE and BOLT_LLD_EXE.")
Rafael Auler0559dab2021-10-26 19:26:23136 endif()
Rafael Aulerb392ec62021-12-23 13:59:35137endif()
Rafael Aulera34c7532021-10-08 18:47:10138
Rafael Aulerb392ec62021-12-23 13:59:35139if (BOLT_ENABLE_RUNTIME)
alekuz0138faf322025-04-15 11:59:05140 message(STATUS "Building BOLT runtime libraries for ${CMAKE_SYSTEM_PROCESSOR}")
Petr Hosek9e6e3372023-05-17 05:41:42141 set(extra_args "")
142 if(CMAKE_SYSROOT)
143 list(APPEND extra_args -DCMAKE_SYSROOT=${CMAKE_SYSROOT})
144 endif()
Tristan Rossabc2eae2024-07-25 15:18:14145
146 include(ExternalProject)
Rafael Aulerb392ec62021-12-23 13:59:35147 ExternalProject_Add(bolt_rt
148 SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/runtime"
149 STAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/bolt_rt-stamps
150 BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/bolt_rt-bins
151 CMAKE_ARGS -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
152 -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
153 -DCMAKE_BUILD_TYPE=Release
154 -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
serge-sans-paillef71d32a2022-10-30 17:25:04155 -DLLVM_LIBDIR_SUFFIX=${LLVM_LIBDIR_SUFFIX}
Petr Hosek9e6e3372023-05-17 05:41:42156 -DLLVM_LIBRARY_DIR=${LLVM_LIBRARY_DIR}
Tristan Rossabc2eae2024-07-25 15:18:14157 -DBOLT_BUILT_STANDALONE=${BOLT_BUILT_STANDALONE}
Petr Hosek9e6e3372023-05-17 05:41:42158 ${extra_args}
159 INSTALL_COMMAND ""
Rafael Aulerb392ec62021-12-23 13:59:35160 BUILD_ALWAYS True
Rafael Aulerae585be2021-11-12 02:14:53161 )
Rafael Aulerb392ec62021-12-23 13:59:35162 install(CODE "execute_process\(COMMAND \${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=\${CMAKE_INSTALL_PREFIX} -P ${CMAKE_CURRENT_BINARY_DIR}/bolt_rt-bins/cmake_install.cmake \)"
163 COMPONENT bolt)
164 add_llvm_install_targets(install-bolt_rt
165 DEPENDS bolt_rt bolt
166 COMPONENT bolt)
Nikita Popov3c42a7742025-01-17 08:38:00167 set(LIBBOLT_RT_INSTR "${CMAKE_CURRENT_BINARY_DIR}/bolt_rt-bins/lib${LLVM_LIBDIR_SUFFIX}/libbolt_rt_instr.a")
168 set(LIBBOLT_RT_HUGIFY "${CMAKE_CURRENT_BINARY_DIR}/bolt_rt-bins/lib${LLVM_LIBDIR_SUFFIX}/libbolt_rt_hugify.a")
Rafael Aulerb392ec62021-12-23 13:59:35169endif()
Rafael Aulerae585be2021-11-12 02:14:53170
Vladislav Khmelevsky4956e0e2022-04-03 16:11:31171find_program(GNU_LD_EXECUTABLE NAMES ${LLVM_DEFAULT_TARGET_TRIPLE}-ld.bfd ld.bfd DOC "GNU ld")
172
Petr Hosekf3269a92023-05-26 22:11:24173include(AddBOLT)
174
175option(BOLT_BUILD_TOOLS
176 "Build the BOLT tools. If OFF, just generate build targets." ON)
177
178add_custom_target(bolt)
Michael Krusec5a3f6642024-05-25 15:15:37179set_target_properties(bolt PROPERTIES FOLDER "BOLT/Metatargets")
Petr Hosekf3269a92023-05-26 22:11:24180add_llvm_install_targets(install-bolt DEPENDS bolt COMPONENT bolt)
181
Rafael Aulerb392ec62021-12-23 13:59:35182include_directories(
183 ${CMAKE_CURRENT_SOURCE_DIR}/include
184 ${CMAKE_CURRENT_BINARY_DIR}/include
185 )
186
187add_subdirectory(lib)
188add_subdirectory(tools)
189
190if (BOLT_INCLUDE_TESTS)
Amir Ayupovdd8fd642022-11-15 22:44:32191 if (EXISTS ${LLVM_THIRD_PARTY_DIR}/unittest/googletest/include/gtest/gtest.h)
Vladislav Khmelevsky20e9d4c2022-01-26 20:45:46192 add_subdirectory(unittests)
193 list(APPEND BOLT_TEST_DEPS BoltUnitTests)
194 endif()
Rafael Aulerb392ec62021-12-23 13:59:35195 add_subdirectory(test)
196endif()
Amir Ayupovcd7a6302021-12-23 23:23:39197
198option(BOLT_INCLUDE_DOCS "Generate build targets for the BOLT docs."
199 ${LLVM_INCLUDE_DOCS})
200if (BOLT_INCLUDE_DOCS)
201 add_subdirectory(docs)
202endif()
serge-sans-paillef71d32a2022-10-30 17:25:04203
204configure_file(${CMAKE_CURRENT_SOURCE_DIR}/include/bolt/RuntimeLibs/RuntimeLibraryVariables.inc.in
205 ${CMAKE_CURRENT_BINARY_DIR}/include/bolt/RuntimeLibs/RuntimeLibraryVariables.inc @ONLY)
Nikita Popove235fcb2025-02-18 08:17:51206
207set(BOLT_ENUM_TARGETS "")
208foreach(t ${BOLT_TARGETS_TO_BUILD})
209 set(BOLT_ENUM_TARGETS "${BOLT_ENUM_TARGETS}BOLT_TARGET(${t})\n")
210endforeach(t)
211
212configure_file(${CMAKE_CURRENT_SOURCE_DIR}/include/bolt/Core/TargetConfig.def.in
213 ${CMAKE_CURRENT_BINARY_DIR}/include/bolt/Core/TargetConfig.def @ONLY)