brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.8 KiB · 002aaef Raw
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