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

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/761f9b4bdcf088f02cd7d971078c00a68dc3d4ba">https://github.com/macports/macports-ports/commit/761f9b4bdcf088f02cd7d971078c00a68dc3d4ba</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 761f9b4bdcf088f02cd7d971078c00a68dc3d4ba
</span>Author: Kirill A. Korinsky <kirill@korins.ky>
AuthorDate: Wed Aug 10 01:19:15 2022 +0200

<span style='display:block; white-space:pre;color:#404040;'>    darwin-xtools: new port, version 3.3.0
</span>---
 devel/darwin-xtools/Portfile                       |  109 +
 ...ld64-unwinddump-include-stdlib-for-exit-3.patch |   32 +
 ...e_file-fix-compilation-without-LTO_SUPPOR.patch |   33 +
 ...ke-as-fix-compilation-on-powerpc-apple-da.patch |   72 +
 ...ol-fix-duplicate-symbol-in-arm-i386-_disa.patch |   40 +
 ...ke-cbtlibs-link-against-libstuff-for-vari.patch |   23 +
 ...make-build-libprunetrie-as-static-archive.patch |   28 +
 .../0007-tapilite-add-TAPI-emulation-library.patch | 2284 ++++++++++++++++++++
 ...use-normal-cmake-trickery-to-link-against.patch |   45 +
 .../0009-tapilite-bunch-of-fixes-and-changes.patch |  523 +++++
 ...ilite-cmake-explitly-build-static-library.patch |   26 +
 .../files/0011-ld64-fix-compilation-on-arm64.patch |   87 +
 .../0012-cctools-fix-build-on-macOS-monterey.patch |   38 +
 .../0013-libyaml-add-the-way-to-include-it.patch   |   27 +
 ...oved-redundant-implementation-of-get_toc_.patch |   65 +
 .../files/0015-tapilite-fix-build-by-clang.patch   |   34 +
 16 files changed, 3466 insertions(+)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/darwin-xtools/Portfile b/devel/darwin-xtools/Portfile
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..df72ec35620
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/darwin-xtools/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,109 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:filetype=tcl:et:sw=4:ts=4:sts=4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+PortSystem                  1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+PortGroup                   cmake 1.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+PortGroup                   github 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set xtools_version          6446947f3e99db52a40b30a38f36b9ae33492aea
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set libyaml_version         0.2.5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+github.setup                iains darwin-xtools ${xtools_version}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+github.tarball_from         archive
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+version                     3.3.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+revision                    0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+epoch                       0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+platforms                   darwin
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+categories                  devel
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+maintainers                 {@catap korins.ky:kirill} openmaintainer
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+description                 Aset of modifications to ctools and ld64 that enable support for older systems with up-to-date-tools.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+long_description            {*}${description}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+license                     {APSL-2 Apache-2}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+homepage                    https://github.com/iains/darwin-xtools
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+master_sites-append         https://github.com/yaml/libyaml/archive/refs/tags:libyaml
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set libyaml_distfile        ${libyaml_version}.tar.gz
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+distfiles-append            ${libyaml_distfile}:libyaml
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+checksums                   ${name}-${xtools_version}.tar.gz \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            rmd160  18d99473a012f4fa48464aadd078921a25bdc322 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            sha256  9167b67e128f616cef079bbeda4b116fe0d41fe54784fff85826420daae23f5f \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            size    2958759 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            ${libyaml_distfile} \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            rmd160  7fe42b7d7bb0dd07aedee6c775c43fd35bb5cf3e \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            sha256  fa240dbf262be053f3898006d502d514936c818e422afdcf33921c63bed9bf2e \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            size    85055
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+patchfiles-append           0001-ld64-unwinddump-include-stdlib-for-exit-3.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            0002-ld64-archive_file-fix-compilation-without-LTO_SUPPOR.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            0003-cctools-cmake-as-fix-compilation-on-powerpc-apple-da.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            0004-cctools-otool-fix-duplicate-symbol-in-arm-i386-_disa.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            0005-cctools-cmake-cbtlibs-link-against-libstuff-for-vari.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            0006-ld64-cmake-build-libprunetrie-as-static-archive.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            0007-tapilite-add-TAPI-emulation-library.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            0008-ld64-cmake-use-normal-cmake-trickery-to-link-against.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            0009-tapilite-bunch-of-fixes-and-changes.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            0010-tapilite-cmake-explitly-build-static-library.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            0011-ld64-fix-compilation-on-arm64.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            0012-cctools-fix-build-on-macOS-monterey.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            0013-libyaml-add-the-way-to-include-it.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            0014-cctools-removed-redundant-implementation-of-get_toc_.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            0015-tapilite-fix-build-by-clang.patch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+post-extract {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    ln -s ${workpath}/libyaml-${libyaml_version} ${worksrcpath}/libyaml
</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;'>+# Use cmake-bootstrap
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+depends_build-replace       path:bin/cmake:cmake port:cmake-bootstrap
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+depends_skip_archcheck-append \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            cmake-bootstrap
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+configure.cmd               ${prefix}/libexec/cmake-bootstrap/bin/cmake
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# prevent findng or linking against any other ports
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+compiler.cpath
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+compiler.library_path
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+configure.cppflags-delete -I${prefix}/include
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+configure.ldflags-delete  -L${prefix}/lib
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+compiler.cxx_standard       2011
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {${os.platform} eq "darwin" && ${os.major} < 12} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    depends_build-append    port:gcc10-bootstrap
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    depends_skip_archcheck-append \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            gcc10-bootstrap
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    configure.cc            ${prefix}/libexec/gcc10-bootstrap/bin/gcc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    configure.cxx           ${prefix}/libexec/gcc10-bootstrap/bin/g++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # prevent it from linking against gcc's libstdc++.6.dylib and libgcc_s.1.1.dylib
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    configure.ldflags-append \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            -static-libstdc++ -static-libgcc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    configure.compiler.add_deps no
</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;'>+cmake.install_prefix        ${prefix}/libexec/${name}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+cmake.build_type            Release
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+cmake.generator             {Unix Makefiles}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+configure.args-append       -DCCTOOLS_LD_CLASSIC=OFF \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            -DXTOOLS_LIBYAML_PATH=${worksrcpath}/libyaml \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            -DXTOOLS_USE_TAPILITE=ON
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# 64bit LD requires futures patches
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {${build_arch} ni [list i386 ppc]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    configure.args-append   -DXTOOLS_HOST_IS_64B=ON
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    configure.args-append   -DXTOOLS_HOST_IS_64B=OFF
</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;'>+post-destroot {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    file delete -force {*}[glob -directory ${destroot}${cmake.install_prefix} \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           cmake/yaml* include/yaml.h lib/libyaml*]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/darwin-xtools/files/0001-ld64-unwinddump-include-stdlib-for-exit-3.patch b/devel/darwin-xtools/files/0001-ld64-unwinddump-include-stdlib-for-exit-3.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..33b41d5e191
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/darwin-xtools/files/0001-ld64-unwinddump-include-stdlib-for-exit-3.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,32 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 11d2c65456a71762744d2ffce321579249c70752 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Fabian Groffen <grobian@gentoo.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Sat, 19 Dec 2020 16:38:36 +0100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] [ld64] unwinddump: include stdlib for exit(3)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+MIME-Version: 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Content-Type: text/plain; charset=UTF-8
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Content-Transfer-Encoding: 8bit
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Fix warning
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+../darwin-xtools/ld64/src/other/unwinddump.cpp:1174:6:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+error: ‘exit’ was not declared in this scope; did you mean ‘_exit’?
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Signed-off-by: Fabian Groffen <grobian@gentoo.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ld64/src/other/unwinddump.cpp | 1 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 1 insertion(+)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git ld64/src/other/unwinddump.cpp ld64/src/other/unwinddump.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index d77e5d9..168ea67 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ld64/src/other/unwinddump.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ld64/src/other/unwinddump.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -27,6 +27,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <sys/mman.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <stdarg.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 <stdlib.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <fcntl.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <unistd.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <errno.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+2.38.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/darwin-xtools/files/0002-ld64-archive_file-fix-compilation-without-LTO_SUPPOR.patch b/devel/darwin-xtools/files/0002-ld64-archive_file-fix-compilation-without-LTO_SUPPOR.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..d39d251940d
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/darwin-xtools/files/0002-ld64-archive_file-fix-compilation-without-LTO_SUPPOR.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,33 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 954632bb0f791a298ea70460807ae6ccbc678f22 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Fabian Groffen <grobian@gentoo.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Sat, 19 Dec 2020 16:45:52 +0100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] [ld64] archive_file: fix compilation without LTO_SUPPORT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Signed-off-by: Fabian Groffen <grobian@gentoo.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ld64/src/ld/parsers/archive_file.cpp | 2 ++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 2 insertions(+)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git ld64/src/ld/parsers/archive_file.cpp ld64/src/ld/parsers/archive_file.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index c09c40a..f13d3d6 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ld64/src/ld/parsers/archive_file.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ld64/src/ld/parsers/archive_file.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -514,6 +514,7 @@ bool File<A>::forEachAtom(ld::File::AtomHandler& handler) const
</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;'>++#ifdef LTO_SUPPORT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   else if ( validLTOFile(member->content(), member->contentSize(), _objOpts) ) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           if ( lto::hasObjCCategory(member->content(), member->contentSize()) ) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                   MemberState& state = this->makeObjectFileForMember(member);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -525,6 +526,7 @@ bool File<A>::forEachAtom(ld::File::AtomHandler& handler) const
</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;'>++#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;'>+   return didSome;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+2.38.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/darwin-xtools/files/0003-cctools-cmake-as-fix-compilation-on-powerpc-apple-da.patch b/devel/darwin-xtools/files/0003-cctools-cmake-as-fix-compilation-on-powerpc-apple-da.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..22c93431c1b
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/darwin-xtools/files/0003-cctools-cmake-as-fix-compilation-on-powerpc-apple-da.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,72 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 119347c55aa84a7f396f335ea48fb5912ef1b984 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Fabian Groffen <grobian@gentoo.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Sat, 19 Dec 2020 20:30:42 +0100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] [cctools, cmake] as: fix compilation on powerpc-apple-darwin9
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+At least GCC (10.1.0) defines PPC by default on powerpc-apple-darwin9,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+e.g. it would result in both I386 and PPC being defined, which is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+resulting in compilation problems.  Undefine PPC to ensure only the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+approprate target code is enabled.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Signed-off-by: Fabian Groffen <grobian@gentoo.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ cctools/as/CMakeLists.txt | 12 ++++++------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 6 insertions(+), 6 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git cctools/as/CMakeLists.txt cctools/as/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 16d7b76..02734ff 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- cctools/as/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ cctools/as/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -42,13 +42,13 @@ if(XTOOLS_C_HAS_WNODEPRECATED_FLAG)
</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;'>+ add_executable(as-driver driver.c)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-set_target_properties(as-driver PROPERTIES COMPILE_FLAGS "-Di486 -Di586 -Di686")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++set_target_properties(as-driver PROPERTIES COMPILE_FLAGS "-Di486 -Di586 -Di686 -UPPC")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ target_link_libraries(as-driver stuff)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set_target_properties(as-driver PROPERTIES OUTPUT_NAME as)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ install(TARGETS as-driver DESTINATION bin )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ add_executable(i386-as ${X86_SRCS})
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-set_target_properties(i386-as PROPERTIES COMPILE_FLAGS "-DI386 -Di486 -Di586 -Di686")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++set_target_properties(i386-as PROPERTIES COMPILE_FLAGS "-DI386 -Di486 -Di586 -Di686 -UPPC")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set_target_properties(i386-as PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/i386)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set_target_properties(i386-as PROPERTIES OUTPUT_NAME as)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ target_link_libraries(i386-as stuff)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -59,13 +59,13 @@ install(TARGETS i386-as DESTINATION bin/i386)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if(BUILD_TESTING)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   add_executable(test-x86 i386-check.c)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  set_target_properties(test-x86 PROPERTIES COMPILE_FLAGS "-DI386 -Di486 -Di586 -Di686")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  set_target_properties(test-x86 PROPERTIES COMPILE_FLAGS "-DI386 -Di486 -Di586 -Di686 -UPPC")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   set_target_properties(test-x86 PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/tests)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   add_test(NAME check-x86-as COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/check-as $<TARGET_FILE:test-x86> i386 $<TARGET_FILE:as-driver>)
</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;'>+ add_executable(x8664-as ${X86_SRCS})
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-set_target_properties(x8664-as PROPERTIES COMPILE_FLAGS "-DI386 -Di486 -Di586 -Di686 -DARCH64")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++set_target_properties(x8664-as PROPERTIES COMPILE_FLAGS "-DI386 -Di486 -Di586 -Di686 -DARCH64 -UPPC")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set_target_properties(x8664-as PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/x86_64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set_target_properties(x8664-as PROPERTIES OUTPUT_NAME as)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ target_link_libraries(x8664-as stuff)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -76,7 +76,7 @@ install(TARGETS x8664-as DESTINATION bin/x86_64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if(BUILD_TESTING)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   add_executable(test-x86_64 i386-check.c)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  set_target_properties(test-x86_64 PROPERTIES COMPILE_FLAGS "-DI386 -Di486 -Di586 -Di686 -DARCH64")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  set_target_properties(test-x86_64 PROPERTIES COMPILE_FLAGS "-DI386 -Di486 -Di586 -Di686 -DARCH64 -UPPC")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   set_target_properties(test-x86_64 PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/tests)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   add_test(NAME check-x86_86-as COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/check-as $<TARGET_FILE:test-x86_64> x86_64 $<TARGET_FILE:as-driver>)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ endif()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -109,7 +109,7 @@ endif()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ install(TARGETS ppc64-as DESTINATION bin/ppc64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ add_executable(arm-as ${ARM_SRCS})
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-set_target_properties(arm-as PROPERTIES COMPILE_FLAGS "-DARM")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++set_target_properties(arm-as PROPERTIES COMPILE_FLAGS "-DARM -UPPC")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set_target_properties(arm-as PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/arm)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set_target_properties(arm-as PROPERTIES OUTPUT_NAME as)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ target_link_libraries(arm-as stuff)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+2.38.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/darwin-xtools/files/0004-cctools-otool-fix-duplicate-symbol-in-arm-i386-_disa.patch b/devel/darwin-xtools/files/0004-cctools-otool-fix-duplicate-symbol-in-arm-i386-_disa.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..c55e530f11f
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/darwin-xtools/files/0004-cctools-otool-fix-duplicate-symbol-in-arm-i386-_disa.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,40 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 505c38b1cc6d0b8b8e111ab3330fa248993361c2 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Fabian Groffen <grobian@gentoo.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Sat, 19 Dec 2020 21:29:48 +0100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] [cctools] otool: fix duplicate symbol in {arm,i386}_disasm.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Signed-off-by: Fabian Groffen <grobian@gentoo.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ cctools/otool/arm_disasm.c  | 2 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ cctools/otool/i386_disasm.c | 2 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 2 files changed, 2 insertions(+), 2 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git cctools/otool/arm_disasm.c cctools/otool/arm_disasm.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 8a2ea5d..66f26ce 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- cctools/otool/arm_disasm.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ cctools/otool/arm_disasm.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -64,7 +64,7 @@ typedef char bfd_byte;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* HACKS to avoid pulling in all of FSF binutils include/dis-asm.h */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ typedef int (*fprintf_ftype) (void *, const char*, ...);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-struct disassemble_info { /* HACK'ed up for just what we need here */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static struct disassemble_info { /* HACK'ed up for just what we need here */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   fprintf_ftype fprintf_func;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   void *stream;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git cctools/otool/i386_disasm.c cctools/otool/i386_disasm.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 0b60eb8..4bafbb3 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- cctools/otool/i386_disasm.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ cctools/otool/i386_disasm.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1617,7 +1617,7 @@ static unsigned int xmm_rm(int r_m, int rex)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  * This is passed to the llvm disassembler.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-struct disassemble_info {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static struct disassemble_info {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   enum bool verbose;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   /* Relocation information.  */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   struct relocation_info *sorted_relocs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+2.38.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/darwin-xtools/files/0005-cctools-cmake-cbtlibs-link-against-libstuff-for-vari.patch b/devel/darwin-xtools/files/0005-cctools-cmake-cbtlibs-link-against-libstuff-for-vari.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..faac456ba26
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/darwin-xtools/files/0005-cctools-cmake-cbtlibs-link-against-libstuff-for-vari.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,23 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From eade12cad5058d8bebaa74793dd65c5cfaba936b Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Fabian Groffen <grobian@gentoo.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Sun, 20 Dec 2020 14:38:20 +0100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] [cctools, cmake] cbtlibs: link against libstuff for various
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ funcs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Signed-off-by: Fabian Groffen <grobian@gentoo.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ cctools/cbtlibs/CMakeLists.txt | 1 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 1 insertion(+)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git cctools/cbtlibs/CMakeLists.txt cctools/cbtlibs/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 77cc8f8..f9eac32 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- cctools/cbtlibs/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ cctools/cbtlibs/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -11,3 +11,4 @@ add_library(syminfo libsyminfo.c)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if(XTOOLS_C_HAS_FNOCOMMON_FLAG)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   set_target_properties(syminfo PROPERTIES COMPILE_FLAGS "-fno-common")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ endif()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++target_link_libraries(syminfo stuff)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+2.38.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/darwin-xtools/files/0006-ld64-cmake-build-libprunetrie-as-static-archive.patch b/devel/darwin-xtools/files/0006-ld64-cmake-build-libprunetrie-as-static-archive.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..4cc942b8a53
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/darwin-xtools/files/0006-ld64-cmake-build-libprunetrie-as-static-archive.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,28 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From d2b528bf63809f9f54a31eb0745dd55f79a4c08f Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Fabian Groffen <grobian@gentoo.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Mon, 21 Dec 2020 13:17:11 +0100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] [ld64, cmake] build libprunetrie as static archive
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+We currently don't install libs, so referencing libprunetrie.dylib from
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+strip is bound to result in a trap.  Since I can't see a reason to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+distribute libprunetrie, and ld(64) seems to incorporate it as well,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+just statically link strip against libprunetrie.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Signed-off-by: Fabian Groffen <grobian@gentoo.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ld64/src/CMakeLists.txt | 2 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 1 insertion(+), 1 deletion(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git ld64/src/CMakeLists.txt ld64/src/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 1be1a5e..0f6a0f4 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ld64/src/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ld64/src/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -76,4 +76,4 @@ include_directories("${CMAKE_CURRENT_SOURCE_DIR}/abstraction")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ add_subdirectory(ld)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ add_subdirectory(other)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-add_library(prunetrie other/PruneTrie.cpp)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++add_library(prunetrie STATIC other/PruneTrie.cpp)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+2.38.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/darwin-xtools/files/0007-tapilite-add-TAPI-emulation-library.patch b/devel/darwin-xtools/files/0007-tapilite-add-TAPI-emulation-library.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..63d52506cb4
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/darwin-xtools/files/0007-tapilite-add-TAPI-emulation-library.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,2284 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 3ab9c8ce51c75a71914036b4b738283e455da154 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Fabian Groffen <grobian@gentoo.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Mon, 28 Dec 2020 14:13:30 +0100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] [tapilite] add TAPI emulation library
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+TAPI is a project with close ties to LLVM, which means one needs it to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+build a linker.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+On systems where no LLVM is used (like older Darwin), or systems where
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+GCC is in use instead, this means TAPI cannot be built.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+On recent Darwin systems, a linker that does not do TAPI, cannot do
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+much, since all system libraries are .tbd (TAPI stubs).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Hence, to e.g. bootstrap LLVM, we need to be able to build a linker that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+understands TAPI, without having TAPI (the host may not supply it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+either).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+This introduces TAPIlite, an implementation of those classes ld64 uses,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+with help of libyaml.  This is very limited at this point, and whether
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+or not it works is very brittle.  Further development here is likely
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+necessary.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Signed-off-by: Fabian Groffen <grobian@gentoo.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ CMakeLists.txt                              |   19 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ld64/src/ld/CMakeLists.txt                  |   15 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tapilite/CMakeLists.txt                     |   26 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tapilite/LICENSE.TXT                        |   62 ++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tapilite/README                             |    6 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tapilite/include/tapi/Defines.h             |   32 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tapilite/include/tapi/LinkerInterfaceFile.h |  496 +++++++++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tapilite/include/tapi/PackedVersion32.h     |  109 ++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tapilite/include/tapi/Symbol.h              |  136 +++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tapilite/include/tapi/Version.h             |   63 ++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tapilite/include/tapi/tapi.h                |   34 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tapilite/src/CMakeLists.txt                 |   12 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tapilite/src/LinkerInterfaceFile.cpp        | 1057 +++++++++++++++++++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tapilite/src/Version.cpp                    |   48 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 14 files changed, 2109 insertions(+), 6 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ create mode 100644 tapilite/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ create mode 100644 tapilite/LICENSE.TXT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ create mode 100644 tapilite/README
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ create mode 100644 tapilite/include/tapi/Defines.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ create mode 100644 tapilite/include/tapi/LinkerInterfaceFile.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ create mode 100644 tapilite/include/tapi/PackedVersion32.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ create mode 100644 tapilite/include/tapi/Symbol.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ create mode 100644 tapilite/include/tapi/Version.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ create mode 100644 tapilite/include/tapi/tapi.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ create mode 100644 tapilite/src/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ create mode 100644 tapilite/src/LinkerInterfaceFile.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ create mode 100644 tapilite/src/Version.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git CMakeLists.txt CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index f223eea..79bc676 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -64,7 +64,10 @@ else()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   message(STATUS "*Top Level* NO LTO")
</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(XTOOLS_TAPI_PATH AND
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++if(XTOOLS_USE_TAPILITE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  option(XTOOLS_TAPI_SUPPORT "Support TAPI in ld64." ON)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  message(STATUS "*Top Level* WITH TAPIlite")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++elseif(XTOOLS_TAPI_PATH AND
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    EXISTS ${XTOOLS_TAPI_PATH}/include/tapi AND
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    EXISTS ${XTOOLS_TAPI_PATH}/lib/libtapi.dylib)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   configure_file(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -128,8 +131,13 @@ include_directories(BEFORE SYSTEM "${CMAKE_SOURCE_DIR}/macho-target-includes")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ include_directories(BEFORE SYSTEM "${CMAKE_BINARY_DIR}/include")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ include_directories(BEFORE SYSTEM "${CMAKE_BINARY_DIR}/host-includes")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if(XTOOLS_TAPI_SUPPORT)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  include_directories(BEFORE SYSTEM "${XTOOLS_TAPI_PATH}/include")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  message(STATUS "*Top Level* including ${XTOOLS_TAPI_PATH}/include")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if(XTOOLS_USE_TAPILITE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    include_directories(BEFORE SYSTEM "${CMAKE_SOURCE_DIR}/tapilite/include")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    message(STATUS "*Top Level* including ${CMAKE_SOURCE_DIR}/tapilite/include")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  else()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    include_directories(BEFORE SYSTEM "${XTOOLS_TAPI_PATH}/include")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    message(STATUS "*Top Level* including ${XTOOLS_TAPI_PATH}/include")
</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;'>+ if (EXISTS ${CMAKE_BINARY_DIR}/lib)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -160,6 +168,11 @@ if (NOT XTOOLS_HAS_MODERNXAR)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 COPYONLY)
</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;'>++# build tapilite first, so ld64 can link against it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++if(XTOOLS_USE_TAPILITE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  add_subdirectory(tapilite)
</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;'>+ # Evaluate first so that we find out about libprunetrie.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if( EXISTS ${CMAKE_SOURCE_DIR}/ld64/CMakeLists.txt )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   add_subdirectory(ld64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git ld64/src/ld/CMakeLists.txt ld64/src/ld/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index c314ff4..79037a3 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ld64/src/ld/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ld64/src/ld/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -51,8 +51,13 @@ configure_file (
</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(XTOOLS_TAPI_SUPPORT)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  include_directories("${XTOOLS_TAPI_PATH}/include")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  message(STATUS "*LD64* including ${XTOOLS_TAPI_PATH}/include")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if(XTOOLS_USE_TAPILITE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    include_directories("${CMAKE_SOURCE_DIR}/tapilite/include")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    message(STATUS "*LD64* including ${CMAKE_SOURCE_DIR}/tapilite/include")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  else()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    include_directories("${XTOOLS_TAPI_PATH}/include")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    message(STATUS "*LD64* including ${XTOOLS_TAPI_PATH}/include")
</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;'>+ include_directories("${CMAKE_CURRENT_SOURCE_DIR}")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -63,7 +68,11 @@ if(XTOOLS_LTO_SUPPORT)
</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(XTOOLS_TAPI_SUPPORT)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -ltapi")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if(XTOOLS_USE_TAPILITE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -ltapilite -lyaml")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  else()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -ltapi")
</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;'>+ add_definitions(-DLD_VERS="xtools-ld64-${LD64_VERSION_NUM}")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git tapilite/CMakeLists.txt tapilite/CMakeLists.txt
</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 0000000..c83334c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ tapilite/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,26 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++set(TAPI_FULL_VERSION "2.0.3" CACHE STRING "Specify tapi version.")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++message(STATUS "TAPI version: ${TAPI_FULL_VERSION}")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++set(TAPI_APPLE_VERSION "1000.10.8" CACHE STRING "Specify tapi version.")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++message(STATUS "APPLE Tapi version: ${TAPI_APPLE_VERSION}")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++set(TAPI_REPOSITORY_STRING "https://github.com/grobian/darwin-xtools.git" CACHE STRING
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  "Vendor-specific text for showing the repository the source is taken from.")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++if(TAPI_REPOSITORY_STRING)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  add_definitions(-DTAPI_REPOSITORY_STRING="${TAPI_REPOSITORY_STRING}")
</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;'>++set(TAPI_VENDOR "tapilite" CACHE STRING
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  "Vendor-specific text for showing with version information.")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++if (TAPI_VENDOR)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  add_definitions( -DTAPI_VENDOR="${TAPI_VENDOR} ")
</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 (TAPI_APPLE_VERSION)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  add_definitions( -DAPPLE_VERSION="${TAPI_APPLE_VERSION}")
</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;'>++add_subdirectory(src)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git tapilite/LICENSE.TXT tapilite/LICENSE.TXT
</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 0000000..06e331e
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ tapilite/LICENSE.TXT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,62 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++==============================================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++tapi License
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++==============================================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++University of Illinois/NCSA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++Open Source License
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++Copyright (c) 2011-2014 by the contributors listed in CREDITS.TXT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++Developed by:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    LLVM Team
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    University of Illinois at Urbana-Champaign
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    http://llvm.org
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++Permission is hereby granted, free of charge, to any person obtaining a copy of
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++this software and associated documentation files (the "Software"), to deal with
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++the Software without restriction, including without limitation the rights to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++of the Software, and to permit persons to whom the Software is furnished to do
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++so, subject to the following conditions:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    * Redistributions of source code must retain the above copyright notice,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      this list of conditions and the following disclaimers.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    * Redistributions in binary form must reproduce the above copyright notice,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      this list of conditions and the following disclaimers in the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      documentation and/or other materials provided with the distribution.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    * Neither the names of the LLVM Team, University of Illinois at
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      Urbana-Champaign, nor the names of its contributors may be used to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      endorse or promote products derived from this Software without specific
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      prior written permission.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++SOFTWARE.
</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;'>++The lld software contains code written by third parties.  Such software will
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++have its own individual LICENSE.TXT file in the directory in which it appears.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++This file will describe the copyrights, license, and restrictions which apply
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++to that code.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++The disclaimer of warranty in the University of Illinois Open Source License
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++applies to all code in the lld Distribution, and nothing in any of the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++other licenses gives permission to use the names of the LLVM Team or the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++University of Illinois to endorse or promote products derived from this
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++Software.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++The following pieces of software have additional or alternate copyrights,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++licenses, and/or restrictions:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++Program             Directory
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++-------             ---------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++<none yet>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git tapilite/README tapilite/README
</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 0000000..a28fe13
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ tapilite/README
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,6 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++This is a very minimal, LLVM-independent implementation of TAPI, such
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++that we can compile (and bootstrap) a linker that will be usable on
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++recent macOS without the need for LLVM.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++dependencies: libyaml
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++provides: required interfaces from ld64/src/ld/parsers/textstub_dylib_file
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git tapilite/include/tapi/Defines.h tapilite/include/tapi/Defines.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 0000000..00f6f2f
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ tapilite/include/tapi/Defines.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,32 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//===-- tapi/Defines.h - TAPI C++ Library Defines ---------------*- C++ -*-===//
</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 distributed under the University of Illinois Open Source
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// License. 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;'>++/// \file
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \brief TAPI C++ library defines.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \since 1.0
</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;'>++// Modified version for "tapilite", a standalone just enough
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// implementation for use without LLVM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef TAPI_DEFINES_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define TAPI_DEFINES_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define TAPI_INTERNAL tapi::internal
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define TAPI_NAMESPACE_INTERNAL_BEGIN namespace tapi { namespace internal {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define TAPI_NAMESPACE_INTERNAL_END } }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define TAPI_NAMESPACE_V1_BEGIN namespace tapi { inline namespace v1 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define TAPI_NAMESPACE_V1_END } }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define TAPI_PUBLIC __attribute__((visibility ("default")))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // TAPI_DEFINES_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git tapilite/include/tapi/LinkerInterfaceFile.h tapilite/include/tapi/LinkerInterfaceFile.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 0000000..51b8263
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ tapilite/include/tapi/LinkerInterfaceFile.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,496 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//===-- tapi/LinkerInterfaceFile.h - TAPI File Interface --------*- C++ -*-===*\
</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 distributed under the University of Illinois Open Source
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// License. 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;'>++/// \file
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \brief API for reading TAPI files.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \since 1.0
</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;'>++// Modified version for "tapilite", a standalone just enough
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// implementation for use without LLVM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef TAPI_LINKER_INTERFACE_FILE_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define TAPI_LINKER_INTERFACE_FILE_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <memory>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <string>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <tapi/Defines.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <vector>
</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;'>++/// \defgroup TAPI_LINKER_INTERFACE_FILE TAPI File APIs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \ingroup TAPI_CPP_API
</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;'>++using cpu_type_t = int;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using cpu_subtype_t = int;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++TAPI_NAMESPACE_V1_BEGIN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++class PackedVersion32;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++class Symbol;
</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;'>++/// \brief Defines a list of supported platforms.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++enum class Platform : unsigned {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief Unknown platform
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  Unknown = 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief Mac OS X
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  OSX = 1,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief iOS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  iOS = 2,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief watchOS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  watchOS = 3,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief tvOS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  tvOS = 4,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief bridgeOS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  bridgeOS = 5,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief zippered
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 2.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  zippered = 6,
</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;'>++/// \brief Defines a list of Objective-C constraints.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++enum class ObjCConstraint : unsigned {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief No constraint.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  None = 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief Retain/Release.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  Retain_Release = 1,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief Retain/Release for Simulator.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  Retain_Release_For_Simulator = 2,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief Retain/Release or Garbage Collection.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  Retain_Release_Or_GC = 3,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief Garbage Collection.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  GC = 4,
</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;'>++/// \brief Defines a list of supported file types.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++enum class FileType : unsigned {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief Unsupported file type.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  Unsupported = 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief Text-based Dynamic Library Stub File (.tbd) version 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  TBD_V1 = 1,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief Text-based stub file (.tbd) version 2.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  TBD_V2 = 2,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief Text-based stub file (.tbd) version 3.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  TBD_V3 = 3,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// format as seen on Big Sur
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  TBD_V4 = 4,
</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;'>++/// \brief Defines the cpu subtype matching mode.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++enum class CpuSubTypeMatching : unsigned {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief Fall-back to an ABI compatible slice if an exact match cannot be
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///        found.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ABI_Compatible = 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief Only accept a slice if the sub type matches.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  Exact = 1,
</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;'>++/// \brief Defines flags that control the parsing of text-based stub files.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \since 1.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++enum ParsingFlags : unsigned {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief Default flags.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  None = 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief Only accept a slice if the sub type matches. ABI fall-back mode is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///        the default.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ExactCpuSubType = 1U << 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief Disallow weak imported symbols. This adds weak imported symbols to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///        the ignore exports list.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  DisallowWeakImports = 1U << 1,
</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;'>++inline ParsingFlags operator|(ParsingFlags lhs, ParsingFlags rhs) noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return static_cast<ParsingFlags>(static_cast<unsigned>(lhs) |
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                   static_cast<unsigned>(rhs));
</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;'>++inline ParsingFlags operator|=(ParsingFlags &lhs, ParsingFlags rhs) noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  lhs = lhs | rhs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return lhs;
</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;'>++/// \brief TAPI File APIs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++class TAPI_PUBLIC LinkerInterfaceFile {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief Returns a list of supported file extensions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \returns a list of supported file extensions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  static std::vector<std::string> getSupportedFileExtensions() noexcept;
</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;'>++  /// \brief Indicate if the provided buffer is a supported Text-based Dynamic
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///        Library Stub file.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// Checks if the buffer is a supported format. This doesn't check for
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// malformed buffer content.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] path full path to the file.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] data raw pointer to start of buffer.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] size size of the buffer in bytes.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \returns true if the format is supported.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  static bool isSupported(const std::string &path, const uint8_t *data,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          size_t size) noexcept;
</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;'>++  /// \brief Check if we should prefer the text-based stub file.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] path full path to the text-based stub file.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \returns true if the tex-based stub file should be prefered over any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///          dynamic library.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  static bool shouldPreferTextBasedStubFile(const std::string &path) noexcept;
</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;'>++  /// \brief Check if the text-based stub file and the MachO dynamic library
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///        file are in sync.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// This validates both files against each other and checks if both files are
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// still in sync.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] tbdPath full path to the text-based stub file.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] dylibPath full path to the MachO dynamic library file.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \returns true if both files are in sync.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  static bool areEquivalent(const std::string &tbdPath,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                            const std::string &dylibPath) noexcept;
</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;'>++  /// \brief Create a LinkerInterfaceFile from the provided buffer.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// Parses the content of the provided buffer with the given constrains for
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// cpu type, cpu sub-type, matching requirement, and minimum deployment
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// version.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] path path to the file (for error message only).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] data raw pointer to start of buffer.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] size size of the buffer in bytes.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] cpuType The cpu type / architecture to check the file for.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] cpuSubType The cpu sub type / sub architecture to check the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///            file for.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] matchingMode Specified the cpu subtype matching mode.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] minOSVersion The minimum OS version / deployment target.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[out] errorMessage holds an error message when the return value is a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///             nullptr.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return nullptr on error
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \deprecated 1.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  static LinkerInterfaceFile *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  create(const std::string &path, const uint8_t *data, size_t size,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         cpu_type_t cpuType, cpu_subtype_t cpuSubType,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         CpuSubTypeMatching matchingMode, PackedVersion32 minOSVersion,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         std::string &errorMessage) noexcept;
</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;'>++  /// \brief Create a LinkerInterfaceFile from the provided buffer.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// Parses the content of the provided buffer with the given constrains for
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// cpu type, cpu sub-type, flags, and minimum deployment version.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] path path to the file (for error message only).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] data raw pointer to start of buffer.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] size size of the buffer in bytes.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] cpuType The cpu type / architecture to check the file for.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] cpuSubType The cpu sub type / sub architecture to check the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///            file for.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] flags Flags that control the parsing behavior.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] minOSVersion The minimum OS version / deployment target.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[out] errorMessage holds an error message when the return value is a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///             nullptr.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return nullptr on error
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \deprecated 1.3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  static LinkerInterfaceFile *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  create(const std::string &path, const uint8_t *data, size_t size,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         cpu_type_t cpuType, cpu_subtype_t cpuSubType, ParsingFlags flags,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         PackedVersion32 minOSVersion, std::string &errorMessage) noexcept;
</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;'>++  /// \brief Create a LinkerInterfaceFile from a file.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// Parses the content of the file with the given constrains for cpu type,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// cpu sub-type, flags, and minimum deployment version.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] path path to the file.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] cpuType The cpu type / architecture to check the file for.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] cpuSubType The cpu sub type / sub architecture to check the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///            file for.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] flags Flags that control the parsing behavior.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] minOSVersion The minimum OS version / deployment target.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[out] errorMessage holds an error message when the return value is a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///             nullptr.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return nullptr on error
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  static LinkerInterfaceFile *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  create(const std::string &path, cpu_type_t cpuType, cpu_subtype_t cpuSubType,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         ParsingFlags flags, PackedVersion32 minOSVersion,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         std::string &errorMessage) noexcept;
</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;'>++  /// \brief Query the file type.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return Returns the file type this TAPI file represents.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  FileType getFileType() const noexcept;
</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;'>++  /// \brief Query the platform
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return Returns the platform supported by the TAPI file.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  Platform getPlatform() const noexcept;
</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;'>++  /// \brief Query the install name.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return Returns the install name of the TAPI file.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  const std::string &getInstallName() const noexcept;
</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;'>++  /// \brief Query the install name is version specifc.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return True if the install name has been adjusted for the provided
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///         minimum OS version.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  bool isInstallNameVersionSpecific() const noexcept;
</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;'>++  /// \brief Query the current library version.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return Returns the current library version as 32bit packed version.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  PackedVersion32 getCurrentVersion() const noexcept;
</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;'>++  /// \brief Query the compatibility library version.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return Returns the compatibility library version as 32bit packed version.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  PackedVersion32 getCompatibilityVersion() const noexcept;
</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;'>++  /// \brief Query the Swift ABI version.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return Returns the Swift ABI version as unsigned integer.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  unsigned getSwiftVersion() const noexcept;
</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;'>++  /// \brief Query the Objective-C Constraint.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return Returns the Objetive-C constraint.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ObjCConstraint getObjCConstraint() const noexcept;
</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;'>++  /// \brief Query if the library has two level namespace.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return Returns true if the library has two level namespace.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  bool hasTwoLevelNamespace() const noexcept;
</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;'>++  /// \brief Query if the library is Applicatiuon Extension Safe.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return Returns true if the library is Application Extension Safe.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  bool isApplicationExtensionSafe() const noexcept;
</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;'>++  /// \brief Query if the library has any allowable clients.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return Return true if there are any allowable clients.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  bool hasAllowableClients() const noexcept;
</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;'>++  /// \brief Query if the library has any re-exported libraries.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return Return true if there are any re-exported libraries.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  bool hasReexportedLibraries() const noexcept;
</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;'>++  /// \brief Query if the library has any weak defined exports.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return Return true if there are any weak defined exports.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  bool hasWeakDefinedExports() const noexcept;
</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;'>++  /// \brief Obtain the name of the parent framework (umbrella framework).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return Returns the name of the parent framework (if it exists), otherwise
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///         an empty string.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  const std::string &getParentFrameworkName() const noexcept;
</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;'>++  /// \brief Obtain the list of allowable clients.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return Returns a list of allowable clients.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  const std::vector<std::string> &allowableClients() const noexcept;
</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;'>++  /// \brief Obtain the list of re-exported libraries.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return Returns a list of re-exported libraries.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  const std::vector<std::string> &reexportedLibraries() const noexcept;
</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;'>++  /// \brief Obtain a list of all symbols to be ignored.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return Returns a list of all symbols that should be ignored.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  const std::vector<std::string> &ignoreExports() const noexcept;
</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;'>++  /// \brief Obtain a list of all exported symbols.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return Returns a list of all exported symbols.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  const std::vector<Symbol> &exports() const noexcept;
</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;'>++  /// \brief Obtain a list of all undefined symbols.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return Returns a list of all undefined symbols.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  const std::vector<Symbol> &undefineds() const noexcept;
</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;'>++  /// \brief Obtain a list of all inlined frameworks.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return Returns a list of install names of all inlined frameworks.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  const std::vector<std::string> &inlinedFrameworkNames() const noexcept;
</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;'>++  /// \brief Create a LinkerInterfaceFile from the specified inlined framework.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// Creates a LinkerInterfaceFile with the given constrains for cpu type,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// cpu sub-type, flags, and minimum deployment version.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] installName install name of the inlined framework.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] cpuType The cpu type / architecture to check the file for.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] cpuSubType The cpu sub type / sub architecture to check the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///            file for.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] flags Flags that control the parsing behavior.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[in] minOSVersion The minimum OS version / deployment target.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \param[out] errorMessage holds an error message when the return value is a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///             nullptr.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return nullptr on error
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  LinkerInterfaceFile *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  getInlinedFramework(const std::string &installName, cpu_type_t cpuType,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      cpu_subtype_t cpuSubType, ParsingFlags flags,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      PackedVersion32 minOSVersion,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      std::string &errorMessage) const noexcept;
</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;'>++  /// \brief Destructor.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ~LinkerInterfaceFile() noexcept;
</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;'>++  /// \brief Copy constructor (deleted).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  LinkerInterfaceFile(const LinkerInterfaceFile &) noexcept = delete;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  LinkerInterfaceFile &operator=(const LinkerInterfaceFile &) noexcept = delete;
</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;'>++  /// \brief Move constructor.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  LinkerInterfaceFile(LinkerInterfaceFile &&) noexcept;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  LinkerInterfaceFile &operator=(LinkerInterfaceFile &&) noexcept;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++private:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  LinkerInterfaceFile() noexcept;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  class Impl;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  class ImplData;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  std::unique_ptr<Impl> _pImpl;
</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;'>++TAPI_NAMESPACE_V1_END
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // TAPI_LINKER_INTERFACE_FILE_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git tapilite/include/tapi/PackedVersion32.h tapilite/include/tapi/PackedVersion32.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 0000000..f8d96d0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ tapilite/include/tapi/PackedVersion32.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,109 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//===-- tapi/PackedVersion32.h - TAPI Packed Version 32 ---------*- C++ -*-===*\
</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 distributed under the University of Illinois Open Source
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// License. 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;'>++/// \file
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \brief Defines the packed version number.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \since 1.0
</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;'>++// Modified version for "tapilite", a standalone just enough
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// implementation for use without LLVM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef TAPI_PACKED_VERSION_32_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define TAPI_PACKED_VERSION_32_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <tapi/Defines.h>
</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;'>++/// \defgroup TAPI_PACKED_VERSION_32 Packed Version handling
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \ingroup TAPI_CPP_API
</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;'>++TAPI_NAMESPACE_V1_BEGIN
</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;'>++/// \brief Packed Version Number Encoding.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// The Mach-O version numbers are commonly encoded as a 32bit value, where the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// upper 16 bit quantity is used for the major version number and the lower two
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// 8 bit quantities as minor version number and patch version number.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++class TAPI_PUBLIC PackedVersion32 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++private:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  uint32_t _version;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief Default construct a PackedVersion32.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  PackedVersion32() = default;
</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;'>++  /// \brief Construct a PackedVersion32 with a raw value.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  PackedVersion32(uint32_t rawVersion) : _version(rawVersion) {}
</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;'>++  /// \brief Construct a PackedVersion32 with the provided major, minor, and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// patch version number.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  PackedVersion32(unsigned major, unsigned minor, unsigned patch)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      : _version((major << 16) | ((minor & 0xff) << 8) | (patch & 0xff)) {}
</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;'>++  /// \brief Get the major version number.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return The major version number as unsigned integer.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  unsigned getMajor() const { return _version >> 16; }
</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;'>++  /// \brief Get the minor version number.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return The minor version number as unsigned integer.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  unsigned getMinor() const { return (_version >> 8) & 0xff; }
</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;'>++  /// \brief Get the patch version number.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return The patch version number as unsigned integer.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  unsigned getPatch() const { return _version & 0xff; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  bool operator<(const PackedVersion32 &rhs) const {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return _version < rhs._version;
</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;'>++  bool operator==(const PackedVersion32 &rhs) const {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return _version == rhs._version;
</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;'>++  bool operator!=(const PackedVersion32 &rhs) const {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return _version != rhs._version;
</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;'>++  operator unsigned() const { return _version; }
</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;'>++TAPI_NAMESPACE_V1_END
</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;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // TAPI_PACKED_VERSION_32_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git tapilite/include/tapi/Symbol.h tapilite/include/tapi/Symbol.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 0000000..cb79919
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ tapilite/include/tapi/Symbol.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,136 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//===-- tapi/Symbol.h - TAPI Symbol -----------------------------*- C++ -*-===*\
</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 distributed under the University of Illinois Open Source
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// License. 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;'>++/// \file
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \brief Defines a symbol.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \since 1.0
</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;'>++// Modified version for "tapilite", a standalone just enough
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// implementation for use without LLVM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef TAPI_SYMBOL_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define TAPI_SYMBOL_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <tapi/Defines.h>
</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;'>++/// \defgroup TAPI_SYMBOL Symbol API
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \ingroup TAPI_CPP_API
</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;'>++TAPI_NAMESPACE_V1_BEGIN
</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;'>++/// \brief Symbol flags.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++enum class SymbolFlags : unsigned {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief No flags
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  None = 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief Thread-local value symbol
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ThreadLocalValue = 1U << 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief Weak defined symbol
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  WeakDefined = 1U << 1,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \brief Weak referenced symbol
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  WeakReferenced = 1U << 2,
</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;'>++enum class SymbolKind : unsigned {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  GlobalSymbol,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ObjectiveCClass,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ObjectiveCClassEHType,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ObjectiveCInstanceVariable,
</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;'>++inline SymbolFlags operator&(const SymbolFlags &lhs,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                             const SymbolFlags &rhs) noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return static_cast<SymbolFlags>(static_cast<unsigned>(lhs) &
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                  static_cast<unsigned>(rhs));
</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;'>++/// \brief Provides query methods for symbols.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++class TAPI_PUBLIC Symbol {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  template <typename Tp>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  Symbol(Tp &&name, SymbolFlags flags = SymbolFlags::None,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      SymbolKind kind = SymbolKind::GlobalSymbol)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      : _name(std::forward<Tp>(name)), _flags(flags), _kind(kind) {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  SymbolKind getKind() const { return _kind; }
</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;'>++  /// \brief Get the symbol name as string.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return A string with the symbol name.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  inline const std::string &getName() const noexcept { return _name; }
</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;'>++  /// \brief Obtain the symbol flags.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return Returns the symbol flags.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  inline SymbolFlags getFlags() const noexcept { return _flags; }
</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;'>++  /// \brief Query if the symbol is thread-local.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return True if the symbol is a thread-local value, false otherwise.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  inline bool isThreadLocalValue() const noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return (_flags & SymbolFlags::ThreadLocalValue) ==
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           SymbolFlags::ThreadLocalValue;
</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;'>++  /// \brief Query if the symbol is weak defined.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return True if the symbol is weak defined, false otherwise.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  inline bool isWeakDefined() const noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return (_flags & SymbolFlags::WeakDefined) == SymbolFlags::WeakDefined;
</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;'>++  /// \brief Query if the symbol is weak referenced.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return True if the symbol is weak referenced, false otherwise.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  inline bool isWeakReferenced() const noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return (_flags & SymbolFlags::WeakReferenced) ==
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           SymbolFlags::WeakReferenced;
</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;'>++private:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  SymbolKind _kind;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  std::string _name;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  SymbolFlags _flags;
</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;'>++TAPI_NAMESPACE_V1_END
</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;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // TAPI_SYMBOL_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git tapilite/include/tapi/Version.h tapilite/include/tapi/Version.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 0000000..6fcbda4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ tapilite/include/tapi/Version.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,63 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//===-- tapi/Version.h - TAPI Version Interface -----------------*- C++ -*-===*\
</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 distributed under the University of Illinois Open Source
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// License. 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;'>++/// \file
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \brief Access the TAPI version information.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \since 1.0
</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;'>++// Modified version for "tapilite", a standalone just enough
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// implementation for use without LLVM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef TAPI_VERSION_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define TAPI_VERSION_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <string>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <tapi/Defines.h>
</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;'>++/// \defgroup TAPI_VERSION Version methods
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \ingroup TAPI_CPP_API
</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;'>++namespace tapi {
</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;'>++/// \brief Access to version related information about the TAPI dynamic library.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++class TAPI_PUBLIC Version {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \name Version Number Methods
</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;'>++  /// \brief Get the full library name and version as string.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \return A string with the program name and version number.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// \since 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  static std::string getFullVersionAsString() noexcept;
</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;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++} // namespace tapi
</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;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // TAPI_VERSION_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git tapilite/include/tapi/tapi.h tapilite/include/tapi/tapi.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 0000000..6cc2fd6
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ tapilite/include/tapi/tapi.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,34 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//===-- tapi/tapi.h - TAPI C++ Library Interface ----------------*- C++ -*-===//
</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 distributed under the University of Illinois Open Source
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// License. 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;'>++/// \file
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \brief This is the umbrella header for the TAPI C++ Library Interface.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \since 1.0
</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;'>++// Modified version for "tapilite", a standalone just enough
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// implementation for use without LLVM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef TAPI_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define TAPI_H
</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;'>++/// \defgroup TAPI_CPP_API TAPI C++ API
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// The C++ Application Programming Interface (API) for the TAPI 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;'>++#include <tapi/Defines.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <tapi/LinkerInterfaceFile.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <tapi/PackedVersion32.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <tapi/Symbol.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <tapi/Version.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // TAPI_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git tapilite/src/CMakeLists.txt tapilite/src/CMakeLists.txt
</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 0000000..4765f3a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ tapilite/src/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,12 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++set(TAPILITE_SOURCES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  LinkerInterfaceFile.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  Version.cpp
</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;'>++add_library(tapilite ${TAPILITE_SOURCES})
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++include_directories("${CMAKE_SOURCE_DIR}/tapilite/include")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++include_directories("${CMAKE_SOURCE_DIR}/ld64/src/abstraction")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# for configure.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++include_directories("${CMAKE_BINARY_DIR}/ld64")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git tapilite/src/LinkerInterfaceFile.cpp tapilite/src/LinkerInterfaceFile.cpp
</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 0000000..ad6407f
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ tapilite/src/LinkerInterfaceFile.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,1057 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//===- libtapi/LinkerInterfaceFile.cpp - TAPI File Interface ----*- C++ -*-===//
</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 distributed under the University of Illinois Open Source
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// License. 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;'>++/// \file
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \brief Implements the C++ linker interface file API.
</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;'>++// Modified version for "tapilite", a standalone just enough
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// implementation for use without LLVM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <string>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <tapi/LinkerInterfaceFile.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <tapi/PackedVersion32.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <tapi/Symbol.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <vector>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <iterator>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <fstream>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <algorithm>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <yaml.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <MachOFileAbstraction.hpp>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++TAPI_NAMESPACE_V1_BEGIN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//using namespace tapi::internal;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static PackedVersion32 parseVersion32(std::string str) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  size_t    len = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  uint32_t  version = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  size_t    num = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (str.empty())
</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;'>++  len = str.find_first_of(".");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (len == std::string::npos)
</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;'>++  num = std::stoull(str, &len, 10);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (len == 0)
</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;'>++  if (num > UINT16_MAX)
</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;'>++  version = num << 16;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  str = str.substr(len + 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  len = str.find_first_of(".");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (len != std::string::npos) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    num = std::stoull(str, &len, 10);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (len == 0)
</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;'>++    if (num > UINT8_MAX)
</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;'>++    version |= (num << 8);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    str = str.substr(len + 1);
</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 (!str.empty()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    num = std::stoull(str, &len, 10);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (len == 0)
</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;'>++    if (num > UINT8_MAX)
</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;'>++    version |= num;
</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;'>++  return version;
</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;'>++class LinkerInterfaceFile::ImplData {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  std::string _path;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  FileType _fileType{FileType::Unsupported};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  Platform _platform{Platform::Unknown};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  std::string _installName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  PackedVersion32 _currentVersion;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  PackedVersion32 _compatibilityVersion;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  unsigned _swiftABIVersion;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ObjCConstraint _objcConstraint;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  std::vector<std::string> _reexportedLibraries;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  std::vector<std::string> _allowableClients;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  std::vector<Symbol *> _exports;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  std::vector<Symbol *> _undefineds;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  std::vector<std::string> _arches;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  std::string _selectedArch;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ImplData() noexcept = default;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  static LinkerInterfaceFile::ImplData *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    loadFile(const std::string &path, const uint8_t *data, size_t size,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        cpu_type_t cpuType, cpu_subtype_t cpuSubType,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        std::string &errorMessage);
</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;'>++class LinkerInterfaceFile::Impl {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  std::shared_ptr<const LinkerInterfaceFile::ImplData> _data;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  std::string _installName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  std::string _parentFrameworkName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  PackedVersion32 _compatibilityVersion;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  std::vector<std::string> _ignoreExports;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  std::vector<std::string> _inlinedFrameworkNames;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  std::vector<Symbol> _exports;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  std::vector<Symbol> _undefineds;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  bool _hasTwoLevelNamespace{false};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  bool _isAppExtensionSafe{false};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  bool _hasWeakDefExports{false};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  bool _installPathOverride{false};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  Impl() noexcept = default;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  bool init(const std::shared_ptr<const LinkerInterfaceFile::ImplData> &data,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            cpu_type_t cpuType, cpu_subtype_t cpuSubType, ParsingFlags flags,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            PackedVersion32 minOSVersion, std::string &errorMessage) noexcept;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  template <typename T> void addSymbol(T &&name, SymbolFlags flags) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (std::find(_ignoreExports.begin(), _ignoreExports.end(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          name) == _ignoreExports.end())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      _exports.emplace_back(std::forward<T>(name), flags);
</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;'>++  void processSymbol(std::string name, PackedVersion32 minOSVersion,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                     bool disallowWeakImports) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    // $ld$ <action> $ <condition> $ <symbol-name>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (name.substr(0, sizeof("$ld$") - 1).compare("$ld$") != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    name = name.substr(sizeof("$ld$") - 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    size_t pos = name.find_first_of("$");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (pos == std::string::npos)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    auto action = name.substr(0, pos);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    name = name.substr(pos + 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    pos = name.find_first_of("$");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (pos == std::string::npos)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    auto condition = name.substr(0, pos);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    name = name.substr(pos + 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (name.empty())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    auto symbolName = name; 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (condition.substr(0, sizeof("os") - 1).compare("os") != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    auto version = parseVersion32(condition.substr(sizeof("os") - 1));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (version != minOSVersion)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (action.compare("hide") == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      _ignoreExports.emplace_back(symbolName);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return;
</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 (action.compare("add") == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      _exports.emplace_back(symbolName);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return;
</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 (action.compare("weak") == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      if (disallowWeakImports)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        _ignoreExports.emplace_back(symbolName);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return;
</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 (action.compare("install_name") == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      _installName = symbolName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      _installPathOverride = true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      if (_installName == "/System/Library/Frameworks/"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          "ApplicationServices.framework/Versions/A/"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          "ApplicationServices") {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        _compatibilityVersion = parseVersion32("1.0");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return;
</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 (action.compare("compatibility_version") == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      _compatibilityVersion = parseVersion32(symbolName);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return;
</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;'>++static std::string getArchForCPU(cpu_type_t cpuType, cpu_subtype_t cpuSubType,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                  bool enforceCpuSubType) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /* this function is deliberately stupid, for the fine details of
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++   * subtypes we need more checking, which isn't necessary for the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++   * general case */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  switch (cpuType) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    case CPU_TYPE_I386:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return "i386";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    case CPU_TYPE_X86_64:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return "x86_64";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    case CPU_TYPE_ARM:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return "arm";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    case CPU_TYPE_POWERPC:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return "ppc";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    case CPU_TYPE_POWERPC64:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return "ppc64";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    case CPU_TYPE_ARM64:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return "arm64";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  case CPU_TYPE_ANY:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return "";  /* meant to match first arch */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return "unsupported";
</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;'>++LinkerInterfaceFile::LinkerInterfaceFile() noexcept
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    : _pImpl{new LinkerInterfaceFile::Impl} {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++LinkerInterfaceFile::~LinkerInterfaceFile() noexcept = default;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++LinkerInterfaceFile::LinkerInterfaceFile(LinkerInterfaceFile &&) noexcept =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    default;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++LinkerInterfaceFile &
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++LinkerInterfaceFile::operator=(LinkerInterfaceFile &&) noexcept = default;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++std::vector<std::string>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++LinkerInterfaceFile::getSupportedFileExtensions() noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return {".tbd"};
</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;'>++/// \brief Load and parse the provided TBD file in the buffer and return on
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++///        success the interface file.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++LinkerInterfaceFile::ImplData *LinkerInterfaceFile::ImplData::loadFile(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const std::string &path, const uint8_t *data, size_t size,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    cpu_type_t cpuType, cpu_subtype_t cpuSubType,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    std::string &errorMessage) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  auto          ret = new LinkerInterfaceFile::ImplData;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  yaml_parser_t parser;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  yaml_event_t  event;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  yaml_char_t  *p;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  bool          selectSection = false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ret->_path = path;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /* Because platform isn't passed onto us by ld, we cannot know what to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++   * select -- this is probably the problem meant to be solved by TAPIv4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++   * which explicitly refers to targets such that arm64-macos is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++   * different from arm64-ios.  Alas, for now it seems this mix isn't
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++   * there for (system) tbd files, so we just ignore platform, and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++   * return the first one that matches the cpu specification. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  std::string myarch = getArchForCPU(cpuType, cpuSubType, false);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  enum {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_INIT,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_HEADER,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_EXPORTS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_UNDEFINEDS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_REEXPORTS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_DONE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }             state = TAPILITE_INIT;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  enum {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_FINDKEY,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_ARCHS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_UUIDS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_PLATFORM,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_FLAGS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_INSTALLNAME,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_CURVERSION,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_COMPATVERSION,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_SWIFTVERSION,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_OBJCCONSTR,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_PARENTUMBR,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_ALLOWED_CLNTS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_SYMBOLS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_RE_EXPORTS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_OBJCCLASSES,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_OBJCEHTYPES,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_OBJCIVARS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_WEAKDEFSYMS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_THRLOCSYMS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_VERSION
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }             substate = TAPILITE_FINDKEY;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  enum {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_V_INVALID,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_V1,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_V2,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_V3,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_V4_OR_LATER,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TAPILITE_V4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }             version = TAPILITE_V1;  /* default for tagless */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  yaml_parser_initialize(&parser);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  yaml_parser_set_input_string(&parser,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      reinterpret_cast<const unsigned char *>(data), size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define error(...) { \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  char errbuf[256]; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  snprintf(errbuf, sizeof(errbuf), __VA_ARGS__); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  errorMessage = errbuf; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return nullptr; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /* syntax:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++   * https://github.com/apple/llvm-project/blob/apple/main/llvm/lib/TextAPI/MachO/TextStub.cpp */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  while (state != TAPILITE_DONE) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (state != TAPILITE_INIT)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      yaml_event_delete(&event);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      state = TAPILITE_HEADER;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (!yaml_parser_parse(&parser, &event))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define ymlcmp(X, Y) strcmp((char *)X, Y)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define ymlncmp(X, Y, Z) strncmp((char *)X, Y, Z)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* process */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    switch (event.type) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      case YAML_STREAM_END_EVENT:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        state = TAPILITE_DONE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      case YAML_SCALAR_EVENT:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define yamlscalar event.data.scalar
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (yamlscalar.value != NULL && substate == TAPILITE_FINDKEY) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          switch (state) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            case TAPILITE_HEADER:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              if (ymlcmp(yamlscalar.value, "archs") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_ARCHS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              if (ymlcmp(yamlscalar.value, "targets") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_ARCHS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "platform") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_PLATFORM;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "install-name") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_INSTALLNAME;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "current-version") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_CURVERSION;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "compatibility-version") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_COMPATVERSION;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "swift-version") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_SWIFTVERSION;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "swift-abi-version") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_SWIFTVERSION;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "objc-constraint") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_OBJCCONSTR;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "uuids") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_UUIDS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "parent-umbrella") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_PARENTUMBR;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "allowable-clients") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_ALLOWED_CLNTS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "flags") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_FLAGS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "tbd-version") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_VERSION;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "exports") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                state = TAPILITE_EXPORTS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "undefineds") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                state = TAPILITE_UNDEFINEDS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            case TAPILITE_EXPORTS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            case TAPILITE_REEXPORTS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              if (ymlcmp(yamlscalar.value, "archs") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_ARCHS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              if (ymlcmp(yamlscalar.value, "targets") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_ARCHS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "allowed-clients") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_ALLOWED_CLNTS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "re-exports") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_RE_EXPORTS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "symbols") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_SYMBOLS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "objc-classes") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_OBJCCLASSES;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "objc-eh-types") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_OBJCEHTYPES;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "objc-ivars") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_OBJCIVARS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "weak-def-symbols") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_WEAKDEFSYMS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "weak-symbols") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_WEAKDEFSYMS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "thread-local-symbols") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_THRLOCSYMS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            case TAPILITE_UNDEFINEDS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              if (ymlcmp(yamlscalar.value, "archs") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_ARCHS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              if (ymlcmp(yamlscalar.value, "targets") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_ARCHS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "symbols") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_SYMBOLS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "objc-classes") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_OBJCCLASSES;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "objc-eh-types") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_OBJCEHTYPES;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "objc-ivars") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_OBJCIVARS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "weak-ref-symbols") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_WEAKDEFSYMS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "weak-symbols") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_WEAKDEFSYMS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              break;
</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;'>++          /* reset selection selector */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          if (substate == TAPILITE_ARCHS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            selectSection = false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        } else if (substate != TAPILITE_FINDKEY) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          /* we have a real value, need to append it to whatever is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           * currently the open thing we're writing for */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          switch (state) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            case TAPILITE_HEADER:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              switch (substate) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_VERSION:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (version == TAPILITE_V4_OR_LATER) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    if (ymlcmp(yamlscalar.value, "4") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      version = TAPILITE_V4;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      error("unsupported TAPI version %s", yamlscalar.value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    error("found tbd-version for TAPI version <v4");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_ARCHS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  /* this is the point where version needs to be set */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (version == TAPILITE_V4_OR_LATER ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      version == TAPILITE_V_INVALID)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    error("unknown tbd file, unknown version specified");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (ret->_fileType == FileType::Unsupported) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    /* apply defaults for various settings based on the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                     * TAPI version */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    switch (version) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      case TAPILITE_V1:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        ret->_currentVersion = parseVersion32("1.0");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        ret->_compatibilityVersion = parseVersion32("1.0");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        ret->_swiftABIVersion = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        ret->_objcConstraint = ObjCConstraint::None;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      case TAPILITE_V2:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      case TAPILITE_V3:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      case TAPILITE_V4:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        ret->_currentVersion = parseVersion32("1.0");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        ret->_compatibilityVersion = parseVersion32("1.0");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        ret->_swiftABIVersion = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        ret->_objcConstraint = ObjCConstraint::Retain_Release;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        break;
</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 (version == TAPILITE_V1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      ret->_fileType == FileType::TBD_V1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    else if (version == TAPILITE_V2)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      ret->_fileType == FileType::TBD_V2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    else if (version == TAPILITE_V3)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      ret->_fileType == FileType::TBD_V3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    else if (version == TAPILITE_V4)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      ret->_fileType == FileType::TBD_V4;
</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;'>++                  ret->_arches.emplace_back(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      std::string((const char *)yamlscalar.value));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (!ret->_selectedArch.empty())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    break;  /* take first matching arch */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  switch (version) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    case TAPILITE_V4:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        /* extract arch, platform out of target, set
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                         * platform if arch matches */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        size_t len = myarch.length();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        if (ymlncmp(yamlscalar.value, myarch.c_str(), len) == 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                            && yamlscalar.value[len] == '-')
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          ret->_selectedArch =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                            std::string((const char *)yamlscalar.value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          /* this is a copy of the PLATFORM case below */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          if (ymlcmp(yamlscalar.value + len + 1, "macosx") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                            ret->_platform = Platform::OSX;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          else if (ymlcmp(yamlscalar.value + len + 1,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                "ios") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                            ret->_platform = Platform::iOS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          /* TODO: see below */
</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;'>++                      break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      /* see if arch matches */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      if (ymlcmp(yamlscalar.value, myarch.c_str()))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        ret->_selectedArch = myarch;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_PLATFORM:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (ymlcmp(yamlscalar.value, "macosx") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    ret->_platform = Platform::OSX;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  else if (ymlcmp(yamlscalar.value, "ios") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    ret->_platform = Platform::iOS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  /* TODO: does it really make a difference to check for
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                   * the rest? */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_INSTALLNAME:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  ret->_installName =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    std::string((const char *)yamlscalar.value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_CURVERSION:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  ret->_currentVersion =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    parseVersion32((const char *)yamlscalar.value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_COMPATVERSION:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  ret->_compatibilityVersion =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    parseVersion32((const char *)yamlscalar.value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_SWIFTVERSION:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  ret->_swiftABIVersion =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    std::stoull((const char *)yamlscalar.value, NULL, 10);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_OBJCCONSTR:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (ymlcmp(yamlscalar.value, "none") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    ret->_objcConstraint = ObjCConstraint::None;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  else if (ymlcmp(yamlscalar.value, "retain_release") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    ret->_objcConstraint = ObjCConstraint::Retain_Release;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  else if (ymlcmp(yamlscalar.value,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        "retain_release_for_simulator") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    ret->_objcConstraint =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      ObjCConstraint::Retain_Release_For_Simulator;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  else if (ymlcmp(yamlscalar.value,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        "retain_release_or_gc") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    ret->_objcConstraint =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      ObjCConstraint::Retain_Release_Or_GC;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  else if (ymlcmp(yamlscalar.value, "gc") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    ret->_objcConstraint = ObjCConstraint::GC;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_ALLOWED_CLNTS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  ret->_allowableClients.emplace_back(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      std::string((const char *)yamlscalar.value));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_UUIDS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_PARENTUMBR:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_FLAGS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  /* ignored: there's currently no consumer for it from
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                   * ld64 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            case TAPILITE_EXPORTS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            case TAPILITE_REEXPORTS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              switch (substate) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_ARCHS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  /* remember: for V4, we store target in selectedArch */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (ymlcmp(yamlscalar.value, ret->_selectedArch.c_str()) == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    selectSection = true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_ALLOWED_CLNTS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  /* should respect this, but for now we just ignore it */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_RE_EXPORTS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_SYMBOLS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (!selectSection)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  ret->_exports.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      std::string((const char *)yamlscalar.value),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      SymbolFlags::None, SymbolKind::GlobalSymbol));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_OBJCCLASSES:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (!selectSection)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  ret->_exports.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      std::string((const char *)yamlscalar.value),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      SymbolFlags::None, SymbolKind::ObjectiveCClass));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_OBJCEHTYPES:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (!selectSection)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  ret->_exports.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      std::string((const char *)yamlscalar.value),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      SymbolFlags::None, SymbolKind::ObjectiveCClassEHType));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_OBJCIVARS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (!selectSection)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  ret->_exports.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      std::string((const char *)yamlscalar.value),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      SymbolFlags::None,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      SymbolKind::ObjectiveCInstanceVariable));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_WEAKDEFSYMS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (!selectSection)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  ret->_exports.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      std::string((const char *)yamlscalar.value),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      SymbolFlags::WeakDefined, SymbolKind::GlobalSymbol));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_THRLOCSYMS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (!selectSection)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  ret->_exports.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      std::string((const char *)yamlscalar.value),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      SymbolFlags::ThreadLocalValue, SymbolKind::GlobalSymbol));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            case TAPILITE_UNDEFINEDS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              switch (substate) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_ARCHS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  /* remember: for V4, we store target in selectedArch */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (ymlcmp(yamlscalar.value, ret->_selectedArch.c_str()) == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    selectSection = true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_SYMBOLS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (!selectSection)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  ret->_undefineds.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      std::string((const char *)yamlscalar.value),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      SymbolFlags::None, SymbolKind::GlobalSymbol));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_OBJCCLASSES:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (!selectSection)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  ret->_undefineds.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      std::string((const char *)yamlscalar.value),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      SymbolFlags::None, SymbolKind::ObjectiveCClass));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_OBJCEHTYPES:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (!selectSection)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  ret->_undefineds.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      std::string((const char *)yamlscalar.value),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      SymbolFlags::None, SymbolKind::ObjectiveCClassEHType));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_OBJCIVARS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (!selectSection)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  ret->_undefineds.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      std::string((const char *)yamlscalar.value),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      SymbolFlags::None,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      SymbolKind::ObjectiveCInstanceVariable));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case TAPILITE_WEAKDEFSYMS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (!selectSection)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  ret->_undefineds.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      std::string((const char *)yamlscalar.value),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      SymbolFlags::WeakReferenced, SymbolKind::GlobalSymbol));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              break;
</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;'>++        break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      case YAML_SEQUENCE_START_EVENT:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      case YAML_SEQUENCE_END_EVENT:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        substate = TAPILITE_FINDKEY;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      case YAML_MAPPING_START_EVENT:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define yamlms event.data.mapping_start
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        switch (state) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          case TAPILITE_HEADER:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if (yamlms.tag == NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if (ymlncmp(yamlms.tag, "!tapi-tbd",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  sizeof("!tapi-tbd") - 1) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            p = yamlms.tag += sizeof("!tapi-tbd") - 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if (*p == '\0') {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              /* this could be version 4 or later, in which case we
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++               * expect a tbd-version key */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              version = TAPILITE_V4_OR_LATER;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            } else if (*p == '-' && p[1] == 'v') {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              p += 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              switch (*p) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case '1':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  /* technically shouldn't be in use */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  version = TAPILITE_V1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case '2':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  version = TAPILITE_V2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                case '3':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  version = TAPILITE_V3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  version = TAPILITE_V_INVALID;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</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;'>++            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            /* ignore */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        substate = TAPILITE_FINDKEY;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      case YAML_MAPPING_END_EVENT:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      /* TODO: could use this to close list pointers or something */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        break;
</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;'>++  yaml_event_delete(&event);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  yaml_parser_delete(&parser);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#undef error
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return ret;
</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;'>++bool LinkerInterfaceFile::isSupported(const std::string &path,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const uint8_t *data,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    size_t size) noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  std::string err;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  auto file = LinkerInterfaceFile::ImplData::loadFile(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      path, data, size, CPU_TYPE_ANY, CPU_SUBTYPE_MULTIPLE, err);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return file && file->_platform != Platform::Unknown;
</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;'>++bool LinkerInterfaceFile::shouldPreferTextBasedStubFile(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const std::string &path) noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  std::string err;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  std::ifstream ifs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ifs.open(path, std::ifstream::in);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  auto data = std::string(std::istreambuf_iterator<char>{ifs}, {});
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  auto file = LinkerInterfaceFile::ImplData::loadFile(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      path, (const uint8_t *)data.c_str(), data.length(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    CPU_TYPE_ANY, CPU_SUBTYPE_MULTIPLE, err);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return file && file->_platform != Platform::Unknown;
</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;'>++bool LinkerInterfaceFile::areEquivalent(const std::string &tbdPath,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                        const std::string &dylibPath) noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // Simple decision, always prefer dylib over textstub if it exists,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // don't check anything, so we don't have to implement Mach-O reading
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // to check that UUIDs match
</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;'>++bool LinkerInterfaceFile::Impl::init(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const std::shared_ptr<const LinkerInterfaceFile::ImplData> &data,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    cpu_type_t cpuType, cpu_subtype_t cpuSubType, ParsingFlags flags,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    PackedVersion32 minOSVersion, std::string &errorMessage) noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  _data = data;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  bool enforceCpuSubType = flags & ParsingFlags::ExactCpuSubType;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  auto arch = getArchForCPU(cpuType, cpuSubType, enforceCpuSubType);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (arch.compare("unsupported") == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    auto count = data->_arches.size();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (count > 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      errorMessage = "missing required architecture " +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                     arch + " in file " +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                     data->_path + " (" + std::to_string(count) +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                     " slices)";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      errorMessage = "missing required architecture " +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                     arch + " in file " +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                     data->_path;
</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;'>++  _compatibilityVersion = data->_compatibilityVersion;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // Remove the patch level.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  minOSVersion =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      PackedVersion32(minOSVersion.getMajor(), minOSVersion.getMinor(), 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // Pre-scan for special linker symbols.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  for (auto *symbol : _data->_exports) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (symbol->getKind() != SymbolKind::GlobalSymbol)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      continue;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    processSymbol(symbol->getName(), minOSVersion,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  flags & ParsingFlags::DisallowWeakImports);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  std::sort(_ignoreExports.begin(), _ignoreExports.end());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  auto last = std::unique(_ignoreExports.begin(), _ignoreExports.end());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  _ignoreExports.erase(last, _ignoreExports.end());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  bool useObjC1ABI =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      (data->_platform == Platform::OSX) && (arch.compare("i386") == 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  for (const auto *symbol : data->_exports) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    switch (symbol->getKind()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    case SymbolKind::GlobalSymbol:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      if (symbol->getName().substr(0, 4).compare("$ld$") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        continue;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      addSymbol(symbol->getName(), symbol->getFlags());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    case SymbolKind::ObjectiveCClass:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      if (useObjC1ABI) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        addSymbol(".objc_class_name_" + symbol->getName(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  symbol->getFlags());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        addSymbol("_OBJC_CLASS_$_" + symbol->getName(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  symbol->getFlags());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        addSymbol("_OBJC_METACLASS_$_" + symbol->getName(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  symbol->getFlags());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    case SymbolKind::ObjectiveCClassEHType:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      addSymbol("_OBJC_EHTYPE_$_" + symbol->getName(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                symbol->getFlags());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    case SymbolKind::ObjectiveCInstanceVariable:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      addSymbol("_OBJC_IVAR_$_" + symbol->getName(), symbol->getFlags());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      break;
</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 (symbol->isWeakDefined())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      _hasWeakDefExports = 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;'>++  for (const auto *symbol : data->_undefineds) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    switch (symbol->getKind()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    case SymbolKind::GlobalSymbol:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      _undefineds.emplace_back(symbol->getName(), symbol->getFlags());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    case SymbolKind::ObjectiveCClass:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      if (useObjC1ABI) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        _undefineds.emplace_back(".objc_class_name_" + symbol->getName(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                 symbol->getFlags());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        _undefineds.emplace_back("_OBJC_CLASS_$_" + symbol->getName(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                 symbol->getFlags());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        _undefineds.emplace_back("_OBJC_METACLASS_$_" + symbol->getName(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                 symbol->getFlags());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    case SymbolKind::ObjectiveCClassEHType:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      _undefineds.emplace_back("_OBJC_EHTYPE_$_" + symbol->getName(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                               symbol->getFlags());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    case SymbolKind::ObjectiveCInstanceVariable:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      _undefineds.emplace_back("_OBJC_IVAR_$_" + symbol->getName(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                               symbol->getFlags());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      break;
</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;'>++  /* TODO we don't handle multiple documents, vague how it works/what it is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  for (auto &file : interface->_documents) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    auto framework = std::static_pointer_cast<const InterfaceFile>(file);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    _inlinedFrameworkNames.emplace_back(framework->getInstallName());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    _inlinedFrameworks.emplace_back(framework);
</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;'>++  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;'>++LinkerInterfaceFile *LinkerInterfaceFile::create(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const std::string &path, const uint8_t *data, size_t size,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    cpu_type_t cpuType, cpu_subtype_t cpuSubType,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    CpuSubTypeMatching matchingMode, PackedVersion32 minOSVersion,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    std::string &errorMessage) noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ParsingFlags flags = (matchingMode == CpuSubTypeMatching::Exact)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                           ? ParsingFlags::ExactCpuSubType
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                           : ParsingFlags::None;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return create(path, data, size, cpuType, cpuSubType, flags, minOSVersion,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                errorMessage);
</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;'>++LinkerInterfaceFile *LinkerInterfaceFile::create(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const std::string &path, const uint8_t *data, size_t size,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    cpu_type_t cpuType, cpu_subtype_t cpuSubType, ParsingFlags flags,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    PackedVersion32 minOSVersion, std::string &errorMessage) noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (path.empty() || data == nullptr || size < 8) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    errorMessage = "invalid argument";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return nullptr;
</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;'>++  auto impldata = LinkerInterfaceFile::ImplData::loadFile(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      path, data, size, cpuType, cpuSubType, errorMessage);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (impldata == nullptr)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return nullptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  auto file = new LinkerInterfaceFile;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (file == nullptr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    errorMessage = "could not allocate memory";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return nullptr;
</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 (file->_pImpl->init(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        std::shared_ptr<LinkerInterfaceFile::ImplData>(impldata),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        cpuType, cpuSubType, flags, minOSVersion, errorMessage)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return file;
</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;'>++  delete file;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return nullptr;
</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;'>++LinkerInterfaceFile *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++LinkerInterfaceFile::create(const std::string &path, cpu_type_t cpuType,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                            cpu_subtype_t cpuSubType, ParsingFlags flags,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                            PackedVersion32 minOSVersion,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                            std::string &errorMessage) noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  std::ifstream ifs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ifs.open(path, std::ifstream::in);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  auto buf = std::string(std::istreambuf_iterator<char>{ifs}, {});
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  auto data = LinkerInterfaceFile::ImplData::loadFile(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      path, (const uint8_t *)buf.c_str(), buf.length(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      cpuType, cpuSubType, errorMessage);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (data == nullptr)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return nullptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  auto file = new LinkerInterfaceFile;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (file == nullptr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    errorMessage = "could not allocate memory";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return nullptr;
</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 (file->_pImpl->init(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    std::shared_ptr<LinkerInterfaceFile::ImplData>(data),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    cpuType, cpuSubType, flags, minOSVersion, errorMessage)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return file;
</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;'>++  delete file;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return nullptr;
</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;'>++FileType LinkerInterfaceFile::getFileType() const noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return _pImpl->_data->_fileType;
</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;'>++Platform LinkerInterfaceFile::getPlatform() const noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return _pImpl->_data->_platform;
</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;'>++const std::string &LinkerInterfaceFile::getInstallName() const noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return _pImpl->_installName;
</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;'>++bool LinkerInterfaceFile::isInstallNameVersionSpecific() const noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return _pImpl->_installPathOverride;
</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;'>++PackedVersion32 LinkerInterfaceFile::getCurrentVersion() const noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return _pImpl->_data->_currentVersion;
</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;'>++PackedVersion32 LinkerInterfaceFile::getCompatibilityVersion() const noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return _pImpl->_compatibilityVersion;
</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;'>++unsigned LinkerInterfaceFile::getSwiftVersion() const noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return _pImpl->_data->_swiftABIVersion;
</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;'>++ObjCConstraint LinkerInterfaceFile::getObjCConstraint() const noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return _pImpl->_data->_objcConstraint;
</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;'>++bool LinkerInterfaceFile::hasTwoLevelNamespace() const noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return _pImpl->_hasTwoLevelNamespace;
</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;'>++bool LinkerInterfaceFile::isApplicationExtensionSafe() const noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return _pImpl->_isAppExtensionSafe;
</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;'>++bool LinkerInterfaceFile::hasAllowableClients() const noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return !_pImpl->_data->_allowableClients.empty();
</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;'>++bool LinkerInterfaceFile::hasReexportedLibraries() const noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return !_pImpl->_data->_reexportedLibraries.empty();
</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;'>++bool LinkerInterfaceFile::hasWeakDefinedExports() const noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return _pImpl->_hasWeakDefExports;
</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;'>++const std::string &LinkerInterfaceFile::getParentFrameworkName() const
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return _pImpl->_parentFrameworkName;
</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;'>++const std::vector<std::string> &LinkerInterfaceFile::allowableClients() const
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return _pImpl->_data->_allowableClients;
</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;'>++const std::vector<std::string> &LinkerInterfaceFile::reexportedLibraries() const
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return _pImpl->_data->_reexportedLibraries;
</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;'>++const std::vector<std::string> &LinkerInterfaceFile::ignoreExports() const
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return _pImpl->_ignoreExports;
</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;'>++const std::vector<Symbol> &LinkerInterfaceFile::exports() const noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return _pImpl->_exports;
</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;'>++const std::vector<Symbol> &LinkerInterfaceFile::undefineds() const noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return _pImpl->_undefineds;
</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;'>++const std::vector<std::string> &
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++LinkerInterfaceFile::inlinedFrameworkNames() const noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return _pImpl->_inlinedFrameworkNames;
</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;'>++LinkerInterfaceFile *LinkerInterfaceFile::getInlinedFramework(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const std::string &installName, cpu_type_t cpuType,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    cpu_subtype_t cpuSubType, ParsingFlags flags, PackedVersion32 minOSVersion,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    std::string &errorMessage) const noexcept {
</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;'>++  auto it = std::find_if(_pImpl->_inlinedFrameworksNames.begin(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                         _pImpl->_inlinedFrameworks.end(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                         [&](const std::shared_ptr<const InterfaceFile> &it) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                           return it->getInstallName() == installName;
</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 (it == _pImpl->_inlinedFrameworks.end()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    errorMessage = "no such inlined framework";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return nullptr;
</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;'>++  auto file = new LinkerInterfaceFile;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (file == nullptr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    errorMessage = "could not allocate memory";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return nullptr;
</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 (file->_pImpl->init(*it, cpuType, cpuSubType, flags, minOSVersion,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                         errorMessage))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return file;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  delete file;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return nullptr;
</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;'>++TAPI_NAMESPACE_V1_END
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* vim:set ts=2 sw=2 expandtab: */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git tapilite/src/Version.cpp tapilite/src/Version.cpp
</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 0000000..6ae2c26
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ tapilite/src/Version.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,48 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//===- libtapi/Version.cpp - TAPI Version Interface -------------*- C++ -*-===//
</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 distributed under the University of Illinois Open Source
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// License. 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;'>++/// \file
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \brief Implements the C++ version interface.
</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;'>++// Modified version for "tapilite", a standalone just enough
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// implementation for use without LLVM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <tapi/Version.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <tuple>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \brief Helper macro for TAPI_VERSION_STRING.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define TAPI_MAKE_STRING2(X) #X
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// \brief A string that describes the TAPI version number, e.g., "1.0.0".
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define TAPI_MAKE_STRING(X) TAPI_MAKE_STRING2(X)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++namespace tapi {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++std::string Version::getFullVersionAsString() noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  std::string result;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef TAPI_VENDOR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  result += TAPI_VENDOR;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef TAPI_VERSION
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  result += TAPI_MAKE_STRING(TAPI_VERSION);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  result += " based on Apple TAPI";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef APPLE_VERSION
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  result += " version " APPLE_VERSION;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef TAPI_REPOSITORY_STRING
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  result += " (" TAPI_REPOSITORY_STRING ")";
</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;'>++  return result;
</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;'>++} // end namespace tapi.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+2.38.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/darwin-xtools/files/0008-ld64-cmake-use-normal-cmake-trickery-to-link-against.patch b/devel/darwin-xtools/files/0008-ld64-cmake-use-normal-cmake-trickery-to-link-against.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..aa8f13d8494
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/darwin-xtools/files/0008-ld64-cmake-use-normal-cmake-trickery-to-link-against.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,45 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 0e7da0d9242a5e711c179839640f7ce1a7d94cfa Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Fabian Groffen <grobian@gentoo.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Mon, 28 Dec 2020 17:07:28 +0100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] [ld64, cmake] use normal cmake trickery to link against tapi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Signed-off-by: Fabian Groffen <grobian@gentoo.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ld64/src/ld/CMakeLists.txt | 16 ++++++++--------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 8 insertions(+), 8 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git ld64/src/ld/CMakeLists.txt ld64/src/ld/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 79037a3..7a3fdc5 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ld64/src/ld/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ld64/src/ld/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -67,14 +67,6 @@ if(XTOOLS_LTO_SUPPORT)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lLTO")
</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(XTOOLS_TAPI_SUPPORT)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  if(XTOOLS_USE_TAPILITE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -ltapilite -lyaml")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  else()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -ltapi")
</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;'>+ add_definitions(-DLD_VERS="xtools-ld64-${LD64_VERSION_NUM}")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ add_executable(ld ${LD64_SOURCES})
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -82,4 +74,12 @@ if(NOT XTOOLS_HAS_MODERNXAR)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   target_link_libraries(ld xarextralib)
</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(XTOOLS_TAPI_SUPPORT)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if(XTOOLS_USE_TAPILITE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    target_link_libraries(ld tapilite yaml)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  else()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    target_link_libraries(ld tapi)
</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;'>+ install(TARGETS ld DESTINATION bin)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+2.38.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/darwin-xtools/files/0009-tapilite-bunch-of-fixes-and-changes.patch b/devel/darwin-xtools/files/0009-tapilite-bunch-of-fixes-and-changes.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..490b45c9da0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/darwin-xtools/files/0009-tapilite-bunch-of-fixes-and-changes.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,523 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 3927b7950b3fddda810353a547142f9e53854ca9 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Fabian Groffen <grobian@gentoo.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Tue, 29 Dec 2020 13:48:16 +0100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] [tapilite] bunch of fixes and changes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- support multiple (inlined) documents
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- simplify strategy of preferring real dylibs over text stubs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- parsing and interpretation fixes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Signed-off-by: Fabian Groffen <grobian@gentoo.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tapilite/src/LinkerInterfaceFile.cpp | 214 +++++++++++++++------------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 122 insertions(+), 92 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git tapilite/src/LinkerInterfaceFile.cpp tapilite/src/LinkerInterfaceFile.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index ad6407f..d579a12 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- tapilite/src/LinkerInterfaceFile.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ tapilite/src/LinkerInterfaceFile.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -101,6 +101,8 @@ public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   std::vector<std::string> _arches;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   std::string _selectedArch;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  LinkerInterfaceFile::ImplData *next;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ImplData() noexcept = default;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   static LinkerInterfaceFile::ImplData *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -250,13 +252,14 @@ LinkerInterfaceFile::ImplData *LinkerInterfaceFile::ImplData::loadFile(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     const std::string &path, const uint8_t *data, size_t size,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     cpu_type_t cpuType, cpu_subtype_t cpuSubType,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     std::string &errorMessage) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  auto          ret = new LinkerInterfaceFile::ImplData;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   yaml_parser_t parser;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   yaml_event_t  event;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   yaml_char_t  *p;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   bool          selectSection = false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  bool          inList        = false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  ret->_path = path;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  LinkerInterfaceFile::ImplData *ret = nullptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  LinkerInterfaceFile::ImplData *cur = nullptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   /* Because platform isn't passed onto us by ld, we cannot know what to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    * select -- this is probably the problem meant to be solved by TAPIv4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -315,6 +318,11 @@ LinkerInterfaceFile::ImplData *LinkerInterfaceFile::ImplData::loadFile(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   errorMessage = errbuf; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return nullptr; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef tapilite_debug
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# define dprintf(...) printf(__VA_ARGS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# define dprintf(...)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   /* syntax:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    * https://github.com/apple/llvm-project/blob/apple/main/llvm/lib/TextAPI/MachO/TextStub.cpp */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   while (state != TAPILITE_DONE) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -326,10 +334,20 @@ LinkerInterfaceFile::ImplData *LinkerInterfaceFile::ImplData::loadFile(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (!yaml_parser_parse(&parser, &event))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    dprintf("yaml: %d\n", event.type);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define ymlcmp(X, Y) strcmp((char *)X, Y)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define ymlncmp(X, Y, Z) strncmp((char *)X, Y, Z)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* process */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     switch (event.type) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      case YAML_DOCUMENT_START_EVENT:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (cur == nullptr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          ret = cur = new LinkerInterfaceFile::ImplData;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          cur = cur->next = new LinkerInterfaceFile::ImplData;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        cur->_path = path;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        cur->next = nullptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       case YAML_STREAM_END_EVENT:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         state = TAPILITE_DONE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -338,6 +356,7 @@ LinkerInterfaceFile::ImplData *LinkerInterfaceFile::ImplData::loadFile(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if (yamlscalar.value != NULL && substate == TAPILITE_FINDKEY) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           switch (state) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             case TAPILITE_HEADER:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              dprintf("header| key: %s\n", yamlscalar.value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               if (ymlcmp(yamlscalar.value, "archs") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 substate = TAPILITE_ARCHS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               if (ymlcmp(yamlscalar.value, "targets") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -368,11 +387,14 @@ LinkerInterfaceFile::ImplData *LinkerInterfaceFile::ImplData::loadFile(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 substate = TAPILITE_VERSION;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               else if (ymlcmp(yamlscalar.value, "exports") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 state = TAPILITE_EXPORTS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "reexported-libraries") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                state = TAPILITE_REEXPORTS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               else if (ymlcmp(yamlscalar.value, "undefineds") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 state = TAPILITE_UNDEFINEDS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             case TAPILITE_EXPORTS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             case TAPILITE_REEXPORTS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              dprintf("exports| key: %s\n", yamlscalar.value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               if (ymlcmp(yamlscalar.value, "archs") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 substate = TAPILITE_ARCHS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               if (ymlcmp(yamlscalar.value, "targets") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -381,6 +403,8 @@ LinkerInterfaceFile::ImplData *LinkerInterfaceFile::ImplData::loadFile(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 substate = TAPILITE_ALLOWED_CLNTS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               else if (ymlcmp(yamlscalar.value, "re-exports") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 substate = TAPILITE_RE_EXPORTS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              else if (ymlcmp(yamlscalar.value, "libraries") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                substate = TAPILITE_RE_EXPORTS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               else if (ymlcmp(yamlscalar.value, "symbols") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 substate = TAPILITE_SYMBOLS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               else if (ymlcmp(yamlscalar.value, "objc-classes") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -424,6 +448,7 @@ LinkerInterfaceFile::ImplData *LinkerInterfaceFile::ImplData::loadFile(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            * currently the open thing we're writing for */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           switch (state) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             case TAPILITE_HEADER:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              dprintf("header|%d val: %s\n", substate, yamlscalar.value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               switch (substate) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 case TAPILITE_VERSION:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   if (version == TAPILITE_V4_OR_LATER) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -441,39 +466,39 @@ LinkerInterfaceFile::ImplData *LinkerInterfaceFile::ImplData::loadFile(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       version == TAPILITE_V_INVALID)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     error("unknown tbd file, unknown version specified");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  if (ret->_fileType == FileType::Unsupported) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (cur->_fileType == FileType::Unsupported) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     /* apply defaults for various settings based on the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                      * TAPI version */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     switch (version) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       case TAPILITE_V1:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                        ret->_currentVersion = parseVersion32("1.0");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                        ret->_compatibilityVersion = parseVersion32("1.0");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                        ret->_swiftABIVersion = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                        ret->_objcConstraint = ObjCConstraint::None;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        cur->_currentVersion = parseVersion32("1.0");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        cur->_compatibilityVersion = parseVersion32("1.0");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        cur->_swiftABIVersion = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        cur->_objcConstraint = ObjCConstraint::None;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                         break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       case TAPILITE_V2:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       case TAPILITE_V3:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       case TAPILITE_V4:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                        ret->_currentVersion = parseVersion32("1.0");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                        ret->_compatibilityVersion = parseVersion32("1.0");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                        ret->_swiftABIVersion = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                        ret->_objcConstraint = ObjCConstraint::Retain_Release;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        cur->_currentVersion = parseVersion32("1.0");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        cur->_compatibilityVersion = parseVersion32("1.0");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        cur->_swiftABIVersion = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        cur->_objcConstraint = ObjCConstraint::Retain_Release;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                         break;
</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 (version == TAPILITE_V1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      ret->_fileType == FileType::TBD_V1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      cur->_fileType = FileType::TBD_V1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     else if (version == TAPILITE_V2)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      ret->_fileType == FileType::TBD_V2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      cur->_fileType = FileType::TBD_V2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     else if (version == TAPILITE_V3)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      ret->_fileType == FileType::TBD_V3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      cur->_fileType = FileType::TBD_V3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     else if (version == TAPILITE_V4)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      ret->_fileType == FileType::TBD_V4;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      cur->_fileType = FileType::TBD_V4;
</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;'>+-                  ret->_arches.emplace_back(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  cur->_arches.emplace_back(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       std::string((const char *)yamlscalar.value));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  if (!ret->_selectedArch.empty())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (!cur->_selectedArch.empty())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     break;  /* take first matching arch */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   switch (version) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -483,69 +508,77 @@ LinkerInterfaceFile::ImplData *LinkerInterfaceFile::ImplData::loadFile(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                          * platform if arch matches */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                         size_t len = myarch.length();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                         if (ymlncmp(yamlscalar.value, myarch.c_str(), len) == 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                            && yamlscalar.value[len] == '-')
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                            && (len == 0 || yamlscalar.value[len] == '-'))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                          ret->_selectedArch =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                            std::string((const char *)yamlscalar.value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                          /* this is a copy of the PLATFORM case below */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                          if (ymlcmp(yamlscalar.value + len + 1, "macosx") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                            ret->_platform = Platform::OSX;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                          else if (ymlcmp(yamlscalar.value + len + 1,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                "ios") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                            ret->_platform = Platform::iOS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          const char *p = (const char *)yamlscalar.value;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          cur->_selectedArch = std::string(p);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          if (len == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                            len = cur->_selectedArch.find_first_of('-');
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          /* this almost is a copy of the PLATFORM case below */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          if (cur->_selectedArch.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                              substr(len + 1).compare("macos") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                            cur->_platform = Platform::OSX;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          else if (cur->_selectedArch.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                              substr(len + 1).compare("ios") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                            cur->_platform = Platform::iOS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           /* TODO: see below */
</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;'>+                       break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      /* see if arch matches */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      if (ymlcmp(yamlscalar.value, myarch.c_str()))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                        ret->_selectedArch = myarch;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      if (myarch.empty()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        cur->_selectedArch =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          std::string((const char *)yamlscalar.value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        /* see if arch matches */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        if (ymlcmp(yamlscalar.value, myarch.c_str()))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          cur->_selectedArch = myarch;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 case TAPILITE_PLATFORM:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   if (ymlcmp(yamlscalar.value, "macosx") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                    ret->_platform = Platform::OSX;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    cur->_platform = Platform::OSX;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   else if (ymlcmp(yamlscalar.value, "ios") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                    ret->_platform = Platform::iOS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    cur->_platform = Platform::iOS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   /* TODO: does it really make a difference to check for
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    * the rest? */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 case TAPILITE_INSTALLNAME:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  ret->_installName =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  cur->_installName =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     std::string((const char *)yamlscalar.value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 case TAPILITE_CURVERSION:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  ret->_currentVersion =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  cur->_currentVersion =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     parseVersion32((const char *)yamlscalar.value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 case TAPILITE_COMPATVERSION:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  ret->_compatibilityVersion =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  cur->_compatibilityVersion =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     parseVersion32((const char *)yamlscalar.value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 case TAPILITE_SWIFTVERSION:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  ret->_swiftABIVersion =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  cur->_swiftABIVersion =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     std::stoull((const char *)yamlscalar.value, NULL, 10);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 case TAPILITE_OBJCCONSTR:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   if (ymlcmp(yamlscalar.value, "none") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                    ret->_objcConstraint = ObjCConstraint::None;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    cur->_objcConstraint = ObjCConstraint::None;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   else if (ymlcmp(yamlscalar.value, "retain_release") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                    ret->_objcConstraint = ObjCConstraint::Retain_Release;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    cur->_objcConstraint = ObjCConstraint::Retain_Release;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   else if (ymlcmp(yamlscalar.value,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                         "retain_release_for_simulator") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                    ret->_objcConstraint =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    cur->_objcConstraint =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       ObjCConstraint::Retain_Release_For_Simulator;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   else if (ymlcmp(yamlscalar.value,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                         "retain_release_or_gc") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                    ret->_objcConstraint =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    cur->_objcConstraint =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       ObjCConstraint::Retain_Release_Or_GC;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   else if (ymlcmp(yamlscalar.value, "gc") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                    ret->_objcConstraint = ObjCConstraint::GC;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    cur->_objcConstraint = ObjCConstraint::GC;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 case TAPILITE_ALLOWED_CLNTS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  ret->_allowableClients.emplace_back(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  cur->_allowableClients.emplace_back(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       std::string((const char *)yamlscalar.value));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 case TAPILITE_UUIDS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -558,41 +591,47 @@ LinkerInterfaceFile::ImplData *LinkerInterfaceFile::ImplData::loadFile(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             case TAPILITE_EXPORTS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             case TAPILITE_REEXPORTS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              dprintf("exports|%d val: %s\n", substate, yamlscalar.value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               switch (substate) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 case TAPILITE_ARCHS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   /* remember: for V4, we store target in selectedArch */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  if (ymlcmp(yamlscalar.value, ret->_selectedArch.c_str()) == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (ymlcmp(yamlscalar.value, cur->_selectedArch.c_str()) == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     selectSection = true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 case TAPILITE_ALLOWED_CLNTS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   /* should respect this, but for now we just ignore it */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 case TAPILITE_RE_EXPORTS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (!selectSection)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  cur->_reexportedLibraries.emplace_back(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      std::string((const char *)yamlscalar.value));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 case TAPILITE_SYMBOLS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   if (!selectSection)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  ret->_exports.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  cur->_exports.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       std::string((const char *)yamlscalar.value),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       SymbolFlags::None, SymbolKind::GlobalSymbol));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 case TAPILITE_OBJCCLASSES:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   if (!selectSection)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  ret->_exports.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  cur->_exports.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       std::string((const char *)yamlscalar.value),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       SymbolFlags::None, SymbolKind::ObjectiveCClass));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 case TAPILITE_OBJCEHTYPES:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   if (!selectSection)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  ret->_exports.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  cur->_exports.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       std::string((const char *)yamlscalar.value),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       SymbolFlags::None, SymbolKind::ObjectiveCClassEHType));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 case TAPILITE_OBJCIVARS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   if (!selectSection)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  ret->_exports.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  cur->_exports.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       std::string((const char *)yamlscalar.value),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       SymbolFlags::None,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       SymbolKind::ObjectiveCInstanceVariable));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -600,14 +639,14 @@ LinkerInterfaceFile::ImplData *LinkerInterfaceFile::ImplData::loadFile(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 case TAPILITE_WEAKDEFSYMS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   if (!selectSection)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  ret->_exports.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  cur->_exports.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       std::string((const char *)yamlscalar.value),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       SymbolFlags::WeakDefined, SymbolKind::GlobalSymbol));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 case TAPILITE_THRLOCSYMS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   if (!selectSection)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  ret->_exports.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  cur->_exports.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       std::string((const char *)yamlscalar.value),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       SymbolFlags::ThreadLocalValue, SymbolKind::GlobalSymbol));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -617,34 +656,34 @@ LinkerInterfaceFile::ImplData *LinkerInterfaceFile::ImplData::loadFile(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               switch (substate) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 case TAPILITE_ARCHS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   /* remember: for V4, we store target in selectedArch */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  if (ymlcmp(yamlscalar.value, ret->_selectedArch.c_str()) == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (ymlcmp(yamlscalar.value, cur->_selectedArch.c_str()) == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     selectSection = true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 case TAPILITE_SYMBOLS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   if (!selectSection)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  ret->_undefineds.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  cur->_undefineds.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       std::string((const char *)yamlscalar.value),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       SymbolFlags::None, SymbolKind::GlobalSymbol));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 case TAPILITE_OBJCCLASSES:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   if (!selectSection)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  ret->_undefineds.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  cur->_undefineds.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       std::string((const char *)yamlscalar.value),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       SymbolFlags::None, SymbolKind::ObjectiveCClass));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 case TAPILITE_OBJCEHTYPES:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   if (!selectSection)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  ret->_undefineds.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  cur->_undefineds.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       std::string((const char *)yamlscalar.value),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       SymbolFlags::None, SymbolKind::ObjectiveCClassEHType));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 case TAPILITE_OBJCIVARS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   if (!selectSection)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  ret->_undefineds.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  cur->_undefineds.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       std::string((const char *)yamlscalar.value),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       SymbolFlags::None,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       SymbolKind::ObjectiveCInstanceVariable));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -652,19 +691,23 @@ LinkerInterfaceFile::ImplData *LinkerInterfaceFile::ImplData::loadFile(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 case TAPILITE_WEAKDEFSYMS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   if (!selectSection)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  ret->_undefineds.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  cur->_undefineds.emplace_back(new Symbol(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       std::string((const char *)yamlscalar.value),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       SymbolFlags::WeakReferenced, SymbolKind::GlobalSymbol));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          if (!inList)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            substate = TAPILITE_FINDKEY;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       case YAML_SEQUENCE_START_EVENT:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        inList = true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       case YAML_SEQUENCE_END_EVENT:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         substate = TAPILITE_FINDKEY;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        inList = false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       case YAML_MAPPING_START_EVENT:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define yamlms event.data.mapping_start
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -675,7 +718,7 @@ LinkerInterfaceFile::ImplData *LinkerInterfaceFile::ImplData::loadFile(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if (ymlncmp(yamlms.tag, "!tapi-tbd",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   sizeof("!tapi-tbd") - 1) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            p = yamlms.tag += sizeof("!tapi-tbd") - 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            p = yamlms.tag + sizeof("!tapi-tbd") - 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if (*p == '\0') {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               /* this could be version 4 or later, in which case we
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                * expect a tbd-version key */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -704,9 +747,12 @@ LinkerInterfaceFile::ImplData *LinkerInterfaceFile::ImplData::loadFile(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         substate = TAPILITE_FINDKEY;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        inList = false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       case YAML_MAPPING_END_EVENT:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      /* TODO: could use this to close list pointers or something */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        inList = false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* TODO: could use this to close list pointers or something */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -731,15 +777,9 @@ bool LinkerInterfaceFile::isSupported(const std::string &path,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ bool LinkerInterfaceFile::shouldPreferTextBasedStubFile(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     const std::string &path) noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  std::string err;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  std::ifstream ifs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  ifs.open(path, std::ifstream::in);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  auto data = std::string(std::istreambuf_iterator<char>{ifs}, {});
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  auto file = LinkerInterfaceFile::ImplData::loadFile(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      path, (const uint8_t *)data.c_str(), data.length(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    CPU_TYPE_ANY, CPU_SUBTYPE_MULTIPLE, err);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  return file && file->_platform != Platform::Unknown;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // Never prefer this, if a dylib exists, take it because it will be
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // more reliable than this "lite" stub, see also below
</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;'>+ bool LinkerInterfaceFile::areEquivalent(const std::string &tbdPath,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -772,6 +812,7 @@ bool LinkerInterfaceFile::Impl::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;'>+   _compatibilityVersion = data->_compatibilityVersion;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  _installName = data->_installName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Remove the patch level.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   minOSVersion =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -849,13 +890,8 @@ bool LinkerInterfaceFile::Impl::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;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  /* TODO we don't handle multiple documents, vague how it works/what it is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  for (auto &file : interface->_documents) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    auto framework = std::static_pointer_cast<const InterfaceFile>(file);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    _inlinedFrameworkNames.emplace_back(framework->getInstallName());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    _inlinedFrameworks.emplace_back(framework);
</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 (auto *file = data->next; file != nullptr; file = file->next)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    _inlinedFrameworkNames.emplace_back(file->_installName);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</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;'>+@@ -1025,30 +1061,24 @@ LinkerInterfaceFile *LinkerInterfaceFile::getInlinedFramework(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     cpu_subtype_t cpuSubType, ParsingFlags flags, PackedVersion32 minOSVersion,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     std::string &errorMessage) const noexcept {
</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;'>+-  auto it = std::find_if(_pImpl->_inlinedFrameworksNames.begin(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                         _pImpl->_inlinedFrameworks.end(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                         [&](const std::shared_ptr<const InterfaceFile> &it) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                           return it->getInstallName() == installName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                         });
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  for (auto *it = _pImpl->_data->next; it != nullptr; it = it->next) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (it->_installName.compare(installName) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      continue;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  if (it == _pImpl->_inlinedFrameworks.end()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    errorMessage = "no such inlined framework";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    return nullptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    auto file = new LinkerInterfaceFile;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (file == nullptr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      errorMessage = "could not allocate memory";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return nullptr;
</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;'>+-  auto file = new LinkerInterfaceFile;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  if (file == nullptr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    errorMessage = "could not allocate memory";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    return nullptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (file->_pImpl->init(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          std::shared_ptr<LinkerInterfaceFile::ImplData>(it),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          cpuType, cpuSubType, flags, minOSVersion, errorMessage)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return file;
</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 (file->_pImpl->init(*it, cpuType, cpuSubType, flags, minOSVersion,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                         errorMessage))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    return file;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  delete file;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  errorMessage = "no such inlined framework";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return nullptr;
</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;'>+2.38.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/darwin-xtools/files/0010-tapilite-cmake-explitly-build-static-library.patch b/devel/darwin-xtools/files/0010-tapilite-cmake-explitly-build-static-library.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..1b21e74c1ee
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/darwin-xtools/files/0010-tapilite-cmake-explitly-build-static-library.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,26 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From bce51cfb6cd55453ab1d662fa9b81523b7ee9ba2 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Fabian Groffen <grobian@gentoo.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Tue, 29 Dec 2020 15:32:48 +0100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] [tapilite, cmake] explitly build static library
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Signed-off-by: Fabian Groffen <grobian@gentoo.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tapilite/src/CMakeLists.txt | 2 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 1 insertion(+), 1 deletion(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git tapilite/src/CMakeLists.txt tapilite/src/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 4765f3a..d8c83ee 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- tapilite/src/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ tapilite/src/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4,7 +4,7 @@ set(TAPILITE_SOURCES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   Version.cpp
</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;'>+-add_library(tapilite ${TAPILITE_SOURCES})
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++add_library(tapilite STATIC ${TAPILITE_SOURCES})
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ include_directories("${CMAKE_SOURCE_DIR}/tapilite/include")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ include_directories("${CMAKE_SOURCE_DIR}/ld64/src/abstraction")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+2.38.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/darwin-xtools/files/0011-ld64-fix-compilation-on-arm64.patch b/devel/darwin-xtools/files/0011-ld64-fix-compilation-on-arm64.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..6b95a1eff26
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/darwin-xtools/files/0011-ld64-fix-compilation-on-arm64.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,87 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 3e707e8f20d151d8e92bdf29d7e8e08d657fcb87 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Fabian Groffen <grobian@gentoo.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Wed, 8 Jun 2022 20:35:59 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] [ld64] fix compilation on arm64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Signed-off-by: Fabian Groffen <grobian@gentoo.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ld64/src/ld/InputFiles.cpp                  |  2 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ld64/src/ld/parsers/libunwind/Registers.hpp | 49 +++++++++++++++++++++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 2 files changed, 51 insertions(+)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git ld64/src/ld/InputFiles.cpp ld64/src/ld/InputFiles.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 617d9d4..957a676 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ld64/src/ld/InputFiles.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ld64/src/ld/InputFiles.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -907,6 +907,8 @@ void InputFiles::inferArchitecture(Options& opts, const char** archName)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   opts.setArchitecture(CPU_TYPE_X86_64, CPU_SUBTYPE_X86_64_ALL, Options::kPlatformOSX);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #elif __arm__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   opts.setArchitecture(CPU_TYPE_ARM, CPU_SUBTYPE_ARM_V6, Options::kPlatformOSX);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif __arm64__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  opts.setArchitecture(CPU_TYPE_ARM64, CPU_SUBTYPE_ARM64_ALL, Options::kPlatformOSX);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   #error unknown default architecture
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git ld64/src/ld/parsers/libunwind/Registers.hpp ld64/src/ld/parsers/libunwind/Registers.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index ceacc28..c111947 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ld64/src/ld/parsers/libunwind/Registers.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ld64/src/ld/parsers/libunwind/Registers.hpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -43,6 +43,55 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ namespace libunwind {
</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 i386_thread_state_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct _i386_thread_state_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    unsigned int  __eax;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    unsigned int  __ebx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    unsigned int  __ecx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    unsigned int  __edx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    unsigned int  __edi;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    unsigned int  __esi;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    unsigned int  __ebp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    unsigned int  __esp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    unsigned int  __ss;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    unsigned int  __eflags;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    unsigned int  __eip;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    unsigned int  __cs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    unsigned int  __ds;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    unsigned int  __es;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    unsigned int  __fs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    unsigned int  __gs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define i386_thread_state_t _i386_thread_state_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef x86_thread_state64_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct _x86_thread_state64_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  __uint64_t      __rax;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  __uint64_t      __rbx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  __uint64_t      __rcx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  __uint64_t      __rdx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  __uint64_t      __rdi;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  __uint64_t      __rsi;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  __uint64_t      __rbp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  __uint64_t      __rsp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  __uint64_t      __r8;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  __uint64_t      __r9;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  __uint64_t      __r10;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  __uint64_t      __r11;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  __uint64_t      __r12;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  __uint64_t      __r13;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  __uint64_t      __r14;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  __uint64_t      __r15;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  __uint64_t      __rip;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  __uint64_t      __rflags;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  __uint64_t      __cs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  __uint64_t      __fs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  __uint64_t      __gs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define x86_thread_state64_t _x86_thread_state64_t
</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;'>+ /// Registers_x86 holds the register state of a thread in a 32-bit intel process.  
</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;'>+2.38.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/darwin-xtools/files/0012-cctools-fix-build-on-macOS-monterey.patch b/devel/darwin-xtools/files/0012-cctools-fix-build-on-macOS-monterey.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..9fdc6d383e6
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/darwin-xtools/files/0012-cctools-fix-build-on-macOS-monterey.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,38 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From a050d76f8c71fbc8c3162be6fb5f36544cf50a35 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Fabian Groffen <grobian@gentoo.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Wed, 8 Jun 2022 20:42:00 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] [cctools] fix build on macOS monterey
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Based on original path by Tee KOBAYASHI, which was based on work
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+from https://trac.macports.org/ticket/63221
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Adapted to be conditional, that is, only defined when not
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+yet defined.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Signed-off-by: Fabian Groffen <grobian@gentoo.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ cctools/otool/print_objc.c | 8 ++++++++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 8 insertions(+)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git cctools/otool/print_objc.c cctools/otool/print_objc.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index e8253f4..3793c22 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- cctools/otool/print_objc.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ cctools/otool/print_objc.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -75,6 +75,14 @@ struct objc_class_t {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     uint32_t protocols;   /* struct objc_protocol_list * (32-bit pointer) */
</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 CLS_GETINFO
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# define CLS_GETINFO(cls, infomask) ((cls)->info & (infomask))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// class is not a metaclass
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define CLS_CLASS 0x1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// class is a metaclass
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define CLS_META 0x2
</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;'>+ struct objc_category_t {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     uint32_t category_name;       /* char * (32-bit pointer) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     uint32_t class_name;  /* char * (32-bit pointer) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+2.38.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/darwin-xtools/files/0013-libyaml-add-the-way-to-include-it.patch b/devel/darwin-xtools/files/0013-libyaml-add-the-way-to-include-it.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..181734123b6
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/darwin-xtools/files/0013-libyaml-add-the-way-to-include-it.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,27 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 67ccbba3a7d01767809b94535090af95ff911256 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: "Kirill A. Korinsky" <kirill@korins.ky>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Tue, 9 Aug 2022 18:55:07 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] [libyaml] add the way to include it
</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;'>+ CMakeLists.txt | 4 ++++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 4 insertions(+)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git CMakeLists.txt CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 79bc676..b198a6e 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -170,6 +170,10 @@ endif()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # build tapilite first, so ld64 can link against it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if(XTOOLS_USE_TAPILITE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if(EXISTS ${XTOOLS_LIBYAML_PATH}/CMakeLists.txt)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    add_subdirectory(${XTOOLS_LIBYAML_PATH})
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    include_directories("${CMAKE_SOURCE_DIR}/libyaml/include")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  endif ()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   add_subdirectory(tapilite)
</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;'>+2.38.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/darwin-xtools/files/0014-cctools-removed-redundant-implementation-of-get_toc_.patch b/devel/darwin-xtools/files/0014-cctools-removed-redundant-implementation-of-get_toc_.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..07acc597244
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/darwin-xtools/files/0014-cctools-removed-redundant-implementation-of-get_toc_.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,65 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From e4362750b6fba1089fa43355e7f32c0eace85219 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: "Kirill A. Korinsky" <kirill@korins.ky>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Tue, 9 Aug 2022 19:11:19 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] [cctools] removed redundant implementation of
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ `get_toc_byte_sex`
</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;'>+ cctools/ld/pass1.c | 41 -----------------------------------------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 41 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git cctools/ld/pass1.c cctools/ld/pass1.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 408f766..1d58fcc 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- cctools/ld/pass1.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ cctools/ld/pass1.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1752,47 +1752,6 @@ down:
</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;'>+- * get_toc_byte_sex() guesses the byte sex of the table of contents of the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * library mapped in at the address, addr, of size, size based on the first
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * object file's bytesex.  If it can't figure it out, because the library has
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * no object file members or is malformed it will return UNKNOWN_BYTE_SEX.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-__private_extern__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-enum byte_sex
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-get_toc_byte_sex(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-char *addr,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-uint32_t size)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-     uint32_t magic;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-     uint32_t ar_name_size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-     struct ar_hdr *ar_hdr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-     char *p;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  ar_hdr = (struct ar_hdr *)(addr + SARMAG);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  p = addr + SARMAG + sizeof(struct ar_hdr) +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      rnd(strtoul(ar_hdr->ar_size, NULL, 10), sizeof(short));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  while(p + sizeof(struct ar_hdr) + sizeof(uint32_t) < addr + size){
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      ar_hdr = (struct ar_hdr *)p;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      if(strncmp(ar_hdr->ar_name, AR_EFMT1, sizeof(AR_EFMT1) - 1) == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          ar_name_size = strtoul(ar_hdr->ar_name + sizeof(AR_EFMT1) - 1,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                 NULL, 10);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          ar_name_size = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      p += sizeof(struct ar_hdr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      memcpy(&magic, p + ar_name_size, sizeof(uint32_t));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      if(magic == MH_MAGIC || magic == MH_MAGIC_64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          return(get_host_byte_sex());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      else if(magic == SWAP_INT(MH_MAGIC) ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              magic == SWAP_INT(MH_MAGIC_64))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          return(get_host_byte_sex() == BIG_ENDIAN_BYTE_SEX ?
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                 LITTLE_ENDIAN_BYTE_SEX : BIG_ENDIAN_BYTE_SEX);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      p += rnd(strtoul(ar_hdr->ar_size, NULL, 10), sizeof(short));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  return(UNKNOWN_BYTE_SEX);
</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;'>+  * check_archive_arch() check the archive specified to see if it's architecture
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  * does not match that of whats being loaded and if so returns FALSE.  Else it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+2.38.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/darwin-xtools/files/0015-tapilite-fix-build-by-clang.patch b/devel/darwin-xtools/files/0015-tapilite-fix-build-by-clang.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..a6cfb5d4a6e
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/darwin-xtools/files/0015-tapilite-fix-build-by-clang.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,34 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 9a7a569cde6c5a07ae6d6d9581b590abf1b3371a Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: "Kirill A. Korinsky" <kirill@korins.ky>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Wed, 10 Aug 2022 02:24:37 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] [tapilite] fix build by clang
</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;'>+ tapilite/CMakeLists.txt | 13 +++++++++++++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 13 insertions(+)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git tapilite/CMakeLists.txt tapilite/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index c83334c..e24b0fc 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- tapilite/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ tapilite/CMakeLists.txt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -23,4 +23,17 @@ if (TAPI_APPLE_VERSION)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   add_definitions( -DAPPLE_VERSION="${TAPI_APPLE_VERSION}")
</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;'>++set(TAPI_CXX_FLAGS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++if(XTOOLS_C_HAS_FNOCOMMON_FLAG)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     set(TAPI_CXX_FLAGS "-fno-common")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++endif()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++if(XTOOLS_CXX_HAS_STDCXX11_FLAG)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     set(TAPI_CXX_FLAGS "${TAPI_CXX_FLAGS} -std=c++11")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++endif()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++if(XTOOLS_CXX_HAS_STDLIB_FLAG)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     set(TAPI_CXX_FLAGS "${TAPI_CXX_FLAGS} -stdlib=libc++")
</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;'>++set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TAPI_CXX_FLAGS} ")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ add_subdirectory(src)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+2.38.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span></pre><pre style='margin:0'>

</pre>