Index: libcxx/trunk/lib/abi/CHANGELOG.TXT =================================================================== --- libcxx/trunk/lib/abi/CHANGELOG.TXT +++ libcxx/trunk/lib/abi/CHANGELOG.TXT @@ -16,6 +16,23 @@ Version 9.0 ----------- +* rXXXXX - Re-rexport missing symbols from libc++abi + + libc++ now re-exports `__cxa_throw_bad_array_new_length` and `__cxa_uncaught_exceptions`, + both of which are provided by libc++abi. This is not an ABI break because + we're just adding symbols. Also, this does mean that libc++ can't be linked + against an older version of libc++abi that doesn't provide those symbols, + however doing so is not supported anyway. + + x86_64-unknown-linux-gnu + ------------------------ + TODO + + x86_64-apple-apple-darwin + ------------------------- + Symbol added: ___cxa_throw_bad_array_new_length + Symbol added: ___cxa_uncaught_exceptions + * r356518 - Integrate support into the shared library This patch introduces support for into the shared library, Index: libcxx/trunk/lib/abi/x86_64-apple-darwin.v1.abilist =================================================================== --- libcxx/trunk/lib/abi/x86_64-apple-darwin.v1.abilist +++ libcxx/trunk/lib/abi/x86_64-apple-darwin.v1.abilist @@ -2321,7 +2321,10 @@ {'is_defined': False, 'name': '___cxa_rethrow_primary_exception', 'type': 'U'} {'is_defined': False, 'name': '___cxa_throw', 'type': 'U'} {'is_defined': True, 'name': '___cxa_throw', 'type': 'I'} +{'is_defined': False, 'name': '___cxa_throw_bad_array_new_length', 'type': 'U'} +{'is_defined': True, 'name': '___cxa_throw_bad_array_new_length', 'type': 'I'} {'is_defined': False, 'name': '___cxa_uncaught_exceptions', 'type': 'U'} +{'is_defined': True, 'name': '___cxa_uncaught_exceptions', 'type': 'I'} {'is_defined': False, 'name': '___cxa_vec_cctor', 'type': 'U'} {'is_defined': True, 'name': '___cxa_vec_cctor', 'type': 'I'} {'is_defined': False, 'name': '___cxa_vec_cleanup', 'type': 'U'} Index: libcxx/trunk/lib/libc++abi.v2.exp =================================================================== --- libcxx/trunk/lib/libc++abi.v2.exp +++ libcxx/trunk/lib/libc++abi.v2.exp @@ -15,6 +15,8 @@ ___cxa_deleted_virtual ___cxa_begin_catch ___cxa_throw +___cxa_throw_bad_array_new_length +___cxa_uncaught_exceptions ___cxa_vec_cctor ___cxa_vec_cleanup ___cxa_vec_ctor Index: libcxx/trunk/utils/libcxx/test/target_info.py =================================================================== --- libcxx/trunk/utils/libcxx/test/target_info.py +++ libcxx/trunk/utils/libcxx/test/target_info.py @@ -156,15 +156,6 @@ env['DYLD_LIBRARY_PATH'] = ':'.join(library_paths) def allow_cxxabi_link(self): - # FIXME: PR27405 - # libc++ *should* export all of the symbols found in libc++abi on OS X. - # For this reason LibcxxConfiguration will not link libc++abi in OS X. - # However __cxa_throw_bad_new_array_length doesn't get exported into - # libc++ yet so we still need to explicitly link libc++abi when testing - # libc++abi - # See PR22654. - if(self.full_config.get_lit_conf('name', '') == 'libc++abi'): - return True # Don't link libc++abi explicitly on OS X because the symbols # should be available in libc++ directly. return False Index: libcxxabi/trunk/test/uncaught_exception.pass.sh.cpp =================================================================== --- libcxxabi/trunk/test/uncaught_exception.pass.sh.cpp +++ libcxxabi/trunk/test/uncaught_exception.pass.sh.cpp @@ -0,0 +1,34 @@ +//===------------------- uncaught_exceptions.pass.cpp ---------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: libcxxabi-no-exceptions + +// This tests that libc++abi still provides __cxa_uncaught_exception() for +// ABI compatibility, even though the Standard doesn't require it to. +// +// We need to explicitly link against libc++abi, because libc++ does not +// re-export this symbol. + +// RUN: %build -lc++abi -o %t.exe +// RUN: %t.exe + +#include +#include + +// namespace __cxxabiv1 { +// extern bool __cxa_uncaught_exception () throw(); +// } + +struct A { + ~A() { assert( __cxxabiv1::__cxa_uncaught_exception()); } +}; + +int main () { + try { A a; throw 3; assert(false); } + catch (int) {} +} Index: libcxxabi/trunk/test/uncaught_exceptions.pass.cpp =================================================================== --- libcxxabi/trunk/test/uncaught_exceptions.pass.cpp +++ libcxxabi/trunk/test/uncaught_exceptions.pass.cpp @@ -9,29 +9,19 @@ // UNSUPPORTED: libcxxabi-no-exceptions #include -#include #include // namespace __cxxabiv1 { -// extern bool __cxa_uncaught_exception () throw(); -// extern unsigned int __cxa_uncaught_exceptions() throw(); +// extern unsigned int __cxa_uncaught_exceptions() throw(); // } struct A { - ~A() { assert( __cxxabiv1::__cxa_uncaught_exception()); } - }; - -struct B { - B(unsigned cnt) : data_(cnt) {} - ~B() { assert( data_ == __cxxabiv1::__cxa_uncaught_exceptions()); } + A(unsigned cnt) : data_(cnt) {} + ~A() { assert( data_ == __cxxabiv1::__cxa_uncaught_exceptions()); } unsigned data_; - }; +}; -int main () -{ - try { A a; throw 3; assert (false); } - catch (int) {} - - try { B b(1); throw 3; assert (false); } +int main () { + try { A a(1); throw 3; assert(false); } catch (int) {} }