<pre style='margin:0'>
Christopher Nielsen (mascguy) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/5fc1fec717f6d409901360f4337bbc531f932945">https://github.com/macports/macports-ports/commit/5fc1fec717f6d409901360f4337bbc531f932945</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 5fc1fec717f rust: build scalpel.dylib from sources
</span>5fc1fec717f is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 5fc1fec717f6d409901360f4337bbc531f932945
</span>Author: Kirill A. Korinsky <kirill@korins.ky>
AuthorDate: Sat Dec 4 14:16:48 2021 +0100

<span style='display:block; white-space:pre;color:#404040;'>    rust: build scalpel.dylib from sources
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Closes: https://trac.macports.org/ticket/64127
</span>---
 lang/rust/Portfile                                 |  19 +-
 lang/rust/files/llvm-13-builtins/int_endianness.h  | 123 ++++++++++++
 lang/rust/files/llvm-13-builtins/int_lib.h         | 180 ++++++++++++++++++
 lang/rust/files/llvm-13-builtins/int_mulo_impl.inc |  58 ++++++
 lang/rust/files/llvm-13-builtins/int_types.h       | 207 +++++++++++++++++++++
 lang/rust/files/llvm-13-builtins/int_util.h        |  56 ++++++
 lang/rust/files/llvm-13-builtins/muloti4.c         |  37 ++++
 7 files changed, 666 insertions(+), 14 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/rust/Portfile b/lang/rust/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 8e3f62786a6..e6f53cedbf9 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/rust/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/rust/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -418,31 +418,22 @@ if {${subport} ne "${ccwrap}" } {
</span>     }
 
     if { ${os.platform} eq "darwin" && ${os.major} < 12 } {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        # I don't need whole libcxx
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # anyway, it is an easy way to get some missed symbols from compiler-rt
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        legacysupport.use_mp_libcxx yes
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span>         # well, let me build a small library which contains only needed symbols
         set scalpel_dylib ${workpath}/scalpel.dylib
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        pre-build {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set export_list_file ${workpath}/scalpel.export_list
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # set scalpel_dylib ${workpath}/scalpel.dylib
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set export_list [open ${export_list_file} w]
</span> 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        pre-build {
</span>             # Since https://github.com/rust-lang/rust/commit/8a6ff90a3a41e6ace18aeb089ea0a0eb3726dd08
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            puts ${export_list} "___muloti4"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set scalpel_sources "${filespath}/llvm-13-builtins/muloti4.c"
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            close ${export_list}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            system "${configure.cc} -dynamiclib -exported_symbols_list ${export_list_file} -o ${scalpel_dylib} ${prefix}/lib/libcxx/libc++.a"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # let's build the scalpel
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            system "${configure.cc} ${configure.cflags} [get_canonical_archflags cc] -dynamiclib -o ${scalpel_dylib} ${scalpel_sources}"
</span> 
             build.env-append \
                         DYLD_FORCE_FLAT_NAMESPACE=1 \
                         DYLD_INSERT_LIBRARIES=${scalpel_dylib}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span>         }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        # inside destroot it also calls cargo / rustc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # inside destroot it also calls prebuilt cargo
</span>         destroot.env-append \
                         DYLD_FORCE_FLAT_NAMESPACE=1 \
                         DYLD_INSERT_LIBRARIES=${scalpel_dylib}
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/rust/files/llvm-13-builtins/int_endianness.h b/lang/rust/files/llvm-13-builtins/int_endianness.h
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..a50eea63e5e
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/rust/files/llvm-13-builtins/int_endianness.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,123 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Source: https://github.com/llvm/llvm-project/blob/llvmorg-13.0.0/compiler-rt/lib/builtins/int_endianness.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * The goal of this code is only allow to run binary
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * which was linked against macOS 10.8 on macOS 10.7 and below.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Such binaries are used to boostrap rust on stage0 only.
</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;'>+//===-- 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;'>+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// See https://llvm.org/LICENSE.txt for license information.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
</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;'>+#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;color:#808080;'>diff --git a/lang/rust/files/llvm-13-builtins/int_lib.h b/lang/rust/files/llvm-13-builtins/int_lib.h
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..0a21d26d3c1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/rust/files/llvm-13-builtins/int_lib.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,180 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Source: https://github.com/llvm/llvm-project/blob/llvmorg-13.0.0/compiler-rt/lib/builtins/int_lib.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * The goal of this code is only allow to run binary
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * which was linked against macOS 10.8 on macOS 10.7 and below.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Such binaries are used to boostrap rust on stage0 only.
</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;'>+//===-- 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;'>+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// See https://llvm.org/LICENSE.txt for license information.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
</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;'>+#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;'>+// 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;'>+#if defined(_MSC_VER) && !defined(__clang__)
</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;'>+#define STR(a) #a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define XSTR(a) STR(a)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SYMBOL_NAME(name) XSTR(__USER_LABEL_PREFIX__) #name
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if defined(__ELF__) || defined(__MINGW32__) || defined(__wasm__) ||           \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    defined(_AIX)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define COMPILER_RT_ALIAS(name, aliasname) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  COMPILER_RT_ABI __typeof(name) aliasname __attribute__((__alias__(#name)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#elif defined(__APPLE__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if defined(VISIBILITY_HIDDEN)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define COMPILER_RT_ALIAS_VISIBILITY(name) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  __asm__(".private_extern " SYMBOL_NAME(name));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define COMPILER_RT_ALIAS_VISIBILITY(name)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define COMPILER_RT_ALIAS(name, aliasname) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  __asm__(".globl " SYMBOL_NAME(aliasname)); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  COMPILER_RT_ALIAS_VISIBILITY(aliasname) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  __asm__(SYMBOL_NAME(aliasname) " = " SYMBOL_NAME(name)); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  COMPILER_RT_ABI __typeof(name) aliasname;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#elif defined(_WIN32)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define COMPILER_RT_ALIAS(name, aliasname)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#error Unsupported target
</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(__FreeBSD__) || defined(__NetBSD__)) &&                           \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    (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;'>+// NB: FreeBSD (and OpenBSD) deprecate machine/limits.h in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// favour of sys/limits.h, so prefer the former, but fall
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// back on the latter if not available since NetBSD only has
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// the latter.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+//
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if defined(__has_include) && __has_include(<sys/limits.h>)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/limits.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <machine/limits.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</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 <float.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <limits.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 <stdint.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 int __paritysi2(si_int a);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+COMPILER_RT_ABI 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 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;'>+int __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;'>+int __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;'>+int __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;'>+int __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;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+bool __inline __builtin_sadd_overflow(int x, int y, int *result) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if ((x < 0) != (y < 0)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    *result = x + y;
</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;'>+  int tmp = (unsigned int)x + (unsigned int)y;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if ((tmp < 0) != (x < 0))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  *result = tmp;
</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;'>+
</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;color:#808080;'>diff --git a/lang/rust/files/llvm-13-builtins/int_mulo_impl.inc b/lang/rust/files/llvm-13-builtins/int_mulo_impl.inc
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..e1b5c1a5d03
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/rust/files/llvm-13-builtins/int_mulo_impl.inc
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,58 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Source: https://github.com/llvm/llvm-project/blob/llvmorg-13.0.0/compiler-rt/lib/builtins/int_mulo_impl.inc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * The goal of this code is only allow to run binary
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * which was linked against macOS 10.8 on macOS 10.7 and below.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Such binaries are used to boostrap rust on stage0 only.
</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;'>+//===-- int_mulo_impl.inc - Implement __mulo[sdt]i4 ---------------*- C -*-===//
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+//
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// See https://llvm.org/LICENSE.txt for license information.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
</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;'>+// Helper used by __mulosi4, __mulodi4 and __muloti4.
</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 "int_lib.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// Returns: a * b
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// Effects: sets *overflow to 1  if a * b overflows
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static __inline fixint_t __muloXi4(fixint_t a, fixint_t b, int *overflow) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  const int N = (int)(sizeof(fixint_t) * CHAR_BIT);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  const fixint_t MIN = (fixint_t)1 << (N - 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  const fixint_t MAX = ~MIN;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  *overflow = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  fixint_t result = a * b;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (a == MIN) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (b != 0 && b != 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      *overflow = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return result;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (b == MIN) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (a != 0 && a != 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      *overflow = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return result;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  fixint_t sa = a >> (N - 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  fixint_t abs_a = (a ^ sa) - sa;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  fixint_t sb = b >> (N - 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  fixint_t abs_b = (b ^ sb) - sb;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (abs_a < 2 || abs_b < 2)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return result;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (sa == sb) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (abs_a > MAX / abs_b)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      *overflow = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (abs_a > MIN / -abs_b)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      *overflow = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  return result;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/rust/files/llvm-13-builtins/int_types.h b/lang/rust/files/llvm-13-builtins/int_types.h
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..75acfaff4a1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/rust/files/llvm-13-builtins/int_types.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,207 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Source: https://github.com/llvm/llvm-project/blob/llvmorg-13.0.0/compiler-rt/lib/builtins/int_types.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * The goal of this code is only allow to run binary
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * which was linked against macOS 10.8 on macOS 10.7 and below.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Such binaries are used to boostrap rust on stage0 only.
</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;'>+//===-- 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;'>+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// See https://llvm.org/LICENSE.txt for license information.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
</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;'>+#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 int32_t si_int;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+typedef uint32_t su_int;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if UINT_MAX == 0xFFFFFFFF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define clzsi __builtin_clz
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define ctzsi __builtin_ctz
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#elif ULONG_MAX == 0xFFFFFFFF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define clzsi __builtin_clzl
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define ctzsi __builtin_ctzl
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#error could not determine appropriate clzsi macro for this system
</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 int64_t di_int;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+typedef uint64_t 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;'>+  di_int all;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  struct {
</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;'>+  du_int all;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  struct {
</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) ||             \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    defined(__riscv) || defined(_WIN64)
</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;'>+// MSVC doesn't have a working 128bit integer type. Users should really compile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// compiler-rt with clang, but if they happen to be doing a standalone build for
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// asan or something else, disable the 128 bit parts so things sort of work.
</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;'>+#undef 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;'>+  ti_int all;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  struct {
</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;'>+  tu_int all;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  struct {
</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;'>+// FreeBSD's boot environment does not support using floating-point and poisons
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// the float and double keywords.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if defined(__FreeBSD__) && defined(_STANDALONE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define CRT_HAS_FLOATING_POINT 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define CRT_HAS_FLOATING_POINT 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;'>+#if CRT_HAS_FLOATING_POINT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+typedef union {
</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;'>+  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;'>+#endif
</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;'>+#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;'>+// Check if the target supports 80 bit extended precision long doubles.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// Notably, on x86 Windows, MSVC only provides a 64-bit long double, but GCC
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// still makes it 80 bits. Clang will match whatever compiler it is trying to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// be compatible with. On 32-bit x86 Android, long double is 64 bits, while on
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// x86_64 Android, long double is 128 bits.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if (defined(__i386__) || defined(__x86_64__)) &&                              \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    !(defined(_MSC_VER) || defined(__ANDROID__))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define HAS_80_BIT_LONG_DOUBLE 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#elif defined(__m68k__) || defined(__ia64__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define HAS_80_BIT_LONG_DOUBLE 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define HAS_80_BIT_LONG_DOUBLE 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;'>+#if CRT_HAS_FLOATING_POINT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+typedef union {
</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 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  float real, imaginary;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} Fcomplex;
</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;'>+  double real, imaginary;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} Dcomplex;
</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;'>+  long double real, imaginary;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} 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
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif // INT_TYPES_H
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/rust/files/llvm-13-builtins/int_util.h b/lang/rust/files/llvm-13-builtins/int_util.h
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..836ff965aa3
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/rust/files/llvm-13-builtins/int_util.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,56 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Source: https://github.com/llvm/llvm-project/blob/llvmorg-13.0.0/compiler-rt/lib/builtins/int_util.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * The goal of this code is only allow to run binary
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * which was linked against macOS 10.8 on macOS 10.7 and below.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Such binaries are used to boostrap rust on stage0 only.
</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;'>+//===-- 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;'>+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// See https://llvm.org/LICENSE.txt for license information.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
</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;'>+#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;'>+// Force unrolling the code specified to be repeated N times.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define REPEAT_0_TIMES(code_to_repeat) /* do nothing */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define REPEAT_1_TIMES(code_to_repeat) code_to_repeat
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define REPEAT_2_TIMES(code_to_repeat)                                         \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  REPEAT_1_TIMES(code_to_repeat)                                               \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  code_to_repeat
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define REPEAT_3_TIMES(code_to_repeat)                                         \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  REPEAT_2_TIMES(code_to_repeat)                                               \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  code_to_repeat
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define REPEAT_4_TIMES(code_to_repeat)                                         \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  REPEAT_3_TIMES(code_to_repeat)                                               \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  code_to_repeat
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define REPEAT_N_TIMES_(N, code_to_repeat) REPEAT_##N##_TIMES(code_to_repeat)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define REPEAT_N_TIMES(N, code_to_repeat) REPEAT_N_TIMES_(N, code_to_repeat)
</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;color:#808080;'>diff --git a/lang/rust/files/llvm-13-builtins/muloti4.c b/lang/rust/files/llvm-13-builtins/muloti4.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..8ec053796c7
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/rust/files/llvm-13-builtins/muloti4.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,37 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Source: https://github.com/llvm/llvm-project/blob/llvmorg-13.0.0/compiler-rt/lib/builtins/muloti4.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * The goal of this code is only allow to run binary
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * which was linked against macOS 10.8 on macOS 10.7 and below.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Such binaries are used to boostrap rust on stage0 only.
</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;'>+//===-- muloti4.c - Implement __muloti4 -----------------------------------===//
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+//
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// See https://llvm.org/LICENSE.txt for license information.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
</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 implements __muloti4 for the 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;'>+#include "int_lib.h"
</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;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// Returns: a * b
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// Effects: sets *overflow to 1  if a * b overflows
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define fixint_t ti_int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "int_mulo_impl.inc"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+COMPILER_RT_ABI ti_int __muloti4(ti_int a, ti_int b, int *overflow) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  return __muloXi4(a, b, overflow);
</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></pre><pre style='margin:0'>

</pre>