brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.0 KiB · 2cd4c4c Raw
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