Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/external/bsd/libc++/dist/libcxxrt Import libcxxrt 47661d00cd...
details: https://anonhg.NetBSD.org/src/rev/8b379f000fff
branches: trunk
changeset: 379372:8b379f000fff
user: joerg <joerg%NetBSD.org@localhost>
date: Sun May 30 00:08:19 2021 +0000
description:
Import libcxxrt 47661d00cd4d6cd728ae31b0bb29a49a6c06272a
The repository moved to https://github.com/libcxxrt/libcxxrt in the mean
time, but keep it on the same branch as before. This primarily brings
C++14 support.
diffstat:
external/bsd/libc++/dist/libcxxrt/src/memory.cc | 47 ++-
external/bsd/libc++/dist/libcxxrt/src/typeinfo.cc | 10 +-
external/bsd/libc++/dist/libcxxrt/src/unwind-arm.h | 12 +-
external/bsd/libc++/dist/libcxxrt/test/test.cc | 2 +
external/bsd/libc++/dist/libcxxrt/test/test.h | 1 +
external/bsd/libc++/dist/libcxxrt/test/test_demangle.cc | 46 +++
external/bsd/libc++/dist/libcxxrt/test/test_exception.cc | 139 +++++++++-
external/bsd/libc++/dist/libcxxrt/test/test_foreign_exceptions.cc | 125 ++++++++
8 files changed, 353 insertions(+), 29 deletions(-)
diffs (truncated from 537 to 300 lines):
diff -r a9f7fb18a522 -r 8b379f000fff external/bsd/libc++/dist/libcxxrt/src/memory.cc
--- a/external/bsd/libc++/dist/libcxxrt/src/memory.cc Sat May 29 23:46:14 2021 +0000
+++ b/external/bsd/libc++/dist/libcxxrt/src/memory.cc Sun May 30 00:08:19 2021 +0000
@@ -71,8 +71,17 @@ namespace std
}
+#if __cplusplus < 201103L
+#define NOEXCEPT throw()
+#define BADALLOC throw(std::bad_alloc)
+#else
+#define NOEXCEPT noexcept
+#define BADALLOC
+#endif
+
+
__attribute__((weak))
-void* operator new(size_t size)
+void* operator new(size_t size) BADALLOC
{
if (0 == size)
{
@@ -97,7 +106,7 @@ void* operator new(size_t size)
}
__attribute__((weak))
-void* operator new(size_t size, const std::nothrow_t &) throw()
+void* operator new(size_t size, const std::nothrow_t &) NOEXCEPT
{
try {
return :: operator new(size);
@@ -110,27 +119,21 @@ void* operator new(size_t size, const st
__attribute__((weak))
-void operator delete(void * ptr)
-#if __cplusplus < 201000L
-throw()
-#endif
+void operator delete(void * ptr) NOEXCEPT
{
free(ptr);
}
__attribute__((weak))
-void * operator new[](size_t size)
-#if __cplusplus < 201000L
-throw(std::bad_alloc)
-#endif
+void * operator new[](size_t size) BADALLOC
{
return ::operator new(size);
}
__attribute__((weak))
-void * operator new[](size_t size, const std::nothrow_t &) throw()
+void * operator new[](size_t size, const std::nothrow_t &) NOEXCEPT
{
try {
return ::operator new[](size);
@@ -143,12 +146,26 @@ void * operator new[](size_t size, const
__attribute__((weak))
-void operator delete[](void * ptr)
-#if __cplusplus < 201000L
-throw()
-#endif
+void operator delete[](void * ptr) NOEXCEPT
+{
+ ::operator delete(ptr);
+}
+
+// C++14 additional delete operators
+
+#if __cplusplus >= 201402L
+
+__attribute__((weak))
+void operator delete(void * ptr, size_t) NOEXCEPT
{
::operator delete(ptr);
}
+__attribute__((weak))
+void operator delete[](void * ptr, size_t) NOEXCEPT
+{
+ ::operator delete(ptr);
+}
+
+#endif
diff -r a9f7fb18a522 -r 8b379f000fff external/bsd/libc++/dist/libcxxrt/src/typeinfo.cc
--- a/external/bsd/libc++/dist/libcxxrt/src/typeinfo.cc Sat May 29 23:46:14 2021 +0000
+++ b/external/bsd/libc++/dist/libcxxrt/src/typeinfo.cc Sun May 30 00:08:19 2021 +0000
@@ -86,15 +86,7 @@ extern "C" char* __cxa_demangle(const ch
if (NULL != demangled)
{
size_t len = strlen(demangled);
- if (buf == NULL)
- {
- if (n)
- {
- *n = len;
- }
- return demangled;
- }
- if (*n < len+1)
+ if (!buf || (*n < len+1))
{
buf = static_cast<char*>(realloc(buf, len+1));
}
diff -r a9f7fb18a522 -r 8b379f000fff external/bsd/libc++/dist/libcxxrt/src/unwind-arm.h
--- a/external/bsd/libc++/dist/libcxxrt/src/unwind-arm.h Sat May 29 23:46:14 2021 +0000
+++ b/external/bsd/libc++/dist/libcxxrt/src/unwind-arm.h Sun May 30 00:08:19 2021 +0000
@@ -20,15 +20,19 @@
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
+/* For uint32_t and uint64_t */
+#include <stdint.h>
+
/**
* ARM-specific unwind definitions. These are taken from the ARM EHABI
* specification.
*/
typedef enum
{
+ _URC_NO_REASON = 0,
_URC_OK = 0, /* operation completed successfully */
_URC_FOREIGN_EXCEPTION_CAUGHT = 1,
- _URC_END_OF_STACK = 5,
+ _URC_END_OF_STACK = 5,
_URC_HANDLER_FOUND = 6,
_URC_INSTALL_CONTEXT = 7,
_URC_CONTINUE_UNWIND = 8,
@@ -41,10 +45,12 @@ typedef uint32_t _Unwind_State;
static const _Unwind_State _US_VIRTUAL_UNWIND_FRAME = 0;
static const _Unwind_State _US_UNWIND_FRAME_STARTING = 1;
static const _Unwind_State _US_UNWIND_FRAME_RESUME = 2;
+static const _Unwind_State _US_ACTION_MASK = 3;
#else // GCC fails at knowing what a constant expression is
# define _US_VIRTUAL_UNWIND_FRAME 0
# define _US_UNWIND_FRAME_STARTING 1
-# define _US_UNWIND_FRAME_RESUME 2
+# define _US_UNWIND_FRAME_RESUME 2
+# define _US_ACTION_MASK 3
#endif
typedef struct _Unwind_Context _Unwind_Context;
@@ -89,7 +95,7 @@ struct _Unwind_Exception
} pr_cache;
/** Force alignment of next item to 8-byte boundary */
long long int :0;
-};
+} __attribute__((__aligned__(8)));
/* Unwinding functions */
_Unwind_Reason_Code _Unwind_RaiseException(struct _Unwind_Exception *ucbp);
diff -r a9f7fb18a522 -r 8b379f000fff external/bsd/libc++/dist/libcxxrt/test/test.cc
--- a/external/bsd/libc++/dist/libcxxrt/test/test.cc Sat May 29 23:46:14 2021 +0000
+++ b/external/bsd/libc++/dist/libcxxrt/test/test.cc Sun May 30 00:08:19 2021 +0000
@@ -35,6 +35,7 @@ static void __attribute__((constructor))
void test_type_info(void);
void test_exceptions();
void test_guards(void);
+void test_demangle(void);
int main(int argc, char **argv)
{
int ch;
@@ -52,5 +53,6 @@ int main(int argc, char **argv)
test_type_info();
test_guards();
test_exceptions();
+ test_demangle();
return 0;
}
diff -r a9f7fb18a522 -r 8b379f000fff external/bsd/libc++/dist/libcxxrt/test/test.h
--- a/external/bsd/libc++/dist/libcxxrt/test/test.h Sat May 29 23:46:14 2021 +0000
+++ b/external/bsd/libc++/dist/libcxxrt/test/test.h Sun May 30 00:08:19 2021 +0000
@@ -2,3 +2,4 @@
void log_test(bool predicate, const char *file, int line, const char *message);
#define TEST(p, m) log_test(p, __FILE__, __LINE__, m)
+#define TEST_LOC(p, m, file, line) log_test(p, file, line, m)
diff -r a9f7fb18a522 -r 8b379f000fff external/bsd/libc++/dist/libcxxrt/test/test_demangle.cc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/external/bsd/libc++/dist/libcxxrt/test/test_demangle.cc Sun May 30 00:08:19 2021 +0000
@@ -0,0 +1,46 @@
+#include "test.h"
+#include <cxxabi.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <list>
+
+template <typename T> void test(const char* expected, int line) {
+ const char *mangled = typeid(T).name();
+ int status = 0;
+ using abi::__cxa_demangle;
+ char* demangled = __cxa_demangle(mangled, 0, 0, &status);
+ printf("mangled='%s' demangled='%s', status=%d\n", mangled, demangled,
+ status);
+ free(demangled);
+ TEST_LOC(status == 0, "should be able to demangle", __FILE__, line);
+ TEST_LOC(demangled != 0, "should be able to demangle", __FILE__, line);
+ if (!demangled) {
+ /* Don't dereference NULL in strcmp() */
+ return;
+ }
+ TEST_LOC(strcmp(expected, demangled) == 0, "should be able to demangle",
+ __FILE__, line);
+ TEST_LOC(strcmp(mangled, demangled) != 0, "should be able to demangle",
+ __FILE__, line);
+}
+
+
+namespace N {
+template<typename T, int U>
+class Templated {
+ virtual ~Templated() {};
+};
+}
+
+void test_demangle(void)
+{
+ using namespace N;
+ test<int>("int", __LINE__);
+ test<char[4]>("char [4]", __LINE__);
+ test<char[]>("char []", __LINE__);
+ test<Templated<Templated<long, 7>, 8> >(
+ "N::Templated<N::Templated<long, 7>, 8>", __LINE__);
+ test<Templated<void(long), -1> >(
+ "N::Templated<void (long), -1>", __LINE__);
+}
diff -r a9f7fb18a522 -r 8b379f000fff external/bsd/libc++/dist/libcxxrt/test/test_exception.cc
--- a/external/bsd/libc++/dist/libcxxrt/test/test_exception.cc Sat May 29 23:46:14 2021 +0000
+++ b/external/bsd/libc++/dist/libcxxrt/test/test_exception.cc Sun May 30 00:08:19 2021 +0000
@@ -1,4 +1,5 @@
#include "test.h"
+#include "unwind.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
@@ -7,12 +8,12 @@
#define fprintf(...)
-void log(void* ignored)
+void log_cleanup(void* ignored)
{
//printf("Cleanup called on %s\n", *(char**)ignored);
}
#define CLEANUP\
- __attribute__((cleanup(log))) __attribute__((unused))\
+ __attribute__((cleanup(log_cleanup))) __attribute__((unused))\
const char *f = __func__;
/**
@@ -191,6 +192,136 @@ static void throw_zero()
throw 0;
}
+struct uncaught_exception_checker
+{
+ uncaught_exception_checker(bool uncaught) : m_uncaught(uncaught) {}
+ ~uncaught_exception_checker() {
+ if (std::uncaught_exception())
+ TEST(m_uncaught, "At least one uncaught exception is in flight");
+ else
+ TEST(!m_uncaught, "No uncaught exceptions are in flight");
+ }
+ bool m_uncaught;
+};
+
+void test_rethrown_uncaught_exception()
+{
+ uncaught_exception_checker outer(false);
+ try
+ {
+ try
+ {
+ throw 42;
+ }
+ catch (int)
+ {
+ uncaught_exception_checker inner(true);
+ throw;
+ }
+ }
+ catch (...) {}
+}
+
+static void exception_cleanup(_Unwind_Reason_Code, struct _Unwind_Exception *ex)
+{
+ delete ex;
+}
+
+void test_rethrown_uncaught_foreign_exception()
Home |
Main Index |
Thread Index |
Old Index