diff mbox series

Freestanding proposal P0829

Message ID CAAvei9rGC8xyEOye19Ly22QG9LoQeH2TmmKq6Vz4DXajuAq7pg@mail.gmail.com
State New
Headers show
Series Freestanding proposal P0829 | expand

Commit Message

Paul M. Bendixen Dec. 3, 2019, 10:38 p.m. UTC
Hello
I've made an implementation of P0829 and tested it with gcc for avr.
I've included the patch and I believe it might need some modification.
Should I rather just maintain my own fork until P0829 is a bit
further? (It is currently being split into smaller proposals).
I have not included further tests, nor actually run the tests since
everything is in header files is only includes of already existing
libstdc++ code.

Best regards

Paul M. Bendixen

Comments

Jonathan Wakely Dec. 4, 2019, 9:43 p.m. UTC | #1
On 03/12/19 23:38 +0100, Paul M. Bendixen wrote:
>Hello
>I've made an implementation of P0829 and tested it with gcc for avr.

This is great, thanks!

What's the status of libstdc++ for AVR? If I understand correctly, it
doesn't build by default when GCC is configured for AVR. Are you
overriding that, or just copying the headers somewhere and including
them in your programs?

>I've included the patch and I believe it might need some modification.
>Should I rather just maintain my own fork until P0829 is a bit
>further? (It is currently being split into smaller proposals).

Yes, I think it's too early to actually make this change. Our current
!_GLIBCXX_HOSTED build conforms to the requirements of a freestanding
implementation (for anything from C++98 to C++17) so I'd prefer not to
mess with that drastically until the P0829 work has made more
progress. Despite that, I'm very happy to see somebody take on the
task, and will be glad to apply a patch like this when the time is
right.

>I have not included further tests, nor actually run the tests since
>everything is in header files is only includes of already existing
>libstdc++ code.

If we were serious about improving our freestanding support, we'd need
to partition the testsuite into the parts that should pass for
freestanding, and mark all the other tests UNSUPPORTED. That would
mean we could run tests for a freestanding build and not get thousands
of failures for tests that are not expected to work for freestanding.
That would be a big project though.

Your patch is mostly just adding #if in various places, not adding new
code, and so I'm not sure it needs a copyright assignment (the changes
probably aren't copyrightable anyway). But if you plan to contribute
to GCC it would be good to get an assignment in place (if you don't
have one already). See https://gcc.gnu.org/contribute.html#legal for
more information, and feel free to contact me directly if you have any
questions or if you want to start the process.

Thanks again for the patch. Please do keep working on it as the P0829
work evolves, so that we can integrate it with libstdc++ at some
point.
Paul M. Bendixen Dec. 10, 2019, 6:10 p.m. UTC | #2
Den ons. 4. dec. 2019 kl. 22.43 skrev Jonathan Wakely <jwakely@redhat.com>:
>
> On 03/12/19 23:38 +0100, Paul M. Bendixen wrote:
> >Hello
> >I've made an implementation of P0829 and tested it with gcc for avr.
>
> This is great, thanks!
>
> What's the status of libstdc++ for AVR? If I understand correctly, it
> doesn't build by default when GCC is configured for AVR. Are you
> overriding that, or just copying the headers somewhere and including
> them in your programs?
>
The status is that it isn't built by default for AVR. I use the method described
in "Real time C++" by Christopher Kormanyos and modified it a bit.

I have a docker image that is built as part of CI at
https://gitlab.com/avr-libstdcxx/avr-libstdcxx-docker that describes
the build process.
I use avrlibc instead of newlib and it seems to work well.

> >I've included the patch and I believe it might need some modification.
> >Should I rather just maintain my own fork until P0829 is a bit
> >further? (It is currently being split into smaller proposals).
>
> Yes, I think it's too early to actually make this change. Our current
> !_GLIBCXX_HOSTED build conforms to the requirements of a freestanding
> implementation (for anything from C++98 to C++17) so I'd prefer not to
> mess with that drastically until the P0829 work has made more
> progress. Despite that, I'm very happy to see somebody take on the
> task, and will be glad to apply a patch like this when the time is
> right.
>
I also considered using another macro ( such as _P0829_FREESTANDING )
so that it might be added directly. I will try to keep the branch up to date
with regards to the current proposal.
If anyone else is interested, the code is at:
https://gitlab.com/avr-libstdcxx/

> >I have not included further tests, nor actually run the tests since
> >everything is in header files is only includes of already existing
> >libstdc++ code.
>
> If we were serious about improving our freestanding support, we'd need
> to partition the testsuite into the parts that should pass for
> freestanding, and mark all the other tests UNSUPPORTED. That would
> mean we could run tests for a freestanding build and not get thousands
> of failures for tests that are not expected to work for freestanding.
> That would be a big project though.
>
> Your patch is mostly just adding #if in various places, not adding new
> code, and so I'm not sure it needs a copyright assignment (the changes
> probably aren't copyrightable anyway). But if you plan to contribute
> to GCC it would be good to get an assignment in place (if you don't
> have one already). See https://gcc.gnu.org/contribute.html#legal for
> more information, and feel free to contact me directly if you have any
> questions or if you want to start the process.
>
> Thanks again for the patch. Please do keep working on it as the P0829
> work evolves, so that we can integrate it with libstdc++ at some
> point.
>

Thank you, I will
diff mbox series

Patch

