<pre style='margin:0'>
Perry E. Metzger (pmetzger) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/bf7cacc6ba7165683712dad885f2cf51963ce11b">https://github.com/macports/macports-ports/commit/bf7cacc6ba7165683712dad885f2cf51963ce11b</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new bf7cacc6ba7 libcxx-powerpc: add emutls support, install into libexec
</span>bf7cacc6ba7 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit bf7cacc6ba7165683712dad885f2cf51963ce11b
</span>Author: barracuda156 <vital.had@gmail.com>
AuthorDate: Sun Dec 31 04:53:45 2023 +0800

<span style='display:block; white-space:pre;color:#404040;'>    libcxx-powerpc: add emutls support, install into libexec
</span>---
 lang/libcxx-powerpc/Portfile                       |   44 +-
 .../files/0014-libcxxabi-support-emutls.patch      | 1007 ++++++++++++++++++++
 ...omic-using-mutex-lock_guard-for-64b-ops-.patch} |    4 +-
 3 files changed, 1041 insertions(+), 14 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/libcxx-powerpc/Portfile b/lang/libcxx-powerpc/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 96b6e79320c..4919d22761a 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/libcxx-powerpc/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/libcxx-powerpc/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -12,10 +12,17 @@ name                        libcxx-powerpc
</span> # Based on: https://github.com/iains/LLVM-7-branch
 # with additional modifications.
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# TODO: implement emutls support and optional installation into system prefix.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# TODO: implement optional installation into system prefix.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# FIXME: get rid of dependency on system libs:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# https://trac.macports.org/ticket/69000
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# FIXME: presently gcc13 will not work with libc++, use gcc12:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# https://trac.macports.org/ticket/68592
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# https://github.com/iains/gcc-13-branch/issues/12
</span> 
 version                     7.1.1
<span style='display:block; white-space:pre;background:#ffe0e0;'>-revision                    0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+revision                    1
</span> 
 categories                  lang devel
 maintainers                 {@barracuda156 gmail.com:vital.had} {@catap korins.ky:kirill} openmaintainer
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -102,10 +109,6 @@ patchfiles-append           0011-libcxx-libcxxabi-minor-fix-to-linking.patch
</span> # https://github.com/catap/llvm-project
 patchfiles-append           0012-disable-Apple-libc-Availability-tests.patch \
                             0013-Fix-missing-long-long-math-prototypes-when-using-the.patch
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# The following patch is supposed to implement 8-byte atomics without libatomic;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# unfortunately, it fails to build as is.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# TODO: fix it to avoid a dependency on libatomic.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# patchfiles-append           0014-implement-atomic-using-mutex-lock_guard-for-64b-ops-.patch
</span> 
 # sterilize MacPorts build environment; we want nothing picked up from MP prefix
 compiler.cpath
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -137,7 +140,7 @@ cmake.build_type            Release
</span> cmake.generator             {Unix Makefiles}
 
 # As long as the port is explicitly for PowerPC and in single version, we can install into the prefix:
<span style='display:block; white-space:pre;background:#ffe0e0;'>-cmake.install_prefix        ${prefix}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+cmake.install_prefix        ${prefix}/libexec/llvm-${version}
</span> cmake.install_rpath
 
 configure.pre_args-replace  {*}[cmake::system_prefix_path] \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -213,6 +216,20 @@ configure.ldflags-append    -L/${cmake.build_dir}/lib
