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