diff --git a/libstdc++-v3/include/Makefile.in b/libstdc++-v3/include/Makefile.in
index bc475c6dd90..3feed5b3bff 100644
--- a/libstdc++-v3/include/Makefile.in
+++ b/libstdc++-v3/include/Makefile.in
@@ -1886,18 +1886,62 @@  install-freestanding-headers:
 	$(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/bits
 	for file in c++0x_warning.h atomic_base.h concept_check.h move.h; do \
 	  $(INSTALL_DATA) ${glibcxx_srcdir}/include/bits/$${file} $(DESTDIR)${gxx_include_dir}/bits; done
+	# P0829 headers
+	for file in algorithmfwd.h alloc_traits.h boost_concept_check.h char_traits.h \
+          concept_check.h cpp_type_traits.h functexcept.h functional_hash.h \
+          hash_byte.h invoke.h memoryfwd.h parse_numbers.h postypes.h predefined_ops.h \
+	  ptr_traits.h random.h random.tcc range_access.h refwrap.h std_abs.h stl_algo.h \
+	  stl_algobase.h stl_construct.h stl_function.h stl_heap.h stl_iterator.h \
+	  stl_iterator_base_funcs.h  stl_iterator_base_types.h \
+	  stl_numeric.h stl_pair.h stl_relops.h stl_uninitialized.h unique_ptr.h \
+          uniform_int_dist.h uses_allocator.h ; do \
+	  $(INSTALL_DATA) ${glibcxx_srcdir}/include/bits/$${file} $(DESTDIR)${gxx_include_dir}/bits; done
 	$(mkinstalldirs) $(DESTDIR)${host_installdir}
 	for file in ${host_srcdir}/os_defines.h ${host_builddir}/c++config.h \
 	  ${glibcxx_srcdir}/$(ABI_TWEAKS_SRCDIR)/cxxabi_tweaks.h \
+	  ${glibcxx_srcdir}/$(ERROR_CONSTANTS_SRCDIR)/error_constants.h \
 	  ${glibcxx_srcdir}/$(CPU_DEFINES_SRCDIR)/cpu_defines.h; do \
 	  $(INSTALL_DATA) $${file} $(DESTDIR)${host_installdir}; done
 	$(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${std_builddir}
 	for file in limits type_traits atomic bit version; do \
 	  $(INSTALL_DATA) ${std_builddir}/$${file} $(DESTDIR)${gxx_include_dir}/${std_builddir}; done
+	#P0829 headers
+	# Remaining headers:
+	#	cwchar memory ranges variant
+	# Will not be implemented:
+	#	cinttypes 
+	for file in algorithm array bitset chrono charconv functional iterator \
+          memory numeric optional random ratio string string_view system_error \
+          utility tuple ; do \
+	  $(INSTALL_DATA) ${std_builddir}/$${file} $(DESTDIR)${gxx_include_dir}/${std_builddir}; done
 	$(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${c_base_builddir}
 	for file in ciso646 cstddef cfloat climits cstdint cstdlib \
 	  cstdalign cstdarg cstdbool; do \
 	  $(INSTALL_DATA) ${c_base_builddir}/$${file} $(DESTDIR)${gxx_include_dir}/${c_base_builddir}; done
+	#P0829 headers
+	for file in csetjmp cwchar cerrno cmath ctime cctype cstring; do \
+	  $(INSTALL_DATA) ${c_base_builddir}/$${file} $(DESTDIR)${gxx_include_dir}/${c_base_builddir}; done
+	$(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${ext_builddir}
+	for file in type_traits.h numeric_traits.h; do \
+	  $(INSTALL_DATA) ${ext_srcdir}/$${file} $(DESTDIR)${gxx_include_dir}/${ext_builddir}; done
+	#P0829 headers ext
+	for file in alloc_traits.h; do \
+	  $(INSTALL_DATA) ${ext_srcdir}/$${file} $(DESTDIR)${gxx_include_dir}/${ext_builddir}; done
+	$(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${debug_builddir}
+	for file in array debug.h assertions.h; do \
+	  $(INSTALL_DATA) ${debug_srcdir}/$${file} $(DESTDIR)${gxx_include_dir}/${debug_builddir}; done
+	#P0829
+	$(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${backward_builddir}
+	for file in binders.h ; do \
+	  $(INSTALL_DATA) ${backward_srcdir}/$${file} $(DESTDIR)${gxx_include_dir}/${backward_builddir}; done
+	$(mkinstalldirs) $(DESTDIR)${host_installdir}
+	for file in ${host_headers} ${bits_host_headers} ${host_headers_extra} \
+	 ${thread_host_headers}; do \
+	  $(INSTALL_DATA) $${file} $(DESTDIR)${host_installdir}; done
+	$(mkinstalldirs) $(DESTDIR)${host_installdir}/../ext
+	for file in ${ext_host_headers}; do \
+	  $(INSTALL_DATA) $${file} $(DESTDIR)${host_installdir}/../ext; done
+
 
 # The real deal.
 install-headers:
diff --git a/libstdc++-v3/include/bits/algorithmfwd.h b/libstdc++-v3/include/bits/algorithmfwd.h
index 40e051aa9e3..ebf6bd5610d 100644
--- a/libstdc++-v3/include/bits/algorithmfwd.h
+++ b/libstdc++-v3/include/bits/algorithmfwd.h
@@ -289,6 +289,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
     bool
     includes(_IIter1, _IIter1, _IIter2, _IIter2, _Compare);
 
+#if _GLIBCXX_HOSTED
   template<typename _BIter>
     void
     inplace_merge(_BIter, _BIter, _BIter);
@@ -296,6 +297,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
   template<typename _BIter, typename _Compare>
     void
     inplace_merge(_BIter, _BIter, _BIter, _Compare);
+#endif // _GLIBCXX_HOSTED
 
 #if __cplusplus >= 201103L
   template<typename _RAIter>
@@ -575,9 +577,11 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
     void
     sort_heap(_RAIter, _RAIter, _Compare);
 
+#if _GLIBCXX_HOSTED
   template<typename _BIter, typename _Predicate>
     _BIter
     stable_partition(_BIter, _BIter, _Predicate);
+#endif // _GLIBCXX_HOSTED
 
 #if __cplusplus < 201103L
   // For C++11 swap() is declared in <type_traits>.
@@ -817,6 +821,7 @@  _GLIBCXX_BEGIN_NAMESPACE_ALGO
     void
     sort(_RAIter, _RAIter, _Compare);
 
+#if _GLIBCXX_HOSTED
   template<typename _RAIter>
     void
     stable_sort(_RAIter, _RAIter);
@@ -824,6 +829,7 @@  _GLIBCXX_BEGIN_NAMESPACE_ALGO
   template<typename _RAIter, typename _Compare>
     void
     stable_sort(_RAIter, _RAIter, _Compare);
+#endif // _GLIBCXX_HOSTED
 
   template<typename _IIter, typename _OIter, typename _UnaryOperation>
     _OIter
diff --git a/libstdc++-v3/include/bits/alloc_traits.h b/libstdc++-v3/include/bits/alloc_traits.h
index cda768bf391..a3dfd578cbf 100644
--- a/libstdc++-v3/include/bits/alloc_traits.h
+++ b/libstdc++-v3/include/bits/alloc_traits.h
@@ -388,6 +388,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
     };
 
   /// Partial specialization for std::allocator.
+#if _GLIBCXX_HOSTED
   template<typename _Tp>
     struct allocator_traits<allocator<_Tp>>
     {
@@ -514,6 +515,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       select_on_container_copy_construction(const allocator_type& __rhs)
       { return __rhs; }
     };
+#endif // _GLIBCXX_HOSTED
 
 
   template<typename _Alloc>
@@ -601,10 +603,12 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
     { };
 
   // std::allocator<_Tp> just requires CopyConstructible
+#if _GLIBCXX_HOSTED
   template<typename _Tp>
     struct __is_copy_insertable<allocator<_Tp>>
     : is_copy_constructible<_Tp>
     { };
+#endif // _GLIBCXX_HOSTED
 
   // true if _Alloc::value_type is MoveInsertable into containers using _Alloc
   // (might be wrong if _Alloc::construct exists but is not constrained,
@@ -615,10 +619,12 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
     { };
 
   // std::allocator<_Tp> just requires MoveConstructible
+#if _GLIBCXX_HOSTED
   template<typename _Tp>
     struct __is_move_insertable<allocator<_Tp>>
     : is_move_constructible<_Tp>
     { };
+#endif // _GLIBCXX_HOSTED
 
   // Trait to detect Allocator-like types.
   template<typename _Alloc, typename = void>
diff --git a/libstdc++-v3/include/bits/memoryfwd.h b/libstdc++-v3/include/bits/memoryfwd.h
index 8b1664a398d..fa6d2d23eea 100644
--- a/libstdc++-v3/include/bits/memoryfwd.h
+++ b/libstdc++-v3/include/bits/memoryfwd.h
@@ -60,11 +60,13 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
    * @{
    */
 
+#if _GLIBCXX_HOSTED
   template<typename>
     class allocator;
 
   template<>
     class allocator<void>;
+#endif // _GLIBCXX_HOSTED
 
   /// Declare uses_allocator so it can be specialized in \<queue\> etc.
   template<typename, typename>
diff --git a/libstdc++-v3/include/bits/random.h b/libstdc++-v3/include/bits/random.h
index 2b1df4cb59e..1b618a5d9ac 100644
--- a/libstdc++-v3/include/bits/random.h
+++ b/libstdc++-v3/include/bits/random.h
@@ -31,7 +31,9 @@ 
 #ifndef _RANDOM_H
 #define _RANDOM_H 1
 
+#if _GLIBCXX_HOSTED
 #include <vector>
+#endif // _GLIBCXX_HOSTED
 #include <bits/uniform_int_dist.h>
 
 namespace std _GLIBCXX_VISIBILITY(default)
@@ -366,6 +368,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 		 const linear_congruential_engine& __rhs)
       { return __lhs._M_x == __rhs._M_x; }
 
+#if _GLIBCXX_HOSTED
       /**
        * @brief Writes the textual representation of the state x(i) of x to
        *        @p __os.
@@ -400,6 +403,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	operator>>(std::basic_istream<_CharT, _Traits>& __is,
 		   std::linear_congruential_engine<_UIntType1, __a1,
 		   __c1, __m1>& __lcr);
+#endif // _GLIBCXX_HOSTED
 
     private:
       _UIntType _M_x;
@@ -578,6 +582,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       { return (std::equal(__lhs._M_x, __lhs._M_x + state_size, __rhs._M_x)
 		&& __lhs._M_p == __rhs._M_p); }
 
+#if _GLIBCXX_HOSTED
       /**
        * @brief Inserts the current state of a % mersenne_twister_engine
        *        random number generator engine @p __x into the output stream
@@ -629,6 +634,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 		   std::mersenne_twister_engine<_UIntType1, __w1, __n1, __m1,
 		   __r1, __a1, __u1, __d1, __s1, __b1, __t1, __c1,
 		   __l1, __f1>& __x);
+#endif // _GLIBCXX_HOSTED
 
     private:
       void _M_gen_rand();
@@ -797,6 +803,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 		&& __lhs._M_carry == __rhs._M_carry
 		&& __lhs._M_p == __rhs._M_p); }
 
+#if _GLIBCXX_HOSTED
       /**
        * @brief Inserts the current state of a % subtract_with_carry_engine
        *        random number generator engine @p __x into the output stream
@@ -834,6 +841,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	operator>>(std::basic_istream<_CharT, _Traits>& __is,
 		   std::subtract_with_carry_engine<_UIntType1, __w1,
 		   __s1, __r1>& __x);
+#endif // _GLIBCXX_HOSTED
 
     private:
       /// The state of the generator.  This is a ring buffer.
@@ -1025,6 +1033,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 		 const discard_block_engine& __rhs)
       { return __lhs._M_b == __rhs._M_b && __lhs._M_n == __rhs._M_n; }
 
+#if _GLIBCXX_HOSTED
       /**
        * @brief Inserts the current state of a %discard_block_engine random
        *        number generator engine @p __x into the output stream
@@ -1060,6 +1069,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	operator>>(std::basic_istream<_CharT, _Traits>& __is,
 		   std::discard_block_engine<_RandomNumberEngine1,
 		   __p1, __r1>& __x);
+#endif // _GLIBCXX_HOSTED
 
     private:
       _RandomNumberEngine _M_b;
@@ -1236,6 +1246,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 		 const independent_bits_engine& __rhs)
       { return __lhs._M_b == __rhs._M_b; }
 
+#if _GLIBCXX_HOSTED
       /**
        * @brief Extracts the current state of a % subtract_with_carry_engine
        *        random number generator engine @p __x from the input stream
@@ -1257,6 +1268,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	  __is >> __x._M_b;
 	  return __is;
 	}
+#endif // _GLIBCXX_HOSTED
 
     private:
       _RandomNumberEngine _M_b;
@@ -1282,6 +1294,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	       _UIntType>& __rhs)
     { return !(__lhs == __rhs); }
 
+#if _GLIBCXX_HOSTED
   /**
    * @brief Inserts the current state of a %independent_bits_engine random
    *        number generator engine @p __x into the output stream @p __os.
@@ -1302,8 +1315,9 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       __os << __x.base();
       return __os;
     }
+#endif // _GLIBCXX_HOSTED
 
-
+#if _GLIBCXX_HOSTED
   /**
    * @brief Produces random numbers by combining random numbers from some
    * base engine to produce random numbers with a specifies number of bits
@@ -1534,7 +1548,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	       const std::shuffle_order_engine<_RandomNumberEngine,
 	       __k>& __rhs)
     { return !(__lhs == __rhs); }
-
+#endif
 
   /**
    * The classic Minimum Standard rand0 of Lewis, Goodman, and Miller.
@@ -1586,10 +1600,13 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
   typedef discard_block_engine<ranlux48_base, 389, 11> ranlux48;
 
+#if _GLIBCXX_HOSTED
   typedef shuffle_order_engine<minstd_rand0, 256> knuth_b;
+#endif // _GLIBCXX_HOSTED
 
   typedef minstd_rand0 default_random_engine;
 
+#if _GLIBCXX_HOSTED
   /**
    * A standard interface to a platform-specific non-deterministic
    * random number generator (if any are available).
@@ -1666,6 +1683,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       mt19937    _M_mt;
     };
   };
+#endif // _GLIBCXX_HOSTED
 
   /* @} */ // group random_generators
 
@@ -1693,6 +1711,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	       const std::uniform_int_distribution<_IntType>& __d2)
     { return !(__d1 == __d2); }
 
+#if _GLIBCXX_HOSTED
   /**
    * @brief Inserts a %uniform_int_distribution random number
    *        distribution @p __x into the output stream @p os.
@@ -6093,6 +6112,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
     std::vector<result_type> _M_v;
   };
 
+#endif // _GLIBCXX_HOSTED
   /* @} */ // group random_utilities
 
   /* @} */ // group random
diff --git a/libstdc++-v3/include/bits/random.tcc b/libstdc++-v3/include/bits/random.tcc
index b80ab82ba15..5aa5ad31b19 100644
--- a/libstdc++-v3/include/bits/random.tcc
+++ b/libstdc++-v3/include/bits/random.tcc
@@ -148,6 +148,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	seed(__sum);
       }
 
+#if _GLIBCXX_HOSTED
   template<typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m,
 	   typename _CharT, typename _Traits>
     std::basic_ostream<_CharT, _Traits>&
@@ -187,6 +188,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       __is.flags(__flags);
       return __is;
     }
+#endif // _GLIBCXX_HOSTED
 
 
   template<typename _UIntType,
@@ -467,6 +469,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       return __z;
     }
 
+#if _GLIBCXX_HOSTED
   template<typename _UIntType, size_t __w,
 	   size_t __n, size_t __m, size_t __r,
 	   _UIntType __a, size_t __u, _UIntType __d, size_t __s,
@@ -518,6 +521,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       __is.flags(__flags);
       return __is;
     }
