llvm-project/libc/benchmarks/CMakeLists.txt

156 lines
4.4 KiB
CMake

find_package(Threads)
include(ExternalProject)
set(LLVM_LINK_COMPONENTS Support)
#==============================================================================
# Build Google Benchmark
#==============================================================================
set(GOOGLE_BENCHMARK_TARGET_FLAGS ${BENCHMARK_DIALECT_FLAG})
if (LIBCXX_BENCHMARK_GCC_TOOLCHAIN)
set(GOOGLE_BENCHMARK_TARGET_FLAGS
-gcc-toolchain ${LIBCXX_BENCHMARK_GCC_TOOLCHAIN})
endif()
string(REPLACE ";" " " GOOGLE_BENCHMARK_TARGET_FLAGS "${GOOGLE_BENCHMARK_TARGET_FLAGS}")
ExternalProject_Add(google-benchmark
EXCLUDE_FROM_ALL ON
PREFIX google-benchmark
SOURCE_DIR ${LIBC_SOURCE_DIR}/../llvm/utils/benchmark
INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/google-benchmark
CMAKE_CACHE_ARGS
-DBUILD_SHARED_LIBS:BOOL=OFF
-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON
-DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
-DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}
-DCMAKE_CXX_FLAGS:STRING=${GOOGLE_BENCHMARK_TARGET_FLAGS}
-DCMAKE_CXX_STANDARD:STRING=14
-DCMAKE_BUILD_TYPE:STRING=RELEASE
-DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
-DBENCHMARK_ENABLE_TESTING:BOOL=OFF)
set(GOOGLE_BENCHMARK_LIBC_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/google-benchmark)
set(GOOGLE_BENCHMARK_LINK_FLAGS -L${GOOGLE_BENCHMARK_LIBC_INSTALL}/lib/)
#==============================================================================
# Add Unit Testing Support
#==============================================================================
function(add_libc_benchmark_unittest target_name)
if(NOT LLVM_INCLUDE_TESTS)
return()
endif()
cmake_parse_arguments(
"LIBC_BENCHMARKS_UNITTEST"
"" # No optional arguments
"SUITE" # Single value arguments
"SRCS;DEPENDS" # Multi-value arguments
${ARGN}
)
add_executable(${target_name}
EXCLUDE_FROM_ALL
${LIBC_BENCHMARKS_UNITTEST_SRCS}
)
target_link_libraries(${target_name}
PRIVATE
gtest_main
gtest
${LIBC_BENCHMARKS_UNITTEST_DEPENDS}
)
add_custom_command(
TARGET ${target_name}
POST_BUILD
COMMAND $<TARGET_FILE:${target_name}>
)
add_dependencies(libc-benchmark-util-tests ${target_name})
endfunction()
#==============================================================================
# Build Google Benchmark for libc
#==============================================================================
add_custom_target(libc-benchmark-util-tests)
function(fix_rtti target)
# TODO: Make this portable and inline with rtti mode from llvm/
target_compile_options(${target} PUBLIC -fno-rtti)
endfunction()
# libc-benchmark
add_library(libc-benchmark
STATIC
EXCLUDE_FROM_ALL
LibcBenchmark.cpp
LibcBenchmark.h
)
add_dependencies(libc-benchmark google-benchmark)
target_include_directories(libc-benchmark
SYSTEM PUBLIC
"${GOOGLE_BENCHMARK_LIBC_INSTALL}/include"
)
target_link_libraries(libc-benchmark
PUBLIC
"${GOOGLE_BENCHMARK_LINK_FLAGS}" # FIXME: Move to `target_link_options`
-lbenchmark # FIXME: Move to `target_link_options`
LLVMSupport
Threads::Threads
)
fix_rtti(libc-benchmark)
add_libc_benchmark_unittest(libc-benchmark-test
SRCS LibcBenchmarkTest.cpp
DEPENDS libc-benchmark
)
# libc-memory-benchmark
add_library(libc-memory-benchmark
STATIC
EXCLUDE_FROM_ALL
LibcMemoryBenchmark.cpp
LibcMemoryBenchmark.h
MemorySizeDistributions.cpp
MemorySizeDistributions.h
)
target_link_libraries(libc-memory-benchmark
PUBLIC
libc-benchmark
)
fix_rtti(libc-memory-benchmark)
add_libc_benchmark_unittest(libc-memory-benchmark-test
SRCS LibcMemoryBenchmarkTest.cpp
DEPENDS libc-memory-benchmark
)
# json
add_library(json
STATIC
EXCLUDE_FROM_ALL
JSON.cpp
JSON.h
)
target_link_libraries(json PUBLIC libc-memory-benchmark)
fix_rtti(json)
add_libc_benchmark_unittest(json-test
SRCS JSONTest.cpp
DEPENDS json
)
#==============================================================================
# Benchmarking tool
#==============================================================================
add_executable(libc-benchmark-main
EXCLUDE_FROM_ALL
LibcMemoryBenchmarkMain.cpp
)
foreach(entrypoint_target libc.src.string.memcpy libc.src.string.memset)
get_target_property(entrypoint_object_file ${entrypoint_target} "OBJECT_FILE_RAW")
target_link_libraries(libc-benchmark-main PUBLIC json ${entrypoint_object_file})
endforeach()