1*4d6fc14bSjoerginclude(ExternalProject) 2*4d6fc14bSjoerginclude(CheckCXXCompilerFlag) 3*4d6fc14bSjoerg 4*4d6fc14bSjoerg#============================================================================== 5*4d6fc14bSjoerg# Build Google Benchmark for libc++ 6*4d6fc14bSjoerg#============================================================================== 7*4d6fc14bSjoerg 8*4d6fc14bSjoergset(CMAKE_FOLDER "${CMAKE_FOLDER}/Benchmarks") 9*4d6fc14bSjoerg 10*4d6fc14bSjoergset(BENCHMARK_LIBCXX_COMPILE_FLAGS 11*4d6fc14bSjoerg -Wno-unused-command-line-argument 12*4d6fc14bSjoerg -nostdinc++ 13*4d6fc14bSjoerg -isystem "${LIBCXX_GENERATED_INCLUDE_DIR}" 14*4d6fc14bSjoerg -L${LIBCXX_LIBRARY_DIR} 15*4d6fc14bSjoerg -Wl,-rpath,${LIBCXX_LIBRARY_DIR} 16*4d6fc14bSjoerg ${SANITIZER_FLAGS} 17*4d6fc14bSjoerg ) 18*4d6fc14bSjoergif(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) 19*4d6fc14bSjoerg list(APPEND BENCHMARK_LIBCXX_COMPILE_FLAGS 20*4d6fc14bSjoerg -isystem "${LIBCXX_GENERATED_INCLUDE_TARGET_DIR}") 21*4d6fc14bSjoergendif() 22*4d6fc14bSjoergif (DEFINED LIBCXX_CXX_ABI_LIBRARY_PATH) 23*4d6fc14bSjoerg list(APPEND BENCHMARK_LIBCXX_COMPILE_FLAGS 24*4d6fc14bSjoerg -L${LIBCXX_CXX_ABI_LIBRARY_PATH} 25*4d6fc14bSjoerg -Wl,-rpath,${LIBCXX_CXX_ABI_LIBRARY_PATH}) 26*4d6fc14bSjoergendif() 27*4d6fc14bSjoergsplit_list(BENCHMARK_LIBCXX_COMPILE_FLAGS) 28*4d6fc14bSjoerg 29*4d6fc14bSjoergExternalProject_Add(google-benchmark-libcxx 30*4d6fc14bSjoerg EXCLUDE_FROM_ALL ON 31*4d6fc14bSjoerg DEPENDS cxx cxx-headers 32*4d6fc14bSjoerg PREFIX benchmark-libcxx 33*4d6fc14bSjoerg SOURCE_DIR ${LIBCXX_SOURCE_DIR}/utils/google-benchmark 34*4d6fc14bSjoerg INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/benchmark-libcxx 35*4d6fc14bSjoerg CMAKE_CACHE_ARGS 36*4d6fc14bSjoerg -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER} 37*4d6fc14bSjoerg -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER} 38*4d6fc14bSjoerg -DCMAKE_BUILD_TYPE:STRING=RELEASE 39*4d6fc14bSjoerg -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> 40*4d6fc14bSjoerg -DCMAKE_CXX_FLAGS:STRING=${BENCHMARK_LIBCXX_COMPILE_FLAGS} 41*4d6fc14bSjoerg -DBENCHMARK_USE_LIBCXX:BOOL=ON 42*4d6fc14bSjoerg -DBENCHMARK_ENABLE_TESTING:BOOL=OFF) 43*4d6fc14bSjoerg 44*4d6fc14bSjoerg#============================================================================== 45*4d6fc14bSjoerg# Build Google Benchmark for the native stdlib 46*4d6fc14bSjoerg#============================================================================== 47*4d6fc14bSjoergset(BENCHMARK_NATIVE_TARGET_FLAGS) 48*4d6fc14bSjoergif (LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN) 49*4d6fc14bSjoerg set(BENCHMARK_NATIVE_TARGET_FLAGS 50*4d6fc14bSjoerg -gcc-toolchain ${LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN}) 51*4d6fc14bSjoergendif() 52*4d6fc14bSjoergsplit_list(BENCHMARK_NATIVE_TARGET_FLAGS) 53*4d6fc14bSjoerg 54*4d6fc14bSjoergif (LIBCXX_BENCHMARK_NATIVE_STDLIB) 55*4d6fc14bSjoerg ExternalProject_Add(google-benchmark-native 56*4d6fc14bSjoerg EXCLUDE_FROM_ALL ON 57*4d6fc14bSjoerg PREFIX benchmark-native 58*4d6fc14bSjoerg SOURCE_DIR ${LIBCXX_SOURCE_DIR}/utils/google-benchmark 59*4d6fc14bSjoerg INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/benchmark-native 60*4d6fc14bSjoerg CMAKE_CACHE_ARGS 61*4d6fc14bSjoerg -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER} 62*4d6fc14bSjoerg -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER} 63*4d6fc14bSjoerg -DCMAKE_CXX_FLAGS:STRING=${BENCHMARK_NATIVE_TARGET_FLAGS} 64*4d6fc14bSjoerg -DCMAKE_BUILD_TYPE:STRING=RELEASE 65*4d6fc14bSjoerg -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> 66*4d6fc14bSjoerg -DBENCHMARK_ENABLE_TESTING:BOOL=OFF) 67*4d6fc14bSjoergendif() 68*4d6fc14bSjoerg 69*4d6fc14bSjoerg 70*4d6fc14bSjoerg#============================================================================== 71*4d6fc14bSjoerg# Benchmark tests configuration 72*4d6fc14bSjoerg#============================================================================== 73*4d6fc14bSjoergadd_custom_target(cxx-benchmarks) 74*4d6fc14bSjoergset(BENCHMARK_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}) 75*4d6fc14bSjoergset(BENCHMARK_LIBCXX_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/benchmark-libcxx) 76*4d6fc14bSjoergset(BENCHMARK_NATIVE_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/benchmark-native) 77*4d6fc14bSjoerg 78*4d6fc14bSjoerg 79*4d6fc14bSjoergset(BENCHMARK_TEST_COMPILE_FLAGS 80*4d6fc14bSjoerg -O2 81*4d6fc14bSjoerg -fsized-deallocation 82*4d6fc14bSjoerg -I${BENCHMARK_LIBCXX_INSTALL}/include 83*4d6fc14bSjoerg -I${LIBCXX_SOURCE_DIR}/test/support 84*4d6fc14bSjoerg) 85*4d6fc14bSjoergset(BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS 86*4d6fc14bSjoerg ${BENCHMARK_TEST_COMPILE_FLAGS} 87*4d6fc14bSjoerg ${SANITIZER_FLAGS} 88*4d6fc14bSjoerg -Wno-user-defined-literals 89*4d6fc14bSjoerg -Wno-suggest-override 90*4d6fc14bSjoerg) 91*4d6fc14bSjoerg 92*4d6fc14bSjoergset(BENCHMARK_TEST_LIBCXX_LINK_FLAGS 93*4d6fc14bSjoerg -nodefaultlibs 94*4d6fc14bSjoerg -L${BENCHMARK_LIBCXX_INSTALL}/lib/ 95*4d6fc14bSjoerg ${SANITIZER_FLAGS} 96*4d6fc14bSjoerg) 97*4d6fc14bSjoergset(BENCHMARK_TEST_NATIVE_COMPILE_FLAGS 98*4d6fc14bSjoerg ${BENCHMARK_NATIVE_TARGET_FLAGS} 99*4d6fc14bSjoerg ${BENCHMARK_TEST_COMPILE_FLAGS} 100*4d6fc14bSjoerg) 101*4d6fc14bSjoergset(BENCHMARK_TEST_NATIVE_LINK_FLAGS 102*4d6fc14bSjoerg ${BENCHMARK_NATIVE_TARGET_FLAGS} 103*4d6fc14bSjoerg -L${BENCHMARK_NATIVE_INSTALL}/lib 104*4d6fc14bSjoerg) 105*4d6fc14bSjoergsplit_list(BENCHMARK_TEST_COMPILE_FLAGS) 106*4d6fc14bSjoergsplit_list(BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS) 107*4d6fc14bSjoergsplit_list(BENCHMARK_TEST_LIBCXX_LINK_FLAGS) 108*4d6fc14bSjoergsplit_list(BENCHMARK_TEST_NATIVE_COMPILE_FLAGS) 109*4d6fc14bSjoergsplit_list(BENCHMARK_TEST_NATIVE_LINK_FLAGS) 110*4d6fc14bSjoerg 111*4d6fc14bSjoergif (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libstdc++") 112*4d6fc14bSjoerg find_library(LIBSTDCXX_FILESYSTEM_TEST stdc++fs 113*4d6fc14bSjoerg PATHS ${LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN} 114*4d6fc14bSjoerg PATH_SUFFIXES lib lib64 115*4d6fc14bSjoerg DOC "The libstdc++ filesystem library used by the benchmarks" 116*4d6fc14bSjoerg ) 117*4d6fc14bSjoerg if (NOT "${LIBSTDCXX_FILESYSTEM_TEST}" STREQUAL "LIBSTDCXX_FILESYSTEM_TEST-NOTFOUND") 118*4d6fc14bSjoerg set(LIBSTDCXX_FILESYSTEM_LIB "stdc++fs") 119*4d6fc14bSjoerg endif() 120*4d6fc14bSjoergendif() 121*4d6fc14bSjoerg 122*4d6fc14bSjoergset(libcxx_benchmark_targets) 123*4d6fc14bSjoerg 124*4d6fc14bSjoergfunction(add_benchmark_test name source_file) 125*4d6fc14bSjoerg set(libcxx_target ${name}_libcxx) 126*4d6fc14bSjoerg list(APPEND libcxx_benchmark_targets ${libcxx_target}) 127*4d6fc14bSjoerg add_executable(${libcxx_target} EXCLUDE_FROM_ALL ${source_file}) 128*4d6fc14bSjoerg add_dependencies(${libcxx_target} cxx google-benchmark-libcxx) 129*4d6fc14bSjoerg add_dependencies(cxx-benchmarks ${libcxx_target}) 130*4d6fc14bSjoerg if (LIBCXX_ENABLE_SHARED) 131*4d6fc14bSjoerg target_link_libraries(${libcxx_target} PRIVATE cxx_shared) 132*4d6fc14bSjoerg else() 133*4d6fc14bSjoerg target_link_libraries(${libcxx_target} PRIVATE cxx_static) 134*4d6fc14bSjoerg endif() 135*4d6fc14bSjoerg if (TARGET cxx_experimental) 136*4d6fc14bSjoerg target_link_libraries(${libcxx_target} PRIVATE cxx_experimental) 137*4d6fc14bSjoerg endif() 138*4d6fc14bSjoerg target_link_libraries(${libcxx_target} PRIVATE -lbenchmark) 139*4d6fc14bSjoerg if (LLVM_USE_SANITIZER) 140*4d6fc14bSjoerg target_link_libraries(${libcxx_target} PRIVATE -ldl) 141*4d6fc14bSjoerg endif() 142*4d6fc14bSjoerg set_target_properties(${libcxx_target} 143*4d6fc14bSjoerg PROPERTIES 144*4d6fc14bSjoerg OUTPUT_NAME "${name}.libcxx.out" 145*4d6fc14bSjoerg RUNTIME_OUTPUT_DIRECTORY "${BENCHMARK_OUTPUT_DIR}" 146*4d6fc14bSjoerg COMPILE_FLAGS "${BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS}" 147*4d6fc14bSjoerg LINK_FLAGS "${BENCHMARK_TEST_LIBCXX_LINK_FLAGS}" 148*4d6fc14bSjoerg CXX_STANDARD 17 149*4d6fc14bSjoerg CXX_STANDARD_REQUIRED YES 150*4d6fc14bSjoerg CXX_EXTENSIONS NO) 151*4d6fc14bSjoerg cxx_link_system_libraries(${libcxx_target}) 152*4d6fc14bSjoerg if (LIBCXX_BENCHMARK_NATIVE_STDLIB) 153*4d6fc14bSjoerg if (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libstdc++" AND NOT DEFINED LIBSTDCXX_FILESYSTEM_LIB 154*4d6fc14bSjoerg AND "${name}" STREQUAL "filesystem") 155*4d6fc14bSjoerg return() 156*4d6fc14bSjoerg endif() 157*4d6fc14bSjoerg set(native_target ${name}_native) 158*4d6fc14bSjoerg add_executable(${native_target} EXCLUDE_FROM_ALL ${source_file}) 159*4d6fc14bSjoerg add_dependencies(${native_target} google-benchmark-native 160*4d6fc14bSjoerg google-benchmark-libcxx) 161*4d6fc14bSjoerg target_link_libraries(${native_target} PRIVATE -lbenchmark) 162*4d6fc14bSjoerg if (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libstdc++") 163*4d6fc14bSjoerg target_link_libraries(${native_target} PRIVATE ${LIBSTDCXX_FILESYSTEM_LIB}) 164*4d6fc14bSjoerg elseif (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libc++") 165*4d6fc14bSjoerg target_link_libraries(${native_target} PRIVATE -lc++fs -lc++experimental) 166*4d6fc14bSjoerg endif() 167*4d6fc14bSjoerg if (LIBCXX_HAS_PTHREAD_LIB) 168*4d6fc14bSjoerg target_link_libraries(${native_target} PRIVATE -pthread) 169*4d6fc14bSjoerg endif() 170*4d6fc14bSjoerg add_dependencies(cxx-benchmarks ${native_target}) 171*4d6fc14bSjoerg set_target_properties(${native_target} 172*4d6fc14bSjoerg PROPERTIES 173*4d6fc14bSjoerg OUTPUT_NAME "${name}.native.out" 174*4d6fc14bSjoerg RUNTIME_OUTPUT_DIRECTORY "${BENCHMARK_OUTPUT_DIR}" 175*4d6fc14bSjoerg INCLUDE_DIRECTORIES "" 176*4d6fc14bSjoerg COMPILE_FLAGS "${BENCHMARK_TEST_NATIVE_COMPILE_FLAGS}" 177*4d6fc14bSjoerg LINK_FLAGS "${BENCHMARK_TEST_NATIVE_LINK_FLAGS}" 178*4d6fc14bSjoerg CXX_STANDARD 17 179*4d6fc14bSjoerg CXX_STANDARD_REQUIRED YES 180*4d6fc14bSjoerg CXX_EXTENSIONS NO) 181*4d6fc14bSjoerg endif() 182*4d6fc14bSjoergendfunction() 183*4d6fc14bSjoerg 184*4d6fc14bSjoerg 185*4d6fc14bSjoerg#============================================================================== 186*4d6fc14bSjoerg# Register Benchmark tests 187*4d6fc14bSjoerg#============================================================================== 188*4d6fc14bSjoergfile(GLOB BENCHMARK_TESTS "*.bench.cpp") 189*4d6fc14bSjoergforeach(test_path ${BENCHMARK_TESTS}) 190*4d6fc14bSjoerg get_filename_component(test_file "${test_path}" NAME) 191*4d6fc14bSjoerg string(REPLACE ".bench.cpp" "" test_name "${test_file}") 192*4d6fc14bSjoerg if (NOT DEFINED ${test_name}_REPORTED) 193*4d6fc14bSjoerg message(STATUS "Adding Benchmark: ${test_file}") 194*4d6fc14bSjoerg # Only report the adding of the benchmark once. 195*4d6fc14bSjoerg set(${test_name}_REPORTED ON CACHE INTERNAL "") 196*4d6fc14bSjoerg endif() 197*4d6fc14bSjoerg add_benchmark_test(${test_name} ${test_file}) 198*4d6fc14bSjoergendforeach() 199*4d6fc14bSjoerg 200*4d6fc14bSjoergif (LIBCXX_INCLUDE_TESTS) 201*4d6fc14bSjoerg include(AddLLVM) 202*4d6fc14bSjoerg 203*4d6fc14bSjoerg if (NOT DEFINED LIBCXX_TEST_DEPS) 204*4d6fc14bSjoerg message(FATAL_ERROR "Expected LIBCXX_TEST_DEPS to be defined") 205*4d6fc14bSjoerg endif() 206*4d6fc14bSjoerg 207*4d6fc14bSjoerg configure_lit_site_cfg( 208*4d6fc14bSjoerg ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.py.in 209*4d6fc14bSjoerg ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg.py) 210*4d6fc14bSjoerg 211*4d6fc14bSjoerg set(BENCHMARK_LIT_ARGS "--show-all --show-xfail --show-unsupported ${LIT_ARGS_DEFAULT}") 212*4d6fc14bSjoerg 213*4d6fc14bSjoerg add_lit_target(check-cxx-benchmarks 214*4d6fc14bSjoerg "Running libcxx benchmarks tests" 215*4d6fc14bSjoerg ${CMAKE_CURRENT_BINARY_DIR} 216*4d6fc14bSjoerg DEPENDS cxx-benchmarks ${LIBCXX_TEST_DEPS} 217*4d6fc14bSjoerg ARGS ${BENCHMARK_LIT_ARGS}) 218*4d6fc14bSjoergendif() 219