+#endif // _GLIBCXX_HOSTED
 
 
   template<typename _UIntType, size_t __w, size_t __s, size_t __r>
@@ -626,6 +630,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       return __xi;
     }
 
+#if _GLIBCXX_HOSTED
   template<typename _UIntType, size_t __w, size_t __s, size_t __r,
 	   typename _CharT, typename _Traits>
     std::basic_ostream<_CharT, _Traits>&
@@ -671,6 +676,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       __is.flags(__flags);
       return __is;
     }
+#endif // _GLIBCXX_HOSTED
 
 
   template<typename _RandomNumberEngine, size_t __p, size_t __r>
@@ -696,6 +702,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       return _M_b();
     }
 
+#if _GLIBCXX_HOSTED
   template<typename _RandomNumberEngine, size_t __p, size_t __r,
 	   typename _CharT, typename _Traits>
     std::basic_ostream<_CharT, _Traits>&
@@ -736,6 +743,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       __is.flags(__flags);
       return __is;
     }
+#endif // _GLIBCXX_HOSTED
 
 
   template<typename _RandomNumberEngine, size_t __w, typename _UIntType>
@@ -808,6 +816,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
     }
 
 
+#if _GLIBCXX_HOSTED
   template<typename _RandomNumberEngine, size_t __k>
     constexpr size_t
     shuffle_order_engine<_RandomNumberEngine, __k>::table_size;
