From f3bc0e51ab72f504445228cbb712542154ccb4cf Mon Sep 17 00:00:00 2001 From: Louis Dionne Date: Thu, 19 Aug 2021 12:39:16 -0400 Subject: [PATCH] [libc++] Bypass calling exception-throwing functions in the dylib with -fno-exceptions basic_string and vector currently have a hard dependency on the compiled library because they need to call __vector_base_common::__throw_xxx(), which are externally instantiated in the compiled library. That makes sense when exceptions are enabled (because we're trying to localize the exception-throwing code to the compiled library), but it doesn't really make sense when exceptions are disabled, and the __throw_xxx functions are just calling abort() anyways. This patch simply overrides the __throw_xxx() functions so that they don't rely on the compiled library when exceptions are disabled. Differential Revision: https://reviews.llvm.org/D108389 --- libcxx/include/string | 19 +++++++++++++++++++ libcxx/include/vector | 20 ++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/libcxx/include/string b/libcxx/include/string index 01b79d8..543234e 100644 --- a/libcxx/include/string +++ b/libcxx/include/string @@ -522,6 +522,7 @@ basic_string operator "" s( const char32_t *str, size_t len ); // C++1 #include #include #include // EOF +#include #include #include #include @@ -1714,6 +1715,24 @@ private: return data() <= __p && __p <= data() + size(); } + _LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI + void __throw_length_error() const { +#ifndef _LIBCPP_NO_EXCEPTIONS + __basic_string_common::__throw_length_error(); +#else + _VSTD::abort(); +#endif + } + + _LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI + void __throw_out_of_range() const { +#ifndef _LIBCPP_NO_EXCEPTIONS + __basic_string_common::__throw_out_of_range(); +#else + _VSTD::abort(); +#endif + } + friend basic_string operator+<>(const basic_string&, const basic_string&); friend basic_string operator+<>(const value_type*, const basic_string&); friend basic_string operator+<>(value_type, const basic_string&); diff --git a/libcxx/include/vector b/libcxx/include/vector index 3afaddc..fac1f95 100644 --- a/libcxx/include/vector +++ b/libcxx/include/vector @@ -281,6 +281,7 @@ erase_if(vector& c, Predicate pred); // C++20 #include #include #include +#include #include #include #include // for forward declaration of vector @@ -390,6 +391,25 @@ protected: is_nothrow_move_assignable::value) {__move_assign_alloc(__c, integral_constant());} + + _LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI + void __throw_length_error() const { +#ifndef _LIBCPP_NO_EXCEPTIONS + __vector_base_common::__throw_length_error(); +#else + _VSTD::abort(); +#endif + } + + _LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI + void __throw_out_of_range() const { +#ifndef _LIBCPP_NO_EXCEPTIONS + __vector_base_common::__throw_out_of_range(); +#else + _VSTD::abort(); +#endif + } + private: _LIBCPP_INLINE_VISIBILITY void __copy_assign_alloc(const __vector_base& __c, true_type) -- 2.7.4