================
@@ -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

Reply via email to