blob: 04db160b64b05869b7a1f6ed6a6d0d4e33bcc9ec [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"
Vladislav Khmelevsky25acc162024-08-07 12:23:5785 OR CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm64|aarch64)$")
Nathan Sidwell06b80572023-04-19 20:08:2586 AND (CMAKE_SYSTEM_NAME STREQUAL "Linux"
Rafael Aulerb9deec12023-08-25 22:54:3987 OR CMAKE_SYSTEM_NAME STREQUAL "Darwin")
88 AND (NOT CMAKE_CROSSCOMPILING))
Nathan Sidwell06b80572023-04-19 20:08:2589 set(BOLT_ENABLE_RUNTIME_default ON)
90endif()
91option(BOLT_ENABLE_RUNTIME "Enable BOLT runtime" ${BOLT_ENABLE_RUNTIME_default})
92if (BOLT_ENABLE_RUNTIME)
93 # Some systems prevent reading /proc/self/map_files
94 execute_process(COMMAND ls /proc/self/map_files
95 RESULT_VARIABLE LS OUTPUT_QUIET ERROR_QUIET)
96 if (LS)
Nathan Sidwell06b80572023-04-19 20:08:2597 message(WARNING
Amir Ayupov1918d4b2024-03-20 23:00:1198 "BOLT runtime may not be able to read /proc/self/map_files. Please use
99 `--instrumentation-binpath <path-to-instrumented-binary>` option.")
Nathan Sidwell06b80572023-04-19 20:08:25100 endif()
Rafael Aulerb392ec62021-12-23 13:59:35101endif()
Rafael Auler62aa74f2019-07-24 21:03:43102
Amir Ayupovde3e3fc2022-01-14 22:18:43103set(BOLT_CLANG_EXE "" CACHE FILEPATH "Path to clang executable for the target \
104architecture for use in BOLT tests")
105set(BOLT_LLD_EXE "" CACHE FILEPATH "Path to lld executable for the target \
106architecture for use in BOLT tests")
107
Rafael Aulerb392ec62021-12-23 13:59:35108set(BOLT_INCLUDE_TESTS OFF)
109if (LLVM_INCLUDE_TESTS)
Amir Ayupov8634aa22022-04-23 16:16:53110 set(BOLT_CLANG_PRESENT OFF)
111 set(BOLT_LLD_PRESENT OFF)
112
113 if ("clang" IN_LIST LLVM_ENABLE_PROJECTS AND BOLT_CLANG_EXE)
114 message(WARNING "BOLT_CLANG_EXE is set and clang project is enabled. \
115 BOLT_CLANG_EXE will be used for BOLT tests.")
116 endif()
Amir Ayupovde3e3fc2022-01-14 22:18:43117 if ("clang" IN_LIST LLVM_ENABLE_PROJECTS OR BOLT_CLANG_EXE)
Amir Ayupov8634aa22022-04-23 16:16:53118 set(BOLT_CLANG_PRESENT ON)
119 endif()
120
121 if ("lld" IN_LIST LLVM_ENABLE_PROJECTS AND BOLT_LLD_EXE)
122 message(WARNING "BOLT_LLD_EXE is set and lld project is enabled. \
123 BOLT_LLD_EXE will be used for BOLT tests.")
124 endif()
125 if ("lld" IN_LIST LLVM_ENABLE_PROJECTS OR BOLT_LLD_EXE)
126 set(BOLT_LLD_PRESENT ON)
127 endif()
128
129 if (BOLT_CLANG_PRESENT AND BOLT_LLD_PRESENT)
130 set(BOLT_INCLUDE_TESTS ON)
Rafael Aulerb392ec62021-12-23 13:59:35131 else()
Amir Ayupov8634aa22022-04-23 16:16:53132 message(WARNING "Not including BOLT tests since clang or lld is disabled. \
133 Add clang and lld to LLVM_ENABLE_PROJECTS or provide paths to clang \
134 and lld binaries in BOLT_CLANG_EXE and BOLT_LLD_EXE.")
Rafael Auler0559dab2021-10-26 19:26:23135 endif()
Rafael Aulerb392ec62021-12-23 13:59:35136endif()
Rafael Aulera34c7532021-10-08 18:47:10137
Rafael Aulerb392ec62021-12-23 13:59:35138if (BOLT_ENABLE_RUNTIME)
139 message(STATUS "Building BOLT runtime libraries for X86")
Petr Hosek9e6e3372023-05-17 05:41:42140 set(extra_args "")
141 if(CMAKE_SYSROOT)
142 list(APPEND extra_args -DCMAKE_SYSROOT=${CMAKE_SYSROOT})
143 endif()
Tristan Rossabc2eae2024-07-25 15:18:14144
145 include(ExternalProject)
Rafael Aulerb392ec62021-12-23 13:59:35146 ExternalProject_Add(bolt_rt
147 SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/runtime"
148 STAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/bolt_rt-stamps
149 BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/bolt_rt-bins
150 CMAKE_ARGS -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
151 -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
152 -DCMAKE_BUILD_TYPE=Release
153 -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
serge-sans-paillef71d32a2022-10-30 17:25:04154 -DLLVM_LIBDIR_SUFFIX=${LLVM_LIBDIR_SUFFIX}
Petr Hosek9e6e3372023-05-17 05:41:42155 -DLLVM_LIBRARY_DIR=${LLVM_LIBRARY_DIR}
Tristan Rossabc2eae2024-07-25 15:18:14156 -DBOLT_BUILT_STANDALONE=${BOLT_BUILT_STANDALONE}
Petr Hosek9e6e3372023-05-17 05:41:42157 ${extra_args}
158 INSTALL_COMMAND ""
Rafael Aulerb392ec62021-12-23 13:59:35159 BUILD_ALWAYS True
Rafael Aulerae585be2021-11-12 02:14:53160 )
Rafael Aulerb392ec62021-12-23 13:59:35161 install(CODE "execute_process\(COMMAND \${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=\${CMAKE_INSTALL_PREFIX} -P ${CMAKE_CURRENT_BINARY_DIR}/bolt_rt-bins/cmake_install.cmake \)"
162 COMPONENT bolt)
163 add_llvm_install_targets(install-bolt_rt
164 DEPENDS bolt_rt bolt
165 COMPONENT bolt)
Nikita Popov3c42a7742025-01-17 08:38:00166 set(LIBBOLT_RT_INSTR "${CMAKE_CURRENT_BINARY_DIR}/bolt_rt-bins/lib${LLVM_LIBDIR_SUFFIX}/libbolt_rt_instr.a")
167 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:35168endif()
Rafael Aulerae585be2021-11-12 02:14:53169
Vladislav Khmelevsky4956e0e2022-04-03 16:11:31170find_program(GNU_LD_EXECUTABLE NAMES ${LLVM_DEFAULT_TARGET_TRIPLE}-ld.bfd ld.bfd DOC "GNU ld")
171
Petr Hosekf3269a92023-05-26 22:11:24172include(AddBOLT)
173
174option(BOLT_BUILD_TOOLS
175 "Build the BOLT tools. If OFF, just generate build targets." ON)
176
177add_custom_target(bolt)
Michael Krusec5a3f6642024-05-25 15:15:37178set_target_properties(bolt PROPERTIES FOLDER "BOLT/Metatargets")
Petr Hosekf3269a92023-05-26 22:11:24179add_llvm_install_targets(install-bolt DEPENDS bolt COMPONENT bolt)
180
Rafael Aulerb392ec62021-12-23 13:59:35181include_directories(
182 ${CMAKE_CURRENT_SOURCE_DIR}/include
183 ${CMAKE_CURRENT_BINARY_DIR}/include
184 )
185
186add_subdirectory(lib)
187add_subdirectory(tools)
188
189if (BOLT_INCLUDE_TESTS)
Amir Ayupovdd8fd642022-11-15 22:44:32190 if (EXISTS ${LLVM_THIRD_PARTY_DIR}/unittest/googletest/include/gtest/gtest.h)
Vladislav Khmelevsky20e9d4c2022-01-26 20:45:46191 add_subdirectory(unittests)
192 list(APPEND BOLT_TEST_DEPS BoltUnitTests)
193 endif()
Rafael Aulerb392ec62021-12-23 13:59:35194 add_subdirectory(test)
195endif()
Amir Ayupovcd7a6302021-12-23 23:23:39196
197option(BOLT_INCLUDE_DOCS "Generate build targets for the BOLT docs."
198 ${LLVM_INCLUDE_DOCS})
199if (BOLT_INCLUDE_DOCS)
200 add_subdirectory(docs)
201endif()
serge-sans-paillef71d32a2022-10-30 17:25:04202
203configure_file(${CMAKE_CURRENT_SOURCE_DIR}/include/bolt/RuntimeLibs/RuntimeLibraryVariables.inc.in
204 ${CMAKE_CURRENT_BINARY_DIR}/include/bolt/RuntimeLibs/RuntimeLibraryVariables.inc @ONLY)