-
Notifications
You must be signed in to change notification settings - Fork 13.3k
/
Copy pathCMakeLists.txt
214 lines (186 loc) · 6.83 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
set( LLVM_LINK_COMPONENTS
${LLVM_TARGETS_TO_BUILD}
Analysis
CodeGen
Core
IPO
AggressiveInstCombine
InstCombine
Instrumentation
MC
MCParser
ObjCARCOpts
Option
ScalarOpts
Support
TargetParser
TransformUtils
Vectorize
)
# Support plugins.
if(CLANG_PLUGIN_SUPPORT)
set(support_plugins SUPPORT_PLUGINS)
endif()
set(CLANG_BOLT_ALLOWLIST INSTRUMENT PERF LBR)
set(CLANG_BOLT OFF CACHE STRING "Apply BOLT optimization to Clang. \
May be specified as one of ${CLANG_BOLT_ALLOWLIST} to use a particular profiling \
mechanism.")
string(TOUPPER "${CLANG_BOLT}" CLANG_BOLT)
if (CLANG_BOLT AND NOT CLANG_BOLT IN_LIST CLANG_BOLT_ALLOWLIST)
message(FATAL_ERROR "Specified CLANG_BOLT value '${CLANG_BOLT}' is not one of ${CLANG_BOLT_ALLOWLIST}.")
endif()
if (CLANG_BOLT AND NOT LLVM_BUILD_INSTRUMENTED)
set(CLANG_BOLT_DEPS clear-bolt-fdata llvm-bolt llvm-readobj)
if (NOT CLANG_BOLT STREQUAL "INSTRUMENT")
list(APPEND CLANG_BOLT_DEPS clear-perf-data)
endif()
endif()
add_clang_tool(clang
driver.cpp
cc1_main.cpp
cc1as_main.cpp
cc1gen_reproducer_main.cpp
DEPENDS
intrinsics_gen
# These generated headers are included transitively.
ARMTargetParserTableGen
AArch64TargetParserTableGen
${support_plugins}
${CLANG_BOLT_DEPS}
GENERATE_DRIVER
)
setup_host_tool(clang CLANG clang_exe clang_target)
clang_target_link_libraries(clang
PRIVATE
clangBasic
clangCodeGen
clangDriver
clangFrontend
clangFrontendTool
clangSerialization
)
if(WIN32 AND NOT CYGWIN)
# Prevent versioning if the buildhost is targeting for Win32.
else()
set_target_properties(clang PROPERTIES VERSION ${CLANG_EXECUTABLE_VERSION})
endif()
# Support plugins.
if(CLANG_PLUGIN_SUPPORT)
export_executable_symbols_for_plugins(clang)
endif()
add_dependencies(clang clang-resource-headers)
if(NOT CLANG_LINKS_TO_CREATE)
set(CLANG_LINKS_TO_CREATE clang++ clang-cl clang-cpp)
endif()
if (CLANG_ENABLE_HLSL)
set(HLSL_LINK clang-dxc)
endif()
foreach(link ${CLANG_LINKS_TO_CREATE} ${HLSL_LINK})
add_clang_symlink(${link} clang)
endforeach()
# Configure plist creation for OS X.
set (TOOL_INFO_PLIST "Info.plist" CACHE STRING "Plist name")
if (APPLE)
if (CLANG_VENDOR)
set(TOOL_INFO_NAME "${CLANG_VENDOR} clang")
else()
set(TOOL_INFO_NAME "clang")
endif()
set(TOOL_INFO_UTI "${CLANG_VENDOR_UTI}")
set(TOOL_INFO_VERSION "${CLANG_VERSION}")
set(TOOL_INFO_BUILD_VERSION "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}")
set(TOOL_INFO_PLIST_OUT "${CMAKE_CURRENT_BINARY_DIR}/${TOOL_INFO_PLIST}")
if(LLVM_TOOL_LLVM_DRIVER_BUILD AND clang IN_LIST LLVM_DRIVER_TOOLS)
set(TARGET_NAME llvm-driver)
else()
set(TARGET_NAME clang)
endif()
target_link_libraries(${TARGET_NAME}
PRIVATE
"-Wl,-sectcreate,__TEXT,__info_plist,\"${TOOL_INFO_PLIST_OUT}\"")
configure_file("${TOOL_INFO_PLIST}.in" "${TOOL_INFO_PLIST_OUT}" @ONLY)
set(TOOL_INFO_UTI)
set(TOOL_INFO_NAME)
set(TOOL_INFO_VERSION)
set(TOOL_INFO_BUILD_VERSION)
endif()
if(CLANG_ORDER_FILE AND
(LLVM_LINKER_IS_APPLE OR LLVM_LINKER_IS_GOLD OR LLVM_LINKER_IS_LLD))
include(CheckLinkerFlag)
if (LLVM_LINKER_IS_APPLE OR (LLVM_LINKER_IS_LLD AND APPLE))
set(LINKER_ORDER_FILE_OPTION "-Wl,-order_file,${CLANG_ORDER_FILE}")
elseif (LLVM_LINKER_IS_GOLD)
set(LINKER_ORDER_FILE_OPTION "-Wl,--section-ordering-file,${CLANG_ORDER_FILE}")
elseif (LLVM_LINKER_IS_LLD)
set(LINKER_ORDER_FILE_OPTION "-Wl,--symbol-ordering-file,${CLANG_ORDER_FILE}")
endif()
# This is a test to ensure the actual order file works with the linker.
check_linker_flag(CXX ${LINKER_ORDER_FILE_OPTION} LINKER_ORDER_FILE_WORKS)
# Passing an empty order file disables some linker layout optimizations.
# To work around this and enable workflows for re-linking when the order file
# changes we check during configuration if the file is empty, and make it a
# configuration dependency.
file(READ ${CLANG_ORDER_FILE} ORDER_FILE LIMIT 20)
if("${ORDER_FILE}" STREQUAL "\n")
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${CLANG_ORDER_FILE})
elseif(LINKER_ORDER_FILE_WORKS)
target_link_libraries(clang PRIVATE ${LINKER_ORDER_FILE_OPTION})
set_target_properties(clang PROPERTIES LINK_DEPENDS ${CLANG_ORDER_FILE})
endif()
endif()
if (CLANG_BOLT AND NOT LLVM_BUILD_INSTRUMENTED)
# Add a clang-bolt target for backwards compatibility.
add_custom_target(clang-bolt DEPENDS clang)
set(CLANG_BOLT_INSTRUMENTED "clang-bolt.inst" CACHE STRING
"Name of BOLT-instrumented Clang binary")
set(CLANG_INSTRUMENTED ${LLVM_RUNTIME_OUTPUT_INTDIR}/${CLANG_BOLT_INSTRUMENTED})
set(PERF_TRAINING_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/../../utils/perf-training)
set(BOLT_FDATA ${PERF_TRAINING_BINARY_DIR}/prof.fdata)
get_llvm_lit_path(
lit_base_dir
lit_file_name
ALLOW_EXTERNAL
)
set(LIT_COMMAND "${lit_base_dir}/${lit_file_name}")
set(CLANG_BOLT_INPUTS $<TARGET_FILE:clang>)
set(CLANG_INSTRUMENTED_OUTPUTS ${CLANG_INSTRUMENTED})
# Add in dynamically linked libraries, if needs be. Currently only supported
# on Linux because it relies on LD_PRELOAD for instrumentation.
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
if (CLANG_LINK_CLANG_DYLIB)
set(CLANG_CPP_BOLT_INSTRUMENTED "clang-cxx-bolt.inst" CACHE STRING
"Name of BOLT-instrumented Clang library")
set(CLANG_CPP_INSTRUMENTED ${LLVM_RUNTIME_OUTPUT_INTDIR}/${CLANG_CPP_BOLT_INSTRUMENTED})
list(APPEND CLANG_BOLT_INPUTS $<TARGET_FILE:clang-cpp>)
list(APPEND CLANG_INSTRUMENTED_OUTPUTS ${CLANG_CPP_INSTRUMENTED})
endif()
if (LLVM_LINK_LLVM_DYLIB)
set(LLVM_BOLT_INSTRUMENTED "LLVM-bolt.inst" CACHE STRING
"Name of BOLT-instrumented LLVM library")
set(LLVM_INSTRUMENTED ${LLVM_RUNTIME_OUTPUT_INTDIR}/${LLVM_BOLT_INSTRUMENTED})
list(APPEND CLANG_BOLT_INPUTS $<TARGET_FILE:LLVM>)
list(APPEND CLANG_INSTRUMENTED_OUTPUTS ${LLVM_INSTRUMENTED})
endif()
endif()
# This POST_BUILD command is executed unconditionally even if the clang target
# is already built. We need to wrap the whole bolt optimization process in
# a single python wrapper, so that we can first check if the binary has
# already been optimized and then exit early with a 0 status if it has.
add_custom_command(
TARGET clang POST_BUILD
COMMAND "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/../../utils/perf-training/perf-helper.py
bolt-optimize
--method ${CLANG_BOLT}
--input "${CLANG_BOLT_INPUTS}"
--instrumented-output "${CLANG_INSTRUMENTED_OUTPUTS}"
--fdata ${BOLT_FDATA}
--perf-training-binary-dir ${PERF_TRAINING_BINARY_DIR}
--readelf $<TARGET_FILE:llvm-readobj>
--bolt $<TARGET_FILE:llvm-bolt>
--lit "${LIT_COMMAND}"
--merge-fdata $<TARGET_FILE:merge-fdata>
COMMENT "Optimizing Clang with BOLT"
USES_TERMINAL
VERBATIM
)
endif()