[PATCH] D143553: [Clang][CMake] Add BOLT perf-training (WIP)
Amir updated this revision to Diff 495915. Amir added a comment. Fixes Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D143553/new/ https://reviews.llvm.org/D143553 Files: clang/CMakeLists.txt clang/cmake/caches/BOLT.cmake clang/utils/perf-training/CMakeLists.txt clang/utils/perf-training/bolt.lit.cfg clang/utils/perf-training/bolt.lit.site.cfg.in Index: clang/utils/perf-training/bolt.lit.site.cfg.in === --- /dev/null +++ clang/utils/perf-training/bolt.lit.site.cfg.in @@ -0,0 +1,14 @@ +@LIT_SITE_CFG_IN_HEADER@ + +import sys + +config.clang_tools_dir = lit_config.substitute("@CURRENT_TOOLS_DIR@") +config.perf_helper_dir = "@CMAKE_CURRENT_SOURCE_DIR@" +config.test_exec_root = "@CMAKE_CURRENT_BINARY_DIR@" +config.test_source_root = "@CLANG_PGO_TRAINING_DATA@" +config.target_triple = "@LLVM_TARGET_TRIPLE@" +config.python_exe = "@Python3_EXECUTABLE@" +config.clang_obj_root = path(r"@CLANG_BINARY_DIR@") + +# Let the main config do the real work. +lit_config.load_config(config, "@CLANG_SOURCE_DIR@/utils/perf-training/bolt.lit.cfg") Index: clang/utils/perf-training/bolt.lit.cfg === --- /dev/null +++ clang/utils/perf-training/bolt.lit.cfg @@ -0,0 +1,21 @@ +# -*- Python -*- + +from lit import Test +import lit.formats +import lit.util +import os +import subprocess + +config.clang = os.path.realpath(lit.util.which('clang-bolt.inst', config.clang_tools_dir)).replace('\\', '/') +sysroot_flags = '' + +config.name = 'Clang Perf Training' +config.suffixes = ['.c', '.cc', '.cpp', '.m', '.mm', '.cu', '.ll', '.cl', '.s', '.S', '.modulemap', '.test'] + +use_lit_shell = os.environ.get("LIT_USE_INTERNAL_SHELL") +config.test_format = lit.formats.ShTest(use_lit_shell == "0") +config.substitutions.append( ('%clang_cpp_skip_driver', ' %s --driver-mode=g++ %s ' % (config.clang, sysroot_flags))) +config.substitutions.append( ('%clang_cpp', ' %s --driver-mode=g++ %s ' % (config.clang, sysroot_flags))) +config.substitutions.append( ('%clang_skip_driver', ' %s %s ' % (config.clang, sysroot_flags))) +config.substitutions.append( ('%clang', ' %s %s ' % (config.clang, sysroot_flags) ) ) +config.substitutions.append( ('%test_root', config.test_exec_root ) ) Index: clang/utils/perf-training/CMakeLists.txt === --- clang/utils/perf-training/CMakeLists.txt +++ clang/utils/perf-training/CMakeLists.txt @@ -59,3 +59,27 @@ COMMENT "Generating order file" DEPENDS generate-dtrace-logs) endif() + +if(CLANG_BOLT_INSTRUMENT) + configure_lit_site_cfg( +${CMAKE_CURRENT_SOURCE_DIR}/bolt.lit.site.cfg.in +${CMAKE_CURRENT_BINARY_DIR}/bolt-fdata/lit.site.cfg +) + + add_lit_testsuite(generate-bolt-fdata "Generating BOLT profile for Clang" +${CMAKE_CURRENT_BINARY_DIR}/bolt-fdata/ +EXCLUDE_FROM_CHECK_ALL +DEPENDS clang-instrumented clear-bolt-fdata +) + + add_custom_target(clear-bolt-fdata +COMMAND "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py clean ${CMAKE_CURRENT_BINARY_DIR} fdata +COMMENT "Clearing old BOLT fdata") + + # Merge profiles into one using merge-fdata + add_custom_target(merge-bolt-fdata +COMMAND "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py +merge-fdata $ ${CMAKE_CURRENT_BINARY_DIR}/prof.fdata ${CMAKE_CURRENT_BINARY_DIR} +COMMENT "Merging BOLT fdata" +DEPENDS merge-fdata generate-bolt-fdata) +endif() Index: clang/cmake/caches/BOLT.cmake === --- clang/cmake/caches/BOLT.cmake +++ clang/cmake/caches/BOLT.cmake @@ -1,9 +1,6 @@ set(CMAKE_BUILD_TYPE Release CACHE STRING "") set(CLANG_BOLT_INSTRUMENT ON CACHE BOOL "") -set(CLANG_BOLT_INSTRUMENT_PROJECTS "llvm" CACHE STRING "") -set(CLANG_BOLT_INSTRUMENT_TARGETS "count" CACHE STRING "") set(CMAKE_EXE_LINKER_FLAGS "-Wl,--emit-relocs,-znow" CACHE STRING "") -set(CLANG_BOLT_INSTRUMENT_EXTRA_CMAKE_FLAGS "" CACHE STRING "") set(LLVM_ENABLE_PROJECTS "bolt;clang" CACHE STRING "") set(LLVM_TARGETS_TO_BUILD Native CACHE STRING "") Index: clang/CMakeLists.txt === --- clang/CMakeLists.txt +++ clang/CMakeLists.txt @@ -853,95 +853,29 @@ if (CLANG_BOLT_INSTRUMENT AND NOT LLVM_BUILD_INSTRUMENTED) set(CLANG_PATH ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang) - set(CLANGXX_PATH ${CLANG_PATH}++) set(CLANG_INSTRUMENTED ${CLANG_PATH}-bolt.inst) - set(CLANGXX_INSTRUMENTED ${CLANGXX_PATH}-bolt.inst) # Instrument clang with BOLT add_custom_target(clang-instrumented DEPENDS ${CLANG_INSTRUMENTED} ) + set(BOLT_FDATA ${CMAKE_CURRENT_BINARY_DIR}/utils/perf-training/prof.fdata) add_custom_command(OUTPUT ${CLANG_INSTRUMENTED} DEPENDS clang llvm-bolt COMMAND llvm-bolt ${CLANG_PATH} -o ${CLANG_INSTRUMENTED}
[PATCH] D143553: [Clang][CMake] Add BOLT perf-training (WIP)
Amir created this revision. Amir added a reviewer: phosek. Herald added a subscriber: wenlei. Herald added a project: All. Amir requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits. Remove the bootstrapped build for BOLT profile collection. Adopt perf-training workflow, similar to pgo and order-file. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D143553 Files: clang/CMakeLists.txt clang/utils/perf-training/CMakeLists.txt clang/utils/perf-training/bolt.lit.cfg clang/utils/perf-training/bolt.lit.site.cfg.in Index: clang/utils/perf-training/bolt.lit.site.cfg.in === --- /dev/null +++ clang/utils/perf-training/bolt.lit.site.cfg.in @@ -0,0 +1,13 @@ +@LIT_SITE_CFG_IN_HEADER@ + +import sys + +config.clang_tools_dir = lit_config.substitute("@CURRENT_TOOLS_DIR@") +config.perf_helper_dir = "@CMAKE_CURRENT_SOURCE_DIR@" +config.test_exec_root = "@CMAKE_CURRENT_BINARY_DIR@" +config.test_source_root = "@CLANG_PGO_TRAINING_DATA@" +config.target_triple = "@LLVM_TARGET_TRIPLE@" +config.python_exe = "@Python3_EXECUTABLE@" + +# Let the main config do the real work. +lit_config.load_config(config, "@CLANG_SOURCE_DIR@/utils/perf-training/bolt.lit.cfg") Index: clang/utils/perf-training/bolt.lit.cfg === --- /dev/null +++ clang/utils/perf-training/bolt.lit.cfg @@ -0,0 +1,20 @@ +# -*- Python -*- + +from lit import Test +import lit.formats +import lit.util +import os +import subprocess + +config.clang = os.path.realpath(lit.util.which('clang-bolt.inst', config.clang_tools_dir)).replace('\\', '/') + +config.name = 'Clang Perf Training' +config.suffixes = ['.c', '.cc', '.cpp', '.m', '.mm', '.cu', '.ll', '.cl', '.s', '.S', '.modulemap', '.test'] + +use_lit_shell = os.environ.get("LIT_USE_INTERNAL_SHELL") +config.test_format = lit.formats.ShTest(use_lit_shell == "0") +config.substitutions.append( ('%clang_cpp_skip_driver', ' %s --driver-mode=g++ %s ' % (config.clang, sysroot_flags))) +config.substitutions.append( ('%clang_cpp', ' %s --driver-mode=g++ %s ' % (config.clang, sysroot_flags))) +config.substitutions.append( ('%clang_skip_driver', ' %s %s ' % (config.clang, sysroot_flags))) +config.substitutions.append( ('%clang', ' %s %s ' % (config.clang, sysroot_flags) ) ) +config.substitutions.append( ('%test_root', config.test_exec_root ) ) Index: clang/utils/perf-training/CMakeLists.txt === --- clang/utils/perf-training/CMakeLists.txt +++ clang/utils/perf-training/CMakeLists.txt @@ -59,3 +59,30 @@ COMMENT "Generating order file" DEPENDS generate-dtrace-logs) endif() + +if(CLANG_BOLT_INSTRUMENT) + configure_lit_site_cfg( +${CMAKE_CURRENT_SOURCE_DIR}/bolt.lit.site.cfg.in +${CMAKE_CURRENT_BINARY_DIR}/bolt-fdata/lit.site.cfg +) + + add_lit_testsuite(generate-bolt-fdata "Generating BOLT profile for Clang" +${CMAKE_CURRENT_BINARY_DIR}/bolt-fdata/ +EXCLUDE_FROM_CHECK_ALL +DEPENDS clang-bolt-instrumented clear-bolt-fdata +) + + add_custom_target(clear-bolt-fdata +COMMAND "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py clean ${CMAKE_CURRENT_BINARY_DIR} fdata +COMMENT "Clearing old BOLT fdata") + + if(NOT MERGE_FDATA) +find_program(MERGE_FDATA merge-fdata) + endif() + + # Merge profiles into one using merge-fdata + add_custom_target(merge-bolt-fdata +COMMAND "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py merge-fdata ${MERGE_FDATA} ${CMAKE_CURRENT_BINARY_DIR}/prof.fdata ${CMAKE_CURRENT_BINARY_DIR} +COMMENT "Merging BOLT fdata" +DEPENDS generate-bolt-fdata) +endif() Index: clang/CMakeLists.txt === --- clang/CMakeLists.txt +++ clang/CMakeLists.txt @@ -852,99 +852,28 @@ endif() if (CLANG_BOLT_INSTRUMENT AND NOT LLVM_BUILD_INSTRUMENTED) - set(CLANG_PATH ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang) - set(CLANGXX_PATH ${CLANG_PATH}++) - set(CLANG_INSTRUMENTED ${CLANG_PATH}-bolt.inst) - set(CLANGXX_INSTRUMENTED ${CLANGXX_PATH}-bolt.inst) + set(CLANG_BOLT_INSTRUMENTED ${CMAKE_CURRENT_BINARY_DIR}/clang-bolt.inst) # Instrument clang with BOLT - add_custom_target(clang-instrumented -DEPENDS ${CLANG_INSTRUMENTED} - ) - add_custom_command(OUTPUT ${CLANG_INSTRUMENTED} + add_custom_target(clang-bolt-instrumented DEPENDS clang llvm-bolt -COMMAND llvm-bolt ${CLANG_PATH} -o ${CLANG_INSTRUMENTED} +COMMAND llvm-bolt $ -o ${CLANG_BOLT_INSTRUMENTED} -instrument --instrumentation-file-append-pid --instrumentation-file=${CMAKE_CURRENT_BINARY_DIR}/prof.fdata COMMENT "Instrumenting clang binary with BOLT" VERBATIM ) - # Make a symlink from clang-bolt.inst to clang++-bolt.inst - add_custom_target(clang++-instrumented -DEPENDS ${CLANGXX_INSTRUMENTED} - ) -