@@ -3349,6 +3358,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       return __ret;
     }
 
+#endif // _GLIBCXX_HOSTED
 _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace
 
diff --git a/libstdc++-v3/include/bits/stl_algo.h b/libstdc++-v3/include/bits/stl_algo.h
index 3411a63b1a3..73de72f4a1e 100644
--- a/libstdc++-v3/include/bits/stl_algo.h
+++ b/libstdc++-v3/include/bits/stl_algo.h
@@ -59,7 +59,9 @@ 
 #include <cstdlib>	     // for rand
 #include <bits/algorithmfwd.h>
 #include <bits/stl_heap.h>
+#if _GLIBCXX_HOSTED
 #include <bits/stl_tempbuf.h>  // for _Temporary_buffer
+#endif
 #include <bits/predefined_ops.h>
 
 #if __cplusplus >= 201103L
@@ -1537,6 +1539,8 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
   // partition
 
+  // p0829 expcludes stable_sort, stable_partition and inplace_merge
+#if _GLIBCXX_HOSTED
   /// This is a helper function...
   /// Requires __first != __last and !__pred(__first)
   /// and __len == distance(__first, __last).
@@ -1660,6 +1664,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       return std::__stable_partition(__first, __last,
 				     __gnu_cxx::__ops::__pred_iter(__pred));
     }
+#endif // _GLIBCXX_HOSTED
 
   /// This is a helper function for the sort routines.
   template<typename _RandomAccessIterator, typename _Compare>
@@ -2515,6 +2520,8 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 				  __len1 - __len11, __len2 - __len22, __comp);
     }
 
+  // p0829 expcludes stable_sort, stable_partition and inplace_merge
+#if _GLIBCXX_HOSTED
   template<typename _BidirectionalIterator, typename _Compare>
     void
     __inplace_merge(_BidirectionalIterator __first,
@@ -2624,6 +2631,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       std::__inplace_merge(__first, __middle, __last,
 			   __gnu_cxx::__ops::__iter_comp_iter(__comp));
     }
+#endif
 
 
   /// This is a helper function for the __merge_sort_loop routines.
@@ -2720,6 +2728,8 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	}
     }
 
+  // p0829 expcludes stable_sort, stable_partition and inplace_merge
+#if _GLIBCXX_HOSTED
   template<typename _RandomAccessIterator, typename _Pointer,
 	   typename _Distance, typename _Compare>
     void
@@ -2770,6 +2780,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
     }
 
   // stable_sort
+#endif
 
   // Set algorithms: includes, set_union, set_intersection, set_difference,
   // set_symmetric_difference.  All of these algorithms have the precondition
@@ -4981,6 +4992,9 @@  _GLIBCXX_BEGIN_NAMESPACE_ALGO
 				__gnu_cxx::__ops::__iter_comp_iter(__comp));
     }
 
+  // p0829 expcludes stable_sort, stable_partition and inplace_merge
+#if _GLIBCXX_HOSTED
+
   template<typename _RandomAccessIterator, typename _Compare>
     inline void
     __stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
@@ -5069,6 +5083,7 @@  _GLIBCXX_BEGIN_NAMESPACE_ALGO
       _GLIBCXX_STD_A::__stable_sort(__first, __last,
 				    __gnu_cxx::__ops::__iter_comp_iter(__comp));
     }
+#endif
 
   template<typename _InputIterator1, typename _InputIterator2,
 	   typename _OutputIterator,
diff --git a/libstdc++-v3/include/bits/stl_construct.h b/libstdc++-v3/include/bits/stl_construct.h
index bf063398ebe..016ab9213b2 100644
--- a/libstdc++-v3/include/bits/stl_construct.h
+++ b/libstdc++-v3/include/bits/stl_construct.h
@@ -198,6 +198,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	__traits::destroy(__alloc, std::__addressof(*__first));
     }
 
+#if _GLIBCXX_HOSTED
   template<typename _ForwardIterator, typename _Tp>
     inline void
     _Destroy(_ForwardIterator __first, _ForwardIterator __last,
@@ -205,6 +206,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
     {
       _Destroy(__first, __last);
     }
+#endif // _GLIBCXX_HOSTED
 
 #if __cplusplus > 201402L
   template <typename _Tp>
diff --git a/libstdc++-v3/include/bits/stl_uninitialized.h b/libstdc++-v3/include/bits/stl_uninitialized.h
index 0d42b253df1..e64dd870fa1 100644
--- a/libstdc++-v3/include/bits/stl_uninitialized.h
+++ b/libstdc++-v3/include/bits/stl_uninitialized.h
@@ -282,11 +282,13 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	}
     }
 
+#if _GLIBCXX_HOSTED
   template<typename _InputIterator, typename _ForwardIterator, typename _Tp>
     inline _ForwardIterator
     __uninitialized_copy_a(_InputIterator __first, _InputIterator __last,
 			   _ForwardIterator __result, allocator<_Tp>&)
     { return std::uninitialized_copy(__first, __last, __result); }
+#endif // _GLIBCXX_HOSTED
 
   template<typename _InputIterator, typename _ForwardIterator,
 	   typename _Allocator>
@@ -331,11 +333,13 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	}
     }
 
+#if _GLIBCXX_HOSTED
   template<typename _ForwardIterator, typename _Tp, typename _Tp2>
     inline void
     __uninitialized_fill_a(_ForwardIterator __first, _ForwardIterator __last,
 			   const _Tp& __x, allocator<_Tp2>&)
     { std::uninitialized_fill(__first, __last, __x); }
+#endif // _GLIBCXX_HOSTED
 
   template<typename _ForwardIterator, typename _Size, typename _Tp,
 	   typename _Allocator>
@@ -358,12 +362,14 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	}
     }
 
+#if _GLIBCXX_HOSTED
   template<typename _ForwardIterator, typename _Size, typename _Tp,
 	   typename _Tp2>
     inline _ForwardIterator
     __uninitialized_fill_n_a(_ForwardIterator __first, _Size __n, 
 			     const _Tp& __x, allocator<_Tp2>&)
     { return std::uninitialized_fill_n(__first, __n, __x); }
+#endif // _GLIBCXX_HOSTED
 
 
   // Extensions: __uninitialized_copy_move, __uninitialized_move_copy,
@@ -607,12 +613,14 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	}
     }
 
+#if _GLIBCXX_HOSTED
   template<typename _ForwardIterator, typename _Tp>
     inline void
     __uninitialized_default_a(_ForwardIterator __first,
 			      _ForwardIterator __last,
 			      allocator<_Tp>&)
     { std::__uninitialized_default(__first, __last); }
+#endif // _GLIBCXX_HOSTED
 
 
   // __uninitialized_default_n_a
@@ -638,11 +646,13 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	}
     }
 
+#if _GLIBCXX_HOSTED
   template<typename _ForwardIterator, typename _Size, typename _Tp>
     inline _ForwardIterator
     __uninitialized_default_n_a(_ForwardIterator __first, _Size __n, 
 				allocator<_Tp>&)
     { return std::__uninitialized_default_n(__first, __n); }
+#endif // _GLIBCXX_HOSTED
 
   template<bool _TrivialValueType>
     struct __uninitialized_default_novalue_1
@@ -901,6 +911,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
     struct __is_bitwise_relocatable
     : is_trivial<_Tp> { };
 
