mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-16 12:56:35 +00:00
[libc++] Add initial support for picolibc
Picolibc is a C Standard Library that is commonly used in embedded environments. This patch adds initial support for this configuration along with pre-commit CI. As of this patch, the test suite only builds the tests and nothing is run. A follow-up patch will make the test suite actually run the tests. Differential Revision: https://reviews.llvm.org/D154246
This commit is contained in:
parent
7eb3103123
commit
8aeacebf28
38
libcxx/cmake/caches/Armv7M-picolibc.cmake
Normal file
38
libcxx/cmake/caches/Armv7M-picolibc.cmake
Normal file
@ -0,0 +1,38 @@
|
||||
set(CMAKE_ASM_COMPILER_TARGET "armv7m-none-eabi" CACHE STRING "")
|
||||
set(CMAKE_CXX_COMPILER_TARGET "armv7m-none-eabi" CACHE STRING "")
|
||||
set(CMAKE_CXX_FLAGS "-mfloat-abi=soft" CACHE STRING "")
|
||||
set(CMAKE_C_COMPILER_TARGET "armv7m-none-eabi" CACHE STRING "")
|
||||
set(CMAKE_C_FLAGS "-mfloat-abi=soft" CACHE STRING "")
|
||||
set(CMAKE_SYSTEM_NAME Generic CACHE STRING "")
|
||||
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY CACHE STRING "")
|
||||
set(COMPILER_RT_BAREMETAL_BUILD ON CACHE BOOL "")
|
||||
set(COMPILER_RT_BUILD_LIBFUZZER OFF CACHE BOOL "")
|
||||
set(COMPILER_RT_BUILD_PROFILE OFF CACHE BOOL "")
|
||||
set(COMPILER_RT_BUILD_SANITIZERS OFF CACHE BOOL "")
|
||||
set(COMPILER_RT_BUILD_XRAY OFF CACHE BOOL "")
|
||||
set(COMPILER_RT_DEFAULT_TARGET_ONLY ON CACHE BOOL "")
|
||||
set(LIBCXXABI_BAREMETAL ON CACHE BOOL "")
|
||||
set(LIBCXXABI_ENABLE_ASSERTIONS OFF CACHE BOOL "")
|
||||
set(LIBCXXABI_ENABLE_EXCEPTIONS OFF CACHE BOOL "")
|
||||
set(LIBCXXABI_ENABLE_SHARED OFF CACHE BOOL "")
|
||||
set(LIBCXXABI_ENABLE_STATIC ON CACHE BOOL "")
|
||||
set(LIBCXXABI_ENABLE_THREADS OFF CACHE BOOL "")
|
||||
set(LIBCXXABI_USE_COMPILER_RT ON CACHE BOOL "")
|
||||
set(LIBCXXABI_USE_LLVM_UNWINDER ON CACHE BOOL "")
|
||||
set(LIBCXX_ENABLE_EXCEPTIONS OFF CACHE BOOL "")
|
||||
set(LIBCXX_ENABLE_FILESYSTEM OFF CACHE STRING "")
|
||||
set(LIBCXX_ENABLE_MONOTONIC_CLOCK OFF CACHE BOOL "")
|
||||
set(LIBCXX_ENABLE_RANDOM_DEVICE OFF CACHE BOOL "")
|
||||
set(LIBCXX_ENABLE_RTTI OFF CACHE BOOL "")
|
||||
set(LIBCXX_ENABLE_SHARED OFF CACHE BOOL "")
|
||||
set(LIBCXX_ENABLE_STATIC ON CACHE BOOL "")
|
||||
set(LIBCXX_ENABLE_THREADS OFF CACHE BOOL "")
|
||||
set(LIBCXX_ENABLE_WIDE_CHARACTERS OFF CACHE BOOL "")
|
||||
set(LIBCXX_INCLUDE_BENCHMARKS OFF CACHE BOOL "")
|
||||
set(LIBCXX_USE_COMPILER_RT ON CACHE BOOL "")
|
||||
set(LIBUNWIND_ENABLE_SHARED OFF CACHE BOOL "")
|
||||
set(LIBUNWIND_ENABLE_STATIC ON CACHE BOOL "")
|
||||
set(LIBUNWIND_ENABLE_THREADS OFF CACHE BOOL "")
|
||||
set(LIBUNWIND_IS_BAREMETAL ON CACHE BOOL "")
|
||||
set(LIBUNWIND_REMEMBER_HEAP_ALLOC ON CACHE BOOL "")
|
||||
set(LIBUNWIND_USE_COMPILER_RT ON CACHE BOOL "")
|
@ -124,16 +124,17 @@ GCC 12 In C++11 or later only latest stable release pe
|
||||
|
||||
Libc++ also supports common platforms and architectures:
|
||||
|
||||
=============== ========================= ============================
|
||||
Target platform Target architecture Notes
|
||||
=============== ========================= ============================
|
||||
macOS 10.13+ i386, x86_64, arm64
|
||||
FreeBSD 12+ i386, x86_64, arm
|
||||
Linux i386, x86_64, arm, arm64 Only glibc-2.24 and later and no other libc is officially supported
|
||||
Android 5.0+ i386, x86_64, arm, arm64
|
||||
Windows i386, x86_64 Both MSVC and MinGW style environments, ABI in MSVC environments is :doc:`unstable <DesignDocs/ABIVersioning>`
|
||||
AIX 7.2TL5+ powerpc, powerpc64
|
||||
=============== ========================= ============================
|
||||
===================== ========================= ============================
|
||||
Target platform Target architecture Notes
|
||||
===================== ========================= ============================
|
||||
macOS 10.13+ i386, x86_64, arm64
|
||||
FreeBSD 12+ i386, x86_64, arm
|
||||
Linux i386, x86_64, arm, arm64 Only glibc-2.24 and later and no other libc is officially supported
|
||||
Android 5.0+ i386, x86_64, arm, arm64
|
||||
Windows i386, x86_64 Both MSVC and MinGW style environments, ABI in MSVC environments is :doc:`unstable <DesignDocs/ABIVersioning>`
|
||||
AIX 7.2TL5+ powerpc, powerpc64
|
||||
Embedded (picolibc) arm Support for building with picolibc is currently work-in-progress
|
||||
===================== ========================= ============================
|
||||
|
||||
Generally speaking, libc++ should work on any platform that provides a fairly complete
|
||||
C Standard Library. It is also possible to turn off parts of the library for use on
|
||||
|
42
libcxx/test/configs/armv7m-picolibc-libc++.cfg.in
Normal file
42
libcxx/test/configs/armv7m-picolibc-libc++.cfg.in
Normal file
@ -0,0 +1,42 @@
|
||||
lit_config.load_config(config, '@CMAKE_CURRENT_BINARY_DIR@/cmake-bridge.cfg')
|
||||
|
||||
libc_linker_script = '@CMAKE_INSTALL_PREFIX@/lib/picolibcpp.ld'
|
||||
|
||||
config.substitutions.append(('%{flags}', '--sysroot=@CMAKE_INSTALL_PREFIX@'))
|
||||
|
||||
config.substitutions.append(('%{compile_flags}',
|
||||
'-nostdinc++ -I %{include} -I %{target-include} -I %{libcxx}/test/support'
|
||||
|
||||
# Disable warnings in cxx_atomic_impl.h:
|
||||
# "large atomic operation may incur significant performance penalty; the
|
||||
# access size (4 bytes) exceeds the max lock-free size (0 bytes)"
|
||||
' -Wno-atomic-alignment'
|
||||
|
||||
# Various libc++ headers check for the definition of _NEWLIB_VERSION
|
||||
# which for picolibc is defined in picolibc.h.
|
||||
' -include picolibc.h'
|
||||
))
|
||||
config.substitutions.append(('%{link_flags}',
|
||||
'-nostdlib -nostdlib++ -L %{lib} -lc++ -lc++abi'
|
||||
' -lc -lm -lclang_rt.builtins -lsemihost -lcrt0-semihost' +
|
||||
' -T {}'.format(libc_linker_script) +
|
||||
' -Wl,--defsym=__flash=0x0'
|
||||
' -Wl,--defsym=__flash_size=0x400000'
|
||||
' -Wl,--defsym=__ram=0x21000000'
|
||||
' -Wl,--defsym=__ram_size=0x1000000'
|
||||
' -Wl,--defsym=__stack_size=0x1000'
|
||||
))
|
||||
config.substitutions.append(('%{exec}',
|
||||
'true' # TODO use qemu-system-arm
|
||||
))
|
||||
config.available_features.add('libcxx-fake-executor')
|
||||
|
||||
import os, site
|
||||
site.addsitedir(os.path.join('@LIBCXX_SOURCE_DIR@', 'utils'))
|
||||
import libcxx.test.params, libcxx.test.config
|
||||
libcxx.test.config.configure(
|
||||
libcxx.test.params.DEFAULT_PARAMETERS,
|
||||
libcxx.test.features.DEFAULT_FEATURES,
|
||||
config,
|
||||
lit_config
|
||||
)
|
@ -8,6 +8,7 @@
|
||||
// UNSUPPORTED: c++03, c++11, c++14, c++17
|
||||
// UNSUPPORTED: target={{.+}}-windows-gnu
|
||||
// ADDITIONAL_COMPILE_FLAGS(has-latomic): -latomic
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// static constexpr bool is_always_lock_free = implementation-defined;
|
||||
// bool is_lock_free() const volatile noexcept;
|
||||
|
@ -39,6 +39,9 @@ for header in public_headers:
|
||||
// TODO: Investigate this failure
|
||||
// UNSUPPORTED{BLOCKLIT}: LIBCXX-FREEBSD-FIXME
|
||||
|
||||
// TODO: Investigate this failure
|
||||
// UNSUPPORTED{BLOCKLIT}: LIBCXX-PICOLIBC-FIXME
|
||||
|
||||
{lit_header_restrictions.get(header, '')}
|
||||
|
||||
#include <{header}>
|
||||
|
@ -6,6 +6,8 @@
|
||||
#
|
||||
# ===----------------------------------------------------------------------===##
|
||||
|
||||
# XFAIL: libcxx-fake-executor
|
||||
|
||||
# Note: We prepend arguments with 'x' to avoid thinking there are too few
|
||||
# arguments in case an argument is an empty string.
|
||||
# RUN: %{python} %s x%S x%T x%{substitutions}
|
||||
|
@ -6,6 +6,7 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// UNSUPPORTED: libcxx-fake-executor
|
||||
// XFAIL: *
|
||||
|
||||
// Make sure the test DOES NOT pass if it fails at runtime.
|
||||
|
@ -7,6 +7,7 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// REQUIRES: objective-c++
|
||||
// UNSUPPORTED: libcxx-fake-executor
|
||||
|
||||
// XFAIL: *
|
||||
|
||||
|
@ -63,7 +63,8 @@ for header in public_headers:
|
||||
#endif
|
||||
|
||||
// Test that libc++ doesn't use names that collide with FreeBSD system macros.
|
||||
#ifndef __FreeBSD__
|
||||
// newlib and picolibc also define these macros
|
||||
#if !defined(__FreeBSD__) && !defined(_NEWLIB_VERSION)
|
||||
# define __null_sentinel SYSTEM_RESERVED_NAME
|
||||
# define __generic SYSTEM_RESERVED_NAME
|
||||
#endif
|
||||
@ -101,7 +102,10 @@ for header in public_headers:
|
||||
# define __pre SYSTEM_RESERVED_NAME
|
||||
#endif
|
||||
|
||||
#define __input SYSTEM_RESERVED_NAME
|
||||
// Newlib & picolibc use __input as a parameter name of a64l & l64a
|
||||
#ifndef _NEWLIB_VERSION
|
||||
# define __input SYSTEM_RESERVED_NAME
|
||||
#endif
|
||||
#define __output SYSTEM_RESERVED_NAME
|
||||
|
||||
#define __acquire SYSTEM_RESERVED_NAME
|
||||
|
@ -8,6 +8,7 @@
|
||||
// UNSUPPORTED: c++03, c++11, c++14, c++17
|
||||
// UNSUPPORTED: target={{.+}}-windows-gnu
|
||||
// ADDITIONAL_COMPILE_FLAGS(has-latomic): -latomic
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// floating-point-type operator=(floating-point-type) volatile noexcept;
|
||||
// floating-point-type operator=(floating-point-type) noexcept;
|
||||
|
@ -7,6 +7,7 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
// UNSUPPORTED: c++03, c++11, c++14, c++17
|
||||
// ADDITIONAL_COMPILE_FLAGS(has-latomic): -latomic
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// bool compare_exchange_strong(T& expected, T desired,
|
||||
// memory_order success, memory_order failure) volatile noexcept;
|
||||
|
@ -7,6 +7,7 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
// UNSUPPORTED: c++03, c++11, c++14, c++17
|
||||
// ADDITIONAL_COMPILE_FLAGS(has-latomic): -latomic
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// bool compare_exchange_weak(T& expected, T desired,
|
||||
// memory_order success, memory_order failure) volatile noexcept;
|
||||
|
@ -8,6 +8,7 @@
|
||||
// UNSUPPORTED: c++03, c++11, c++14, c++17
|
||||
// UNSUPPORTED: target={{.+}}-windows-gnu
|
||||
// ADDITIONAL_COMPILE_FLAGS(has-latomic): -latomic
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// constexpr atomic() noexcept;
|
||||
// constexpr atomic(floating-point-type) noexcept;
|
||||
|
@ -11,6 +11,7 @@
|
||||
// XFAIL: tsan
|
||||
// XFAIL: target={{x86_64-.*}} && msan
|
||||
// ADDITIONAL_COMPILE_FLAGS(has-latomic): -latomic
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// T exchange(T, memory_order = memory_order::seq_cst) volatile noexcept;
|
||||
// T exchange(T, memory_order = memory_order::seq_cst) noexcept;
|
||||
|
@ -13,6 +13,7 @@
|
||||
// Hangs with msan.
|
||||
// UNSUPPORTED: msan
|
||||
// ADDITIONAL_COMPILE_FLAGS(has-latomic): -latomic
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// floating-point-type fetch_add(floating-point-type,
|
||||
// memory_order = memory_order::seq_cst) volatile noexcept;
|
||||
|
@ -13,6 +13,7 @@
|
||||
// Hangs with msan.
|
||||
// UNSUPPORTED: msan
|
||||
// ADDITIONAL_COMPILE_FLAGS(has-latomic): -latomic
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// floating-point-type fetch_sub(floating-point-type,
|
||||
// memory_order = memory_order::seq_cst) volatile noexcept;
|
||||
|
@ -10,6 +10,7 @@
|
||||
// Clang's support for atomic operations on long double is broken. See https://github.com/llvm/llvm-project/issues/72893
|
||||
// XFAIL: tsan
|
||||
// ADDITIONAL_COMPILE_FLAGS(has-latomic): -latomic
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// floating-point-type load(memory_order = memory_order::seq_cst) volatile noexcept;
|
||||
// floating-point-type load(memory_order = memory_order::seq_cst) noexcept;
|
||||
|
@ -8,6 +8,7 @@
|
||||
// UNSUPPORTED: c++03, c++11, c++14, c++17
|
||||
// UNSUPPORTED: target={{.+}}-windows-gnu
|
||||
// ADDITIONAL_COMPILE_FLAGS(has-latomic): -latomic
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// static constexpr bool is_always_lock_free = implementation-defined;
|
||||
// bool is_lock_free() const volatile noexcept;
|
||||
|
@ -9,6 +9,7 @@
|
||||
// XFAIL: availability-synchronization_library-missing
|
||||
// UNSUPPORTED: c++03, c++11, c++14, c++17
|
||||
// ADDITIONAL_COMPILE_FLAGS(has-latomic): -latomic
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// void notify_all() volatile noexcept;
|
||||
// void notify_all() noexcept;
|
||||
|
@ -9,6 +9,7 @@
|
||||
// XFAIL: availability-synchronization_library-missing
|
||||
// UNSUPPORTED: c++03, c++11, c++14, c++17
|
||||
// ADDITIONAL_COMPILE_FLAGS(has-latomic): -latomic
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// void notify_one() volatile noexcept;
|
||||
// void notify_one() noexcept;
|
||||
|
@ -8,6 +8,7 @@
|
||||
// UNSUPPORTED: c++03, c++11, c++14, c++17
|
||||
// UNSUPPORTED: target={{.+}}-windows-gnu
|
||||
// ADDITIONAL_COMPILE_FLAGS(has-latomic): -latomic
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// operator floating-point-type() volatile noexcept;
|
||||
// operator floating-point-type() noexcept;
|
||||
|
@ -9,6 +9,7 @@
|
||||
// UNSUPPORTED: target={{.+}}-windows-gnu
|
||||
// XFAIL: LIBCXX-AIX-FIXME
|
||||
// ADDITIONAL_COMPILE_FLAGS(has-latomic): -latomic
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
// Hangs with msan.
|
||||
// UNSUPPORTED: msan
|
||||
|
||||
|
@ -9,6 +9,7 @@
|
||||
// UNSUPPORTED: target={{.+}}-windows-gnu
|
||||
// XFAIL: LIBCXX-AIX-FIXME
|
||||
// ADDITIONAL_COMPILE_FLAGS(has-latomic): -latomic
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
// Hangs with msan.
|
||||
// UNSUPPORTED: msan
|
||||
|
||||
|
@ -9,6 +9,7 @@
|
||||
// Clang's support for atomic operations on long double is broken. See https://github.com/llvm/llvm-project/issues/72893
|
||||
// XFAIL: tsan
|
||||
// ADDITIONAL_COMPILE_FLAGS(has-latomic): -latomic
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// void store(floating-point-type, memory_order = memory_order::seq_cst) volatile noexcept;
|
||||
// void store(floating-point-type, memory_order = memory_order::seq_cst) noexcept;
|
||||
|
@ -11,6 +11,7 @@
|
||||
// XFAIL: tsan
|
||||
// XFAIL: target={{x86_64-.*}} && msan
|
||||
// ADDITIONAL_COMPILE_FLAGS(has-latomic): -latomic
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// void wait(T old, memory_order order = memory_order::seq_cst) const volatile noexcept;
|
||||
// void wait(T old, memory_order order = memory_order::seq_cst) const noexcept;
|
||||
|
@ -6,6 +6,8 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// <atomic>
|
||||
|
||||
// template <>
|
||||
|
@ -6,6 +6,8 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// <atomic>
|
||||
|
||||
// template<class T>
|
||||
|
@ -6,6 +6,8 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// <atomic>
|
||||
|
||||
// template<class T>
|
||||
|
@ -6,6 +6,8 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// <atomic>
|
||||
|
||||
// template<class T>
|
||||
|
@ -6,6 +6,8 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// <atomic>
|
||||
|
||||
// template<class T>
|
||||
|
@ -6,6 +6,8 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// <atomic>
|
||||
|
||||
// template<class T>
|
||||
|
@ -6,6 +6,8 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// <atomic>
|
||||
|
||||
// template<class T>
|
||||
|
@ -6,6 +6,8 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// <atomic>
|
||||
|
||||
// template<class T>
|
||||
|
@ -6,6 +6,8 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// <atomic>
|
||||
|
||||
// template<class T>
|
||||
|
@ -6,6 +6,8 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// <atomic>
|
||||
|
||||
// template<class T>
|
||||
|
@ -6,6 +6,8 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// <atomic>
|
||||
|
||||
// template<class T>
|
||||
|
@ -8,6 +8,8 @@
|
||||
|
||||
// UNSUPPORTED: c++03
|
||||
|
||||
// XFAIL: !has-64-bit-atomics
|
||||
|
||||
// <atomic>
|
||||
|
||||
// constexpr atomic<T>::atomic(T value)
|
||||
|
@ -6,6 +6,9 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// Floating point exceptions are required for the FE_... macros to be defined.
|
||||
// XFAIL: LIBCXX-PICOLIBC-FIXME
|
||||
|
||||
// <fenv.h>
|
||||
|
||||
#include <fenv.h>
|
||||
|
@ -11,6 +11,9 @@
|
||||
// Apple platforms don't provide <uchar.h> yet, so these tests fail.
|
||||
// XFAIL: target={{.+}}-apple-{{.+}}
|
||||
|
||||
// mbrtoc16 not defined.
|
||||
// XFAIL: LIBCXX-PICOLIBC-FIXME
|
||||
|
||||
// <uchar.h>
|
||||
|
||||
#include <uchar.h>
|
||||
|
@ -8,6 +8,9 @@
|
||||
|
||||
// UNSUPPORTED: c++03, c++11, c++14
|
||||
|
||||
// The machine emulated in tests does not have enough memory for code.
|
||||
// UNSUPPORTED: LIBCXX-PICOLIBC-FIXME
|
||||
|
||||
// <experimental/simd>
|
||||
//
|
||||
// [simd.reference]
|
||||
|
@ -6,6 +6,8 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// UNSUPPORTED: LIBCXX-PICOLIBC-FIXME
|
||||
|
||||
// <iostream>
|
||||
|
||||
// ostream cerr;
|
||||
|
@ -6,6 +6,8 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// UNSUPPORTED: LIBCXX-PICOLIBC-FIXME
|
||||
|
||||
// <iostream>
|
||||
|
||||
// ostream clog;
|
||||
|
@ -6,6 +6,8 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// UNSUPPORTED: LIBCXX-PICOLIBC-FIXME
|
||||
|
||||
// <iostream>
|
||||
|
||||
// ostream cout;
|
||||
|
@ -11,6 +11,11 @@
|
||||
// This test uses iterator types from std::filesystem
|
||||
// XFAIL: availability-filesystem-missing
|
||||
|
||||
// std::same_as<typename Traits::difference_type, DiffType> failed.
|
||||
// The former was long and the latter was long long.
|
||||
// Possibly related to "using streamoff = long int" in ios.h.
|
||||
// XFAIL: LIBCXX-PICOLIBC-FIXME
|
||||
|
||||
// template<class T>
|
||||
// struct iterator_traits;
|
||||
|
||||
|
@ -9,6 +9,7 @@
|
||||
// test sized operator delete[] replacement.
|
||||
|
||||
// UNSUPPORTED: sanitizer-new-delete, c++03, c++11
|
||||
// UNSUPPORTED: LIBCXX-PICOLIBC-FIXME
|
||||
|
||||
// NOTE: Clang does not enable sized-deallocation in C++14 and beyond by
|
||||
// default. It is only enabled when -fsized-deallocation is given.
|
||||
|
@ -9,6 +9,7 @@
|
||||
// test sized operator delete replacement.
|
||||
|
||||
// UNSUPPORTED: sanitizer-new-delete, c++03, c++11
|
||||
// UNSUPPORTED: LIBCXX-PICOLIBC-FIXME
|
||||
|
||||
// NOTE: Clang does not enable sized-deallocation in C++14 and beyond by
|
||||
// default. It is only enabled when -fsized-deallocation is given.
|
||||
|
@ -11,6 +11,9 @@
|
||||
|
||||
// UNSUPPORTED: c++03, c++11, c++14
|
||||
|
||||
// picolibc doesn't define TIME_UTC.
|
||||
// XFAIL: LIBCXX-PICOLIBC-FIXME
|
||||
|
||||
// ::timespec_get is provided by the C library, but it's marked as
|
||||
// unavailable until macOS 10.15
|
||||
// XFAIL: stdlib=apple-libc++ && target={{.+}}-apple-macosx10.{{9|10|11|12|13|14}}
|
||||
|
@ -6,6 +6,9 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// Floating point exceptions are required for the FE_... macros to be defined.
|
||||
// XFAIL: LIBCXX-PICOLIBC-FIXME
|
||||
|
||||
// <cfenv>
|
||||
|
||||
#include <cfenv>
|
||||
|
@ -11,6 +11,9 @@
|
||||
// Apple platforms don't provide <uchar.h> yet, so these tests fail.
|
||||
// XFAIL: target={{.+}}-apple-{{.+}}
|
||||
|
||||
// mbrtoc16 not defined.
|
||||
// XFAIL: LIBCXX-PICOLIBC-FIXME
|
||||
|
||||
// <cuchar>
|
||||
|
||||
#include <cuchar>
|
||||
|
@ -10,6 +10,9 @@
|
||||
|
||||
// UNSUPPORTED: availability-filesystem-missing
|
||||
|
||||
// "unable to find library from dependent library specifier: rt"
|
||||
// XFAIL: LIBCXX-PICOLIBC-FIXME
|
||||
|
||||
// <chrono>
|
||||
//
|
||||
// file_clock
|
||||
|
@ -6,6 +6,9 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// "unable to find library from dependent library specifier: rt"
|
||||
// XFAIL: LIBCXX-PICOLIBC-FIXME
|
||||
|
||||
// <chrono>
|
||||
|
||||
// high_resolution_clock
|
||||
|
@ -6,6 +6,9 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// "unable to find library from dependent library specifier: rt"
|
||||
// XFAIL: LIBCXX-PICOLIBC-FIXME
|
||||
|
||||
// <chrono>
|
||||
|
||||
// system_clock
|
||||
|
@ -6,6 +6,9 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// "unable to find library from dependent library specifier: rt"
|
||||
// XFAIL: LIBCXX-PICOLIBC-FIXME
|
||||
|
||||
// <chrono>
|
||||
|
||||
// system_clock
|
||||
|
@ -6,6 +6,9 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// "unable to find library from dependent library specifier: rt"
|
||||
// XFAIL: LIBCXX-PICOLIBC-FIXME
|
||||
|
||||
// <chrono>
|
||||
|
||||
// system_clock
|
||||
|
@ -6,6 +6,9 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// "unable to find library from dependent library specifier: rt"
|
||||
// XFAIL: LIBCXX-PICOLIBC-FIXME
|
||||
|
||||
// <chrono>
|
||||
|
||||
// time_point
|
||||
|
@ -10,7 +10,7 @@ least the (N), (E) and (D) fields.
|
||||
|
||||
N: Linaro Toolchain Working Group
|
||||
E: linaro-toolchain@lists.linaro.org
|
||||
D: Armv7, Armv8, AArch64
|
||||
D: Arm platforms
|
||||
|
||||
N: LLVM on Power
|
||||
E: powerllvm@ca.ibm.com
|
||||
|
111
libcxx/utils/ci/build-picolibc.sh
Executable file
111
libcxx/utils/ci/build-picolibc.sh
Executable file
@ -0,0 +1,111 @@
|
||||
#!/usr/bin/env bash
|
||||
#===----------------------------------------------------------------------===##
|
||||
#
|
||||
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
# See https://llvm.org/LICENSE.txt for license information.
|
||||
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
#
|
||||
#===----------------------------------------------------------------------===##
|
||||
|
||||
#
|
||||
# This script builds picolibc (https://github.com/picolibc/picolibc) from
|
||||
# source to facilitate building libc++ against it.
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
PROGNAME="$(basename "${0}")"
|
||||
|
||||
function error() { printf "error: %s\n" "$*" >&2; exit 1; }
|
||||
|
||||
function usage() {
|
||||
cat <<EOF
|
||||
Usage:
|
||||
${PROGNAME} [options]
|
||||
|
||||
[-h|--help] Display this help and exit.
|
||||
|
||||
--build-dir <DIR> Path to the directory to use for building.
|
||||
|
||||
--install-dir <DIR> Path to the directory to install the library to.
|
||||
EOF
|
||||
}
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case ${1} in
|
||||
-h|--help)
|
||||
usage
|
||||
exit 0
|
||||
;;
|
||||
--build-dir)
|
||||
build_dir="${2}"
|
||||
shift; shift
|
||||
;;
|
||||
--install-dir)
|
||||
install_dir="${2}"
|
||||
shift; shift
|
||||
;;
|
||||
--target)
|
||||
target="${2}"
|
||||
shift; shift
|
||||
;;
|
||||
*)
|
||||
error "Unknown argument '${1}'"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
for arg in build_dir install_dir target; do
|
||||
if [ -z ${!arg+x} ]; then
|
||||
error "Missing required argument '--${arg//_/-}'"
|
||||
elif [ "${!arg}" == "" ]; then
|
||||
error "Argument to --${arg//_/-} must not be empty"
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
echo "--- Downloading picolibc"
|
||||
picolibc_source_dir="${build_dir}/picolibc-source"
|
||||
picolibc_build_dir="${build_dir}/picolibc-build"
|
||||
mkdir -p "${picolibc_source_dir}"
|
||||
mkdir -p "${picolibc_build_dir}"
|
||||
# Download the version of picolibc that was the latest at the time this script was written.
|
||||
# Following changes are required and were introduced after version 1.8.5:
|
||||
# - updated semihost arguments handling,
|
||||
# - added missing macros in stdio.h
|
||||
# Version following 1.8.5, was not released by the time of writing.
|
||||
picolibc_commit="4b9b8ef01d18cf0563348ad4af4ae89a7277e7ca"
|
||||
curl -L "https://github.com/picolibc/picolibc/archive/${picolibc_commit}.zip" --output "${picolibc_source_dir}/picolibc.zip"
|
||||
unzip -q "${picolibc_source_dir}/picolibc.zip" -d "${picolibc_source_dir}"
|
||||
mv "${picolibc_source_dir}/picolibc-${picolibc_commit}"/* "${picolibc_source_dir}"
|
||||
rm -rf "${picolibc_source_dir}/picolibc-${picolibc_commit}"
|
||||
|
||||
cat <<EOF > "${picolibc_build_dir}/meson-cross-build.txt"
|
||||
[binaries]
|
||||
c = ['${CC:-cc}', '--target=${target}', '-mfloat-abi=soft', '-nostdlib']
|
||||
ar = 'llvm-ar'
|
||||
as = 'llvm-as'
|
||||
ld = 'lld'
|
||||
strip = 'llvm-strip'
|
||||
[host_machine]
|
||||
system = 'none'
|
||||
cpu_family = 'arm'
|
||||
cpu = 'arm'
|
||||
endian = 'little'
|
||||
[properties]
|
||||
skip_sanity_check = true
|
||||
EOF
|
||||
|
||||
venv_dir="${build_dir}/meson-venv"
|
||||
python3 -m venv "${venv_dir}"
|
||||
# Install the version of meson that was the latest at the time this script was written.
|
||||
"${venv_dir}/bin/pip" install "meson==1.1.1"
|
||||
|
||||
"${venv_dir}/bin/meson" setup \
|
||||
-Dincludedir=include -Dlibdir=lib -Dspecsdir=none -Dmultilib=false -Dpicoexit=false \
|
||||
--prefix "${install_dir}" \
|
||||
--cross-file "${picolibc_build_dir}/meson-cross-build.txt" \
|
||||
"${picolibc_build_dir}" \
|
||||
"${picolibc_source_dir}"
|
||||
|
||||
"${venv_dir}/bin/meson" install -C "${picolibc_build_dir}"
|
@ -227,6 +227,11 @@ steps:
|
||||
<<: *arm_agent_armv8l
|
||||
<<: *common
|
||||
|
||||
- label: Armv7-M picolibc
|
||||
command: libcxx/utils/ci/run-buildbot armv7m-picolibc
|
||||
<<: *arm_agent_aarch64
|
||||
<<: *common
|
||||
|
||||
- group: AIX
|
||||
steps:
|
||||
- label: AIX (32-bit)
|
||||
|
@ -610,6 +610,41 @@ armv7-no-exceptions)
|
||||
generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Armv7Thumb-no-exceptions.cmake"
|
||||
check-runtimes
|
||||
;;
|
||||
armv7m-picolibc)
|
||||
clean
|
||||
|
||||
# To make it easier to get this builder up and running, build picolibc
|
||||
# from scratch. Anecdotally, the build-picolibc script takes about 16 seconds.
|
||||
# This could be optimised by building picolibc into the Docker container.
|
||||
${MONOREPO_ROOT}/libcxx/utils/ci/build-picolibc.sh \
|
||||
--build-dir "${BUILD_DIR}" \
|
||||
--install-dir "${INSTALL_DIR}" \
|
||||
--target armv7m-none-eabi
|
||||
|
||||
echo "--- Generating CMake"
|
||||
flags="--sysroot=${INSTALL_DIR}"
|
||||
${CMAKE} \
|
||||
-S "${MONOREPO_ROOT}/compiler-rt" \
|
||||
-B "${BUILD_DIR}/compiler-rt" \
|
||||
-GNinja -DCMAKE_MAKE_PROGRAM="${NINJA}" \
|
||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
||||
-DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}" \
|
||||
-C "${MONOREPO_ROOT}/libcxx/cmake/caches/Armv7M-picolibc.cmake" \
|
||||
-DCMAKE_C_FLAGS="${flags}" \
|
||||
-DCMAKE_CXX_FLAGS="${flags}" \
|
||||
-DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=ON
|
||||
generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Armv7M-picolibc.cmake" \
|
||||
-DLIBCXX_TEST_CONFIG="armv7m-picolibc-libc++.cfg.in" \
|
||||
-DLIBCXXABI_TEST_CONFIG="armv7m-picolibc-libc++abi.cfg.in" \
|
||||
-DLIBUNWIND_TEST_CONFIG="armv7m-picolibc-libunwind.cfg.in" \
|
||||
-DCMAKE_C_FLAGS="${flags}" \
|
||||
-DCMAKE_CXX_FLAGS="${flags}"
|
||||
|
||||
${NINJA} -vC "${BUILD_DIR}/compiler-rt" install
|
||||
mv "${BUILD_DIR}/install/lib/armv7m-none-eabi"/* "${BUILD_DIR}/install/lib"
|
||||
|
||||
check-runtimes
|
||||
;;
|
||||
clang-cl-dll)
|
||||
clean
|
||||
# TODO: Currently, building with the experimental library breaks running
|
||||
|
@ -190,6 +190,17 @@ DEFAULT_FEATURES = [
|
||||
""",
|
||||
),
|
||||
),
|
||||
Feature(
|
||||
name="has-64-bit-atomics",
|
||||
when=lambda cfg: sourceBuilds(
|
||||
cfg,
|
||||
"""
|
||||
#include <atomic>
|
||||
std::atomic_uint64_t x;
|
||||
int main(int, char**) { (void)x.load(); return 0; }
|
||||
""",
|
||||
),
|
||||
),
|
||||
# TODO: Remove this feature once compiler-rt includes __atomic_is_lockfree()
|
||||
# on all supported platforms.
|
||||
Feature(
|
||||
@ -265,7 +276,8 @@ DEFAULT_FEATURES = [
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
int main(int, char**) {
|
||||
return 0;
|
||||
int fd[2];
|
||||
return pipe(fd);
|
||||
}
|
||||
""",
|
||||
),
|
||||
@ -413,6 +425,19 @@ DEFAULT_FEATURES += [
|
||||
name="LIBCXX-FREEBSD-FIXME",
|
||||
when=lambda cfg: "__FreeBSD__" in compilerMacros(cfg),
|
||||
),
|
||||
Feature(
|
||||
name="LIBCXX-PICOLIBC-FIXME",
|
||||
when=lambda cfg: sourceBuilds(
|
||||
cfg,
|
||||
"""
|
||||
#include <string.h>
|
||||
#ifndef __PICOLIBC__
|
||||
#error not picolibc
|
||||
#endif
|
||||
int main(int, char**) { return 0; }
|
||||
""",
|
||||
),
|
||||
),
|
||||
]
|
||||
|
||||
# Add features representing the build host platform name.
|
||||
|
33
libcxxabi/test/configs/armv7m-picolibc-libc++abi.cfg.in
Normal file
33
libcxxabi/test/configs/armv7m-picolibc-libc++abi.cfg.in
Normal file
@ -0,0 +1,33 @@
|
||||
lit_config.load_config(config, '@CMAKE_CURRENT_BINARY_DIR@/cmake-bridge.cfg')
|
||||
|
||||
libc_linker_script = '@CMAKE_INSTALL_PREFIX@/lib/picolibcpp.ld'
|
||||
|
||||
config.substitutions.append(('%{flags}', '--sysroot=@CMAKE_INSTALL_PREFIX@'))
|
||||
|
||||
config.substitutions.append(('%{compile_flags}',
|
||||
'-nostdinc++ -I %{include} -I %{cxx-include} -I %{cxx-target-include} %{maybe-include-libunwind} -I %{libcxx}/test/support -I %{libcxx}/src -D_LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS'
|
||||
))
|
||||
config.substitutions.append(('%{link_flags}',
|
||||
'-nostdlib -nostdlib++ -L %{lib} -lc++ -lc++abi'
|
||||
' -lc -lm -lclang_rt.builtins -lsemihost -lcrt0-semihost' +
|
||||
' -T {}'.format(libc_linker_script) +
|
||||
' -Wl,--defsym=__flash=0x0'
|
||||
' -Wl,--defsym=__flash_size=0x400000'
|
||||
' -Wl,--defsym=__ram=0x21000000'
|
||||
' -Wl,--defsym=__ram_size=0x1000000'
|
||||
' -Wl,--defsym=__stack_size=0x1000'
|
||||
))
|
||||
config.substitutions.append(('%{exec}',
|
||||
'true' # TODO use qemu-system-arm
|
||||
))
|
||||
config.available_features.add('libcxx-fake-executor')
|
||||
|
||||
import os, site
|
||||
site.addsitedir(os.path.join('@LIBCXXABI_LIBCXX_PATH@', 'utils'))
|
||||
import libcxx.test.params, libcxx.test.config
|
||||
libcxx.test.config.configure(
|
||||
libcxx.test.params.DEFAULT_PARAMETERS,
|
||||
libcxx.test.features.DEFAULT_FEATURES,
|
||||
config,
|
||||
lit_config
|
||||
)
|
@ -9,6 +9,9 @@
|
||||
// The demangler does not pass all these tests with the system dylibs on macOS.
|
||||
// XFAIL: stdlib=apple-libc++ && target={{.+}}-apple-macosx10.{{9|10|11|12|13|14|15}}
|
||||
|
||||
// This test is too big for most embedded devices.
|
||||
// XFAIL: LIBCXX-PICOLIBC-FIXME
|
||||
|
||||
// https://llvm.org/PR51407 was not fixed in some previously-released
|
||||
// demanglers, which causes them to run into the infinite loop.
|
||||
// UNSUPPORTED: stdlib=apple-libc++ && target={{.+}}-apple-macosx10.{{9|10|11|12|13|14|15}}
|
||||
|
33
libunwind/test/configs/armv7m-picolibc-libunwind.cfg.in
Normal file
33
libunwind/test/configs/armv7m-picolibc-libunwind.cfg.in
Normal file
@ -0,0 +1,33 @@
|
||||
lit_config.load_config(config, '@CMAKE_CURRENT_BINARY_DIR@/cmake-bridge.cfg')
|
||||
|
||||
libc_linker_script = '@CMAKE_INSTALL_PREFIX@/lib/picolibcpp.ld'
|
||||
|
||||
config.substitutions.append(('%{flags}', '--sysroot=@CMAKE_INSTALL_PREFIX@'))
|
||||
|
||||
config.substitutions.append(('%{compile_flags}',
|
||||
'-nostdinc++ -I %{include}'
|
||||
))
|
||||
config.substitutions.append(('%{link_flags}',
|
||||
'-nostdlib -nostdlib++ -L %{lib} -lunwind'
|
||||
' -lc -lm -lclang_rt.builtins -lsemihost -lcrt0-semihost' +
|
||||
' -T {}'.format(libc_linker_script) +
|
||||
' -Wl,--defsym=__flash=0x0'
|
||||
' -Wl,--defsym=__flash_size=0x400000'
|
||||
' -Wl,--defsym=__ram=0x21000000'
|
||||
' -Wl,--defsym=__ram_size=0x1000000'
|
||||
' -Wl,--defsym=__stack_size=0x1000'
|
||||
))
|
||||
config.substitutions.append(('%{exec}',
|
||||
'true' # TODO use qemu-system-arm
|
||||
))
|
||||
config.available_features.add('libcxx-fake-executor')
|
||||
|
||||
import os, site
|
||||
site.addsitedir(os.path.join('@LIBUNWIND_LIBCXX_PATH@', 'utils'))
|
||||
import libcxx.test.params, libcxx.test.config
|
||||
libcxx.test.config.configure(
|
||||
libcxx.test.params.DEFAULT_PARAMETERS,
|
||||
libcxx.test.features.DEFAULT_FEATURES,
|
||||
config,
|
||||
lit_config
|
||||
)
|
Loading…
x
Reference in New Issue
Block a user