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 <filesystem> support into the shared library
This patch introduces support for <filesystem> into the shared library,
{'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'}
___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
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
--- /dev/null
+//===------------------- 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 <cxxabi.h>
+#include <cassert>
+
+// 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) {}
+}
// UNSUPPORTED: libcxxabi-no-exceptions
#include <cxxabi.h>
-#include <exception>
#include <cassert>
// 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) {}
}