Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions arch/sim/src/cmake/Toolchain.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,10 @@ if(CONFIG_LIBCXX)
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-D_LIBCPP_DISABLE_AVAILABILITY>)
endif()

if(CONFIG_LIBCXX_TEST)
add_link_options(-Wl,-latomic)
endif()

if(APPLE)
add_link_options(-Wl,-dead_strip)
else()
Expand Down
5 changes: 5 additions & 0 deletions libs/libxx/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -136,4 +136,9 @@ config LIBCXX_VERSION
depends on LIBCXX
default "17.0.6"

config LIBCXX_TEST
bool "LLVM Libcxx Library Test"
depends on LIBCXX && CXX_EXCEPTION
default n

endif
196 changes: 193 additions & 3 deletions libs/libxx/libcxx/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -69,13 +69,17 @@ if(CONFIG_LIBCXX)
nuttx_create_symlink(${CMAKE_CURRENT_LIST_DIR}/libcxx/include
${CMAKE_BINARY_DIR}/include/libcxx)

configure_file(${CMAKE_CURRENT_LIST_DIR}/../__config_site
${CMAKE_BINARY_DIR}/include/libcxx/__config_site COPYONLY)
nuttx_create_symlink(${CMAKE_CURRENT_LIST_DIR}/../__config_site
${CMAKE_BINARY_DIR}/include/libcxx_config/__config_site)

set_property(
TARGET nuttx
APPEND
PROPERTY NUTTX_CXX_INCLUDE_DIRECTORIES ${CMAKE_BINARY_DIR}/include/libcxx)
PROPERTY NUTTX_CXX_INCLUDE_DIRECTORIES
${CMAKE_BINARY_DIR}/include/libcxx
${CMAKE_BINARY_DIR}/include/libcxx_config
${CMAKE_CURRENT_LIST_DIR}/libcxx/test/support
${CMAKE_CURRENT_LIST_DIR}/libcxx/src)

add_compile_definitions(_LIBCPP_BUILDING_LIBRARY)
if(CONFIG_LIBSUPCXX_TOOLCHAIN)
Expand Down Expand Up @@ -123,4 +127,190 @@ if(CONFIG_LIBCXX)
target_compile_options(libcxx PRIVATE ${FLAGS})
target_include_directories(libcxx BEFORE
PRIVATE ${CMAKE_CURRENT_LIST_DIR}/libcxx/src)

if(CONFIG_LIBCXX_TEST)
list(
APPEND
FLAGS
-Wno-array-bounds
-Wno-permissive
-Wno-unused-variable
-Wno-unused-but-set-variable
-Wno-psabi
-Wno-unused-local-typedefs
-Wno-unused-result
-Wno-unused-function
-Wno-undef
-Wno-return-type
-Wno-self-move
-Wno-class-memaccess
-Wno-tautological-compare
-Wno-narrowing
-Wno-use-after-free
-Wno-invalid-memory-model
-Wno-mismatched-new-delete)
add_compile_options(-UNDEBUG)
add_compile_definitions(
DISABLE_NEW_COUNT
_LIBCPP_ABI_INCOMPLETE_TYPES_IN_DEQUE
_LIBCPP_ENABLE_DEBUG_MODE
_LIBCPP_ENABLE_CXX17_REMOVED_BINDERS
_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR
_LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_MEMBERS
_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS
_LIBCPP_DISABLE_DEPRECATION_WARNINGS)

set(i 0)
set(TEST_DIR "${CMAKE_CURRENT_LIST_DIR}/libcxx/test")
file(GLOB_RECURSE TESTS "${TEST_DIR}/*.pass.cpp")
file(
GLOB
UNSUPPORTED_TESTS
# error: ‘_wremove’ was not declared in this scope
${TEST_DIR}/libcxx/input.output/file.streams/fstreams/ifstream.members/open_wchar_pointer.pass.cpp
${TEST_DIR}/libcxx/input.output/file.streams/fstreams/ofstream.members/open_wchar_pointer.pass.cpp
${TEST_DIR}/libcxx/input.output/file.streams/fstreams/ofstream.cons/wchar_pointer.pass.cpp
${TEST_DIR}/libcxx/input.output/file.streams/fstreams/fstream.members/open_wchar_pointer.pass.cpp
${TEST_DIR}/libcxx/input.output/file.streams/fstreams/fstream.cons/wchar_pointer.pass.cpp
# error: ‘x’ in ‘struct Foo’ does not name a type
${TEST_DIR}/libcxx/selftest/compile.pass.cpp/compile-error.compile.pass.cpp
${TEST_DIR}/libcxx/selftest/pass.cpp/compile-error.pass.cpp
${TEST_DIR}/libcxx/selftest/link.pass.cpp/compile-error.link.pass.cpp
# error: ‘__sanitizer_verify_contiguous_container’ was not declared in
# this scope
${TEST_DIR}/libcxx/containers/sequences/vector/asan.pass.cpp
# error: attributes are not allowed on a function-definition
${TEST_DIR}/libcxx/thread/thread.mutex/thread_safety_requires_capability.pass.cpp
# fatal error: Block.h: No such file or directory
${TEST_DIR}/libcxx/utilities/function.objects/func.blocks.pass.cpp
# link error
${TEST_DIR}/libcxx/selftest/compile.pass.cpp/link-error.compile.pass.cpp
${TEST_DIR}/libcxx/selftest/link.pass.cpp/link-error.link.pass.cpp
${TEST_DIR}/libcxx/selftest/pass.cpp/link-error.pass.cpp
# std::views::join
${TEST_DIR}/std/ranges/range.adaptors/range.join.view/adaptor.pass.cpp
${TEST_DIR}/std/library/description/conventions/customization.point.object/cpo.compile.pass.cpp
${TEST_DIR}/std/algorithms/alg.modifying.operations/alg.copy/ranges.copy.segmented.pass.cpp
${TEST_DIR}/std/algorithms/alg.modifying.operations/alg.copy/ranges.copy_backward.pass.cpp
# no build __partition_chunks
${TEST_DIR}/libcxx/algorithms/pstl.libdispatch.chunk_partitions.pass.cpp
# REQUIRES: c++98 || c++03 || c++11 || c++14
${TEST_DIR}/std/containers/associative/multimap/multimap.value_compare/types.pass.cpp
${TEST_DIR}/std/containers/associative/map/map.value_compare/types.pass.cpp
# std::result_of
${TEST_DIR}/std/utilities/meta/meta.trans/meta.trans.other/result_of.pass.cpp
${TEST_DIR}/std/utilities/meta/meta.trans/meta.trans.other/result_of11.pass.cpp
${TEST_DIR}/std/utilities/function.objects/func.invoke/invoke.pass.cpp
${TEST_DIR}/std/utilities/function.objects/func.invoke/invoke_constexpr.pass.cpp
# WINT_MIN undef
${TEST_DIR}/std/language.support/cstdint/cstdint.syn/cstdint.pass.cpp
${TEST_DIR}/std/input.output/file.streams/c.files/cinttypes.pass.cpp
# static assertion failed
${TEST_DIR}/std/language.support/support.runtime/cstdlib.pass.cpp
# error: static assertion failed: Types differ unexpectedly
${TEST_DIR}/std/strings/c.strings/cstring.pass.cpp
${TEST_DIR}/std/strings/c.strings/cwchar.pass.cpp
# error: ‘is_literal_type_v’ is not a member of ‘std’
${TEST_DIR}/std/utilities/meta/meta.unary/meta.unary.prop/is_literal_type.pass.cpp
${TEST_DIR}/libcxx/containers/sequences/vector/asan.pass.cpp
# error: static assertion failed
${TEST_DIR}/libcxx/utilities/utility/pairs/pairs.pair/non_trivial_copy_move_ABI.pass.cpp
# unsport c++20
${TEST_DIR}/std/utilities/memory/default.allocator/allocator_types.void.compile.pass.cpp
${TEST_DIR}/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/auto_ptr.pass.cpp
${TEST_DIR}/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.assign/auto_ptr_Y.pass.cpp
${TEST_DIR}/std/utilities/utility/pairs/pairs.pair/assign_pair_cxx03.pass.cpp
${TEST_DIR}/std/utilities/function.objects/func.require/binary_function.pass.cpp
${TEST_DIR}/std/utilities/function.objects/func.require/unary_function.pass.cpp
${TEST_DIR}/std/utilities/function.objects/refwrap/weak_result.pass.cpp
${TEST_DIR}/std/utilities/function.objects/refwrap/binder_typedefs.compile.pass.cpp
${TEST_DIR}/std/language.support/support.dynamic/new.delete/new.delete.array/sized_delete_array11.pass.cpp
${TEST_DIR}/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete11.pass.cpp
# arm build error
${TEST_DIR}/std/numerics/cfenv/cfenv.syn/cfenv.pass.cpp
${TEST_DIR}/std/utilities/format/format.formatter/format.formatter.spec/formatter.floating_point.pass.cpp
${TEST_DIR}/std/localization/locales/locale.convenience/conversions/conversions.buffer/seekoff.pass.cpp
)

