================
@@ -154,3 +192,178 @@ if (DEFINED FLANG_TEST_TARGET_TRIPLE)
"to use FLANG_TEST_TARGET_TRIPLE.")
endif()
endif()
+
+include(LLVMExternalProjectUtils)
+
+
+if(LLVM_BUILD_INSTRUMENTED)
+ set(CLANG_CURRENT_BINARY_DIR
${CMAKE_CURRENT_BINARY_DIR}/../../clang/utils/perf-training)
+ set(LIT_LOAD_CONFIG "${CMAKE_CURRENT_SOURCE_DIR}/pgo.lit.cfg")
+ configure_lit_site_cfg(
+ ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.py.in
+ ${CMAKE_CURRENT_BINARY_DIR}/pgo-data/lit.site.cfg
+ MAIN_CONFIG
+ ${CMAKE_CURRENT_SOURCE_DIR}/lit.cfg.py
+ )
+
+ add_lit_testsuite(generate-flang-profraw "Generating flang PGO data"
+ ${CMAKE_CURRENT_BINARY_DIR}/pgo-data/
+ EXCLUDE_FROM_CHECK_ALL
+ DEPENDS ${FLANG_TEST_DEPENDS}
+ )
+ if(FLANG_PGO_TRAINING_CLANG_COUPLING)
+ add_lit_testsuite(generate-clang-profraw "Generating clang PGO data"
+ ${CLANG_CURRENT_BINARY_DIR}/pgo-data/
+ EXCLUDE_FROM_CHECK_ALL
+ DEPENDS clang
+ )
+ endif()
+
+ add_custom_target(clear-flang-profraw
+ COMMAND "${Python3_EXECUTABLE}" ${PERF_HELPER} clean
${CMAKE_CURRENT_BINARY_DIR}/.. ${CMAKE_BINARY_DIR}/profiles/ profraw
+ COMMENT "Clearing old flang profraw data")
+ if (FLANG_PGO_TRAINING_CLANG_COUPLING)
+ add_dependencies(clear-flang-profraw clear-profraw)
+ endif()
+
+ if(NOT LLVM_PROFDATA)
+ find_program(LLVM_PROFDATA llvm-profdata)
+ endif()
+
+ if(NOT LLVM_PROFDATA)
+ message(STATUS "To enable merging PGO data LLVM_PROFDATA has to point to
llvm-profdata")
+ else()
+ set(PROFDATA ${CMAKE_BINARY_DIR}/flang.profdata)
+ set(PROFRAW_TARGETS "")
+ set(PROFRAW_DIRS "")
+ set(PROFRAW_DEPS "")
+ if(FLANG_PGO_TRAINING_CLANG_COUPLING)
+ list(APPEND PROFRAW_TARGETS generate-clang-profraw)
+ list(APPEND PROFRAW_DIRS ${CLANG_CURRENT_BINARY_DIR})
+ list(APPEND PROFRAW_DEPS clang)
+ if (CLANG_PGO_TRAINING_DATA_SOURCE_DIR)
+ llvm_ExternalProject_Add(generate-clang-profraw-external
+ ${CLANG_PGO_TRAINING_DATA_SOURCE_DIR}
+ USE_TOOLCHAIN
+ EXCLUDE_FROM_ALL
+ NO_INSTALL
+ CMAKE_ARGS
"${CLANG_PGO_TRAINING_DATA_SOURCE_CMAKE_ARGS}")
+ list(APPEND PROFRAW_TARGETS generate-clang-profraw-external)
+ endif()
+ endif()
+ list(APPEND PROFRAW_TARGETS generate-flang-profraw)
+ list(APPEND PROFRAW_DIRS
+ ${CMAKE_CURRENT_BINARY_DIR}/..
+ ${CMAKE_BINARY_DIR}/profiles/)
+ list(APPEND PROFRAW_DEPS
+ flang
+ flang-rt)
+ if (FLANG_PGO_TRAINING_DATA_SOURCE_DIR)
+ llvm_ExternalProject_Add(generate-flang-profraw-external
+ ${FLANG_PGO_TRAINING_DATA_SOURCE_DIR}
+ USE_TOOLCHAIN
+ ENABLE_FORTRAN
+ EXCLUDE_FROM_ALL
+ NO_INSTALL
+ CMAKE_ARGS
"${FLANG_PGO_TRAINING_DATA_SOURCE_CMAKE_ARGS}")
+ list(APPEND PROFRAW_TARGETS generate-flang-profraw-external)
+ endif()
+ add_custom_command(
+ OUTPUT ${PROFDATA}
+ # PROFRAW_TARGETS are custom targets which are always considered stale.
+ # If we add them here to 'DEPENDS', then it will always execute and
running
+ # ninja install && ninja check-all will result in the profile data being
+ # generated twice, and cause the ninja check-all build to fail with
errors like:
+ # `ld.lld: error: Function Import: link error: linking module flags
'ProfileSummary': IDs have conflicting values in`
+ # Therefore we call these targets manually as part of this custom
command,
+ # which will only run if flang or ${FLANG_PGO_TRAINING_DEPS} are updated.
+ COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target
${PROFRAW_TARGETS}
+ COMMAND "${Python3_EXECUTABLE}" ${PERF_HELPER} merge ${LLVM_PROFDATA}
${PROFDATA} ${PROFRAW_DIRS}
+ COMMENT "Merging flang profdata"
+ DEPENDS ${PROFRAW_DEPS} ${FLANG_PGO_TRAINING_DEPS} clear-flang-profraw
+ )
+ add_custom_target(generate-flang-profdata DEPENDS ${PROFDATA})
+
+ if(FLANG_PGO_TRAINING_CLANG_COUPLING)
+ string(TOUPPER "${LLVM_BUILD_INSTRUMENTED}"
LLVM_BUILD_UPPER_INSTRUMENTED)
+ if (LLVM_BUILD_UPPER_INSTRUMENTED STREQUAL "CSSPGO")
+ message(STATUS "CSSPGO of flang is not supported")
+ else()
+ add_dependencies(clang-bootstrap-deps generate-flang-profdata)
+ endif()
+ endif()
+ endif()
+endif()
+
+if (FLANG_BOLT AND NOT LLVM_BUILD_INSTRUMENTED)
+ # Add a flang-bolt target for backwards compatibility.
+ add_custom_target(flang-bolt DEPENDS flang-test-depends)
+
+ set(FLANG_BOLT_INSTRUMENTED "flang-bolt.inst" CACHE STRING
+ "Name of BOLT-instrumented flang binary")
+ set(FLANG_INSTRUMENTED
${LLVM_RUNTIME_OUTPUT_INTDIR}/${FLANG_BOLT_INSTRUMENTED})
+ set(PERF_TRAINING_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
+ set(FLANG_BOLT_FDATA ${PERF_TRAINING_BINARY_DIR}/flang-prof.fdata)
+ get_llvm_lit_path(
+ lit_base_dir
+ lit_file_name
+ ALLOW_EXTERNAL
+ )
+ set(LIT_COMMAND "${lit_base_dir}/${lit_file_name}")
+
+ set(FLANG_BOLT_INPUTS $<TARGET_FILE:flang>)
+ set(FLANG_INSTRUMENTED_OUTPUTS ${FLANG_INSTRUMENTED})
+
+ # Add in dynamically linked libraries, if needs be. Currently only supported
+ # on Linux because it relies on LD_PRELOAD for instrumentation.
+ if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ if (LLVM_LINK_LLVM_DYLIB)
+ set(LLVM_BOLT_INSTRUMENTED "LLVM-bolt.inst" CACHE STRING
+ "Name of BOLT-instrumented LLVM library")
+ set(LLVM_INSTRUMENTED
${LLVM_RUNTIME_OUTPUT_INTDIR}/${LLVM_BOLT_INSTRUMENTED})
+ list(APPEND FLANG_BOLT_INPUTS $<TARGET_FILE:LLVM>)
+ list(APPEND FLANG_INSTRUMENTED_OUTPUTS ${LLVM_INSTRUMENTED})
+ endif()
+ endif()
+
+ # This POST_BUILD command is executed unconditionally even if the flang
target
+ # is already built. We need to wrap the whole bolt optimization process in
+ # a single python wrapper, so that we can first check if the binary has
+ # already been optimized and then exit early with a 0 status if it has.
+ add_custom_command(
+ TARGET flang-test-depends POST_BUILD
+ COMMAND "${Python3_EXECUTABLE}"
${LLVM_MAIN_SRC_DIR}/../clang/utils/perf-training/perf-helper.py
----------------
Meinersbur wrote:
```suggestion
COMMAND "${Python3_EXECUTABLE}" "${PERF_HELPER}"
```
Don't you have PERF_HELPER defiend to not heve to repeat this?
https://github.com/llvm/llvm-project/pull/198863
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits