215 lines · plain
1set( LLVM_LINK_COMPONENTS2 ${LLVM_TARGETS_TO_BUILD}3 Analysis4 CodeGen5 Core6 IPO7 AggressiveInstCombine8 InstCombine9 Instrumentation10 MC11 MCParser12 ObjCARCOpts13 Option14 ScalarOpts15 Support16 TargetParser17 TransformUtils18 Vectorize19 )20 21# Support plugins.22if(CLANG_PLUGIN_SUPPORT)23 set(support_plugins SUPPORT_PLUGINS)24endif()25 26set(CLANG_BOLT_ALLOWLIST INSTRUMENT PERF LBR)27set(CLANG_BOLT OFF CACHE STRING "Apply BOLT optimization to Clang. \28May be specified as one of ${CLANG_BOLT_ALLOWLIST} to use a particular profiling \29 mechanism.")30string(TOUPPER "${CLANG_BOLT}" CLANG_BOLT)31if (CLANG_BOLT AND NOT CLANG_BOLT IN_LIST CLANG_BOLT_ALLOWLIST)32 message(FATAL_ERROR "Specified CLANG_BOLT value '${CLANG_BOLT}' is not one of ${CLANG_BOLT_ALLOWLIST}.")33endif()34 35if (CLANG_BOLT AND NOT LLVM_BUILD_INSTRUMENTED)36 set(CLANG_BOLT_DEPS clear-bolt-fdata llvm-bolt llvm-readobj)37 if (NOT CLANG_BOLT STREQUAL "INSTRUMENT")38 list(APPEND CLANG_BOLT_DEPS clear-perf-data)39 endif()40endif()41 42add_clang_tool(clang43 driver.cpp44 cc1_main.cpp45 cc1as_main.cpp46 cc1gen_reproducer_main.cpp47 48 DEPENDS49 intrinsics_gen50 # These generated headers are included transitively.51 target_parser_gen52 ${support_plugins}53 ${CLANG_BOLT_DEPS}54 GENERATE_DRIVER55 )56 57setup_host_tool(clang CLANG clang_exe clang_target)58 59clang_target_link_libraries(clang60 PRIVATE61 clangBasic62 clangCodeGen63 clangDriver64 clangFrontend65 clangFrontendTool66 clangOptions67 clangSerialization68 )69 70if(WIN32 AND NOT CYGWIN)71 # Prevent versioning if the buildhost is targeting for Win32.72else()73 set_target_properties(clang PROPERTIES VERSION ${CLANG_EXECUTABLE_VERSION})74endif()75 76# Support plugins.77if(CLANG_PLUGIN_SUPPORT)78 export_executable_symbols_for_plugins(clang)79endif()80 81add_dependencies(clang clang-resource-headers)82 83if(NOT CLANG_LINKS_TO_CREATE)84 set(CLANG_LINKS_TO_CREATE clang++ clang-cl clang-cpp)85endif()86 87if (CLANG_ENABLE_HLSL)88 set(HLSL_LINK clang-dxc)89endif()90 91foreach(link ${CLANG_LINKS_TO_CREATE} ${HLSL_LINK})92 add_clang_symlink(${link} clang)93endforeach()94 95# Configure plist creation for OS X.96set (TOOL_INFO_PLIST "Info.plist" CACHE STRING "Plist name")97if (APPLE)98 if (CLANG_VENDOR)99 set(TOOL_INFO_NAME "${CLANG_VENDOR} clang")100 else()101 set(TOOL_INFO_NAME "clang")102 endif()103 104 set(TOOL_INFO_UTI "${CLANG_VENDOR_UTI}")105 set(TOOL_INFO_VERSION "${CLANG_VERSION}")106 set(TOOL_INFO_BUILD_VERSION "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}")107 108 set(TOOL_INFO_PLIST_OUT "${CMAKE_CURRENT_BINARY_DIR}/${TOOL_INFO_PLIST}")109 110 if(LLVM_TOOL_LLVM_DRIVER_BUILD AND clang IN_LIST LLVM_DRIVER_TOOLS)111 set(TARGET_NAME llvm-driver)112 else()113 set(TARGET_NAME clang)114 endif()115 116 target_link_libraries(${TARGET_NAME}117 PRIVATE118 "-Wl,-sectcreate,__TEXT,__info_plist,\"${TOOL_INFO_PLIST_OUT}\"")119 configure_file("${TOOL_INFO_PLIST}.in" "${TOOL_INFO_PLIST_OUT}" @ONLY)120 121 set(TOOL_INFO_UTI)122 set(TOOL_INFO_NAME)123 set(TOOL_INFO_VERSION)124 set(TOOL_INFO_BUILD_VERSION)125endif()126 127if(CLANG_ORDER_FILE AND128 (LLVM_LINKER_IS_APPLE OR LLVM_LINKER_IS_GOLD OR LLVM_LINKER_IS_LLD))129 include(CheckLinkerFlag)130 131 if (LLVM_LINKER_IS_APPLE OR (LLVM_LINKER_IS_LLD AND APPLE))132 set(LINKER_ORDER_FILE_OPTION "-Wl,-order_file,${CLANG_ORDER_FILE}")133 elseif (LLVM_LINKER_IS_GOLD)134 set(LINKER_ORDER_FILE_OPTION "-Wl,--section-ordering-file,${CLANG_ORDER_FILE}")135 elseif (LLVM_LINKER_IS_LLD)136 set(LINKER_ORDER_FILE_OPTION "-Wl,--symbol-ordering-file,${CLANG_ORDER_FILE}")137 endif()138 139 # This is a test to ensure the actual order file works with the linker.140 check_linker_flag(CXX ${LINKER_ORDER_FILE_OPTION} LINKER_ORDER_FILE_WORKS)141 142 # Passing an empty order file disables some linker layout optimizations.143 # To work around this and enable workflows for re-linking when the order file144 # changes we check during configuration if the file is empty, and make it a145 # configuration dependency.146 file(READ ${CLANG_ORDER_FILE} ORDER_FILE LIMIT 20)147 if("${ORDER_FILE}" STREQUAL "\n")148 set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${CLANG_ORDER_FILE})149 elseif(LINKER_ORDER_FILE_WORKS)150 target_link_libraries(clang PRIVATE ${LINKER_ORDER_FILE_OPTION})151 set_target_properties(clang PROPERTIES LINK_DEPENDS ${CLANG_ORDER_FILE})152 endif()153endif()154 155if (CLANG_BOLT AND NOT LLVM_BUILD_INSTRUMENTED)156 # Add a clang-bolt target for backwards compatibility.157 add_custom_target(clang-bolt DEPENDS clang)158 159 set(CLANG_BOLT_INSTRUMENTED "clang-bolt.inst" CACHE STRING160 "Name of BOLT-instrumented Clang binary")161 set(CLANG_INSTRUMENTED ${LLVM_RUNTIME_OUTPUT_INTDIR}/${CLANG_BOLT_INSTRUMENTED})162 set(PERF_TRAINING_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/../../utils/perf-training)163 set(BOLT_FDATA ${PERF_TRAINING_BINARY_DIR}/prof.fdata)164 get_llvm_lit_path(165 lit_base_dir166 lit_file_name167 ALLOW_EXTERNAL168 )169 set(LIT_COMMAND "${lit_base_dir}/${lit_file_name}")170 171 set(CLANG_BOLT_INPUTS $<TARGET_FILE:clang>)172 set(CLANG_INSTRUMENTED_OUTPUTS ${CLANG_INSTRUMENTED})173 174 # Add in dynamically linked libraries, if needs be. Currently only supported175 # on Linux because it relies on LD_PRELOAD for instrumentation.176 if (CMAKE_SYSTEM_NAME STREQUAL "Linux")177 if (CLANG_LINK_CLANG_DYLIB)178 set(CLANG_CPP_BOLT_INSTRUMENTED "clang-cxx-bolt.inst" CACHE STRING179 "Name of BOLT-instrumented Clang library")180 set(CLANG_CPP_INSTRUMENTED ${LLVM_RUNTIME_OUTPUT_INTDIR}/${CLANG_CPP_BOLT_INSTRUMENTED})181 list(APPEND CLANG_BOLT_INPUTS $<TARGET_FILE:clang-cpp>)182 list(APPEND CLANG_INSTRUMENTED_OUTPUTS ${CLANG_CPP_INSTRUMENTED})183 endif()184 if (LLVM_LINK_LLVM_DYLIB)185 set(LLVM_BOLT_INSTRUMENTED "LLVM-bolt.inst" CACHE STRING186 "Name of BOLT-instrumented LLVM library")187 set(LLVM_INSTRUMENTED ${LLVM_RUNTIME_OUTPUT_INTDIR}/${LLVM_BOLT_INSTRUMENTED})188 list(APPEND CLANG_BOLT_INPUTS $<TARGET_FILE:LLVM>)189 list(APPEND CLANG_INSTRUMENTED_OUTPUTS ${LLVM_INSTRUMENTED})190 endif()191 endif()192 193 # This POST_BUILD command is executed unconditionally even if the clang target194 # is already built. We need to wrap the whole bolt optimization process in195 # a single python wrapper, so that we can first check if the binary has196 # already been optimized and then exit early with a 0 status if it has.197 add_custom_command(198 TARGET clang POST_BUILD199 COMMAND "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/../../utils/perf-training/perf-helper.py200 bolt-optimize201 --method ${CLANG_BOLT}202 --input "${CLANG_BOLT_INPUTS}"203 --instrumented-output "${CLANG_INSTRUMENTED_OUTPUTS}"204 --fdata ${BOLT_FDATA}205 --perf-training-binary-dir ${PERF_TRAINING_BINARY_DIR}206 --readelf $<TARGET_FILE:llvm-readobj>207 --bolt $<TARGET_FILE:llvm-bolt>208 --lit "${LIT_COMMAND}"209 --merge-fdata $<TARGET_FILE:merge-fdata>210 COMMENT "Optimizing Clang with BOLT"211 USES_TERMINAL212 VERBATIM213 )214endif()215