</span> # prevent it from linking against gcc's libstdc++.6.dylib and libgcc_s.1.1.dylib
 # configure.ldflags-append    -static-libstdc++ -static-libgcc
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+variant emutls description "Enable emulated TLS" {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # libcxxabi emutls support
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    patchfiles-append       0014-libcxxabi-support-emutls.patch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    configure.args-append   -DLIBCXXABI_ENABLE_THREADS=ON
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant lock_guard description "8-byte atomics via mutex lock_guard" {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # The following patch is supposed to implement 8-byte atomics without libatomic;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # unfortunately, it fails to build as is.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # https://github.com/fangism/libcxx/issues/1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    patchfiles-append       0015-implement-atomic-using-mutex-lock_guard-for-64b-ops-.patch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> # Universal variant code is borrowed from clang-11-bootstrap port.
 if {[variant_exists universal] && [variant_isset universal]} {
     foreach arch ${universal_archs_supported} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -227,21 +244,24 @@ if {[variant_exists universal] && [variant_isset universal]} {
</span>                             yes
 }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+default_variants-append     +emutls
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> post-destroot {
     system "ditto ${llvmdir}/libcxx/include ${destroot}${cmake.install_prefix}/include/c++/v1"
     system "ditto ${llvmdir}/libcxxabi/include ${destroot}${cmake.install_prefix}/include"
 
     # rpath does not work, we need absolute paths here:
     foreach dylib {libc++.1.dylib libc++abi.1.dylib} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        system "install_name_tool -id ${prefix}/lib/${dylib} ${destroot}${cmake.install_prefix}/lib/${dylib}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        system "install_name_tool -change @rpath/libc++.1.dylib ${prefix}/lib/libc++.1.dylib ${destroot}${cmake.install_prefix}/lib/${dylib}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        system "install_name_tool -change @rpath/libc++abi.1.dylib ${prefix}/lib/libc++abi.1.dylib ${destroot}${cmake.install_prefix}/lib/${dylib}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        system "install_name_tool -id ${cmake.install_prefix}/lib/${dylib} ${destroot}${cmake.install_prefix}/lib/${dylib}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        system "install_name_tool -change @rpath/libc++.1.dylib ${cmake.install_prefix}/lib/libc++.1.dylib ${destroot}${cmake.install_prefix}/lib/${dylib}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        system "install_name_tool -change @rpath/libc++abi.1.dylib ${cmake.install_prefix}/lib/libc++abi.1.dylib ${destroot}${cmake.install_prefix}/lib/${dylib}"
</span>     }
 }
 
 notes "
<span style='display:block; white-space:pre;background:#ffe0e0;'>-The libraries have been installed into ${prefix}/lib. To use libc++ with Macports’s gcc compilers,\
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-those have to be built with +stdlib_flag variant enabled and includes’ path set to ${prefix}/include/c++/v1.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+The libraries have been installed into ${cmake.install_prefix}/lib. To use libc++ with Macports’s gcc compilers,\
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+those have to be built with +stdlib_flag variant enabled and includes’ path set to ${cmake.install_prefix}/include/c++/v1.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Unless the libs are moved into ${prefix}/lib or /usr/lib, ldflags should be set accordingly.
</span> "
 
 livecheck.type              none
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/libcxx-powerpc/files/0014-libcxxabi-support-emutls.patch b/lang/libcxx-powerpc/files/0014-libcxxabi-support-emutls.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..392ce9711f9
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/libcxx-powerpc/files/0014-libcxxabi-support-emutls.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,1007 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 9bd463209e6877d6f94c780aa0af73c149784c8b Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: barracuda156 <vital.had@gmail.com>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Sun, 31 Dec 2023 00:32:27 +0800
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] libcxxabi: support emutls
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ libcxxabi/include/cxxabi.h          |   2 -
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ libcxxabi/include/int_endianness.h  | 116 ++++++++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ libcxxabi/include/int_lib.h         | 134 ++++++++++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ libcxxabi/include/int_types.h       | 163 ++++++++++++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ libcxxabi/include/int_util.h        |  33 +++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ libcxxabi/src/CMakeLists.txt        |  13 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ libcxxabi/src/cxa_thread_atexit.cpp |  19 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ libcxxabi/src/emutls.c              | 394 ++++++++++++++++++++++++++++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 8 files changed, 851 insertions(+), 23 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ create mode 100644 libcxxabi/include/int_endianness.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ create mode 100644 libcxxabi/include/int_lib.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ create mode 100644 libcxxabi/include/int_types.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ create mode 100644 libcxxabi/include/int_util.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ create mode 100644 libcxxabi/src/emutls.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/libcxxabi/include/cxxabi.h b/libcxxabi/include/cxxabi.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 2596560d6e9..68af82ff9a4 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/libcxxabi/include/cxxabi.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/libcxxabi/include/cxxabi.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -160,12 +160,10 @@ __cxa_decrement_exception_refcount(void *primary_exception) throw();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern _LIBCXXABI_FUNC_VIS bool __cxa_uncaught_exception() throw();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern _LIBCXXABI_FUNC_VIS unsigned int __cxa_uncaught_exceptions() throw();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#ifdef __linux__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Linux TLS support. Not yet an official part of the Itanium ABI.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // https://sourceware.org/glibc/wiki/Destructor%20support%20for%20thread_local%20variables
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern _LIBCXXABI_FUNC_VIS int __cxa_thread_atexit(void (*)(void *), void *,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                    void *) throw();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } // extern "C"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } // namespace __cxxabiv1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/libcxxabi/include/int_endianness.h b/libcxxabi/include/int_endianness.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+new file mode 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 00000000000..e2586c56bac
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/libcxxabi/include/int_endianness.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,116 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* ===-- int_endianness.h - configuration header for compiler-rt ------------===
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *                       The LLVM Compiler Infrastructure
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This file is dual licensed under the MIT and the University of Illinois Open
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Source Licenses. See LICENSE.TXT for details.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ===----------------------------------------------------------------------===
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This file is a configuration header for compiler-rt.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This file is not part of the interface of this library.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ===----------------------------------------------------------------------===
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef INT_ENDIANNESS_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define INT_ENDIANNESS_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    defined(__ORDER_LITTLE_ENDIAN__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* Clang and GCC provide built-in endianness definitions. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define _YUGA_LITTLE_ENDIAN 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define _YUGA_BIG_ENDIAN    1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define _YUGA_LITTLE_ENDIAN 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define _YUGA_BIG_ENDIAN    0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* __BYTE_ORDER__ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else /* Compilers other than Clang or GCC. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__SVR4) && defined(__sun)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <sys/byteorder.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(_BIG_ENDIAN)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define _YUGA_LITTLE_ENDIAN 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define _YUGA_BIG_ENDIAN    1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif defined(_LITTLE_ENDIAN)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define _YUGA_LITTLE_ENDIAN 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define _YUGA_BIG_ENDIAN    0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else /* !_LITTLE_ENDIAN */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#error "unknown endianness"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* !_LITTLE_ENDIAN */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* Solaris and AuroraUX. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* .. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) ||   \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    defined(__minix)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <sys/endian.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if _BYTE_ORDER == _BIG_ENDIAN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define _YUGA_LITTLE_ENDIAN 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define _YUGA_BIG_ENDIAN    1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif _BYTE_ORDER == _LITTLE_ENDIAN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define _YUGA_LITTLE_ENDIAN 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define _YUGA_BIG_ENDIAN    0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* _BYTE_ORDER */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* *BSD */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__OpenBSD__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <machine/endian.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if _BYTE_ORDER == _BIG_ENDIAN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define _YUGA_LITTLE_ENDIAN 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define _YUGA_BIG_ENDIAN    1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif _BYTE_ORDER == _LITTLE_ENDIAN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define _YUGA_LITTLE_ENDIAN 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define _YUGA_BIG_ENDIAN    0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* _BYTE_ORDER */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* OpenBSD */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* .. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* Mac OSX has __BIG_ENDIAN__ or __LITTLE_ENDIAN__ automatically set by the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * compiler (at least with GCC) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__APPLE__) || defined(__ellcc__ )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef __BIG_ENDIAN__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if __BIG_ENDIAN__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define _YUGA_LITTLE_ENDIAN 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define _YUGA_BIG_ENDIAN    1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* __BIG_ENDIAN__ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef __LITTLE_ENDIAN__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if __LITTLE_ENDIAN__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define _YUGA_LITTLE_ENDIAN 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define _YUGA_BIG_ENDIAN    0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* __LITTLE_ENDIAN__ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* Mac OSX */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* .. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(_WIN32)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define _YUGA_LITTLE_ENDIAN 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define _YUGA_BIG_ENDIAN    0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* Windows */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* Clang or GCC. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* . */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if !defined(_YUGA_LITTLE_ENDIAN) || !defined(_YUGA_BIG_ENDIAN)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#error Unable to determine endian
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* Check we found an endianness correctly. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* INT_ENDIANNESS_H */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/libcxxabi/include/int_lib.h b/libcxxabi/include/int_lib.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+new file mode 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 00000000000..9d09e2dc915
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/libcxxabi/include/int_lib.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,134 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* ===-- int_lib.h - configuration header for compiler-rt  -----------------===
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *                     The LLVM Compiler Infrastructure
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This file is dual licensed under the MIT and the University of Illinois Open
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Source Licenses. See LICENSE.TXT for details.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ===----------------------------------------------------------------------===
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This file is a configuration header for compiler-rt.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This file is not part of the interface of this library.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ===----------------------------------------------------------------------===
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef INT_LIB_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define INT_LIB_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* Assumption: Signed integral is 2's complement. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* Assumption: Right shift of signed negative is arithmetic shift. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* Assumption: Endianness is little or big (not mixed). */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__ELF__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define FNALIAS(alias_name, original_name) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  void alias_name() __attribute__((__alias__(#original_name)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define COMPILER_RT_ALIAS(aliasee) __attribute__((__alias__(#aliasee)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define FNALIAS(alias, name) _Pragma("GCC error(\"alias unsupported on this file format\")")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define COMPILER_RT_ALIAS(aliasee) _Pragma("GCC error(\"alias unsupported on this file format\")")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* ABI macro definitions */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if __ARM_EABI__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# ifdef COMPILER_RT_ARMHF_TARGET
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#   define COMPILER_RT_ABI
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#   define COMPILER_RT_ABI __attribute__((__pcs__("aapcs")))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# define COMPILER_RT_ABI
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define AEABI_RTABI __attribute__((__pcs__("aapcs")))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef _MSC_VER
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define ALWAYS_INLINE __forceinline
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define NOINLINE __declspec(noinline)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define NORETURN __declspec(noreturn)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define UNUSED
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define ALWAYS_INLINE __attribute__((always_inline))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define NOINLINE __attribute__((noinline))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define NORETURN __attribute__((noreturn))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define UNUSED __attribute__((unused))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__NetBSD__) && (defined(_KERNEL) || defined(_STANDALONE))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Kernel and boot environment can't use normal headers,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * so use the equivalent system headers.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  include <machine/limits.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  include <sys/stdint.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  include <sys/types.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* Include the standard compiler builtin headers we use functionality from. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  include <limits.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  include <stdint.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  include <stdbool.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  include <float.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* Include the commonly used internal type definitions. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "int_types.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* Include internal utility function declarations. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "int_util.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++COMPILER_RT_ABI si_int __paritysi2(si_int a);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++COMPILER_RT_ABI si_int __paritydi2(di_int a);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++COMPILER_RT_ABI di_int __divdi3(di_int a, di_int b);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++COMPILER_RT_ABI si_int __divsi3(si_int a, si_int b);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++COMPILER_RT_ABI su_int __udivsi3(su_int n, su_int d);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++COMPILER_RT_ABI su_int __udivmodsi4(su_int a, su_int b, su_int* rem);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++COMPILER_RT_ABI du_int __udivmoddi4(du_int a, du_int b, du_int* rem);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef CRT_HAS_128BIT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++COMPILER_RT_ABI si_int __clzti2(ti_int a);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++COMPILER_RT_ABI tu_int __udivmodti4(tu_int a, tu_int b, tu_int* rem);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* Definitions for builtins unavailable on MSVC */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(_MSC_VER) && !defined(__clang__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <intrin.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++uint32_t __inline __builtin_ctz(uint32_t value) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  unsigned long trailing_zero = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (_BitScanForward(&trailing_zero, value))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return trailing_zero;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return 32;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++uint32_t __inline __builtin_clz(uint32_t value) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  unsigned long leading_zero = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (_BitScanReverse(&leading_zero, value))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return 31 - leading_zero;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return 32;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(_M_ARM) || defined(_M_X64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++uint32_t __inline __builtin_clzll(uint64_t value) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  unsigned long leading_zero = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (_BitScanReverse64(&leading_zero, value))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return 63 - leading_zero;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return 64;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++uint32_t __inline __builtin_clzll(uint64_t value) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (value == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return 64;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  uint32_t msh = (uint32_t)(value >> 32);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  uint32_t lsh = (uint32_t)(value & 0xFFFFFFFF);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (msh != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return __builtin_clz(msh);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return 32 + __builtin_clz(lsh);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define __builtin_clzl __builtin_clzll
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* defined(_MSC_VER) && !defined(__clang__) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* INT_LIB_H */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/libcxxabi/include/int_types.h b/libcxxabi/include/int_types.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+new file mode 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 00000000000..766fc944ec3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/libcxxabi/include/int_types.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,163 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* ===-- int_lib.h - configuration header for compiler-rt  -----------------===
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *                     The LLVM Compiler Infrastructure
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This file is dual licensed under the MIT and the University of Illinois Open
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Source Licenses. See LICENSE.TXT for details.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ===----------------------------------------------------------------------===
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This file is not part of the interface of this library.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This file defines various standard types, most importantly a number of unions
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * used to access parts of larger types.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ===----------------------------------------------------------------------===
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef INT_TYPES_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define INT_TYPES_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "int_endianness.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* si_int is defined in Linux sysroot's asm-generic/siginfo.h */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef si_int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#undef si_int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef      int si_int;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef unsigned su_int;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef          long long di_int;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef unsigned long long du_int;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef union
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    di_int all;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    struct
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if _YUGA_LITTLE_ENDIAN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        su_int low;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        si_int high;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        si_int high;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        su_int low;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* _YUGA_LITTLE_ENDIAN */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }s;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++} dwords;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef union
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    du_int all;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    struct
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if _YUGA_LITTLE_ENDIAN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        su_int low;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        su_int high;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        su_int high;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        su_int low;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* _YUGA_LITTLE_ENDIAN */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }s;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++} udwords;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if (defined(__LP64__) || defined(__wasm__) || defined(__mips64)) || defined(__riscv)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define CRT_HAS_128BIT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef CRT_HAS_128BIT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef int      ti_int __attribute__ ((mode (TI)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef unsigned tu_int __attribute__ ((mode (TI)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef union
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    ti_int all;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    struct
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if _YUGA_LITTLE_ENDIAN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        du_int low;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        di_int high;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        di_int high;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        du_int low;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* _YUGA_LITTLE_ENDIAN */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }s;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++} twords;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef union
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    tu_int all;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    struct
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if _YUGA_LITTLE_ENDIAN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        du_int low;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        du_int high;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        du_int high;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        du_int low;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* _YUGA_LITTLE_ENDIAN */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }s;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++} utwords;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static __inline ti_int make_ti(di_int h, di_int l) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    twords r;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    r.s.high = h;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    r.s.low = l;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return r.all;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static __inline tu_int make_tu(du_int h, du_int l) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    utwords r;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    r.s.high = h;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    r.s.low = l;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return r.all;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* CRT_HAS_128BIT */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef union
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    su_int u;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    float f;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++} float_bits;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef union
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    udwords u;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    double  f;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++} double_bits;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef struct
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if _YUGA_LITTLE_ENDIAN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    udwords low;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    udwords high;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    udwords high;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    udwords low;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* _YUGA_LITTLE_ENDIAN */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++} uqwords;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef union
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    uqwords     u;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    long double f;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++} long_double_bits;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if __STDC_VERSION__ >= 199901L
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef float _Complex Fcomplex;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef double _Complex Dcomplex;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef long double _Complex Lcomplex;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define COMPLEX_REAL(x) __real__(x)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define COMPLEX_IMAGINARY(x) __imag__(x)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef struct { float real, imaginary; } Fcomplex;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef struct { double real, imaginary; } Dcomplex;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef struct { long double real, imaginary; } Lcomplex;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define COMPLEX_REAL(x) (x).real
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define COMPLEX_IMAGINARY(x) (x).imaginary
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* INT_TYPES_H */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/libcxxabi/include/int_util.h b/libcxxabi/include/int_util.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+new file mode 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 00000000000..a7b20ed6624
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/libcxxabi/include/int_util.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,33 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* ===-- int_util.h - internal utility functions ----------------------------===
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *                     The LLVM Compiler Infrastructure
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This file is dual licensed under the MIT and the University of Illinois Open
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Source Licenses. See LICENSE.TXT for details.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ===-----------------------------------------------------------------------===
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This file is not part of the interface of this library.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This file defines non-inline utilities which are available for use in the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * library. The function definitions themselves are all contained in int_util.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * which will always be compiled into any compiler-rt library.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ===-----------------------------------------------------------------------===
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef INT_UTIL_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define INT_UTIL_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/** \brief Trigger a program abort (or panic for kernel code). */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define compilerrt_abort() compilerrt_abort_impl(__FILE__, __LINE__, __func__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++NORETURN void compilerrt_abort_impl(const char *file, int line,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                    const char *function);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define COMPILE_TIME_ASSERT(expr) COMPILE_TIME_ASSERT1(expr, __COUNTER__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define COMPILE_TIME_ASSERT1(expr, cnt) COMPILE_TIME_ASSERT2(expr, cnt)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define COMPILE_TIME_ASSERT2(expr, cnt)                                        \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  typedef char ct_assert_##cnt[(expr) ? 1 : -1] UNUSED
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* INT_UTIL_H */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/libcxxabi/src/CMakeLists.txt b/libcxxabi/src/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index fce0b7e1ba5..1f18f46db80 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/libcxxabi/src/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/libcxxabi/src/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -18,6 +18,8 @@ set(LIBCXXABI_SOURCES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   abort_message.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   fallback_malloc.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   private_typeinfo.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  # Emutls support
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  emutls.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -31,7 +33,7 @@ else()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   list(APPEND LIBCXXABI_SOURCES cxa_noexception.cpp)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ endif()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-if (LIBCXXABI_ENABLE_THREADS AND UNIX AND NOT (APPLE OR CYGWIN))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++if (LIBCXXABI_ENABLE_THREADS AND UNIX AND NOT CYGWIN)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   list(APPEND LIBCXXABI_SOURCES cxa_thread_atexit.cpp)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ endif()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -93,7 +95,8 @@ if ( APPLE )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     list(APPEND LIBCXXABI_SHARED_LINK_FLAGS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "-compatibility_version 1"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "-current_version 1"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      "-install_name @rpath/libc++abi.1.dylib")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      "-install_name @rpath/libc++abi.1.dylib"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      "-Wl,-undefined,dynamic_lookup")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     list(APPEND LIBCXXABI_LINK_FLAGS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         "/usr/lib/libgcc_s.10.5.dylib"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         "/usr/lib/libSystem.B.dylib")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -102,14 +105,16 @@ if ( APPLE )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     list(APPEND LIBCXXABI_SHARED_LINK_FLAGS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "-compatibility_version 1"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "-current_version 1"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      "-install_name @rpath/libc++abi.1.dylib")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      "-install_name @rpath/libc++abi.1.dylib"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      "-Wl,-undefined,dynamic_lookup")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     list(APPEND LIBCXXABI_LINK_FLAGS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         "/usr/lib/libgcc_s.10.5.dylib"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         "/usr/lib/libSystem.B.dylib")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     list(APPEND LIBCXXABI_SHARED_LINK_FLAGS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "-compatibility_version 1"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      "-install_name @rpath/libc++abi.1.dylib")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      "-install_name @rpath/libc++abi.1.dylib"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      "-Wl,-undefined,dynamic_lookup")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   endif()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ endif()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/libcxxabi/src/cxa_thread_atexit.cpp b/libcxxabi/src/cxa_thread_atexit.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 49d15d6b145..e0e3d1a1886 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/libcxxabi/src/cxa_thread_atexit.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/libcxxabi/src/cxa_thread_atexit.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -17,14 +17,6 @@ namespace __cxxabiv1 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   using Dtor = void(*)(void*);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   extern "C"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#ifndef HAVE___CXA_THREAD_ATEXIT_IMPL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  // A weak symbol is used to detect this function's presence in the C library
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  // at runtime, even if libc++ is built against an older libc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  _LIBCXXABI_WEAK
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  int __cxa_thread_atexit_impl(Dtor, void*, void*);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#ifndef HAVE___CXA_THREAD_ATEXIT_IMPL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ namespace {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // This implementation is used if the C library does not provide
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -99,17 +91,11 @@ namespace {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } // namespace
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#endif // HAVE___CXA_THREAD_ATEXIT_IMPL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern "C" {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   _LIBCXXABI_FUNC_VIS int __cxa_thread_atexit(Dtor dtor, void* obj, void* dso_symbol) throw() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#ifdef HAVE___CXA_THREAD_ATEXIT_IMPL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    return __cxa_thread_atexit_impl(dtor, obj, dso_symbol);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (__cxa_thread_atexit_impl) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      return __cxa_thread_atexit_impl(dtor, obj, dso_symbol);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // Initialize the dtors std::__libcpp_tls_key (uses __cxa_guard_*() for
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // one-time initialization and __cxa_atexit() for destruction)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       static DtorsManager manager;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -133,7 +119,6 @@ extern "C" {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#endif // HAVE___CXA_THREAD_ATEXIT_IMPL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } // extern "C"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/libcxxabi/src/emutls.c b/libcxxabi/src/emutls.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+new file mode 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 00000000000..0907edc9c6a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/libcxxabi/src/emutls.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,394 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* ===---------- emutls.c - Implements __emutls_get_address ---------------===
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *                     The LLVM Compiler Infrastructure
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This file is dual licensed under the MIT and the University of Illinois Open
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Source Licenses. See LICENSE.TXT for details.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ===----------------------------------------------------------------------===
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <stdint.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "int_lib.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "int_util.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef __BIONIC__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* There are 4 pthread key cleanup rounds on Bionic. Delay emutls deallocation
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++   to round 2. We need to delay deallocation because:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    - Android versions older than M lack __cxa_thread_atexit_impl, so apps
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      use a pthread key destructor to call C++ destructors.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    - Apps might use __thread/thread_local variables in pthread destructors.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++   We can't wait until the final two rounds, because jemalloc needs two rounds
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++   after the final malloc/free call to free its thread-specific data (see
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++   https://reviews.llvm.org/D46978#1107507). */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define EMUTLS_SKIP_DESTRUCTOR_ROUNDS 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define EMUTLS_SKIP_DESTRUCTOR_ROUNDS 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef struct emutls_address_array {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    uintptr_t skip_destructor_rounds;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    uintptr_t size;  /* number of elements in the 'data' array */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    void* data[];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++} emutls_address_array;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void emutls_shutdown(emutls_address_array *array);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef _WIN32
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <pthread.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static pthread_mutex_t emutls_mutex = PTHREAD_MUTEX_INITIALIZER;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static pthread_key_t emutls_pthread_key;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef unsigned int gcc_word __attribute__((mode(word)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef unsigned int gcc_pointer __attribute__((mode(pointer)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* Default is not to use posix_memalign, so systems like Android
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * can use thread local data without heavier POSIX memory allocators.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef EMUTLS_USE_POSIX_MEMALIGN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define EMUTLS_USE_POSIX_MEMALIGN 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static __inline void *emutls_memalign_alloc(size_t align, size_t size) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    void *base;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if EMUTLS_USE_POSIX_MEMALIGN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (posix_memalign(&base, align, size) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        abort();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    #define EXTRA_ALIGN_PTR_BYTES (align - 1 + sizeof(void*))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    char* object;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if ((object = (char*)malloc(EXTRA_ALIGN_PTR_BYTES + size)) == NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        abort();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    base = (void*)(((uintptr_t)(object + EXTRA_ALIGN_PTR_BYTES))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    & ~(uintptr_t)(align - 1));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    ((void**)base)[-1] = object;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return base;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static __inline void emutls_memalign_free(void *base) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if EMUTLS_USE_POSIX_MEMALIGN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    free(base);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* The mallocated address is in ((void**)base)[-1] */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    free(((void**)base)[-1]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static __inline void emutls_setspecific(emutls_address_array *value) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    pthread_setspecific(emutls_pthread_key, (void*) value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static __inline emutls_address_array* emutls_getspecific() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return (emutls_address_array*) pthread_getspecific(emutls_pthread_key);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void emutls_key_destructor(void* ptr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    emutls_address_array *array = (emutls_address_array*)ptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (array->skip_destructor_rounds > 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* emutls is deallocated using a pthread key destructor. These
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         * destructors are called in several rounds to accommodate destructor
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         * functions that (re)initialize key values with pthread_setspecific.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         * Delay the emutls deallocation to accommodate other end-of-thread
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         * cleanup tasks like calling thread_local destructors (e.g. the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         * __cxa_thread_atexit fallback in libc++abi).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        array->skip_destructor_rounds--;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        emutls_setspecific(array);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        emutls_shutdown(array);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        free(ptr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static __inline void emutls_init(void) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (pthread_key_create(&emutls_pthread_key, emutls_key_destructor) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        abort();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static __inline void emutls_init_once(void) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    static pthread_once_t once = PTHREAD_ONCE_INIT;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    pthread_once(&once, emutls_init);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static __inline void emutls_lock() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    pthread_mutex_lock(&emutls_mutex);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static __inline void emutls_unlock() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    pthread_mutex_unlock(&emutls_mutex);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else /* _WIN32 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <windows.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <malloc.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <stdio.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <assert.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static LPCRITICAL_SECTION emutls_mutex;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static DWORD emutls_tls_index = TLS_OUT_OF_INDEXES;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef uintptr_t gcc_word;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef void * gcc_pointer;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void win_error(DWORD last_err, const char *hint) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    char *buffer = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER |
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                       FORMAT_MESSAGE_FROM_SYSTEM |
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                       FORMAT_MESSAGE_MAX_WIDTH_MASK,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                       NULL, last_err, 0, (LPSTR)&buffer, 1, NULL)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        fprintf(stderr, "Windows error: %s\n", buffer);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        fprintf(stderr, "Unkown Windows error: %s\n", hint);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    LocalFree(buffer);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static __inline void win_abort(DWORD last_err, const char *hint) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    win_error(last_err, hint);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    abort();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static __inline void *emutls_memalign_alloc(size_t align, size_t size) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    void *base = _aligned_malloc(size, align);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (!base)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        win_abort(GetLastError(), "_aligned_malloc");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return base;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static __inline void emutls_memalign_free(void *base) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    _aligned_free(base);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void emutls_exit(void) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (emutls_mutex) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        DeleteCriticalSection(emutls_mutex);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        _aligned_free(emutls_mutex);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        emutls_mutex = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (emutls_tls_index != TLS_OUT_OF_INDEXES) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        emutls_shutdown((emutls_address_array*)TlsGetValue(emutls_tls_index));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        TlsFree(emutls_tls_index);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        emutls_tls_index = TLS_OUT_OF_INDEXES;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#pragma warning (push)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#pragma warning (disable : 4100)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static BOOL CALLBACK emutls_init(PINIT_ONCE p0, PVOID p1, PVOID *p2) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    emutls_mutex = (LPCRITICAL_SECTION)_aligned_malloc(sizeof(CRITICAL_SECTION), 16);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (!emutls_mutex) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        win_error(GetLastError(), "_aligned_malloc");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return FALSE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    InitializeCriticalSection(emutls_mutex);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    emutls_tls_index = TlsAlloc();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (emutls_tls_index == TLS_OUT_OF_INDEXES) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        emutls_exit();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        win_error(GetLastError(), "TlsAlloc");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return FALSE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    atexit(&emutls_exit);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return TRUE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static __inline void emutls_init_once(void) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    static INIT_ONCE once;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    InitOnceExecuteOnce(&once, emutls_init, NULL, NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static __inline void emutls_lock() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    EnterCriticalSection(emutls_mutex);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static __inline void emutls_unlock() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    LeaveCriticalSection(emutls_mutex);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static __inline void emutls_setspecific(emutls_address_array *value) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (TlsSetValue(emutls_tls_index, (LPVOID) value) == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        win_abort(GetLastError(), "TlsSetValue");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static __inline emutls_address_array* emutls_getspecific() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    LPVOID value = TlsGetValue(emutls_tls_index);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (value == NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        const DWORD err = GetLastError();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (err != ERROR_SUCCESS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            win_abort(err, "TlsGetValue");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return (emutls_address_array*) value;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* Provide atomic load/store functions for emutls_get_index if built with MSVC.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if !defined(__ATOMIC_RELEASE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <intrin.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++enum { __ATOMIC_ACQUIRE = 2, __ATOMIC_RELEASE = 3 };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static __inline uintptr_t __atomic_load_n(void *ptr, unsigned type) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    assert(type == __ATOMIC_ACQUIRE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    // These return the previous value - but since we do an OR with 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    // it's equivalent to a plain load.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef _WIN64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return InterlockedOr64(ptr, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return InterlockedOr(ptr, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static __inline void __atomic_store_n(void *ptr, uintptr_t val, unsigned type) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    assert(type == __ATOMIC_RELEASE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    InterlockedExchangePointer((void *volatile *)ptr, (void *)val);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* __ATOMIC_RELEASE */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#pragma warning (pop)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* _WIN32 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static size_t emutls_num_object = 0;  /* number of allocated TLS objects */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* Free the allocated TLS data
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void emutls_shutdown(emutls_address_array *array) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (array) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        uintptr_t i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        for (i = 0; i < array->size; ++i) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if (array->data[i])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                emutls_memalign_free(array->data[i]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* For every TLS variable xyz,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * there is one __emutls_control variable named __emutls_v.xyz.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * If xyz has non-zero initial value, __emutls_v.xyz's "value"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * will point to __emutls_t.xyz, which has the initial value.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef struct __emutls_control {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* Must use gcc_word here, instead of size_t, to match GCC.  When
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++       gcc_word is larger than size_t, the upper extra bits are all
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++       zeros.  We can use variables of size_t to operate on size and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++       align.  */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    gcc_word size;  /* size of the object in bytes */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    gcc_word align;  /* alignment of the object in bytes */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    union {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        uintptr_t index;  /* data[index-1] is the object address */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        void* address;  /* object address, when in single thread env */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    } object;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    void* value;  /* null or non-zero initial value for the object */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++} __emutls_control;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* Emulated TLS objects are always allocated at run-time. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static __inline void *emutls_allocate_object(__emutls_control *control) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* Use standard C types, check with gcc's emutls.o. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    COMPILE_TIME_ASSERT(sizeof(uintptr_t) == sizeof(gcc_pointer));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    COMPILE_TIME_ASSERT(sizeof(uintptr_t) == sizeof(void*));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    size_t size = control->size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    size_t align = control->align;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    void* base;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (align < sizeof(void*))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        align = sizeof(void*);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* Make sure that align is power of 2. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if ((align & (align - 1)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        abort();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    base = emutls_memalign_alloc(align, size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (control->value)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        memcpy(base, control->value, size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        memset(base, 0, size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return base;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* Returns control->object.index; set index if not allocated yet. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static __inline uintptr_t emutls_get_index(__emutls_control *control) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    uintptr_t index = __atomic_load_n(&control->object.index, __ATOMIC_ACQUIRE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (!index) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        emutls_init_once();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        emutls_lock();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        index = control->object.index;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (!index) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            index = ++emutls_num_object;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            __atomic_store_n(&control->object.index, index, __ATOMIC_RELEASE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        emutls_unlock();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return index;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* Updates newly allocated thread local emutls_address_array. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static __inline void emutls_check_array_set_size(emutls_address_array *array,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                                 uintptr_t size) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (array == NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        abort();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    array->size = size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    emutls_setspecific(array);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* Returns the new 'data' array size, number of elements,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * which must be no smaller than the given index.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static __inline uintptr_t emutls_new_data_array_size(uintptr_t index) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++   /* Need to allocate emutls_address_array with extra slots
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    * to store the header.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    * Round up the emutls_address_array size to multiple of 16.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    uintptr_t header_words = sizeof(emutls_address_array) / sizeof(void *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return ((index + header_words + 15) & ~((uintptr_t)15)) - header_words;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* Returns the size in bytes required for an emutls_address_array with
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * N number of elements for data field.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static __inline uintptr_t emutls_asize(uintptr_t N) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return N * sizeof(void *) + sizeof(emutls_address_array);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* Returns the thread local emutls_address_array.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Extends its size if necessary to hold address at index.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static __inline emutls_address_array *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++emutls_get_address_array(uintptr_t index) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    emutls_address_array* array = emutls_getspecific();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (array == NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        uintptr_t new_size = emutls_new_data_array_size(index);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        array = (emutls_address_array*) malloc(emutls_asize(new_size));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (array) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            memset(array->data, 0, new_size * sizeof(void*));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            array->skip_destructor_rounds = EMUTLS_SKIP_DESTRUCTOR_ROUNDS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        emutls_check_array_set_size(array, new_size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    } else if (index > array->size) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        uintptr_t orig_size = array->size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        uintptr_t new_size = emutls_new_data_array_size(index);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        array = (emutls_address_array*) realloc(array, emutls_asize(new_size));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (array)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            memset(array->data + orig_size, 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                   (new_size - orig_size) * sizeof(void*));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        emutls_check_array_set_size(array, new_size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return array;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef _WIN32
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++__attribute__((visibility("default")))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void* __emutls_get_address(__emutls_control* control) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    uintptr_t index = emutls_get_index(control);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    emutls_address_array* array = emutls_get_address_array(index--);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (array->data[index] == NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        array->data[index] = emutls_allocate_object(control);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return array->data[index];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- 
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/libcxx-powerpc/files/0014-implement-atomic-using-mutex-lock_guard-for-64b-ops-.patch b/lang/libcxx-powerpc/files/0015-implement-atomic-using-mutex-lock_guard-for-64b-ops-.patch
</span>similarity index 99%
rename from lang/libcxx-powerpc/files/0014-implement-atomic-using-mutex-lock_guard-for-64b-ops-.patch
rename to lang/libcxx-powerpc/files/0015-implement-atomic-using-mutex-lock_guard-for-64b-ops-.patch
<span style='display:block; white-space:pre;color:#808080;'>index d6a544ecf9f..a7847845350 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/libcxx-powerpc/files/0014-implement-atomic-using-mutex-lock_guard-for-64b-ops-.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/libcxx-powerpc/files/0015-implement-atomic-using-mutex-lock_guard-for-64b-ops-.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -101,7 +101,7 @@ index 000000000000..f10dd747e878
</span> +   else { __e = na(); return false; }
 +      }
 +
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+    // for now, _weak inditinguishable from _strong
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    // for now, _weak indistinguishable from _strong
</span> +    _LIBCPP_INLINE_VISIBILITY
 +    bool compare_exchange_strong(_Tp& __e, _Tp __d,
 +                                 memory_order __s, memory_order __f) volatile _NOEXCEPT
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -264,7 +264,7 @@ index 9c2898653788..c053b2e6ec11 100644
</span>  
  _LIBCPP_END_NAMESPACE_STD
  
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+#if    defined(__ppc__) && !defined(__ppc64__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__ppc__) && !defined(__ppc64__)
</span> +// specialize fallback implementation where 64b atomics are missing
 +#include <__atomic_locked>
 +
</pre><pre style='margin:0'>

</pre>