+#if _GLIBCXX_HOSTED
   template <typename _Tp, typename _Up>
     inline __enable_if_t<std::__is_bitwise_relocatable<_Tp>::value, _Tp*>
     __relocate_a_1(_Tp* __first, _Tp* __last,
@@ -911,6 +922,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	__builtin_memmove(__result, __first, __count * sizeof(_Tp));
       return __result + __count;
     }
+#endif // _GLIBCXX_HOSTED
 
   template <typename _InputIterator, typename _ForwardIterator,
 	    typename _Allocator>
diff --git a/libstdc++-v3/include/bits/unique_ptr.h b/libstdc++-v3/include/bits/unique_ptr.h
index d8129747eb5..c14d68dd9bf 100644
--- a/libstdc++-v3/include/bits/unique_ptr.h
+++ b/libstdc++-v3/include/bits/unique_ptr.h
@@ -828,6 +828,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
 #if __cplusplus > 201103L
 
+#if _GLIBCXX_HOSTED
 #define __cpp_lib_make_unique 201304
 
   template<typename _Tp>
@@ -859,6 +860,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
     inline typename _MakeUniq<_Tp>::__invalid_type
     make_unique(_Args&&...) = delete;
 #endif
+#endif // _GLIBCXX_HOSTED
 
   // @} group pointer_abstractions
 
diff --git a/libstdc++-v3/include/c_global/cstring b/libstdc++-v3/include/c_global/cstring
index 5d656c507ad..c2b0d717cda 100644
--- a/libstdc++-v3/include/c_global/cstring
+++ b/libstdc++-v3/include/c_global/cstring
@@ -81,21 +81,23 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
   using ::memset;
   using ::strcat;
   using ::strcmp;
-  using ::strcoll;
   using ::strcpy;
   using ::strcspn;
-  using ::strerror;
   using ::strlen;
   using ::strncat;
   using ::strncmp;
   using ::strncpy;
   using ::strspn;
-  using ::strtok;
-  using ::strxfrm;
   using ::strchr;
   using ::strpbrk;
   using ::strrchr;
   using ::strstr;
+#if _GLIBCXX_HOSTED
+  using ::strcoll;
+  using ::strerror;
+  using ::strtok;
+  using ::strxfrm;
+#endif // GLIBCXX_HOSTED
 
 #ifndef __CORRECT_ISO_CPP_STRING_H_PROTO
   inline void*
diff --git a/libstdc++-v3/include/c_std/cmath b/libstdc++-v3/include/c_std/cmath
index 2dcdff0ac68..232c1e9e31d 100644
--- a/libstdc++-v3/include/c_std/cmath
+++ b/libstdc++-v3/include/c_std/cmath
@@ -45,7 +45,10 @@ 
 #include <bits/cpp_type_traits.h>
 #include <ext/type_traits.h>
 
+
+#if _GLIBCXX_HOSTED
 #include <math.h>
+#endif // _GLIBCXX_HOSTED
 
 // Get rid of those macros defined in <math.h> in lieu of real functions.
 #undef abs
@@ -95,6 +98,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
     abs(_Tp __x)
     { return __builtin_fabs(__x); }
 
+#if _GLIBCXX_HOSTED
   using ::acos;
 
   inline float
@@ -577,6 +581,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
 #endif /* _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC */
 #endif /* _GLIBCXX_USE_C99_MATH */
+#endif // _GLIBCXX_HOSTED
 
 _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace std
diff --git a/libstdc++-v3/include/c_std/cstdlib b/libstdc++-v3/include/c_std/cstdlib
index 6472ae1dccb..1407a616eed 100644
--- a/libstdc++-v3/include/c_std/cstdlib
+++ b/libstdc++-v3/include/c_std/cstdlib
@@ -115,9 +115,43 @@  namespace std _GLIBCXX_VISIBILITY(default)
 {
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
+#if !_GLIBCXX_HOSTED
   using ::div_t;
   using ::ldiv_t;
+  using ::bsearch;
+  using ::qsort;
+  using ::div;
+  using ::ldiv;
+  using ::labs;
+#if defined(__GLIBCXX_TYPE_INT_N_0)
+  inline __GLIBCXX_TYPE_INT_N_0
+  abs(__GLIBCXX_TYPE_INT_N_0 __x) { return __x >= 0 ? __x : -__x; }
+#endif
+#if defined(__GLIBCXX_TYPE_INT_N_1)
+  inline __GLIBCXX_TYPE_INT_N_1
+  abs(__GLIBCXX_TYPE_INT_N_1 __x) { return __x >= 0 ? __x : -__x; }
+#endif
+#if defined(__GLIBCXX_TYPE_INT_N_2)
+  inline __GLIBCXX_TYPE_INT_N_2
+  abs(__GLIBCXX_TYPE_INT_N_2 __x) { return __x >= 0 ? __x : -__x; }
+#endif
+#if defined(__GLIBCXX_TYPE_INT_N_3)
+  inline __GLIBCXX_TYPE_INT_N_3
+  abs(__GLIBCXX_TYPE_INT_N_3 __x) { return __x >= 0 ? __x : -__x; }
+#endif
+  inline long
+  abs(long __i) { return __builtin_labs(__i); }
 
+#ifdef _GLIBCXX_USE_LONG_LONG
+  inline long long
+  abs(long long __x) { return __builtin_llabs (__x); }
+#endif
+
+  inline ldiv_t
+  div(long __i, long __j) { return ldiv(__i, __j); }
+
+
+#else
   using ::abort;
   using ::abs;
   using ::atexit;
@@ -129,21 +163,16 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
   using ::atof;
   using ::atoi;
   using ::atol;
-  using ::bsearch;
   using ::calloc;
-  using ::div;
   using ::exit;
   using ::free;
   using ::getenv;
-  using ::labs;
-  using ::ldiv;
   using ::malloc;
 #ifdef _GLIBCXX_HAVE_MBSTATE_T
   using ::mblen;
   using ::mbstowcs;
   using ::mbtowc;
 #endif // _GLIBCXX_HAVE_MBSTATE_T
-  using ::qsort;
 #if __cplusplus >= 201103L
 # ifdef _GLIBCXX_HAVE_QUICK_EXIT
   using ::quick_exit;
@@ -161,34 +190,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
   using ::wctomb;
 #endif // _GLIBCXX_USE_WCHAR_T
 
-  inline long
-  abs(long __i) { return __builtin_labs(__i); }
-
-#ifdef _GLIBCXX_USE_LONG_LONG
-  inline long long
-  abs(long long __x) { return __builtin_llabs (__x); }
-#endif
-
-#if defined(__GLIBCXX_TYPE_INT_N_0)
-  inline __GLIBCXX_TYPE_INT_N_0
-  abs(__GLIBCXX_TYPE_INT_N_0 __x) { return __x >= 0 ? __x : -__x; }
-#endif
-#if defined(__GLIBCXX_TYPE_INT_N_1)
-  inline __GLIBCXX_TYPE_INT_N_1
-  abs(__GLIBCXX_TYPE_INT_N_1 __x) { return __x >= 0 ? __x : -__x; }
-#endif
-#if defined(__GLIBCXX_TYPE_INT_N_2)
-  inline __GLIBCXX_TYPE_INT_N_2
-  abs(__GLIBCXX_TYPE_INT_N_2 __x) { return __x >= 0 ? __x : -__x; }
-#endif
-#if defined(__GLIBCXX_TYPE_INT_N_3)
-  inline __GLIBCXX_TYPE_INT_N_3
-  abs(__GLIBCXX_TYPE_INT_N_3 __x) { return __x >= 0 ? __x : -__x; }
-#endif
-
-  inline ldiv_t
-  div(long __i, long __j) { return ldiv(__i, __j); }
-
+#endif // _GLIBCXX_HOSTED
 _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace
 
diff --git a/libstdc++-v3/include/c_std/cwchar b/libstdc++-v3/include/c_std/cwchar
index 6e260e72450..1f53d7aed01 100644
--- a/libstdc++-v3/include/c_std/cwchar
+++ b/libstdc++-v3/include/c_std/cwchar
@@ -228,7 +228,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace
 
-#if _GLIBCXX_USE_C99_WCHAR
+#if _GLIBCXX_USE_C99_WCHAR && _GLIBCXX_HOSTED
 
 #undef wcstold
 #undef wcstoll
diff --git a/libstdc++-v3/include/std/algorithm b/libstdc++-v3/include/std/algorithm
index b5013a226e3..27bbfa81a2a 100644
--- a/libstdc++-v3/include/std/algorithm
+++ b/libstdc++-v3/include/std/algorithm
@@ -76,7 +76,7 @@ 
 # define __cpp_lib_parallel_algorithm 201603L
 #endif // C++17
 
-#ifdef _GLIBCXX_PARALLEL
+#ifdef _GLIBCXX_PARALLEL && _GLIBCXX_HOSTED
 # include <parallel/algorithm>
 #endif
 
diff --git a/libstdc++-v3/include/std/array b/libstdc++-v3/include/std/array
index 02c6f4b4dbe..bed475bb1d3 100644
--- a/libstdc++-v3/include/std/array
+++ b/libstdc++-v3/include/std/array
@@ -36,7 +36,9 @@ 
 #else
 
 #include <utility>
+#if _GLIBCXX_HOSTED
 #include <stdexcept>
+#endif
 #include <bits/stl_algobase.h>
 #include <bits/range_access.h>
 
@@ -189,6 +191,7 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       operator[](size_type __n) const noexcept
       { return _AT_Type::_S_ref(_M_elems, __n); }
 
+#if _GLIBCXX_HOSTED
       _GLIBCXX17_CONSTEXPR reference
       at(size_type __n)
       {
@@ -210,6 +213,7 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 					   __n, _Nm),
 	     _AT_Type::_S_ref(_M_elems, 0));
       }
