• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1if(LIBC_TARGET_OS_IS_GPU)
2  add_subdirectory(gpu)
3  return()
4endif()
5
6# The CPU build depends on Google benchmark.
7if(NOT LIBC_INCLUDE_BENCHMARKS)
8  return()
9endif()
10
11find_package(Threads)
12
13set(LLVM_LINK_COMPONENTS
14  Support
15  TargetParser
16  )
17
18#==============================================================================
19# Add Unit Testing Support
20#==============================================================================
21
22function(add_libc_benchmark_unittest target_name)
23  if(NOT LLVM_INCLUDE_TESTS)
24    return()
25  endif()
26
27  cmake_parse_arguments(
28    "LIBC_BENCHMARKS_UNITTEST"
29    "" # No optional arguments
30    "SUITE" # Single value arguments
31    "SRCS;DEPENDS" # Multi-value arguments
32    ${ARGN}
33  )
34
35  add_executable(${target_name}
36    EXCLUDE_FROM_ALL
37    ${LIBC_BENCHMARKS_UNITTEST_SRCS}
38  )
39  target_link_libraries(${target_name}
40    PRIVATE
41    llvm_gtest_main
42    llvm_gtest
43    ${LIBC_BENCHMARKS_UNITTEST_DEPENDS}
44  )
45  llvm_update_compile_flags(${target_name})
46
47  add_custom_command(
48    TARGET ${target_name}
49    POST_BUILD
50    COMMAND $<TARGET_FILE:${target_name}>
51  )
52  add_dependencies(libc-benchmark-util-tests ${target_name})
53endfunction()
54
55#==============================================================================
56# Build Google Benchmark for libc
57#==============================================================================
58
59include(ExternalProject)
60ExternalProject_Add(google-benchmark-libc
61        EXCLUDE_FROM_ALL ON
62        PREFIX google-benchmark-libc
63        SOURCE_DIR ${LLVM_THIRD_PARTY_DIR}/benchmark
64        INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/google-benchmark-libc
65        CMAKE_CACHE_ARGS
66          -DBENCHMARK_ENABLE_EXCEPTIONS:BOOL=OFF
67          -DBENCHMARK_ENABLE_LTO:BOOL=OFF
68          -DBENCHMARK_ENABLE_TESTING:BOOL=OFF
69          -DBENCHMARK_ENABLE_WERROR:BOOL=${LLVM_ENABLE_WERROR}
70          -DBENCHMARK_FORCE_WERROR:BOOL=OFF
71          -DBENCHMARK_USE_LIBCXX:BOOL=OFF
72          -DCMAKE_BUILD_TYPE:STRING=Release
73
74          -DCMAKE_SYSTEM_NAME:STRING=${CMAKE_SYSTEM_NAME}
75          -DCMAKE_SYSTEM_PROCESSOR:STRING=${CMAKE_SYSTEM_PROCESSOR}
76          -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
77          -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}
78          -DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
79          -DCMAKE_FIND_ROOT_PATH:STRING=${CMAKE_FIND_ROOT_PATH}
80
81          -DBUILD_SHARED_LIBS:BOOL=OFF
82          -DCMAKE_EXE_LINKER_FLAGS:STRING=-static
83
84          -DCMAKE_CXX_STANDARD:STRING=14
85          -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
86        )
87
88add_custom_target(libc-benchmark-util-tests)
89
90# libc-benchmark
91add_library(libc-benchmark
92    STATIC
93    EXCLUDE_FROM_ALL
94    LibcBenchmark.cpp
95    LibcBenchmark.h
96)
97
98target_include_directories(libc-benchmark
99    PUBLIC ${LLVM_INCLUDE_DIR} ${LLVM_MAIN_INCLUDE_DIR}
100)
101target_link_libraries(libc-benchmark
102    PUBLIC
103    benchmark::benchmark
104    LLVMSupport
105    LLVMTargetParser
106    Threads::Threads
107)
108add_dependencies(libc-benchmark google-benchmark-libc)
109llvm_update_compile_flags(libc-benchmark)
110
111add_libc_benchmark_unittest(libc-benchmark-test
112    SRCS LibcBenchmarkTest.cpp
113    DEPENDS libc-benchmark
114)
115
116# libc-memory-benchmark
117add_library(libc-memory-benchmark
118    STATIC
119    EXCLUDE_FROM_ALL
120    LibcMemoryBenchmark.cpp
121    LibcMemoryBenchmark.h
122    LibcFunctionPrototypes.h
123    MemorySizeDistributions.cpp
124    MemorySizeDistributions.h
125)
126target_include_directories(libc-memory-benchmark
127    PUBLIC
128    ${CMAKE_CURRENT_SOURCE_DIR}
129    ${LIBC_SOURCE_DIR}
130)
131target_link_libraries(libc-memory-benchmark
132    PUBLIC
133    libc-benchmark
134)
135llvm_update_compile_flags(libc-memory-benchmark)
136
137add_libc_benchmark_unittest(libc-memory-benchmark-test
138    SRCS LibcMemoryBenchmarkTest.cpp
139    DEPENDS libc-memory-benchmark
140)
141
142# json
143add_library(json
144    STATIC
145    EXCLUDE_FROM_ALL
146    JSON.cpp
147    JSON.h
148)
149target_link_libraries(json PUBLIC libc-memory-benchmark)
150llvm_update_compile_flags(json)
151
152add_libc_benchmark_unittest(json-test
153    SRCS JSONTest.cpp
154    DEPENDS json
155)
156
157#==============================================================================
158# Benchmarking tool
159#==============================================================================
160
161# Benchmark all implementations that can run on the target CPU.
162function(add_libc_multi_impl_benchmark name)
163  get_property(fq_implementations GLOBAL PROPERTY ${name}_implementations)
164  foreach(fq_config_name IN LISTS fq_implementations)
165    get_target_property(required_cpu_features ${fq_config_name} REQUIRE_CPU_FEATURES)
166    cpu_supports(can_run "${required_cpu_features}")
167    if(can_run)
168        set(benchmark_name ${fq_config_name}_benchmark)
169        add_executable(${benchmark_name}
170            EXCLUDE_FROM_ALL
171            LibcMemoryBenchmarkMain.cpp
172        )
173        get_target_property(entrypoint_object_file ${fq_config_name} "OBJECT_FILE_RAW")
174        target_link_libraries(${benchmark_name} PUBLIC json ${entrypoint_object_file})
175        string(TOUPPER ${name} name_upper)
176        target_compile_definitions(${benchmark_name} PRIVATE "-DLIBC_BENCHMARK_FUNCTION_${name_upper}=LIBC_NAMESPACE::${name}" "-DLIBC_BENCHMARK_FUNCTION_NAME=\"${fq_config_name}\"")
177        llvm_update_compile_flags(${benchmark_name})
178    else()
179      message(STATUS "Skipping benchmark for '${fq_config_name}' insufficient host cpu features '${required_cpu_features}'")
180    endif()
181  endforeach()
182endfunction()
183
184add_libc_multi_impl_benchmark(bcmp)
185add_libc_multi_impl_benchmark(bzero)
186add_libc_multi_impl_benchmark(memcmp)
187add_libc_multi_impl_benchmark(memcpy)
188add_libc_multi_impl_benchmark(memmove)
189add_libc_multi_impl_benchmark(memset)
190
191#==============================================================================
192# Google Benchmarking tool
193#==============================================================================
194
195# This target uses the Google Benchmark facility to report throughput for llvm
196# libc memory functions compiled for the host machine. This is useful to
197# continuously monitor the performance of the memory functions.
198add_executable(libc.benchmarks.memory_functions.opt_host
199  EXCLUDE_FROM_ALL
200  LibcMemoryGoogleBenchmarkMain.cpp
201  LibcDefaultImplementations.cpp
202)
203target_link_libraries(libc.benchmarks.memory_functions.opt_host
204  PRIVATE
205  libc-memory-benchmark
206  libc.src.string.memcmp_opt_host.__internal__
207  libc.src.string.bcmp_opt_host.__internal__
208  libc.src.string.memcpy_opt_host.__internal__
209  libc.src.string.memset_opt_host.__internal__
210  libc.src.string.bzero_opt_host.__internal__
211  libc.src.string.memmove_opt_host.__internal__
212  benchmark_main
213)
214llvm_update_compile_flags(libc.benchmarks.memory_functions.opt_host)
215
216add_subdirectory(automemcpy)
217