From 1b522a79133037f04c8ffcdfbe6c885ccb3ddcd3 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 26 Feb 2020 14:20:55 +0000 Subject: [PATCH] libstdc++: Fix freestanding build (PR 92376) In a freestanding library we don't install the header, so don't try to include it unless it exists. Explicitly declare aligned alloc functions for freestanding, because doesn't declare them. Backport from mainline 2020-01-17 Jonathan Wakely PR libstdc++/92376 * include/bits/c++config: Only do PSTL config when the header is present, to fix freestanding. * libsupc++/new_opa.cc [!_GLIBCXX_HOSTED]: Declare allocation functions if they were detected by configure. --- libstdc++-v3/ChangeLog | 9 +++++++++ libstdc++-v3/include/bits/c++config | 5 ++++- libstdc++-v3/libsupc++/new_opa.cc | 15 +++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 19ae4cef9fa5..a94334f8ab16 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,14 @@ 2020-02-26 Jonathan Wakely + Backport from mainline + 2020-01-17 Jonathan Wakely + + PR libstdc++/92376 + * include/bits/c++config: Only do PSTL config when the header is + present, to fix freestanding. + * libsupc++/new_opa.cc [!_GLIBCXX_HOSTED]: Declare allocation + functions if they were detected by configure. + Backport from mainline 2019-10-09 Jonathan Wakely diff --git a/libstdc++-v3/include/bits/c++config b/libstdc++-v3/include/bits/c++config index 7a7e78819ba7..7e0962edd199 100644 --- a/libstdc++-v3/include/bits/c++config +++ b/libstdc++-v3/include/bits/c++config @@ -668,6 +668,8 @@ namespace std // PSTL configuration #if __cplusplus >= 201703L +// This header is not installed for freestanding: +#if __has_include() // Preserved here so we have some idea which version of upstream we've pulled in // #define PSTL_VERSION 104 // #define PSTL_VERSION_MAJOR (PSTL_VERSION/100) @@ -686,6 +688,7 @@ namespace std # define __PSTL_ASSERT_MSG(_Condition, _Message) __glibcxx_assert(_Condition) #include +#endif // __has_include +#endif // C++17 -#endif // End of prewritten config; the settings discovered at configure time follow. diff --git a/libstdc++-v3/libsupc++/new_opa.cc b/libstdc++-v3/libsupc++/new_opa.cc index 8143c129bc62..9c7f53d7073c 100644 --- a/libstdc++-v3/libsupc++/new_opa.cc +++ b/libstdc++-v3/libsupc++/new_opa.cc @@ -43,6 +43,21 @@ extern "C" void *memalign(std::size_t boundary, std::size_t size); using std::new_handler; using std::bad_alloc; +#if ! _GLIBCXX_HOSTED +extern "C" +{ +# if _GLIBCXX_HAVE_ALIGNED_ALLOC + void *aligned_alloc(size_t alignment, size_t size); +# elif _GLIBCXX_HAVE__ALIGNED_MALLOC + void *_aligned_malloc(size_t size, size_t alignment); +# elif _GLIBCXX_HAVE_POSIX_MEMALIGN + void *posix_memalign(void **, size_t alignment, size_t size); +# elif _GLIBCXX_HAVE_MEMALIGN + void *memalign(size_t alignment, size_t size); +# endif +} +#endif + namespace __gnu_cxx { #if _GLIBCXX_HAVE_ALIGNED_ALLOC using ::aligned_alloc; -- 2.47.2