+#endif // GLIBCXX_HOSTED
 
       _GLIBCXX17_CONSTEXPR reference
       front() noexcept
diff --git a/libstdc++-v3/include/std/bitset b/libstdc++-v3/include/std/bitset
index d6958301e8a..dc23abb72aa 100644
--- a/libstdc++-v3/include/std/bitset
+++ b/libstdc++-v3/include/std/bitset
@@ -44,10 +44,13 @@ 
 
 #pragma GCC system_header
 
-#include <string>
 #include <bits/functexcept.h>   // For invalid_argument, out_of_range,
                                 // overflow_error
+#if _GLIBCXX_HOSTED
+#include <string>
 #include <iosfwd>
+#endif
+
 #include <bits/cxxabi_forced.h>
 
 #if __cplusplus >= 201103L
@@ -217,6 +220,7 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 	return __result;
       }
 
+#if _GLIBCXX_HOSTED
       unsigned long
       _M_do_to_ulong() const;
 
@@ -224,6 +228,7 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       unsigned long long
       _M_do_to_ullong() const;
 #endif
+#endif // _GLIBCXX_HOSTED
 
       // find first "on" bit
       size_t
@@ -288,6 +293,7 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 	}
     }
 
+#if _GLIBCXX_HOSTED
   template<size_t _Nw>
     unsigned long
     _Base_bitset<_Nw>::_M_do_to_ulong() const
@@ -314,6 +320,7 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       return _M_w[0];
     }
 #endif
+#endif // _GLIBCXX_HOSTED
 
   template<size_t _Nw>
     size_t
@@ -755,6 +762,7 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       typedef _Base_bitset<_GLIBCXX_BITSET_WORDS(_Nb)> _Base;
       typedef unsigned long _WordT;
 
+#if _GLIBCXX_HOSTED
       template<class _CharT, class _Traits, class _Alloc>
       void
       _M_check_initial_position(const std::basic_string<_CharT, _Traits, _Alloc>& __s,
@@ -774,6 +782,7 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 				       ">= _Nb (which is %zu)"),
 				   __s, __position, _Nb);
       }
+#endif // _GLIBCXX_HOSTED
 
       void
       _M_do_sanitize() _GLIBCXX_NOEXCEPT
@@ -888,6 +897,7 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  @throw  std::invalid_argument  If a character appears in the string
        *                                 which is neither @a 0 nor @a 1.
        */
+#if _GLIBCXX_HOSTED
       template<class _CharT, class _Traits, class _Alloc>
 	explicit
 	bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __s,
@@ -959,6 +969,7 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 							     __one);
 	}
 #endif
+#endif // _GLIBCXX_HOSTED
 
       // 23.3.5.2 bitset operations:
       //@{
@@ -1085,12 +1096,14 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  @param  __val  Either true or false, defaults to true.
        *  @throw  std::out_of_range  If @a pos is bigger the size of the %set.
        */
+#if _GLIBCXX_HOSTED
       bitset<_Nb>&
       set(size_t __position, bool __val = true)
       {
 	this->_M_check(__position, __N("bitset::set"));
 	return _Unchecked_set(__position, __val);
       }
+#endif // _GLIBCXX_HOSTED
 
       /**
        *  @brief Sets every bit to false.
@@ -1109,12 +1122,14 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *
        *  Same as writing @c set(pos,false).
        */
+#if _GLIBCXX_HOSTED
       bitset<_Nb>&
       reset(size_t __position)
       {
 	this->_M_check(__position, __N("bitset::reset"));
 	return _Unchecked_reset(__position);
       }
+#endif // _GLIBCXX_HOSTED
 
       /**
        *  @brief Toggles every bit to its opposite value.
@@ -1132,12 +1147,14 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  @param  __position  The index of the bit.
        *  @throw  std::out_of_range  If @a pos is bigger the size of the %set.
        */
+#if _GLIBCXX_HOSTED
       bitset<_Nb>&
       flip(size_t __position)
       {
 	this->_M_check(__position, __N("bitset::flip"));
 	return _Unchecked_flip(__position);
       }
+#endif // _GLIBCXX_HOSTED
 
       /// See the no-argument flip().
       bitset<_Nb>
@@ -1192,6 +1209,7 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        *  correspond to increasing bit positions (see the main class notes for
        *  an example).
        */
+#if _GLIBCXX_HOSTED
       template<class _CharT, class _Traits, class _Alloc>
 	std::basic_string<_CharT, _Traits, _Alloc>
 	to_string() const
@@ -1289,7 +1307,7 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 	void
         _M_copy_to_string(std::basic_string<_CharT, _Traits,_Alloc>& __s) const
 	{ _M_copy_to_string(__s, _CharT('0'), _CharT('1')); }
-
+#endif // _GLIBCXX_HOSTED
       /// Returns the number of bits which are set.
       size_t
       count() const _GLIBCXX_NOEXCEPT
@@ -1383,6 +1401,7 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       { return this->_M_do_find_next(__prev, _Nb); }
     };
 
+#if _GLIBCXX_HOSTED
   // Definitions of non-inline member functions.
   template<size_t _Nb>
     template<class _CharT, class _Traits>
@@ -1417,6 +1436,7 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 	  if (_Unchecked_test(__i - 1))
 	    _Traits::assign(__s[_Nb - __i], __one);
       }
+#endif // _GLIBCXX_HOSTED
 
   // 23.3.5.3 bitset operations:
   //@{
@@ -1465,6 +1485,7 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
    *  characters, and will only extract as many digits as the %bitset will
    *  hold.
   */
