<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>