138 lines · plain
1include(LLVMExternalProjectUtils)2 3set(CLANG_PGO_TRAINING_DATA "${CMAKE_CURRENT_SOURCE_DIR}" CACHE PATH4 "The path to a lit testsuite containing samples for PGO and order file generation"5 )6set(CLANG_PGO_TRAINING_DATA_SOURCE_DIR OFF CACHE STRING "Path to source directory containing cmake project with source files to use for generating pgo data")7set(CLANG_PGO_TRAINING_DEPS "" CACHE STRING "Extra dependencies needed to build the PGO training data.")8 9add_custom_target(clear-perf-data10 COMMAND "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py clean ${CMAKE_CURRENT_BINARY_DIR} perf.data11 COMMENT "Clearing old perf data")12 13option(CLANG_PGO_TRAINING_USE_LLVM_BUILD "Use LLVM build for generating PGO data" ON)14 15llvm_canonicalize_cmake_booleans(16 CLANG_PGO_TRAINING_USE_LLVM_BUILD17)18 19if(LLVM_BUILD_INSTRUMENTED)20 configure_lit_site_cfg(21 ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in22 ${CMAKE_CURRENT_BINARY_DIR}/pgo-data/lit.site.cfg23 )24 25 add_lit_testsuite(generate-profraw "Generating clang PGO data"26 ${CMAKE_CURRENT_BINARY_DIR}/pgo-data/27 EXCLUDE_FROM_CHECK_ALL28 DEPENDS clear-profraw clang29 )30 31 add_custom_target(clear-profraw32 COMMAND "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py clean ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_BINARY_DIR}/profiles/ profraw33 COMMENT "Clearing old profraw data")34 35 if(NOT LLVM_PROFDATA)36 find_program(LLVM_PROFDATA llvm-profdata)37 endif()38 39 if(NOT LLVM_PROFDATA)40 message(STATUS "To enable merging PGO data LLVM_PROFDATA has to point to llvm-profdata")41 else()42 add_custom_command(43 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/clang.profdata44 # generate-profraw is a custom_target which are always considered stale.45 # If we add it here to 'DEPENDS', then it will always execute and running46 # ninja install && ninja check-all will result in the profile data being47 # generated twice, and cause the ninja check-all build to fail with errors like:48 # `ld.lld: error: Function Import: link error: linking module flags 'ProfileSummary': IDs have conflicting values in`49 # Therefor we call the generate-profraw target manually as part of this custom50 # command, which will only run if clang or ${CLANG_PGO_TRAINING_DEPS} are updated.51 COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target generate-profraw52 COMMAND "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py merge ${LLVM_PROFDATA} ${CMAKE_CURRENT_BINARY_DIR}/clang.profdata ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_BINARY_DIR}/profiles/53 COMMENT "Merging profdata"54 DEPENDS clang ${CLANG_PGO_TRAINING_DEPS}55 )56 add_custom_target(generate-profdata DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/clang.profdata)57 if (CLANG_PGO_TRAINING_DATA_SOURCE_DIR)58 llvm_ExternalProject_Add(generate-profraw-external ${CLANG_PGO_TRAINING_DATA_SOURCE_DIR}59 USE_TOOLCHAIN EXLUDE_FROM_ALL NO_INSTALL DEPENDS generate-profraw)60 add_dependencies(generate-profdata generate-profraw-external)61 endif()62 63 if(NOT LLVM_PROFGEN)64 find_program(LLVM_PROFGEN llvm-profgen)65 endif()66 67 if(NOT LLVM_PROFGEN)68 message(STATUS "To enable converting CSSPGO samples LLVM_PROFGEN has to point to llvm-profgen")69 elseif(NOT CLANG_PGO_TRAINING_DATA_SOURCE_DIR)70 message(STATUS "CLANG_PGO_TRAINING_DATA_SOURCE_DIR must be set to collect CSSPGO samples")71 else()72 set(PERF_HELPER "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py)73 set(CLANG_SPROFDATA ${CMAKE_CURRENT_BINARY_DIR}/clang.sprofdata)74 add_custom_command(75 OUTPUT ${CLANG_SPROFDATA}76 # Execute generate-profraw-external under perf77 COMMAND ${PERF_HELPER} perf --csspgo -- ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target generate-profraw-external78 # Convert perf profile into profraw79 COMMAND ${PERF_HELPER} perf2prof ${LLVM_PROFGEN} $<TARGET_FILE:clang> ${CMAKE_CURRENT_BINARY_DIR}80 # Merge profdata81 COMMAND ${PERF_HELPER} merge --sample ${LLVM_PROFDATA} ${CLANG_SPROFDATA} ${CMAKE_CURRENT_BINARY_DIR}82 DEPENDS clang ${CLANG_PGO_TRAINING_DEPS} clear-perf-data generate-profraw-external-clean83 VERBATIM84 USES_TERMINAL85 )86 add_custom_target(generate-sprofdata DEPENDS ${CLANG_SPROFDATA})87 endif()88 endif()89endif()90 91find_program(DTRACE dtrace)92# TODO: Look into supporting this for the driver build. It will require changing93# the perf-helper.py file to understand to call `llvm` as `llvm clang`.94if(APPLE AND DTRACE AND NOT LLVM_TOOL_LLVM_DRIVER_BUILD)95 configure_lit_site_cfg(96 ${CMAKE_CURRENT_SOURCE_DIR}/order-files.lit.site.cfg.in97 ${CMAKE_CURRENT_BINARY_DIR}/order-files/lit.site.cfg98 )99 100 add_lit_testsuite(generate-dtrace-logs "Generating clang dtrace data"101 ${CMAKE_CURRENT_BINARY_DIR}/order-files/102 EXCLUDE_FROM_CHECK_ALL103 ARGS -j 1104 DEPENDS clang clear-dtrace-logs105 )106 107 add_custom_target(clear-dtrace-logs108 COMMAND "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py clean ${CMAKE_CURRENT_BINARY_DIR} dtrace109 COMMENT "Clearing old dtrace data")110 111 if(NOT CLANG_ORDER_FILE)112 message(FATAL_ERROR "Output clang order file is not set")113 endif()114 115 add_custom_target(generate-order-file116 COMMAND "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py gen-order-file --binary $<TARGET_FILE:clang> --output ${CLANG_ORDER_FILE} ${CMAKE_CURRENT_BINARY_DIR}117 COMMENT "Generating order file"118 DEPENDS generate-dtrace-logs)119endif()120 121if(CLANG_BOLT AND NOT LLVM_BUILD_INSTRUMENTED)122 configure_lit_site_cfg(123 ${CMAKE_CURRENT_SOURCE_DIR}/bolt.lit.site.cfg.in124 ${CMAKE_CURRENT_BINARY_DIR}/bolt-fdata/lit.site.cfg125 )126 127 add_lit_testsuite(generate-bolt-fdata "Generating BOLT profile for Clang"128 ${CMAKE_CURRENT_BINARY_DIR}/bolt-fdata/129 EXCLUDE_FROM_CHECK_ALL130 DEPENDS clear-bolt-fdata clear-perf-data131 )132 133 add_custom_target(clear-bolt-fdata134 COMMAND "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py clean ${CMAKE_CURRENT_BINARY_DIR} fdata135 COMMENT "Clearing old BOLT fdata")136 137endif()138