+#if _GLIBCXX_HOSTED
   template<class _CharT, class _Traits, size_t _Nb>
     std::basic_istream<_CharT, _Traits>&
     operator>>(std::basic_istream<_CharT, _Traits>& __is, bitset<_Nb>& __x)
@@ -1546,6 +1567,7 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       __x._M_copy_to_string(__tmp, __ct.widen('0'), __ct.widen('1'));
       return __os << __tmp;
     }
+#endif // _GLIBCXX_HOSTED
   //@}
 
 _GLIBCXX_END_NAMESPACE_CONTAINER
diff --git a/libstdc++-v3/include/std/chrono b/libstdc++-v3/include/std/chrono
index 9e63fa9c698..5b718ac4d6a 100644
--- a/libstdc++-v3/include/std/chrono
+++ b/libstdc++-v3/include/std/chrono
@@ -799,6 +799,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 		 const time_point<_Clock, _Dur2>& __rhs)
       { return !(__lhs < __rhs); }
 
+#if _GLIBCXX_HOSTED
 
     // Clocks.
 
@@ -888,6 +889,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
     using high_resolution_clock = system_clock;
 
     } // end inline namespace _V2
+#endif // _GLIBCXX_HOSTED
   } // namespace chrono
 
 #if __cplusplus > 201103L
diff --git a/libstdc++-v3/include/std/functional b/libstdc++-v3/include/std/functional
index 8cf2c670648..b19a7089bd7 100644
--- a/libstdc++-v3/include/std/functional
+++ b/libstdc++-v3/include/std/functional
@@ -56,7 +56,9 @@ 
 #include <bits/functional_hash.h>
 #include <bits/invoke.h>
 #include <bits/refwrap.h>	// std::reference_wrapper and _Mem_fn_traits
+#if _GLIBCXX_HOSTED
 #include <bits/std_function.h>	// std::function
+#endif // _GLIBCXX_HOSTED
 #if __cplusplus > 201402L
 # include <unordered_map>
 # include <vector>
@@ -1014,7 +1016,6 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
     }
 
   // Searchers
-#define __cpp_lib_boyer_moore_searcher 201603
 
   template<typename _ForwardIterator1, typename _BinaryPredicate = equal_to<>>
     class default_searcher
@@ -1044,6 +1045,8 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       tuple<_ForwardIterator1, _ForwardIterator1, _BinaryPredicate> _M_m;
     };
 
+#if _GLIBCXX_HOSTED
+#define __cpp_lib_boyer_moore_searcher 201603
   template<typename _Key, typename _Tp, typename _Hash, typename _Pred>
     struct __boyer_moore_map_base
     {
@@ -1286,6 +1289,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	}
       return std::make_pair(__last, __last);
     }
+#endif // _GLIBCXX_HOSTED
 
 #endif // C++17
 #endif // C++14
diff --git a/libstdc++-v3/include/std/iterator b/libstdc++-v3/include/std/iterator
index 9d9e19c4c6b..8e7d61263c5 100644
--- a/libstdc++-v3/include/std/iterator
+++ b/libstdc++-v3/include/std/iterator
@@ -61,10 +61,12 @@ 
 #include <bits/stl_iterator_base_types.h>
 #include <bits/stl_iterator_base_funcs.h>
 #include <bits/stl_iterator.h>
+#if _GLIBCXX_HOSTED
 #include <ostream>
 #include <istream>
 #include <bits/stream_iterator.h>
 #include <bits/streambuf_iterator.h>
+#endif // _GLIBCXX_HOSTED
 #include <bits/range_access.h>
 
 #if __cplusplus >= 201402L && ! defined _GLIBCXX_DEBUG // PR libstdc++/70303
diff --git a/libstdc++-v3/include/std/memory b/libstdc++-v3/include/std/memory
index b6950c76089..18d5e2c5bf9 100644
--- a/libstdc++-v3/include/std/memory
+++ b/libstdc++-v3/include/std/memory
@@ -60,31 +60,39 @@ 
  */
 
 #include <bits/stl_algobase.h>
-#include <bits/allocator.h>
+#if _GLIBCXX_HOSTED
+#  include <bits/allocator.h>
+#  include <bits/stl_tempbuf.h>
+#  include <bits/stl_raw_storage_iter.h>
+#endif // _GLIBCXX_HOSTED
 #include <bits/stl_construct.h>
 #include <bits/stl_uninitialized.h>
-#include <bits/stl_tempbuf.h>
-#include <bits/stl_raw_storage_iter.h>
 
 #if __cplusplus >= 201103L
 #  include <exception>        	  // std::exception
 #  include <typeinfo>         	  // std::type_info in get_deleter
-#  include <iosfwd>           	  // std::basic_ostream
-#  include <ext/atomicity.h>
-#  include <ext/concurrence.h>
+#if _GLIBCXX_HOSTED
+#    include <iosfwd>           	  // std::basic_ostream
+#    include <ext/atomicity.h>
+#    include <ext/concurrence.h>
+#endif // _GLIBCXX_HOSTED
 #  include <bits/functexcept.h>
 #  include <bits/stl_function.h>  // std::less
 #  include <bits/uses_allocator.h>
 #  include <type_traits>
 #  include <debug/debug.h>
 #  include <bits/unique_ptr.h>
-#  include <bits/shared_ptr.h>
-#  include <bits/shared_ptr_atomic.h>
+#if _GLIBCXX_HOSTED
+#    include <bits/shared_ptr.h>
+#    include <bits/shared_ptr_atomic.h>
 #  if _GLIBCXX_USE_DEPRECATED
 #    include <backward/auto_ptr.h>
 #  endif
+#endif // _GLIBCXX_HOSTED
 #else
+#if _GLIBCXX_HOSTED
 #  include <backward/auto_ptr.h>
+#endif // _GLIBCXX_HOSTED
 #endif
 
 #if __cplusplus >= 201103L
@@ -138,6 +146,7 @@  align(size_t __align, size_t __size, void*& __ptr, size_t& __space) noexcept
 
 // 20.7.4 [util.dynamic.safety], pointer safety
 
+#if _GLIBCXX_HOSTED
 enum class pointer_safety { relaxed, preferred, strict };
 
 inline void
@@ -155,6 +164,7 @@  undeclare_no_pointers(char*, size_t) { }
 
 inline pointer_safety
 get_pointer_safety() noexcept { return pointer_safety::relaxed; }
+#endif // _GLIBCXX_HOSTED
 
 #if __cplusplus > 201703L
   /// Inform the compiler that a pointer is aligned.
@@ -207,6 +217,7 @@  get_pointer_safety() noexcept { return pointer_safety::relaxed; }
 	}
     }
 
+#if _GLIBCXX_HOSTED
 #if __cpp_concepts
   template<typename _Tp>
     concept _Std_pair = __is_pair<_Tp>::value;
@@ -359,6 +370,7 @@  get_pointer_safety() noexcept { return pointer_safety::relaxed; }
       return ::new(__vp) _Tp(std::make_obj_using_allocator<_Tp>(__a,
 	    std::forward<_Args>(__args)...));
     }
+#endif // _GLIBCXX_HOSTED
 
 #endif // C++2a
 
@@ -366,6 +378,7 @@  _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace
 #endif // C++11
 
+#if _GLIBCXX_HOSTED
 #if __cplusplus > 201402L
 // Parallel STL algorithms
 # if __PSTL_EXECUTION_POLICIES_DEFINED
@@ -379,5 +392,6 @@  _GLIBCXX_END_NAMESPACE_VERSION
 // Feature test macro for parallel algorithms
 # define __cpp_lib_parallel_algorithm 201603L
 #endif // C++17
