Author: Louis Dionne Date: 2021-08-23T13:08:21-04:00 New Revision: ae5ed5d23bb19d44024a6f5fe581906c8506f060
URL: https://github.com/llvm/llvm-project/commit/ae5ed5d23bb19d44024a6f5fe581906c8506f060 DIFF: https://github.com/llvm/llvm-project/commit/ae5ed5d23bb19d44024a6f5fe581906c8506f060.diff LOG: [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 (cherry picked from commit f3bc0e51ab72f504445228cbb712542154ccb4cf) Added: Modified: libcxx/include/string libcxx/include/vector Removed: ################################################################################ diff --git a/libcxx/include/string b/libcxx/include/string index 4940021b0c68a..4159ea5803450 100644 --- a/libcxx/include/string +++ b/libcxx/include/string @@ -522,6 +522,7 @@ basic_string<char32_t> operator "" s( const char32_t *str, size_t len ); // C++1 #include <algorithm> #include <compare> #include <cstdio> // EOF +#include <cstdlib> #include <cstring> #include <cwchar> #include <initializer_list> @@ -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<true>::__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<true>::__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 9189ed44a80c7..90d8b946f135c 100644 --- a/libcxx/include/vector +++ b/libcxx/include/vector @@ -281,6 +281,7 @@ erase_if(vector<T, Allocator>& c, Predicate pred); // C++20 #include <algorithm> #include <climits> #include <compare> +#include <cstdlib> #include <cstring> #include <initializer_list> #include <iosfwd> // for forward declaration of vector @@ -390,6 +391,25 @@ protected: is_nothrow_move_assignable<allocator_type>::value) {__move_assign_alloc(__c, integral_constant<bool, __alloc_traits::propagate_on_container_move_assignment::value>());} + + _LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI + void __throw_length_error() const { +#ifndef _LIBCPP_NO_EXCEPTIONS + __vector_base_common<true>::__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<true>::__throw_out_of_range(); +#else + _VSTD::abort(); +#endif + } + private: _LIBCPP_INLINE_VISIBILITY void __copy_assign_alloc(const __vector_base& __c, true_type) _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits