-
Notifications
You must be signed in to change notification settings - Fork 11.6k
/
CMakeLists.txt
207 lines (181 loc) · 6.42 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
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
LibcFunctionPrototypes.h
MemorySizeDistributions.cpp
MemorySizeDistributions.h
)
target_include_directories(libc-memory-benchmark
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}
)
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
#==============================================================================
# Benchmark all implementations that can run on the target CPU.
function(add_libc_multi_impl_benchmark name)
get_property(fq_implementations GLOBAL PROPERTY ${name}_implementations)
foreach(fq_config_name IN LISTS fq_implementations)
get_target_property(required_cpu_features ${fq_config_name} REQUIRE_CPU_FEATURES)
cpu_supports(can_run "${required_cpu_features}")
if(can_run)
set(benchmark_name ${fq_config_name}_benchmark)
add_executable(${benchmark_name}
EXCLUDE_FROM_ALL
LibcMemoryBenchmarkMain.cpp
)
get_target_property(entrypoint_object_file ${fq_config_name} "OBJECT_FILE_RAW")
target_link_libraries(${benchmark_name} PUBLIC json ${entrypoint_object_file})
string(TOUPPER ${name} name_upper)
target_compile_definitions(${benchmark_name} PRIVATE "-DLIBC_BENCHMARK_FUNCTION_${name_upper}=__llvm_libc::${name}" "-DLIBC_BENCHMARK_FUNCTION_NAME=\"${fq_config_name}\"")
else()
message(STATUS "Skipping benchmark for '${fq_config_name}' insufficient host cpu features '${required_cpu_features}'")
endif()
endforeach()
endfunction()
add_libc_multi_impl_benchmark(bcmp)
add_libc_multi_impl_benchmark(bzero)
add_libc_multi_impl_benchmark(memcmp)
add_libc_multi_impl_benchmark(memcpy)
add_libc_multi_impl_benchmark(memmove)
add_libc_multi_impl_benchmark(memset)
#==============================================================================
# Google Benchmarking tool
#==============================================================================
# This target uses the Google Benchmark facility to report throughput for llvm
# libc memory functions compiled for the host machine. This is useful to
# continuously monitor the performance of the memory functions.
add_executable(libc.benchmarks.memory_functions.opt_host
EXCLUDE_FROM_ALL
LibcMemoryGoogleBenchmarkMain.cpp
LibcDefaultImplementations.cpp
)
target_link_libraries(libc.benchmarks.memory_functions.opt_host
PRIVATE
libc-memory-benchmark
libc.src.string.memcmp_opt_host
libc.src.string.bcmp_opt_host
libc.src.string.memcpy_opt_host
libc.src.string.memset_opt_host
libc.src.string.bzero_opt_host
libc.src.string.memmove_opt_host
benchmark_main
)
add_subdirectory(automemcpy)