+#endif // _GLIBCXX_HOSTED
 
 #endif /* _GLIBCXX_MEMORY */
diff --git a/libstdc++-v3/include/std/optional b/libstdc++-v3/include/std/optional
index 503d859bee6..92203e67a4d 100644
--- a/libstdc++-v3/include/std/optional
+++ b/libstdc++-v3/include/std/optional
@@ -73,6 +73,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
   /// Tag to disengage optional objects.
   inline constexpr nullopt_t nullopt { nullopt_t::_Construct::_Token };
 
+#if _GLIBCXX_HOSTED
   /**
    *  @brief Exception class thrown when a disengaged optional object is
    *  dereferenced.
@@ -97,6 +98,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
   inline void
   __throw_bad_optional_access()
   { _GLIBCXX_THROW_OR_ABORT(bad_optional_access()); }
+#endif // _GLIBCXX_HOSTED
 
   // This class template manages construction/destruction of
   // the contained value for a std::optional.
@@ -915,6 +917,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       constexpr bool has_value() const noexcept
       { return this->_M_is_engaged(); }
 
+#if _GLIBCXX_HOSTED
       constexpr const _Tp&
       value() const&
       {
@@ -946,6 +949,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	  ? std::move(this->_M_get())
 	  : (__throw_bad_optional_access(), std::move(this->_M_get()));
       }
+#endif // _GLIBCXX_HOSTED
 
       template<typename _Up>
 	constexpr _Tp
diff --git a/libstdc++-v3/include/std/random b/libstdc++-v3/include/std/random
index 67a54a28178..c6cb8756724 100644
--- a/libstdc++-v3/include/std/random
+++ b/libstdc++-v3/include/std/random
@@ -38,7 +38,9 @@ 
 #include <cmath>
 #include <cstdlib>
 #include <string>
+#if _GLIBCXX_HOSTED
 #include <iosfwd>
+#endif // _GLIBCXX_HOSTED
 #include <limits>
 #include <debug/debug.h>
 #include <type_traits>
diff --git a/libstdc++-v3/include/std/string b/libstdc++-v3/include/std/string
index 6ccc06f337a..cb764fabd97 100644
--- a/libstdc++-v3/include/std/string
+++ b/libstdc++-v3/include/std/string
@@ -36,8 +36,9 @@ 
 #pragma GCC system_header
 
 #include <bits/c++config.h>
-#include <bits/stringfwd.h>
 #include <bits/char_traits.h>  // NB: In turn includes stl_algobase.h
+#if _GLIBCXX_HOSTED
+#include <bits/stringfwd.h>
 #include <bits/allocator.h>
 #include <bits/cpp_type_traits.h>
 #include <bits/localefwd.h>    // For operators >>, <<, and getline.
@@ -144,4 +145,5 @@  _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace std
 #endif // C++20
 
+#endif // _GLIBCXX_HOSTED
 #endif /* _GLIBCXX_STRING */
diff --git a/libstdc++-v3/include/std/string_view b/libstdc++-v3/include/std/string_view
index 42822cc41ab..6a490a3e9c1 100644
--- a/libstdc++-v3/include/std/string_view
+++ b/libstdc++-v3/include/std/string_view
@@ -38,7 +38,9 @@ 
 #if __cplusplus >= 201703L
 
 #include <limits>
+#if _GLIBCXX_HOSTED
 #include <iosfwd>
+#endif // _GLIBCXX_HOSTED
 #include <bits/char_traits.h>
 #include <bits/functional_hash.h>
 #include <bits/range_access.h>
@@ -49,6 +51,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
 #define __cpp_lib_string_view 201603
 
+#if _GLIBCXX_HOSTED
   // Helper for basic_string and basic_string_view members.
   constexpr size_t
   __sv_check(size_t __size, size_t __pos, const char* __s)
@@ -68,6 +71,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
    return __testoff ? __off : __size - __pos;
   }
 
+#endif // _GLIBCXX_HOSTED
   /**
    *  @class basic_string_view <string_view>
    *  @brief  A non-owning reference to a string.
@@ -198,6 +202,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	return *(this->_M_str + __pos);
       }
 
+#if _GLIBCXX_HOSTED
       constexpr const_reference
       at(size_type __pos) const
       {
@@ -207,6 +212,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 				       "(which is %zu)"), __pos, this->size());
 	return *(this->_M_str + __pos);
       }
+#endif // _GLIBCXX_HOSTED
 
       constexpr const_reference
       front() const noexcept
@@ -252,6 +258,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       // [string.view.ops], string operations:
 
+#if _GLIBCXX_HOSTED
       size_type
       copy(_CharT* __str, size_type __n, size_type __pos = 0) const
       {
@@ -271,6 +278,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	const size_type __rlen = std::min(__n, _M_len - __pos);
 	return basic_string_view{_M_str + __pos, __rlen};
       }
+#endif // _GLIBCXX_HOSTED
 
       constexpr int
       compare(basic_string_view __str) const noexcept
@@ -282,6 +290,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	return __ret;
       }
 
+#if _GLIBCXX_HOSTED
       constexpr int
       compare(size_type __pos1, size_type __n1, basic_string_view __str) const
       { return this->substr(__pos1, __n1).compare(__str); }
@@ -292,11 +301,13 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       {
 	return this->substr(__pos1, __n1).compare(__str.substr(__pos2, __n2));
       }
+#endif // _GLIBCXX_HOSTED
 
       __attribute__((__nonnull__)) constexpr int
       compare(const _CharT* __str) const noexcept
       { return this->compare(basic_string_view{__str}); }
 
+#if _GLIBCXX_HOSTED
       __attribute__((__nonnull__)) constexpr int
       compare(size_type __pos1, size_type __n1, const _CharT* __str) const
       { return this->substr(__pos1, __n1).compare(basic_string_view{__str}); }
@@ -308,11 +319,14 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	return this->substr(__pos1, __n1)
 		   .compare(basic_string_view(__str, __n2));
       }
+#endif // _GLIBCXX_HOSTED
 
 #if __cplusplus > 201703L
+#if _GLIBCXX_HOSTED
       constexpr bool
       starts_with(basic_string_view __x) const noexcept
       { return this->substr(0, __x.size()) == __x; }
+#endif // _GLIBCXX_HOSTED
 
       constexpr bool
       starts_with(_CharT __x) const noexcept
@@ -322,12 +336,14 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       starts_with(const _CharT* __x) const noexcept
       { return this->starts_with(basic_string_view(__x)); }
 
+#if _GLIBCXX_HOSTED
       constexpr bool
       ends_with(basic_string_view __x) const noexcept
       {
 	return this->size() >= __x.size()
 	    && this->compare(this->size() - __x.size(), npos, __x) == 0;
       }
+#endif // _GLIBCXX_HOSTED
 
       constexpr bool
       ends_with(_CharT __x) const noexcept
diff --git a/libstdc++-v3/include/std/system_error b/libstdc++-v3/include/std/system_error
index b7891cbaa86..1d719c980b3 100644
--- a/libstdc++-v3/include/std/system_error
+++ b/libstdc++-v3/include/std/system_error
@@ -37,6 +37,7 @@ 
 
 #include <bits/c++config.h>
 #include <bits/error_constants.h>
+#if _GLIBCXX_HOSTED
 #include <iosfwd>
 #include <stdexcept>
 
@@ -421,4 +422,5 @@  _GLIBCXX_END_NAMESPACE_VERSION
 
 #endif // C++11
 
+#endif // _GLIBCXX_HOSTED
 #endif // _GLIBCXX_SYSTEM_ERROR