Index: CMakeLists.txt =================================================================== --- CMakeLists.txt +++ CMakeLists.txt @@ -570,6 +570,7 @@ ARGS ${LLVM_LIT_EXTRA_ARGS} ) endif() + add_subdirectory(utils/perf-training) endif() option(CLANG_INCLUDE_DOCS "Generate build targets for the Clang docs." Index: utils/perf-training/CMakeLists.txt =================================================================== --- /dev/null +++ utils/perf-training/CMakeLists.txt @@ -0,0 +1,36 @@ +if(LLVM_BUILD_INSTRUMENTED AND NOT WIN32) + if (CMAKE_CFG_INTDIR STREQUAL ".") + set(LLVM_BUILD_MODE ".") + else () + set(LLVM_BUILD_MODE "%(build_mode)s") + endif () + + string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} CLANG_TOOLS_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) + + configure_lit_site_cfg( + ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in + ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg + ) + + add_lit_testsuite(generate-profraw "Generating clang PGO data" + ${CMAKE_CURRENT_BINARY_DIR} + DEPENDS clang clear-profraw + ) + + add_custom_target(clear-profraw + COMMAND find ${CMAKE_CURRENT_BINARY_DIR} -name "*.profraw" -print | xargs rm + COMMENT "Clearing old profraw data") + + if(NOT LLVM_PROFDATA) + find_program(LLVM_PROFDATA llvm-profdata) + endif() + + if(NOT LLVM_PROFDATA) + message(FATAL_ERROR "Must set LLVM_PROFDATA to point to llvm-profdata to use for merging PGO data") + endif() + + add_custom_target(generate-profdata + COMMAND find ${CMAKE_CURRENT_BINARY_DIR} -name "*.profraw" -print | xargs ${LLVM_PROFDATA} merge -o ${CMAKE_CURRENT_BINARY_DIR}/clang.profdata + COMMENT "Merging profdata" + DEPENDS generate-profraw) +endif() Index: utils/perf-training/README.txt =================================================================== --- /dev/null +++ utils/perf-training/README.txt @@ -0,0 +1,6 @@ +========================== + Performance Training Data +========================== + +This directory contains simple source files for use as training data for +generating PGO data and linker order files for clang. Index: utils/perf-training/cxx/hello_world.cpp =================================================================== --- /dev/null +++ utils/perf-training/cxx/hello_world.cpp @@ -0,0 +1,7 @@ +// RUN: %clang_cpp -c %s +#include + +int main(int, char**) { + std::cout << "Hello, World!"; + return 0; +} Index: utils/perf-training/lit.cfg =================================================================== --- /dev/null +++ utils/perf-training/lit.cfg @@ -0,0 +1,53 @@ +# -*- Python -*- + +from lit import Test +import lit.formats +import lit.util + +def inferClang(PATH): + # Determine which clang to use. + clang = os.getenv('CLANG') + + # If the user set clang in the environment, definitely use that and don't + # try to validate. + if clang: + return clang + + # Otherwise look in the path. + clang = lit.util.which('clang', PATH) + + if not clang: + lit_config.fatal("couldn't find 'clang' program, try setting " + "CLANG in your environment") + + return clang + +def getSysrootFlagsOnDarwin(config, lit_config): + # On Darwin, support relocatable SDKs by providing Clang with a + # default system root path. + if 'darwin' in config.target_triple: + try: + out = lit.util.capture(['xcrun', '--show-sdk-path']).strip() + res = 0 + except OSError: + res = -1 + if res == 0 and out: + sdk_path = out + lit_config.note('using SDKROOT: %r' % sdk_path) + return '-isysroot %s' % sdk_path + return '' + +sysroot_flags = getSysrootFlagsOnDarwin(config, lit_config) + +config.clang = inferClang(config.clang_tools_dir).replace('\\', '/') + +config.name = 'Clang Perf Training' +config.suffixes = ['.c', '.cpp', '.m', '.mm', '.cu', '.ll', '.cl', '.s', '.S', '.modulemap'] + +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', ' %s --driver-mode=cpp %s ' % (config.clang, sysroot_flags))) +config.substitutions.append( ('%clang', ' %s %s ' % (config.clang, sysroot_flags) ) ) + +config.environment['LLVM_PROFILE_FILE'] = 'perf-training-%p.profraw' + Index: utils/perf-training/lit.site.cfg.in =================================================================== --- /dev/null +++ utils/perf-training/lit.site.cfg.in @@ -0,0 +1,20 @@ +import sys + +## Autogenerated by LLVM/Clang configuration. +# Do not edit! +config.clang_tools_dir = "@CLANG_TOOLS_DIR@" +config.test_exec_root = "@CMAKE_CURRENT_BINARY_DIR@" +config.test_source_root = "@CMAKE_CURRENT_SOURCE_DIR@" +config.target_triple = "@TARGET_TRIPLE@" + +# Support substitution of the tools and libs dirs with user parameters. This is +# used when we can't determine the tool dir at configuration time. +try: + config.clang_tools_dir = config.clang_tools_dir % lit_config.params +except KeyError: + e = sys.exc_info()[1] + key, = e.args + lit_config.fatal("unable to find %r parameter, use '--param=%s=VALUE'" % (key,key)) + +# Let the main config do the real work. +lit_config.load_config(config, "@CLANG_SOURCE_DIR@/utils/perf-training/lit.cfg")