file(
GLOB_RECURSE
SKIP_TESTS
${TEST_DIR}/libcxx/containers/views/mdspan/*.pass.cpp
${TEST_DIR}/libcxx/input.output/iostream.format/print.fun/*.pass.cpp
${TEST_DIR}/libcxx/ranges/range.factories/range.repeat.view/*.pass.cpp
${TEST_DIR}/libcxx/utilities/expected/*.pass.cpp
# skip deprecated test
${TEST_DIR}/libcxx/depr/*.pass.cpp
${TEST_DIR}/std/depr/*.pass.cpp
${TEST_DIR}/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/*.pass.cpp
# arm atomic undef
${TEST_DIR}/std/atomics/atomics.types.operations/atomics.types.operations.req/*.pass.cpp
${TEST_DIR}/std/atomics/atomics.types.operations/atomics.types.operations.wait/*.pass.cpp
)
list(REMOVE_ITEM TESTS ${UNSUPPORTED_TESTS} ${SKIP_TESTS})
foreach(TEST ${TESTS})
if(EXISTS ${TEST})
set(GREP_PATTERNS
"UNSUPPORTED: c++03, c++11, c++14, c++17, c++20"
"TEST_LIBCPP_ASSERT_FAILURE"
"static_assert(test"
"UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME"
"UNSUPPORTED: gcc"
"include <sstream>"
"std::ranges::join_view"
"std::binary_function"
"std::unary_function"
"std::binary_negate"
"std::not1"
"std::not2"
"std::unary_negate"
"std::raw_storage_iterator"
"void operator delete"
"filesystem_test_helper.h"
"asan_testing.h")

set(SKIP_TEST FALSE)

foreach(PATTERN IN LISTS GREP_PATTERNS)
execute_process(COMMAND grep -q "${PATTERN}" ${TEST}
RESULT_VARIABLE grep_result)

if(grep_result EQUAL 0)
set(SKIP_TEST TRUE)
break()
endif()
endforeach()

if(SKIP_TEST)
continue()
endif()

execute_process(COMMAND grep -q "int main" ${TEST}
RESULT_VARIABLE grep_result)
if(NOT grep_result EQUAL 0)
continue()
endif()

get_filename_component(TEST_NAME ${TEST} NAME_WE)
foreach(CHARACTER "+" "-" "=" "[]")
string(REPLACE "${CHARACTER}" "_" TEST_NAME "${TEST_NAME}")
endforeach()

nuttx_add_application(
NAME
${TEST_NAME}_${i}
SRCS
${TEST}
STACKSIZE
102400
COMPILE_FLAGS
${FLAGS})
set_source_files_properties(
${TEST_DIR}/libcxx/containers/sequences/vector/exception_safety_exceptions_disabled.pass.cpp
PROPERTIES COMPILE_FLAGS -fno-exceptions)
math(EXPR i "${i}+1")
endif()
endforeach()
endif()

endif()
Loading