Skip to content
This repository was archived by the owner on Mar 28, 2020. It is now read-only.

Commit f32ea9d

Browse files
authored
Merge pull request #1 from apple/stable-next
Re-branch stable from swift-5.1-branch
2 parents 432692b + 1794f8f commit f32ea9d

File tree

970 files changed

+30993
-6764
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

970 files changed

+30993
-6764
lines changed

CMakeLists.txt

Lines changed: 91 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
2727
project(libcxx CXX C)
2828

2929
set(PACKAGE_NAME libcxx)
30-
set(PACKAGE_VERSION 7.0.0)
30+
set(PACKAGE_VERSION 8.0.0svn)
3131
set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
3232
set(PACKAGE_BUGREPORT "[email protected]")
3333

@@ -50,9 +50,14 @@ MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
5050
"${PROJECT_NAME} requires an out of source build. Please create a separate
5151
build directory and run 'cmake /path/to/${PROJECT_NAME} [options]' there."
5252
)
53+
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" AND "${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC")
54+
message(STATUS "Configuring for clang-cl")
55+
set(LIBCXX_TARGETING_CLANG_CL ON)
56+
endif()
5357

5458
if (MSVC)
5559
set(LIBCXX_TARGETING_MSVC ON)
60+
message(STATUS "Configuring for MSVC")
5661
else()
5762
set(LIBCXX_TARGETING_MSVC OFF)
5863
endif()
@@ -77,7 +82,12 @@ option(LIBCXX_ENABLE_FILESYSTEM "Build filesystem as part of libc++fs.a"
7782
option(LIBCXX_INCLUDE_TESTS "Build the libc++ tests." ${LLVM_INCLUDE_TESTS})
7883

7984
# Benchmark options -----------------------------------------------------------
80-
option(LIBCXX_INCLUDE_BENCHMARKS "Build the libc++ benchmarks and their dependancies" ON)
85+
option(LIBCXX_INCLUDE_BENCHMARKS "Build the libc++ benchmarks and their dependencies" ON)
86+
87+
set(LIBCXX_BENCHMARK_TEST_ARGS_DEFAULT --benchmark_min_time=0.01)
88+
set(LIBCXX_BENCHMARK_TEST_ARGS "${LIBCXX_BENCHMARK_TEST_ARGS_DEFAULT}" CACHE STRING
89+
"Arguments to pass when running the benchmarks using check-cxx-benchmarks")
90+
8191
set(LIBCXX_BENCHMARK_NATIVE_STDLIB "" CACHE STRING
8292
"Build the benchmarks against the specified native STL.
8393
The value must be one of libc++/libstdc++")
@@ -111,12 +121,8 @@ cmake_dependent_option(LIBCXX_INSTALL_FILESYSTEM_LIBRARY
111121
"Install libc++fs.a" ON
112122
"LIBCXX_ENABLE_FILESYSTEM;LIBCXX_INSTALL_LIBRARY" OFF)
113123

114-
if (FUCHSIA)
115-
set(DEFAULT_ABI_VERSION 2)
116-
else()
117-
set(DEFAULT_ABI_VERSION 1)
118-
endif()
119-
set(LIBCXX_ABI_VERSION ${DEFAULT_ABI_VERSION} CACHE STRING "ABI version of libc++.")
124+
set(LIBCXX_ABI_VERSION "1" CACHE STRING "ABI version of libc++. Can be either 1 or 2, where 2 is currently not stable. Defaults to 1.")
125+
set(LIBCXX_ABI_NAMESPACE "" CACHE STRING "The inline ABI namespace used by libc++. It defaults to __n where `n` is the current ABI version.")
120126
option(LIBCXX_ABI_UNSTABLE "Unstable ABI of libc++." OFF)
121127
option(LIBCXX_ABI_FORCE_ITANIUM "Ignore auto-detection and force use of the Itanium ABI.")
122128
option(LIBCXX_ABI_FORCE_MICROSOFT "Ignore auto-detection and force use of the Microsoft ABI.")
@@ -503,14 +509,16 @@ remove_flags(-Wno-pedantic -pedantic-errors -pedantic)
503509

504510
# Required flags ==============================================================
505511
set(LIBCXX_STANDARD_VER c++11 CACHE INTERNAL "internal option to change build dialect")
506-
if (LIBCXX_HAS_MUSL_LIBC)
512+
if (LIBCXX_HAS_MUSL_LIBC OR LIBCXX_TARGETING_CLANG_CL)
507513
# musl's pthread implementations uses volatile types in their structs which is
508514
# not a constexpr in C++11 but is in C++14, so we use C++14 with musl.
509515
set(LIBCXX_STANDARD_VER c++14 CACHE INTERNAL "internal option to change build dialect")
510516
endif()
511517
add_compile_flags_if_supported(-std=${LIBCXX_STANDARD_VER})
518+
add_compile_flags_if_supported("/std:${LIBCXX_STANDARD_VER}")
512519
mangle_name("LIBCXX_SUPPORTS_STD_EQ_${LIBCXX_STANDARD_VER}_FLAG" SUPPORTS_DIALECT_NAME)
513-
if(NOT ${SUPPORTS_DIALECT_NAME})
520+
mangle_name("LIBCXX_SUPPORTS_STD_COLON_${LIBCXX_STANDARD_VER}_FLAG" SUPPORTS_DIALECT_NAME_MSVC)
521+
if(NOT ${SUPPORTS_DIALECT_NAME} AND NOT ${SUPPORTS_DIALECT_NAME_MSVC})
514522
if(NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" AND NOT "${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC")
515523
message(FATAL_ERROR "C++11 or greater is required but the compiler does not support ${LIBCXX_STANDARD_VER}")
516524
endif()
@@ -545,11 +553,29 @@ add_definitions(-D_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
545553
add_compile_flags_if_supported(
546554
-Wall -Wextra -W -Wwrite-strings
547555
-Wno-unused-parameter -Wno-long-long
548-
-Werror=return-type)
556+
-Werror=return-type -Wextra-semi)
549557
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
550558
add_compile_flags_if_supported(
551559
-Wno-user-defined-literals
552560
-Wno-covered-switch-default)
561+
if (LIBCXX_TARGETING_CLANG_CL)
562+
add_compile_flags_if_supported(
563+
-Wno-c++98-compat
564+
-Wno-c++98-compat-pedantic
565+
-Wno-c++11-compat
566+
-Wno-undef
567+
-Wno-reserved-id-macro
568+
-Wno-gnu-include-next
569+
-Wno-gcc-compat # For ignoring "'diagnose_if' is a clang extension" warnings
570+
-Wno-zero-as-null-pointer-constant # FIXME: Remove this and fix all occurrences.
571+
-Wno-deprecated-dynamic-exception-spec # For auto_ptr
572+
-Wno-sign-conversion
573+
-Wno-old-style-cast
574+
-Wno-deprecated # FIXME: Remove this and fix all occurrences.
575+
-Wno-shift-sign-overflow # FIXME: Why do we need this with clang-cl but not clang?
576+
-Wno-double-promotion # FIXME: remove me
577+
)
578+
endif()
553579
elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
554580
add_compile_flags_if_supported(
555581
-Wno-literal-suffix
@@ -622,44 +648,63 @@ endif()
622648

623649
# Sanitizer flags =============================================================
624650

625-
# Configure for sanitizers. If LIBCXX_STANDALONE_BUILD then we have to do
626-
# the flag translation ourselves. Othewise LLVM's CMakeList.txt will handle it.
627-
if (LIBCXX_STANDALONE_BUILD)
628-
set(LLVM_USE_SANITIZER "" CACHE STRING
629-
"Define the sanitizer used to build the library and tests")
651+
function(get_sanitizer_flags OUT_VAR USE_SANITIZER)
652+
set(SANITIZER_FLAGS)
653+
set(USE_SANITIZER "${USE_SANITIZER}")
630654
# NOTE: LLVM_USE_SANITIZER checks for a UNIX like system instead of MSVC.
631655
# But we don't have LLVM_ON_UNIX so checking for MSVC is the best we can do.
632-
if (LLVM_USE_SANITIZER AND NOT MSVC)
633-
add_flags_if_supported("-fno-omit-frame-pointer")
634-
add_flags_if_supported("-gline-tables-only")
656+
if (USE_SANITIZER AND NOT MSVC)
657+
append_flags_if_supported(SANITIZER_FLAGS "-fno-omit-frame-pointer")
658+
append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
635659

636660
if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND
637-
NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
638-
add_flags_if_supported("-gline-tables-only")
661+
NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
662+
append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
639663
endif()
640-
if (LLVM_USE_SANITIZER STREQUAL "Address")
641-
add_flags("-fsanitize=address")
642-
elseif (LLVM_USE_SANITIZER MATCHES "Memory(WithOrigins)?")
643-
add_flags(-fsanitize=memory)
644-
if (LLVM_USE_SANITIZER STREQUAL "MemoryWithOrigins")
645-
add_flags("-fsanitize-memory-track-origins")
664+
if (USE_SANITIZER STREQUAL "Address")
665+
append_flags(SANITIZER_FLAGS "-fsanitize=address")
666+
elseif (USE_SANITIZER MATCHES "Memory(WithOrigins)?")
667+
append_flags(SANITIZER_FLAGS -fsanitize=memory)
668+
if (USE_SANITIZER STREQUAL "MemoryWithOrigins")
669+
append_flags(SANITIZER_FLAGS "-fsanitize-memory-track-origins")
646670
endif()
647-
elseif (LLVM_USE_SANITIZER STREQUAL "Undefined")
648-
add_flags("-fsanitize=undefined -fno-sanitize=vptr,function -fno-sanitize-recover=all")
649-
elseif (LLVM_USE_SANITIZER STREQUAL "Thread")
650-
add_flags(-fsanitize=thread)
671+
elseif (USE_SANITIZER STREQUAL "Undefined")
672+
append_flags(SANITIZER_FLAGS "-fsanitize=undefined -fno-sanitize=vptr,function -fno-sanitize-recover=all")
673+
elseif (USE_SANITIZER STREQUAL "Thread")
674+
append_flags(SANITIZER_FLAGS -fsanitize=thread)
651675
else()
652-
message(WARNING "Unsupported value of LLVM_USE_SANITIZER: ${LLVM_USE_SANITIZER}")
676+
message(WARNING "Unsupported value of LLVM_USE_SANITIZER: ${USE_SANITIZER}")
653677
endif()
654-
elseif(LLVM_USE_SANITIZER AND MSVC)
678+
elseif(USE_SANITIZER AND MSVC)
655679
message(WARNING "LLVM_USE_SANITIZER is not supported on this platform.")
656680
endif()
681+
set(${OUT_VAR} "${SANITIZER_FLAGS}" PARENT_SCOPE)
682+
endfunction()
683+
684+
# Configure for sanitizers. If LIBCXX_STANDALONE_BUILD then we have to do
685+
# the flag translation ourselves. Othewise LLVM's CMakeList.txt will handle it.
686+
if (LIBCXX_STANDALONE_BUILD)
687+
set(LLVM_USE_SANITIZER "" CACHE STRING
688+
"Define the sanitizer used to build the library and tests")
689+
endif()
690+
get_sanitizer_flags(SANITIZER_FLAGS "${LLVM_USE_SANITIZER}")
691+
if (LIBCXX_STANDALONE_BUILD AND SANITIZER_FLAGS)
692+
add_flags(${SANITIZER_FLAGS})
657693
endif()
658694

659695
# Configuration file flags =====================================================
660-
if (NOT LIBCXX_ABI_VERSION EQUAL DEFAULT_ABI_VERSION)
696+
if (NOT LIBCXX_ABI_VERSION EQUAL 1)
661697
config_define(${LIBCXX_ABI_VERSION} _LIBCPP_ABI_VERSION)
662698
endif()
699+
if (NOT LIBCXX_ABI_NAMESPACE STREQUAL "")
700+
if (NOT LIBCXX_ABI_NAMESPACE MATCHES "__.*")
701+
message(WARNING "LIBCXX_ABI_NAMESPACE must be a reserved identifier.")
702+
endif()
703+
if (LIBCXX_ABI_NAMESPACE MATCHES "__[0-9]+$")
704+
message(FATAL_ERROR "LIBCXX_ABI_NAMESPACE '${LIBCXX_ABI_NAMESPACE}' is reserved for use by libc++.")
705+
endif()
706+
config_define(${LIBCXX_ABI_NAMESPACE} _LIBCPP_ABI_NAMESPACE)
707+
endif()
663708
config_define_if(LIBCXX_ABI_UNSTABLE _LIBCPP_ABI_UNSTABLE)
664709
config_define_if(LIBCXX_ABI_FORCE_ITANIUM _LIBCPP_ABI_FORCE_ITANIUM)
665710
config_define_if(LIBCXX_ABI_FORCE_MICROSOFT _LIBCPP_ABI_FORCE_MICROSOFT)
@@ -726,6 +771,18 @@ include_directories(include)
726771
add_subdirectory(include)
727772
add_subdirectory(lib)
728773

774+
set(LIBCXX_TEST_DEPS "")
775+
776+
if (LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY)
777+
list(APPEND LIBCXX_TEST_DEPS cxx_experimental)
778+
endif()
779+
if (LIBCXX_ENABLE_FILESYSTEM)
780+
list(APPEND LIBCXX_TEST_DEPS cxx_filesystem)
781+
endif()
782+
783+
if (LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY)
784+
list(APPEND LIBCXX_TEST_DEPS cxx_external_threads)
785+
endif()
729786

730787
if (LIBCXX_INCLUDE_BENCHMARKS)
731788
add_subdirectory(benchmarks)

appveyor-reqs-install.cmd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ cd C:\projects\deps
99
:: Setup Compiler
1010
::###########################################################################
1111
if NOT EXIST llvm-installer.exe (
12-
appveyor DownloadFile http://prereleases.llvm.org/win-snapshots/LLVM-7.0.0-r325576-win32.exe -FileName llvm-installer.exe
12+
appveyor DownloadFile https://prereleases.llvm.org/win-snapshots/LLVM-8.0.0-r345380-win32.exe -FileName llvm-installer.exe
1313
)
1414
if "%CLANG_VERSION%"=="ToT" (
1515
START /WAIT llvm-installer.exe /S /D=C:\"Program Files\LLVM"

appveyor.yml

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,6 @@ environment:
1818
GENERATOR: Ninja
1919
MAKE_PROGRAM: ninja
2020
APPVEYOR_SAVE_CACHE_ON_ERROR: true
21-
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
22-
CMAKE_OPTIONS: -DCMAKE_C_COMPILER=clang-cl.exe -DCMAKE_CXX_COMPILER=clang-cl.exe
23-
CLANG_VERSION: 4
24-
MSVC_SETUP_PATH: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat
25-
MSVC_SETUP_ARG: x86_amd64
26-
GENERATOR: Ninja
27-
MAKE_PROGRAM: ninja
28-
APPVEYOR_SAVE_CACHE_ON_ERROR: true
2921
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
3022
MINGW_PATH: C:\mingw-w64\i686-6.3.0-posix-dwarf-rt_v5-rev1\mingw32\bin
3123
GENERATOR: MinGW Makefiles

benchmarks/CMakeLists.txt

Lines changed: 74 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,21 @@ set(BENCHMARK_LIBCXX_COMPILE_FLAGS
1111
-isystem ${LIBCXX_SOURCE_DIR}/include
1212
-L${LIBCXX_LIBRARY_DIR}
1313
-Wl,-rpath,${LIBCXX_LIBRARY_DIR}
14+
${SANITIZER_FLAGS}
1415
)
1516
if (DEFINED LIBCXX_CXX_ABI_LIBRARY_PATH)
1617
list(APPEND BENCHMARK_LIBCXX_COMPILE_FLAGS
1718
-L${LIBCXX_CXX_ABI_LIBRARY_PATH}
1819
-Wl,-rpath,${LIBCXX_CXX_ABI_LIBRARY_PATH})
1920
endif()
21+
if (LIBCXX_NEEDS_SITE_CONFIG)
22+
list(APPEND BENCHMARK_LIBCXX_COMPILE_FLAGS -include "${LIBCXX_BINARY_DIR}/__config_site")
23+
endif()
2024
split_list(BENCHMARK_LIBCXX_COMPILE_FLAGS)
2125

2226
ExternalProject_Add(google-benchmark-libcxx
2327
EXCLUDE_FROM_ALL ON
24-
DEPENDS cxx
28+
DEPENDS cxx cxx-headers
2529
PREFIX benchmark-libcxx
2630
SOURCE_DIR ${LIBCXX_SOURCE_DIR}/utils/google-benchmark
2731
INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/benchmark-libcxx
@@ -67,20 +71,38 @@ add_custom_target(cxx-benchmarks)
6771
set(BENCHMARK_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
6872
set(BENCHMARK_LIBCXX_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/benchmark-libcxx)
6973
set(BENCHMARK_NATIVE_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/benchmark-native)
74+
75+
check_flag_supported("-std=c++17")
76+
mangle_name("LIBCXX_SUPPORTS_STD_EQ_c++17_FLAG" BENCHMARK_SUPPORTS_STD_CXX17_FLAG)
77+
if (${BENCHMARK_SUPPORTS_STD_CXX17_FLAG})
78+
set(BENCHMARK_DIALECT_FLAG "-std=c++17")
79+
else()
80+
# If the compiler doesn't support -std=c++17, attempt to fall back to -std=c++1z while still
81+
# requiring C++17 language features.
82+
set(BENCHMARK_DIALECT_FLAG "-std=c++1z")
83+
endif()
84+
7085
set(BENCHMARK_TEST_COMPILE_FLAGS
71-
-std=c++17 -O2
86+
${BENCHMARK_DIALECT_FLAG} -O2
7287
-I${BENCHMARK_LIBCXX_INSTALL}/include
7388
-I${LIBCXX_SOURCE_DIR}/test/support
7489
)
7590
set(BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS
7691
-nostdinc++
7792
-isystem ${LIBCXX_SOURCE_DIR}/include
7893
${BENCHMARK_TEST_COMPILE_FLAGS}
94+
${SANITIZER_FLAGS}
7995
-Wno-user-defined-literals
8096
)
97+
if (LIBCXX_NEEDS_SITE_CONFIG)
98+
list(APPEND BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS
99+
-include "${LIBCXX_BINARY_DIR}/__config_site")
100+
endif()
101+
81102
set(BENCHMARK_TEST_LIBCXX_LINK_FLAGS
82103
-nodefaultlibs
83104
-L${BENCHMARK_LIBCXX_INSTALL}/lib/
105+
${SANITIZER_FLAGS}
84106
)
85107
set(BENCHMARK_TEST_NATIVE_COMPILE_FLAGS
86108
${BENCHMARK_NATIVE_TARGET_FLAGS}
@@ -95,10 +117,25 @@ split_list(BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS)
95117
split_list(BENCHMARK_TEST_LIBCXX_LINK_FLAGS)
96118
split_list(BENCHMARK_TEST_NATIVE_COMPILE_FLAGS)
97119
split_list(BENCHMARK_TEST_NATIVE_LINK_FLAGS)
98-
macro(add_benchmark_test name source_file)
120+
121+
if (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libstdc++")
122+
find_library(LIBSTDCXX_FILESYSTEM_TEST stdc++fs
123+
PATHS ${LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN}
124+
PATH_SUFFIXES lib lib64
125+
DOC "The libstdc++ filesystem library used by the benchmarks"
126+
)
127+
if (NOT "${LIBSTDCXX_FILESYSTEM_TEST}" STREQUAL "LIBSTDCXX_FILESYSTEM_TEST-NOTFOUND")
128+
set(LIBSTDCXX_FILESYSTEM_LIB "stdc++fs")
129+
endif()
130+
endif()
131+
132+
set(libcxx_benchmark_targets)
133+
134+
function(add_benchmark_test name source_file)
99135
set(libcxx_target ${name}_libcxx)
136+
list(APPEND libcxx_benchmark_targets ${libcxx_target})
100137
add_executable(${libcxx_target} EXCLUDE_FROM_ALL ${source_file})
101-
add_dependencies(${libcxx_target} cxx google-benchmark-libcxx)
138+
add_dependencies(${libcxx_target} cxx cxx-headers google-benchmark-libcxx)
102139
add_dependencies(cxx-benchmarks ${libcxx_target})
103140
if (LIBCXX_ENABLE_SHARED)
104141
target_link_libraries(${libcxx_target} cxx_shared)
@@ -108,23 +145,33 @@ macro(add_benchmark_test name source_file)
108145
if (TARGET cxx_experimental)
109146
target_link_libraries(${libcxx_target} cxx_experimental)
110147
endif()
148+
if (TARGET cxx_filesystem)
149+
target_link_libraries(${libcxx_target} cxx_filesystem)
150+
endif()
111151
target_link_libraries(${libcxx_target} -lbenchmark)
152+
if (LLVM_USE_SANITIZER)
153+
target_link_libraries(${libcxx_target} -ldl)
154+
endif()
112155
set_target_properties(${libcxx_target}
113156
PROPERTIES
114157
OUTPUT_NAME "${name}.libcxx.out"
115158
RUNTIME_OUTPUT_DIRECTORY "${BENCHMARK_OUTPUT_DIR}"
116159
COMPILE_FLAGS "${BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS}"
117160
LINK_FLAGS "${BENCHMARK_TEST_LIBCXX_LINK_FLAGS}")
118161
if (LIBCXX_BENCHMARK_NATIVE_STDLIB)
162+
if (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libstdc++" AND NOT DEFINED LIBSTDCXX_FILESYSTEM_LIB
163+
AND "${name}" STREQUAL "filesystem")
164+
return()
165+
endif()
119166
set(native_target ${name}_native)
120167
add_executable(${native_target} EXCLUDE_FROM_ALL ${source_file})
121168
add_dependencies(${native_target} google-benchmark-native
122169
google-benchmark-libcxx)
123170
target_link_libraries(${native_target} -lbenchmark)
124171
if (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libstdc++")
125-
target_link_libraries(${native_target} -lstdc++fs)
172+
target_link_libraries(${native_target} ${LIBSTDCXX_FILESYSTEM_LIB})
126173
elseif (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libc++")
127-
target_link_libraries(${native_target} -lc++experimental)
174+
target_link_libraries(${native_target} -lc++fs -lc++experimental)
128175
endif()
129176
if (LIBCXX_HAS_PTHREAD_LIB)
130177
target_link_libraries(${native_target} -pthread)
@@ -138,7 +185,7 @@ macro(add_benchmark_test name source_file)
138185
COMPILE_FLAGS "${BENCHMARK_TEST_NATIVE_COMPILE_FLAGS}"
139186
LINK_FLAGS "${BENCHMARK_TEST_NATIVE_LINK_FLAGS}")
140187
endif()
141-
endmacro()
188+
endfunction()
142189

143190

144191
#==============================================================================
@@ -155,3 +202,23 @@ foreach(test_path ${BENCHMARK_TESTS})
155202
endif()
156203
add_benchmark_test(${test_name} ${test_file})
157204
endforeach()
205+
206+
if (LIBCXX_INCLUDE_TESTS)
207+
include(AddLLVM)
208+
209+
if (NOT DEFINED LIBCXX_TEST_DEPS)
210+
message(FATAL_ERROR "Expected LIBCXX_TEST_DEPS to be defined")
211+
endif()
212+
213+
configure_lit_site_cfg(
214+
${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.py.in
215+
${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg.py)
216+
217+
set(BENCHMARK_LIT_ARGS "--show-all --show-xfail --show-unsupported ${LIT_ARGS_DEFAULT}")
218+
219+
add_lit_target(check-cxx-benchmarks
220+
"Running libcxx benchmarks tests"
221+
${CMAKE_CURRENT_BINARY_DIR}
222+
DEPENDS cxx-benchmarks ${LIBCXX_TEST_DEPS}
223+
ARGS ${BENCHMARK_LIT_ARGS})
224+
endif()

0 commit comments

Comments
 (0)