[clang] [llvm] [InstallAPI] Add --extra* and --exclude* cli options for header input (PR #86522)
Cyndy Ishida via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 25 09:29:47 PDT 2024
https://github.com/cyndyishida updated https://github.com/llvm/llvm-project/pull/86522
>From a2c27fc38b2aa41d5d3874ede654d9faa30298b6 Mon Sep 17 00:00:00 2001
From: Cyndy Ishida <cyndy_ishida at apple.com>
Date: Mon, 25 Mar 2024 11:48:27 -0400
Subject: [PATCH 1/2] [InstallAPI] Add --extra* and --exclude* cli options for
header input
InstallAPI takes a json list of headers that is typically generated from a build system like Xcode based on a project's attributes. Sometimes, maintainers may want to alter this for tapi input. Using e.g. `--extra-public-headers`, users can manipulate what headers will be used for TBD file generation.
---
.../clang/Basic/DiagnosticInstallAPIKinds.td | 3 +
clang/include/clang/InstallAPI/HeaderFile.h | 54 +-
clang/include/clang/InstallAPI/MachO.h | 1 +
clang/lib/InstallAPI/Frontend.cpp | 2 +
clang/lib/InstallAPI/HeaderFile.cpp | 51 +
.../Inputs/Simple/Extra/SimpleExtraAPI1.h | 1 +
.../Inputs/Simple/Extra/SimpleExtraAPI2.h | 1 +
.../Simple/Simple.framework/Headers/Basic.h | 103 +
.../Simple.framework/Headers/External.h | 19 +
.../Simple/Simple.framework/Headers/Simple.h | 45 +
.../Simple.framework/Headers/SimpleAPI.h | 1 +
.../PrivateHeaders/SimplePrivate.h | 5 +
.../PrivateHeaders/SimplePrivateSPI.h | 2 +
.../test/InstallAPI/Inputs/Simple/Simple.yaml | 3196 +++++++++++++++++
.../Inputs/Simple/SimpleInternalAPI.h | 3 +
.../Inputs/Simple/SimpleInternalAPI2.h | 7 +
.../Inputs/Simple/SimpleInternalSPI.h | 5 +
.../InstallAPI/extra-exclude-headers.test | 207 ++
.../tools/clang-installapi/InstallAPIOpts.td | 32 +
clang/tools/clang-installapi/Options.cpp | 121 +
clang/tools/clang-installapi/Options.h | 21 +
llvm/include/llvm/TextAPI/Utils.h | 6 +
llvm/lib/TextAPI/Utils.cpp | 46 +
23 files changed, 3930 insertions(+), 2 deletions(-)
create mode 100644 clang/test/InstallAPI/Inputs/Simple/Extra/SimpleExtraAPI1.h
create mode 100644 clang/test/InstallAPI/Inputs/Simple/Extra/SimpleExtraAPI2.h
create mode 100644 clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/Basic.h
create mode 100644 clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/External.h
create mode 100644 clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/Simple.h
create mode 100644 clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/SimpleAPI.h
create mode 100644 clang/test/InstallAPI/Inputs/Simple/Simple.framework/PrivateHeaders/SimplePrivate.h
create mode 100644 clang/test/InstallAPI/Inputs/Simple/Simple.framework/PrivateHeaders/SimplePrivateSPI.h
create mode 100644 clang/test/InstallAPI/Inputs/Simple/Simple.yaml
create mode 100644 clang/test/InstallAPI/Inputs/Simple/SimpleInternalAPI.h
create mode 100644 clang/test/InstallAPI/Inputs/Simple/SimpleInternalAPI2.h
create mode 100644 clang/test/InstallAPI/Inputs/Simple/SimpleInternalSPI.h
create mode 100644 clang/test/InstallAPI/extra-exclude-headers.test
diff --git a/clang/include/clang/Basic/DiagnosticInstallAPIKinds.td b/clang/include/clang/Basic/DiagnosticInstallAPIKinds.td
index a4c6e630ac5fd8..27df731fa28627 100644
--- a/clang/include/clang/Basic/DiagnosticInstallAPIKinds.td
+++ b/clang/include/clang/Basic/DiagnosticInstallAPIKinds.td
@@ -15,6 +15,9 @@ let CategoryName = "Command line" in {
def err_cannot_write_file : Error<"cannot write file '%0': %1">;
def err_no_install_name : Error<"no install name specified: add -install_name <path>">;
def err_no_output_file: Error<"no output file specified">;
+def err_no_such_header_file : Error<"no such %select{public|private|project}1 header file: '%0'">;
+def warn_no_such_excluded_header_file : Warning<"no such excluded %select{public|private}0 header file: '%1'">, InGroup<InstallAPIViolation>;
+def warn_glob_did_not_match: Warning<"glob '%0' did not match any header file">, InGroup<InstallAPIViolation>;
} // end of command line category.
let CategoryName = "Verification" in {
diff --git a/clang/include/clang/InstallAPI/HeaderFile.h b/clang/include/clang/InstallAPI/HeaderFile.h
index 70e83bbb3e76f6..235b4da3add840 100644
--- a/clang/include/clang/InstallAPI/HeaderFile.h
+++ b/clang/include/clang/InstallAPI/HeaderFile.h
@@ -13,7 +13,9 @@
#ifndef LLVM_CLANG_INSTALLAPI_HEADERFILE_H
#define LLVM_CLANG_INSTALLAPI_HEADERFILE_H
+#include "clang/Basic/FileManager.h"
#include "clang/Basic/LangStandard.h"
+#include "clang/InstallAPI/MachO.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/Regex.h"
@@ -56,6 +58,10 @@ class HeaderFile {
std::string IncludeName;
/// Supported language mode for header.
std::optional<clang::Language> Language;
+ /// Exclude header file from processing.
+ bool Excluded{false};
+ /// Add header file to processing.
+ bool Extra{false};
public:
HeaderFile() = delete;
@@ -71,17 +77,48 @@ class HeaderFile {
StringRef getIncludeName() const { return IncludeName; }
StringRef getPath() const { return FullPath; }
+ void setExtra(bool V = true) { Extra = V; }
+ void setExcluded(bool V = true) { Excluded = V; }
+ bool isExtra() const { return Extra; }
+ bool isExcluded() const { return Excluded; }
+
bool useIncludeName() const {
return Type != HeaderType::Project && !IncludeName.empty();
}
bool operator==(const HeaderFile &Other) const {
- return std::tie(Type, FullPath, IncludeName, Language) ==
+ return std::tie(Type, FullPath, IncludeName, Language, Excluded, Extra) ==
std::tie(Other.Type, Other.FullPath, Other.IncludeName,
- Other.Language);
+ Other.Language, Other.Excluded, Other.Extra);
}
};
+/// Glob that represents a pattern of header files to retreive.
+class HeaderGlob {
+private:
+ std::string GlobString;
+ llvm::Regex Rule;
+ HeaderType Type;
+ bool FoundMatch{false};
+
+public:
+ HeaderGlob(StringRef GlobString, llvm::Regex &&, HeaderType Type);
+
+ /// Create a header glob from string for the header access level.
+ static llvm::Expected<std::unique_ptr<HeaderGlob>>
+ create(StringRef GlobString, HeaderType Type);
+
+ /// Query if provided header matches glob.
+ bool match(const HeaderFile &Header);
+
+ /// Query if a header was matched in the glob, used primarily for error
+ /// reporting.
+ bool didMatch() { return FoundMatch; }
+
+ /// Provide back input glob string.
+ StringRef str() { return GlobString; }
+};
+
/// Assemble expected way header will be included by clients.
/// As in what maps inside the brackets of `#include <IncludeName.h>`
/// For example,
@@ -93,6 +130,19 @@ class HeaderFile {
std::optional<std::string> createIncludeHeaderName(const StringRef FullPath);
using HeaderSeq = std::vector<HeaderFile>;
+/// Determine if Path is a header file.
+/// It does not touch the file system.
+///
+/// \param Path File path to file.
+bool isHeaderFile(StringRef Path);
+
+/// Given input directory, collect all header files.
+///
+/// \param FM FileManager for finding input files.
+/// \param Directory Path to directory file.
+llvm::Expected<PathSeq> enumerateFiles(clang::FileManager &FM,
+ StringRef Directory);
+
} // namespace clang::installapi
#endif // LLVM_CLANG_INSTALLAPI_HEADERFILE_H
diff --git a/clang/include/clang/InstallAPI/MachO.h b/clang/include/clang/InstallAPI/MachO.h
index f0dea8bbd24ccd..4961c596fd68ae 100644
--- a/clang/include/clang/InstallAPI/MachO.h
+++ b/clang/include/clang/InstallAPI/MachO.h
@@ -40,6 +40,7 @@ using SymbolSet = llvm::MachO::SymbolSet;
using SimpleSymbol = llvm::MachO::SimpleSymbol;
using FileType = llvm::MachO::FileType;
using PackedVersion = llvm::MachO::PackedVersion;
+using PathSeq = llvm::MachO::PathSeq;
using Target = llvm::MachO::Target;
using TargetList = llvm::MachO::TargetList;
diff --git a/clang/lib/InstallAPI/Frontend.cpp b/clang/lib/InstallAPI/Frontend.cpp
index 12cd5fcbc22bf7..e07ccb14e0b80a 100644
--- a/clang/lib/InstallAPI/Frontend.cpp
+++ b/clang/lib/InstallAPI/Frontend.cpp
@@ -138,6 +138,8 @@ std::unique_ptr<MemoryBuffer> createInputBuffer(InstallAPIContext &Ctx) {
SmallString<4096> Contents;
raw_svector_ostream OS(Contents);
for (const HeaderFile &H : Ctx.InputHeaders) {
+ if (H.isExcluded())
+ continue;
if (H.getType() != Ctx.Type)
continue;
if (Ctx.LangMode == Language::C || Ctx.LangMode == Language::CXX)
diff --git a/clang/lib/InstallAPI/HeaderFile.cpp b/clang/lib/InstallAPI/HeaderFile.cpp
index c2d8372741ee07..0b7041ec8147eb 100644
--- a/clang/lib/InstallAPI/HeaderFile.cpp
+++ b/clang/lib/InstallAPI/HeaderFile.cpp
@@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "clang/InstallAPI/HeaderFile.h"
+#include "llvm/TextAPI/Utils.h"
using namespace llvm;
namespace clang::installapi {
@@ -34,4 +35,54 @@ std::optional<std::string> createIncludeHeaderName(const StringRef FullPath) {
return Matches[1].drop_front(Matches[1].rfind('/') + 1).str() + "/" +
Matches[3].str();
}
+
+bool isHeaderFile(StringRef Path) {
+ return StringSwitch<bool>(sys::path::extension(Path))
+ .Cases(".h", ".H", ".hh", ".hpp", ".hxx", true)
+ .Default(false);
+}
+
+llvm::Expected<PathSeq> enumerateFiles(FileManager &FM, StringRef Directory) {
+ PathSeq Files;
+ std::error_code EC;
+ auto &FS = FM.getVirtualFileSystem();
+ for (llvm::vfs::recursive_directory_iterator i(FS, Directory, EC), ie;
+ i != ie; i.increment(EC)) {
+ if (EC)
+ return errorCodeToError(EC);
+
+ // Skip files that do not exist. This usually happens for broken symlinks.
+ if (FS.status(i->path()) == std::errc::no_such_file_or_directory)
+ continue;
+
+ StringRef Path = i->path();
+ if (isHeaderFile(Path))
+ Files.emplace_back(Path);
+ }
+
+ return Files;
+}
+
+HeaderGlob::HeaderGlob(StringRef GlobString, Regex &&Rule, HeaderType Type)
+ : GlobString(GlobString), Rule(std::move(Rule)), Type(Type) {}
+
+bool HeaderGlob::match(const HeaderFile &Header) {
+ if (Header.getType() != Type)
+ return false;
+
+ bool Match = Rule.match(Header.getPath());
+ if (Match)
+ FoundMatch = true;
+ return Match;
+}
+
+Expected<std::unique_ptr<HeaderGlob>> HeaderGlob::create(StringRef GlobString,
+ HeaderType Type) {
+ auto Rule = MachO::createRegexFromGlob(GlobString);
+ if (!Rule)
+ return Rule.takeError();
+
+ return std::make_unique<HeaderGlob>(GlobString, std::move(*Rule), Type);
+}
+
} // namespace clang::installapi
diff --git a/clang/test/InstallAPI/Inputs/Simple/Extra/SimpleExtraAPI1.h b/clang/test/InstallAPI/Inputs/Simple/Extra/SimpleExtraAPI1.h
new file mode 100644
index 00000000000000..83a5b9507de307
--- /dev/null
+++ b/clang/test/InstallAPI/Inputs/Simple/Extra/SimpleExtraAPI1.h
@@ -0,0 +1 @@
+extern int extraGlobalAPI1;
diff --git a/clang/test/InstallAPI/Inputs/Simple/Extra/SimpleExtraAPI2.h b/clang/test/InstallAPI/Inputs/Simple/Extra/SimpleExtraAPI2.h
new file mode 100644
index 00000000000000..34fe3364bba84e
--- /dev/null
+++ b/clang/test/InstallAPI/Inputs/Simple/Extra/SimpleExtraAPI2.h
@@ -0,0 +1 @@
+extern int extraGlobalAPI2;
diff --git a/clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/Basic.h b/clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/Basic.h
new file mode 100644
index 00000000000000..08412bb2de2838
--- /dev/null
+++ b/clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/Basic.h
@@ -0,0 +1,103 @@
+#import <Foundation/Foundation.h>
+
+// Basic class with no super class
+ at interface Basic1
+ at end
+
+ at interface Basic2 : NSObject
+ at end
+
+ at interface Basic3 : NSObject
+ at property BOOL property1;
+ at property(readonly) BOOL property2;
+ at property(getter=isProperty3) BOOL property3;
+ at property BOOL dynamicProp;
+ at end
+
+ at interface Basic4 : NSObject {
+ at public
+ BOOL ivar1;
+ at protected
+ BOOL ivar2;
+ at package
+ BOOL ivar3;
+ at private
+ BOOL ivar4;
+}
+ at end
+
+__attribute__((visibility("hidden"))) @interface Basic4_1 : NSObject {
+ at public
+ BOOL ivar1;
+ at protected
+ BOOL ivar2;
+ at package
+ BOOL ivar3;
+ at private
+ BOOL ivar4;
+}
+ at end
+
+ at interface Basic4_2 : NSObject {
+ at private
+ BOOL ivar4;
+ at package
+ BOOL ivar3;
+ at protected
+ BOOL ivar2;
+ at public
+ BOOL ivar1;
+}
+ at end
+
+ at interface Basic5 : NSObject
++ (void)aClassMethod;
+- (void)anInstanceMethod;
+ at end
+
+ at interface Basic6 : NSObject
+ at end
+
+ at interface Basic6 () {
+ at public
+ BOOL ivar1;
+}
+ at property BOOL property1;
+- (void)anInstanceMethodFromAnExtension;
+ at end
+
+ at interface Basic6 (Foo)
+ at property BOOL property2;
+- (void)anInstanceMethodFromACategory;
+ at end
+
+__attribute__((visibility("hidden")))
+ at interface Basic7 : NSObject
+ at end
+
+ at interface Basic7 ()
+- (void) anInstanceMethodFromAnHiddenExtension;
+ at end
+
+ at interface Basic8 : NSObject
++ (void)useSameName;
+ at end
+
+// Classes and protocols can have the same name. For now they would only clash
+// in the selector map if the protocl starts with '_'.
+ at protocol _A
+- (void)aMethod;
+ at end
+
+ at interface A : NSObject
+- (void)aMethod NS_AVAILABLE(10_11, 9_0);
+- (void)bMethod NS_UNAVAILABLE;
+ at end
+
+ at interface Basic9 : NSObject
+ at property(readonly) BOOL aProperty NS_AVAILABLE(10_10, 8_0);
+ at end
+
+ at interface Basic9 (deprecated)
+ at property(readwrite) BOOL aProperty NS_DEPRECATED_MAC(10_8, 10_10);
+ at end
diff --git a/clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/External.h b/clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/External.h
new file mode 100644
index 00000000000000..5dc3c92f34c24d
--- /dev/null
+++ b/clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/External.h
@@ -0,0 +1,19 @@
+#import <Foundation/Foundation.h>
+
+// Sub-class an external defined ObjC Class.
+ at interface ExternalManagedObject : NSManagedObject
+- (void)foo;
+ at end
+
+// Add category to external defined ObjC Class.
+ at interface NSManagedObject (Simple)
+- (int)supportsSimple;
+ at end
+
+// CoreData Accessors are dynamically generated and have no implementation.
+ at interface ExternalManagedObject (CoreDataGeneratedAccessors)
+- (void)addChildObject:(ExternalManagedObject *)value;
+- (void)removeChildObject:(ExternalManagedObject *)value;
+- (void)addChild:(NSSet *)values;
+- (void)removeChild:(NSSet *)values;
+ at end
diff --git a/clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/Simple.h b/clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/Simple.h
new file mode 100644
index 00000000000000..12c77098a8d9a7
--- /dev/null
+++ b/clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/Simple.h
@@ -0,0 +1,45 @@
+#import <Foundation/Foundation.h>
+
+// Useless forward declaration. This is used for testing.
+ at class FooBar;
+ at protocol FooProtocol;
+
+ at protocol ForwardProcotol;
+
+// Test public global.
+extern int publicGlobalVariable;
+
+// Test weak public global.
+extern int weakPublicGlobalVariable __attribute__((weak));
+
+// Test public ObjC class
+ at interface Simple : NSObject
+ at end
+
+__attribute__((objc_exception))
+ at interface Base : NSObject
+ at end
+
+ at interface SubClass : Base
+ at end
+
+ at protocol BaseProtocol
+- (void) baseMethod;
+ at end
+
+NS_AVAILABLE(10_11, 9_0)
+ at protocol FooProtocol <BaseProtocol>
+- (void) protocolMethod;
+ at end
+
+ at protocol BarProtocol
+- (void) barMethod;
+ at end
+
+ at interface FooClass <FooProtocol, BarProtocol>
+ at end
+
+// Create an empty category conforms to a forward declared protocol.
+// <rdar://problem/35605892>
+ at interface FooClass (Test) <ForwardProcotol>
+ at end
diff --git a/clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/SimpleAPI.h b/clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/SimpleAPI.h
new file mode 100644
index 00000000000000..d953fac966daf3
--- /dev/null
+++ b/clang/test/InstallAPI/Inputs/Simple/Simple.framework/Headers/SimpleAPI.h
@@ -0,0 +1 @@
+extern int otherFrameworkAPI;
diff --git a/clang/test/InstallAPI/Inputs/Simple/Simple.framework/PrivateHeaders/SimplePrivate.h b/clang/test/InstallAPI/Inputs/Simple/Simple.framework/PrivateHeaders/SimplePrivate.h
new file mode 100644
index 00000000000000..5a28cda3928e3d
--- /dev/null
+++ b/clang/test/InstallAPI/Inputs/Simple/Simple.framework/PrivateHeaders/SimplePrivate.h
@@ -0,0 +1,5 @@
+// Test private global variable.
+extern int privateGlobalVariable;
+
+// Test weak private global.
+extern int weakPrivateGlobalVariable __attribute__((weak));
diff --git a/clang/test/InstallAPI/Inputs/Simple/Simple.framework/PrivateHeaders/SimplePrivateSPI.h b/clang/test/InstallAPI/Inputs/Simple/Simple.framework/PrivateHeaders/SimplePrivateSPI.h
new file mode 100644
index 00000000000000..c9aca30fa82fa8
--- /dev/null
+++ b/clang/test/InstallAPI/Inputs/Simple/Simple.framework/PrivateHeaders/SimplePrivateSPI.h
@@ -0,0 +1,2 @@
+// Test private global variable.
+extern int otherFrameworkSPI;
diff --git a/clang/test/InstallAPI/Inputs/Simple/Simple.yaml b/clang/test/InstallAPI/Inputs/Simple/Simple.yaml
new file mode 100644
index 00000000000000..998e51f1a67dcc
--- /dev/null
+++ b/clang/test/InstallAPI/Inputs/Simple/Simple.yaml
@@ -0,0 +1,3196 @@
+--- !mach-o
+FileHeader:
+ magic: 0xFEEDFACF
+ cputype: 0x1000007
+ cpusubtype: 0x3
+ filetype: 0x6
+ ncmds: 15
+ sizeofcmds: 1952
+ flags: 0x118085
+ reserved: 0x0
+LoadCommands:
+ - cmd: LC_SEGMENT_64
+ cmdsize: 472
+ segname: __TEXT
+ vmaddr: 0
+ vmsize: 12288
+ fileoff: 0
+ filesize: 12288
+ maxprot: 5
+ initprot: 5
+ nsects: 5
+ flags: 0
+ Sections:
+ - sectname: __text
+ segname: __TEXT
+ addr: 0x1BC0
+ size: 180
+ offset: 0x1BC0
+ align: 0
+ reloff: 0x0
+ nreloc: 0
+ flags: 0x80000400
+ reserved1: 0x0
+ reserved2: 0x0
+ reserved3: 0x0
+ content: 554889E50FBE47085DC3554889E58857085DC3554889E50FBE47095DC3554889E50FBE470A5DC3554889E588570A5DC3554889E55DC3554889E55DC3554889E55DC3554889E50FBE47095DC3554889E58857095DC3554889E5B8010000005DC3554889E55DC3554889E55DC3554889E55DC3554889E55DC3554889E5B0015DC3554889E55DC3554889E55DC3554889E55DC3554889E50FBE47085DC3554889E55DC3554889E55DC3554889E55DC3554889E55DC3
+ - sectname: __cstring
+ segname: __TEXT
+ addr: 0x1C74
+ size: 296
+ offset: 0x1C74
+ align: 0
+ reloff: 0x0
+ nreloc: 0
+ flags: 0x2
+ reserved1: 0x0
+ reserved2: 0x0
+ reserved3: 0x0
+ content: 53696D706C65004261736500537562436C6173730053696D706C65496E7465726E616C4150490053696D706C65496E7465726E616C53504900426173696331004261736963320042617369633300426173696334004261736963345F31004261736963345F32004261736963350042617369633600466F6F004261736963370045787465726E616C4D616E616765644F626A6563740048696464656E436C61737300426173696338004100426173696339006465707265636174656400466F6F436C61737300466F6F50726F746F636F6C004261736550726F746F636F6C0042617250726F746F636F6C0050726976617465005072697661746550726F746F636F6C0063313640303A380076323040303A3863313600630076313640303A380042313640303A3800
+ - sectname: __objc_methname
+ segname: __TEXT
+ addr: 0x1D9C
+ size: 450
+ offset: 0x1D9C
+ align: 0
+ reloff: 0x0
+ nreloc: 0
+ flags: 0x2
+ reserved1: 0x0
+ reserved2: 0x0
+ reserved3: 0x0
+ content: 70726F7065727479310073657450726F7065727479313A0070726F70657274793200697350726F7065727479330073657450726F7065727479333A0070726F7065727479330054632C5670726F7065727479310054632C522C5670726F7065727479320054632C47697350726F7065727479332C5670726F7065727479330064796E616D696350726F700054632C440069766172310069766172320069766172330069766172340061436C6173734D6574686F6400616E496E7374616E63654D6574686F6400616E496E7374616E63654D6574686F6446726F6D416E457874656E73696F6E0073657450726F7065727479323A00616E496E7374616E63654D6574686F6446726F6D4143617465676F727900546300616E496E7374616E63654D6574686F6446726F6D416E48696464656E457874656E73696F6E00666F6F00737570706F72747353696D706C650075736553616D654E616D6500614D6574686F64006150726F7065727479005F6150726F70657274790054632C522C565F6150726F706572747900626173654D6574686F640070726F746F636F6C4D6574686F64006261724D6574686F64007072697661746550726F636F746F6C4D6574686F6400
+ - sectname: __unwind_info
+ segname: __TEXT
+ addr: 0x1F60
+ size: 4152
+ offset: 0x1F60
+ align: 2
+ reloff: 0x0
+ nreloc: 0
+ flags: 0x0
+ reserved1: 0x0
+ reserved2: 0x0
+ reserved3: 0x0
+ content: 010000001C000000010000002000000000000000200000000200000000000001C01B00003800000038000000741C00000000000038000000030000000C0001001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+ - sectname: __eh_frame
+ segname: __TEXT
+ addr: 0x2F98
+ size: 24
+ offset: 0x2F98
+ align: 3
+ reloff: 0x0
+ nreloc: 0
+ flags: 0x6000000B
+ reserved1: 0x0
+ reserved2: 0x0
+ reserved3: 0x0
+ content: 1400000000000000017A520001781001100C070890010000
+ - cmd: LC_SEGMENT_64
+ cmdsize: 792
+ segname: __DATA
+ vmaddr: 12288
+ vmsize: 8192
+ fileoff: 12288
+ filesize: 8192
+ maxprot: 3
+ initprot: 3
+ nsects: 9
+ flags: 0
+ Sections:
+ - sectname: __objc_const
+ segname: __DATA
+ addr: 0x3000
+ size: 4952
+ offset: 0x3000
+ align: 3
+ reloff: 0x0
+ nreloc: 0
+ flags: 0x0
+ reserved1: 0x0
+ reserved2: 0x0
+ reserved3: 0x0
+ content: 010000002800000028000000000000000000000000000000741C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000008000000000000000000000000000000741C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000028000000280000000000000000000000000000007B1C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000008000000080000000000000000000000000000007B1C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000007B1C000000000000D043000000000000010000002800000028000000000000000000000000000000801C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000800000008000000000000000000000000000000801C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000801C0000000000002044000000000000010000002800000028000000000000000000000000000000891C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000800000008000000000000000000000000000000891C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000891C00000000000070440000000000000100000028000000280000000000000000000000000000009B1C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000008000000080000000000000000000000000000009B1C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000009B1C000000000000C044000000000000030000002800000028000000000000000000000000000000AD1C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000AD1C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000002800000028000000000000000000000000000000B41C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000008000000000000000000000000000000B41C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000002800000028000000000000000000000000000000BB1C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018000000050000009C1D000000000000771D000000000000C01B000000000000A61D0000000000007F1D000000000000CA1B000000000000B41D000000000000771D000000000000D31B000000000000BE1D000000000000771D000000000000DD1B000000000000CA1D0000000000007F1D000000000000E71B000000000000200000000300000098490000000000009C1D0000000000008A1D0000000000000000000001000000A049000000000000B41D0000000000008A1D0000000000000000000001000000A849000000000000D81D0000000000008A1D000000000000000000000100000010000000040000009C1D000000000000E21D000000000000B41D000000000000F01D000000000000D81D000000000000001E0000000000001B1E000000000000271E00000000000000000000080000000B000000000000000000000000000000BB1C00000000000098340000000000000000000000000000183500000000000000000000000000008035000000000000010000002800000028000000000000000000000000000000C21C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000004000000B0490000000000002C1E0000000000008A1D0000000000000000000001000000B849000000000000321E0000000000008A1D0000000000000000000001000000C049000000000000381E0000000000008A1D0000000000000000000001000000C8490000000000003E1E0000000000008A1D000000000000000000000100000000000000080000000C000000000000000000000000000000C21C00000000000000000000000000000000000000000000583600000000000000000000000000000000000000000000110000002800000028000000000000000000000000000000C91C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000004000000D0490000000000002C1E0000000000008A1D0000000000000000000001000000D849000000000000321E0000000000008A1D0000000000000000000001000000E049000000000000381E0000000000008A1D0000000000000000000001000000E8490000000000003E1E0000000000008A1D000000000000000000000100000010000000080000000C000000000000000000000000000000C91C00000000000000000000000000000000000000000000703700000000000000000000000000000000000000000000010000002800000028000000000000000000000000000000D21C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000004000000F0490000000000003E1E0000000000008A1D0000000000000000000001000000F849000000000000381E0000000000008A1D0000000000000000000001000000004A000000000000321E0000000000008A1D0000000000000000000001000000084A0000000000002C1E0000000000008A1D000000000000000000000100000000000000080000000C000000000000000000000000000000D21C000000000000000000000000000000000000000000008838000000000000000000000000000000000000000000001800000001000000441E0000000000008C1D000000000000F01B000000000000010000002800000028000000000000000000000000000000DB1C000000000000583900000000000000000000000000000000000000000000000000000000000000000000000000001800000001000000511E0000000000008C1D000000000000F61B000000000000000000000800000008000000000000000000000000000000DB1C000000000000C0390000000000000000000000000000000000000000000000000000000000000000000000000000010000002800000028000000000000000000000000000000E21C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001800000003000000621E0000000000008C1D000000000000FC1B0000000000009C1D000000000000771D000000000000021C000000000000A61D0000000000007F1D0000000000000C1C0000000000002000000002000000104A0000000000002C1E0000000000008A1D0000000000000000000001000000184A0000000000009C1D0000000000008A1D000000000000000000000100000010000000010000009C1D000000000000E21D00000000000000000000080000000A000000000000000000000000000000E21C000000000000703A0000000000000000000000000000C03A0000000000000000000000000000083B0000000000001800000003000000B41D000000000000771D000000000000151C000000000000821E0000000000007F1D000000000000201C000000000000901E0000000000008C1D000000000000261C0000000000001000000001000000B41D000000000000AE1E000000000000E91C0000000000004047000000000000683B00000000000000000000000000000000000000000000B83B00000000000000000000000000004000000000000000110000002800000028000000000000000000000000000000ED1C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001800000001000000B11E0000000000008C1D0000000000002C1C000000000000100000000800000008000000000000000000000000000000ED1C000000000000583C0000000000000000000000000000000000000000000000000000000000000000000000000000010000002800000028000000000000000000000000000000F41C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001800000001000000D71E0000000000008C1D000000000000321C000000000000000000000800000008000000000000000000000000000000F41C000000000000083D00000000000000000000000000000000000000000000000000000000000000000000000000001800000001000000DB1E000000000000941D000000000000381C000000000000741C0000000000000000000000000000703D000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000001100000028000000280000000000000000000000000000000A1D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000008000000080000000000000000000000000000000A1D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001800000001000000EA1E0000000000008C1D000000000000401C000000000000010000002800000028000000000000000000000000000000161D000000000000603E00000000000000000000000000000000000000000000000000000000000000000000000000001800000001000000EA1E0000000000008C1D000000000000461C000000000000000000000800000008000000000000000000000000000000161D000000000000C83E00000000000000000000000000000000000000000000000000000000000000000000000000000100000028000000280000000000000000000000000000001D1D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001800000001000000F61E0000000000008C1D0000000000004C1C0000000000000000000008000000080000000000000000000000000000001D1D000000000000783F00000000000000000000000000000000000000000000000000000000000000000000000000000100000028000000280000000000000000000000000000001F1D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001800000001000000FE1E000000000000771D000000000000521C0000000000002000000001000000204A000000000000081F0000000000008A1D00000000000000000000010000001000000001000000FE1E000000000000131F0000000000000000000008000000090000000000000000000000000000001F1D000000000000284000000000000000000000000000004840000000000000000000000000000070400000000000001000000001000000FE1E000000000000AE1E000000000000261D0000000000002049000000000000000000000000000000000000000000000000000000000000D040000000000000000000000000000040000000000000001800000001000000241F0000000000008C1D00000000000000000000000000008C1D0000000000000100000000000000284A000000000000000000000000000018000000010000002F1F0000000000008C1D00000000000000000000000000008C1D00000000000018000000010000003E1F0000000000008C1D00000000000000000000000000008C1D0000000000000200000000000000884A000000000000E84A0000000000000000000000000000030000002800000028000000000000000000000000000000311D0000000000000000000000000000B8410000000000000000000000000000000000000000000000000000000000001800000003000000241F0000000000008C1D0000000000005C1C0000000000002F1F0000000000008C1D000000000000621C0000000000003E1F0000000000008C1D000000000000681C000000000000020000000000000000000000000000000000000000000000311D0000000000002042000000000000B8410000000000000000000000000000000000000000000000000000000000001800000001000000481F0000000000008C1D0000000000006E1C0000000000001800000001000000481F0000000000008C1D00000000000000000000000000008C1D0000000000000100000000000000484B00000000000000000000000000005F1D0000000000004849000000000000B84200000000000000000000000000000043000000000000000000000000000000000000000000004000000000000000
+ - sectname: __objc_data
+ segname: __DATA
+ addr: 0x4358
+ size: 1600
+ offset: 0x4358
+ align: 3
+ reloff: 0x0
+ nreloc: 0
+ flags: 0x0
+ reserved1: 0x0
+ reserved2: 0x0
+ reserved3: 0x0
+ content: 000000000000000000000000000000000000000000000000000000000000000000300000000000005843000000000000000000000000000000000000000000000000000000000000483000000000000000000000000000000000000000000000000000000000000000000000000000009030000000000000A843000000000000000000000000000000000000000000000000000000000000D8300000000000000000000000000000A843000000000000000000000000000000000000000000003831000000000000F843000000000000D0430000000000000000000000000000000000000000000080310000000000000000000000000000000000000000000000000000000000000000000000000000E03100000000000048440000000000000000000000000000000000000000000000000000000000002832000000000000000000000000000000000000000000000000000000000000000000000000000088320000000000009844000000000000000000000000000000000000000000000000000000000000D032000000000000104500000000000000000000000000000000000000000000000000000000000078330000000000001045000000000000E8440000000000000000000000000000000000000000000030330000000000000000000000000000000000000000000000000000000000000000000000000000C03300000000000038450000000000000000000000000000000000000000000000000000000000000834000000000000000000000000000000000000000000000000000000000000000000000000000050340000000000008845000000000000000000000000000000000000000000000000000000000000C83500000000000000000000000000000000000000000000000000000000000000000000000000001036000000000000D845000000000000000000000000000000000000000000000000000000000000E036000000000000000000000000000000000000000000000000000000000000000000000000000028370000000000002846000000000000000000000000000000000000000000000000000000000000F837000000000000000000000000000000000000000000000000000000000000000000000000000040380000000000007846000000000000000000000000000000000000000000000000000000000000103900000000000000000000000000000000000000000000000000000000000000000000000000007839000000000000C846000000000000000000000000000000000000000000000000000000000000E0390000000000000000000000000000000000000000000000000000000000000000000000000000283A0000000000001847000000000000000000000000000000000000000000000000000000000000203B0000000000000000000000000000000000000000000000000000000000000000000000000000103C0000000000006847000000000000000000000000000000000000000000000000000000000000783C0000000000000000000000000000000000000000000000000000000000000000000000000000C03C000000000000B847000000000000000000000000000000000000000000000000000000000000283D0000000000000000000000000000000000000000000000000000000000000000000000000000D03D0000000000000848000000000000000000000000000000000000000000000000000000000000183E0000000000000000000000000000000000000000000000000000000000000000000000000000803E0000000000005848000000000000000000000000000000000000000000000000000000000000E83E0000000000000000000000000000000000000000000000000000000000000000000000000000303F000000000000A848000000000000000000000000000000000000000000000000000000000000983F0000000000000000000000000000000000000000000000000000000000000000000000000000E03F000000000000F8480000000000000000000000000000000000000000000000000000000000008840000000000000704900000000000000000000000000000000000000000000000000000000000070420000000000007049000000000000484900000000000000000000000000000000000000000000D841000000000000
+ - sectname: __objc_ivar
+ segname: __DATA
+ addr: 0x4998
+ size: 144
+ offset: 0x4998
+ align: 3
+ reloff: 0x0
+ nreloc: 0
+ flags: 0x0
+ reserved1: 0x0
+ reserved2: 0x0
+ reserved3: 0x0
+ content: 080000000000000009000000000000000A00000000000000080000000000000009000000000000000A000000000000000B00000000000000080000000000000009000000000000000A000000000000000B00000000000000080000000000000009000000000000000A000000000000000B00000000000000080000000000000009000000000000000800000000000000
+ - sectname: __data
+ segname: __DATA
+ addr: 0x4A28
+ size: 392
+ offset: 0x4A28
+ align: 3
+ reloff: 0x0
+ nreloc: 0
+ flags: 0x0
+ reserved1: 0x0
+ reserved2: 0x0
+ reserved3: 0x0
+ content: 0000000000000000461D000000000000000000000000000028410000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000048410000000000000000000000000000000000000000000000000000000000003A1D00000000000050410000000000006841000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000008841000000000000000000000000000000000000000000000000000000000000531D0000000000000000000000000000904100000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000B041000000000000000000000000000000000000000000000000000000000000671D0000000000000000000000000000D84200000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000F842000000000000000000000000000000000000000000000000000000000000
+ - sectname: __objc_protolist
+ segname: __DATA
+ addr: 0x4BB0
+ size: 32
+ offset: 0x4BB0
+ align: 3
+ reloff: 0x0
+ nreloc: 0
+ flags: 0x1000000B
+ reserved1: 0x0
+ reserved2: 0x0
+ reserved3: 0x0
+ content: 284A000000000000884A000000000000E84A000000000000484B000000000000
+ - sectname: __objc_classlist
+ segname: __DATA
+ addr: 0x4BD0
+ size: 160
+ offset: 0x4BD0
+ align: 3
+ reloff: 0x0
+ nreloc: 0
+ flags: 0x10000000
+ reserved1: 0x0
+ reserved2: 0x0
+ reserved3: 0x0
+ content: 8043000000000000D04300000000000020440000000000007044000000000000C044000000000000E8440000000000006045000000000000B04500000000000000460000000000005046000000000000A046000000000000F04600000000000040470000000000009047000000000000E04700000000000030480000000000008048000000000000D04800000000000020490000000000004849000000000000
+ - sectname: __objc_catlist
+ segname: __DATA
+ addr: 0x4C70
+ size: 32
+ offset: 0x4C70
+ align: 3
+ reloff: 0x0
+ nreloc: 0
+ flags: 0x10000000
+ reserved1: 0x0
+ reserved2: 0x0
+ reserved3: 0x0
+ content: D03B000000000000903D000000000000E8400000000000001843000000000000
+ - sectname: __objc_imageinfo
+ segname: __DATA
+ addr: 0x4C90
+ size: 8
+ offset: 0x4C90
+ align: 0
+ reloff: 0x0
+ nreloc: 0
+ flags: 0x0
+ reserved1: 0x0
+ reserved2: 0x0
+ reserved3: 0x0
+ content: '0000000040000000'
+ - sectname: __common
+ segname: __DATA
+ addr: 0x4C98
+ size: 16
+ offset: 0x0
+ align: 2
+ reloff: 0x0
+ nreloc: 0
+ flags: 0x1
+ reserved1: 0x0
+ reserved2: 0x0
+ reserved3: 0x0
+ - cmd: LC_SEGMENT_64
+ cmdsize: 72
+ segname: __LINKEDIT
+ vmaddr: 20480
+ vmsize: 10272
+ fileoff: 20480
+ filesize: 10272
+ maxprot: 1
+ initprot: 1
+ nsects: 0
+ flags: 0
+ - cmd: LC_DYLD_INFO_ONLY
+ cmdsize: 48
+ rebase_off: 20480
+ rebase_size: 320
+ bind_off: 20800
+ bind_size: 480
+ weak_bind_off: 0
+ weak_bind_size: 0
+ lazy_bind_off: 0
+ lazy_bind_size: 0
+ export_off: 21280
+ export_size: 896
+ - cmd: LC_SYMTAB
+ cmdsize: 24
+ symoff: 22208
+ nsyms: 187
+ stroff: 25200
+ strsize: 5552
+ - cmd: LC_DYSYMTAB
+ cmdsize: 80
+ ilocalsym: 0
+ nlocalsym: 131
+ iextdefsym: 131
+ nextdefsym: 49
+ iundefsym: 180
+ nundefsym: 7
+ tocoff: 0
+ ntoc: 0
+ modtaboff: 0
+ nmodtab: 0
+ extrefsymoff: 0
+ nextrefsyms: 0
+ indirectsymoff: 0
+ nindirectsyms: 0
+ extreloff: 0
+ nextrel: 0
+ locreloff: 0
+ nlocrel: 0
+ - cmd: LC_ID_DYLIB
+ cmdsize: 88
+ dylib:
+ name: 24
+ timestamp: 0
+ current_version: 66051
+ compatibility_version: 65536
+ Content: '/System/Library/Frameworks/Simple.framework/Versions/A/Simple'
+ ZeroPadBytes: 3
+ - cmd: LC_UUID
+ cmdsize: 24
+ uuid: 4C4C441D-5555-3144-A104-DD1AF4EF8FE7
+ - cmd: LC_VERSION_MIN_MACOSX
+ cmdsize: 16
+ version: 658432
+ sdk: 983040
+ - cmd: LC_LOAD_DYLIB
+ cmdsize: 96
+ dylib:
+ name: 24
+ timestamp: 0
+ current_version: 197722368
+ compatibility_version: 19660800
+ Content: '/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation'
+ ZeroPadBytes: 3
+ - cmd: LC_LOAD_DYLIB
+ cmdsize: 56
+ dylib:
+ name: 24
+ timestamp: 0
+ current_version: 14942208
+ compatibility_version: 65536
+ Content: '/usr/lib/libobjc.A.dylib'
+ ZeroPadBytes: 8
+ - cmd: LC_LOAD_DYLIB
+ cmdsize: 96
+ dylib:
+ name: 24
+ timestamp: 0
+ current_version: 91750400
+ compatibility_version: 65536
+ Content: '/System/Library/Frameworks/CoreData.framework/Versions/A/CoreData'
+ ZeroPadBytes: 7
+ - cmd: LC_LOAD_DYLIB
+ cmdsize: 56
+ dylib:
+ name: 24
+ timestamp: 0
+ current_version: 88539136
+ compatibility_version: 65536
+ Content: '/usr/lib/libSystem.B.dylib'
+ ZeroPadBytes: 6
+ - cmd: LC_FUNCTION_STARTS
+ cmdsize: 16
+ dataoff: 22176
+ datasize: 32
+ - cmd: LC_DATA_IN_CODE
+ cmdsize: 16
+ dataoff: 22208
+ datasize: 0
+LinkEditData:
+ RebaseOpcodes:
+ - Opcode: REBASE_OPCODE_SET_TYPE_IMM
+ Imm: 1
+ - Opcode: REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
+ Imm: 1
+ ExtraData: [ 0x18 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+ Imm: 0
+ ExtraData: [ 0x3, 0x40 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x30 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x40 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x30 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x40 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x30 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x40 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x30 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+ Imm: 0
+ ExtraData: [ 0x4, 0x40 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x30 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 15
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 2
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 8
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+ Imm: 0
+ ExtraData: [ 0x2, 0x8 ]
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 2
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x30 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 4
+ - Opcode: REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+ Imm: 0
+ ExtraData: [ 0x2, 0x10 ]
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x30 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 4
+ - Opcode: REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+ Imm: 0
+ ExtraData: [ 0x2, 0x10 ]
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x30 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 4
+ - Opcode: REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+ Imm: 0
+ ExtraData: [ 0x2, 0x10 ]
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 5
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 7
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x30 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 9
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 2
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+ Imm: 0
+ ExtraData: [ 0x2, 0x8 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 9
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 5
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 2
+ - Opcode: REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+ Imm: 0
+ ExtraData: [ 0x2, 0x28 ]
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 7
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x30 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 5
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 4
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+ Imm: 0
+ ExtraData: [ 0x2, 0x40 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x30 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 5
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 7
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x30 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 7
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x30 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 2
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+ Imm: 0
+ ExtraData: [ 0x2, 0x8 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 4
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x18 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+ Imm: 0
+ ExtraData: [ 0x2, 0x8 ]
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x8 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x8 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 4
+ - Opcode: REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+ Imm: 0
+ ExtraData: [ 0x2, 0x8 ]
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 9
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 4
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+ Imm: 0
+ ExtraData: [ 0x2, 0x8 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x38 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x20 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+ Imm: 0
+ ExtraData: [ 0x2, 0x8 ]
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 1
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 2
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x20 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x20 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 2
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x20 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x20 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x20 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x20 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x20 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x20 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x20 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x20 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x20 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x20 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x20 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x20 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x20 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 2
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 3
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 2
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x98 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+ Imm: 0
+ ExtraData: [ 0x2, 0x8 ]
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 4
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x18 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
+ Imm: 3
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 5
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x18 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+ Imm: 0
+ ExtraData: [ 0x2, 0x8 ]
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 4
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x18 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
+ Imm: 0
+ ExtraData: [ 0x2, 0x8 ]
+ - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
+ Imm: 4
+ - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
+ Imm: 0
+ ExtraData: [ 0x18 ]
+ - Opcode: REBASE_OPCODE_DO_REBASE_ULEB_TIMES
+ Imm: 0
+ ExtraData: [ 0x1C ]
+ - Opcode: REBASE_OPCODE_DONE
+ Imm: 0
+ BindOpcodes:
+ - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
+ Imm: 0
+ Symbol: _objc_ehtype_vtable
+ - Opcode: BIND_OPCODE_SET_TYPE_IMM
+ Imm: 1
+ Symbol: ''
+ - Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
+ Imm: 2
+ Symbol: ''
+ - Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
+ Imm: 1
+ ULEBExtraData: [ 0x120 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_SET_ADDEND_SLEB
+ Imm: 0
+ SLEBExtraData: [ 16 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0xA0 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0xA0 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0xA0 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
+ Imm: 0
+ Symbol: '_OBJC_CLASS_$_NSManagedObject'
+ - Opcode: BIND_OPCODE_SET_TYPE_IMM
+ Imm: 1
+ Symbol: ''
+ - Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
+ Imm: 3
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0xA78 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_SET_ADDEND_SLEB
+ Imm: 0
+ SLEBExtraData: [ 0 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0xA48 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
+ Imm: 0
+ Symbol: '_OBJC_METACLASS_$_NSObject'
+ - Opcode: BIND_OPCODE_SET_TYPE_IMM
+ Imm: 1
+ Symbol: ''
+ - Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
+ Imm: 2
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0xFFFFFFFFFFFFFB68 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x40 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x40 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x48 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x40 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x90 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x40 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x40 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x40 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x40 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x40 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x40 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x40 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x40 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x48 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x40 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x40 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x40 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
+ Imm: 0
+ Symbol: __objc_empty_cache
+ - Opcode: BIND_OPCODE_SET_TYPE_IMM
+ Imm: 1
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0xFFFFFFFFFFFFFA60 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x20 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
+ Imm: 0
+ Symbol: '_OBJC_CLASS_$_NSObject'
+ - Opcode: BIND_OPCODE_SET_TYPE_IMM
+ Imm: 1
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0xFFFFFFFFFFFFFA00 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x48 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x98 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x48 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x98 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x48 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x48 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x48 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x48 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x48 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x48 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x48 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x98 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x48 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x48 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0x48 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
+ Imm: 0
+ Symbol: '_OBJC_METACLASS_$_NSManagedObject'
+ - Opcode: BIND_OPCODE_SET_TYPE_IMM
+ Imm: 1
+ Symbol: ''
+ - Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
+ Imm: 3
+ Symbol: ''
+ - Opcode: BIND_OPCODE_ADD_ADDR_ULEB
+ Imm: 0
+ ULEBExtraData: [ 0xFFFFFFFFFFFFFE90 ]
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DO_BIND
+ Imm: 0
+ Symbol: ''
+ - Opcode: BIND_OPCODE_DONE
+ Imm: 0
+ Symbol: ''
+ ExportTrie:
+ TerminalSize: 0
+ NodeOffset: 0
+ Name: ''
+ Flags: 0x0
+ Address: 0x0
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 0
+ NodeOffset: 5
+ Name: _
+ Flags: 0x0
+ Address: 0x0
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 0
+ NodeOffset: 41
+ Name: p
+ Flags: 0x0
+ Address: 0x0
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 4
+ NodeOffset: 86
+ Name: rivateGlobalVariable
+ Flags: 0x0
+ Address: 0x4CA0
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 92
+ Name: ublicGlobalVariable
+ Flags: 0x0
+ Address: 0x4CA4
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 0
+ NodeOffset: 98
+ Name: extraGlobalAPI
+ Flags: 0x0
+ Address: 0x0
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 4
+ NodeOffset: 106
+ Name: '1'
+ Flags: 0x0
+ Address: 0x4C98
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 112
+ Name: '2'
+ Flags: 0x0
+ Address: 0x4C9C
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 0
+ NodeOffset: 118
+ Name: weakP
+ Flags: 0x0
+ Address: 0x0
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 4
+ NodeOffset: 165
+ Name: rivateGlobalVariable
+ Flags: 0x4
+ Address: 0x4BAC
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 171
+ Name: ublicGlobalVariable
+ Flags: 0x4
+ Address: 0x4BA8
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 0
+ NodeOffset: 177
+ Name: OBJC_
+ Flags: 0x0
+ Address: 0x0
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 0
+ NodeOffset: 232
+ Name: 'IVAR_$_Basic'
+ Flags: 0x0
+ Address: 0x0
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 4
+ NodeOffset: 248
+ Name: 6.ivar1
+ Flags: 0x0
+ Address: 0x4A10
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 0
+ NodeOffset: 254
+ Name: '4'
+ Flags: 0x0
+ Address: 0x0
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 0
+ NodeOffset: 274
+ Name: .ivar
+ Flags: 0x0
+ Address: 0x0
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 4
+ NodeOffset: 284
+ Name: '2'
+ Flags: 0x0
+ Address: 0x49B8
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 290
+ Name: '1'
+ Flags: 0x0
+ Address: 0x49B0
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 0
+ NodeOffset: 296
+ Name: _2.ivar
+ Flags: 0x0
+ Address: 0x0
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 4
+ NodeOffset: 306
+ Name: '1'
+ Flags: 0x0
+ Address: 0x4A08
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 312
+ Name: '2'
+ Flags: 0x0
+ Address: 0x4A00
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 0
+ NodeOffset: 318
+ Name: 'METACLASS_$_'
+ Flags: 0x0
+ Address: 0x0
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 4
+ NodeOffset: 369
+ Name: FooClass
+ Flags: 0x0
+ Address: 0x4970
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 375
+ Name: ExternalManagedObject
+ Flags: 0x0
+ Address: 0x47B8
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 0
+ NodeOffset: 381
+ Name: S
+ Flags: 0x0
+ Address: 0x0
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 4
+ NodeOffset: 401
+ Name: imple
+ Flags: 0x0
+ Address: 0x4358
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 0
+ NodeOffset: 418
+ Name: Internal
+ Flags: 0x0
+ Address: 0x0
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 4
+ NodeOffset: 432
+ Name: SPI
+ Flags: 0x0
+ Address: 0x4498
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 438
+ Name: API
+ Flags: 0x0
+ Address: 0x4448
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 444
+ Name: ubClass
+ Flags: 0x0
+ Address: 0x43F8
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 0
+ NodeOffset: 450
+ Name: Bas
+ Flags: 0x0
+ Address: 0x0
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 4
+ NodeOffset: 461
+ Name: e
+ Flags: 0x0
+ Address: 0x43A8
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 0
+ NodeOffset: 467
+ Name: ic
+ Flags: 0x0
+ Address: 0x0
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 4
+ NodeOffset: 501
+ Name: '2'
+ Flags: 0x0
+ Address: 0x4538
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 507
+ Name: '3'
+ Flags: 0x0
+ Address: 0x4588
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 513
+ Name: '5'
+ Flags: 0x0
+ Address: 0x46C8
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 519
+ Name: '4'
+ Flags: 0x0
+ Address: 0x45D8
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 4
+ NodeOffset: 530
+ Name: _2
+ Flags: 0x0
+ Address: 0x4678
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 536
+ Name: '9'
+ Flags: 0x0
+ Address: 0x48F8
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 542
+ Name: '8'
+ Flags: 0x0
+ Address: 0x4858
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 548
+ Name: '6'
+ Flags: 0x0
+ Address: 0x4718
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 554
+ Name: '1'
+ Flags: 0x0
+ Address: 0x4510
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 560
+ Name: A
+ Flags: 0x0
+ Address: 0x48A8
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 0
+ NodeOffset: 566
+ Name: 'EHTYPE_$_'
+ Flags: 0x0
+ Address: 0x0
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 3
+ NodeOffset: 579
+ Name: Base
+ Flags: 0x0
+ Address: 0x3120
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 0
+ NodeOffset: 584
+ Name: S
+ Flags: 0x0
+ Address: 0x0
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 3
+ NodeOffset: 612
+ Name: ubClass
+ Flags: 0x0
+ Address: 0x31C8
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 0
+ NodeOffset: 617
+ Name: impleInternal
+ Flags: 0x0
+ Address: 0x0
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 3
+ NodeOffset: 631
+ Name: SPI
+ Flags: 0x0
+ Address: 0x3318
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 3
+ NodeOffset: 636
+ Name: API
+ Flags: 0x0
+ Address: 0x3270
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 0
+ NodeOffset: 641
+ Name: 'CLASS_$_'
+ Flags: 0x0
+ Address: 0x0
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 4
+ NodeOffset: 692
+ Name: A
+ Flags: 0x0
+ Address: 0x48D0
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 698
+ Name: ExternalManagedObject
+ Flags: 0x0
+ Address: 0x47E0
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 704
+ Name: FooClass
+ Flags: 0x0
+ Address: 0x4948
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 0
+ NodeOffset: 710
+ Name: S
+ Flags: 0x0
+ Address: 0x0
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 4
+ NodeOffset: 730
+ Name: ubClass
+ Flags: 0x0
+ Address: 0x4420
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 736
+ Name: imple
+ Flags: 0x0
+ Address: 0x4380
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 0
+ NodeOffset: 753
+ Name: Internal
+ Flags: 0x0
+ Address: 0x0
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 4
+ NodeOffset: 767
+ Name: API
+ Flags: 0x0
+ Address: 0x4470
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 773
+ Name: SPI
+ Flags: 0x0
+ Address: 0x44C0
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 0
+ NodeOffset: 779
+ Name: Bas
+ Flags: 0x0
+ Address: 0x0
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 4
+ NodeOffset: 790
+ Name: e
+ Flags: 0x0
+ Address: 0x43D0
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 0
+ NodeOffset: 796
+ Name: ic
+ Flags: 0x0
+ Address: 0x0
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 4
+ NodeOffset: 830
+ Name: '1'
+ Flags: 0x0
+ Address: 0x44E8
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 836
+ Name: '3'
+ Flags: 0x0
+ Address: 0x45B0
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 842
+ Name: '4'
+ Flags: 0x0
+ Address: 0x4600
+ Other: 0x0
+ ImportName: ''
+ Children:
+ - TerminalSize: 4
+ NodeOffset: 853
+ Name: _2
+ Flags: 0x0
+ Address: 0x46A0
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 859
+ Name: '2'
+ Flags: 0x0
+ Address: 0x4560
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 865
+ Name: '8'
+ Flags: 0x0
+ Address: 0x4880
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 871
+ Name: '9'
+ Flags: 0x0
+ Address: 0x4920
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 877
+ Name: '6'
+ Flags: 0x0
+ Address: 0x4740
+ Other: 0x0
+ ImportName: ''
+ - TerminalSize: 4
+ NodeOffset: 883
+ Name: '5'
+ Flags: 0x0
+ Address: 0x46F0
+ Other: 0x0
+ ImportName: ''
+ NameList:
+ - n_strx: 2
+ n_type: 0xE
+ n_sect: 1
+ n_desc: 0
+ n_value: 7104
+ - n_strx: 22
+ n_type: 0xE
+ n_sect: 1
+ n_desc: 0
+ n_value: 7114
+ - n_strx: 46
+ n_type: 0xE
+ n_sect: 1
+ n_desc: 0
+ n_value: 7123
+ - n_strx: 66
+ n_type: 0xE
+ n_sect: 1
+ n_desc: 0
+ n_value: 7133
+ - n_strx: 88
+ n_type: 0xE
+ n_sect: 1
+ n_desc: 0
+ n_value: 7143
+ - n_strx: 112
+ n_type: 0xE
+ n_sect: 1
+ n_desc: 0
+ n_value: 7152
+ - n_strx: 135
+ n_type: 0xE
+ n_sect: 1
+ n_desc: 0
+ n_value: 7158
+ - n_strx: 162
+ n_type: 0xE
+ n_sect: 1
+ n_desc: 0
+ n_value: 7164
+ - n_strx: 204
+ n_type: 0xE
+ n_sect: 1
+ n_desc: 0
+ n_value: 7170
+ - n_strx: 224
+ n_type: 0xE
+ n_sect: 1
+ n_desc: 0
+ n_value: 7180
+ - n_strx: 248
+ n_type: 0xE
+ n_sect: 1
+ n_desc: 0
+ n_value: 7189
+ - n_strx: 273
+ n_type: 0xE
+ n_sect: 1
+ n_desc: 0
+ n_value: 7200
+ - n_strx: 302
+ n_type: 0xE
+ n_sect: 1
+ n_desc: 0
+ n_value: 7206
+ - n_strx: 347
+ n_type: 0xE
+ n_sect: 1
+ n_desc: 0
+ n_value: 7212
+ - n_strx: 395
+ n_type: 0xE
+ n_sect: 1
+ n_desc: 0
+ n_value: 7218
+ - n_strx: 424
+ n_type: 0xE
+ n_sect: 1
+ n_desc: 0
+ n_value: 7224
+ - n_strx: 466
+ n_type: 0xE
+ n_sect: 1
+ n_desc: 0
+ n_value: 7232
+ - n_strx: 488
+ n_type: 0xE
+ n_sect: 1
+ n_desc: 0
+ n_value: 7238
+ - n_strx: 510
+ n_type: 0xE
+ n_sect: 1
+ n_desc: 0
+ n_value: 7244
+ - n_strx: 523
+ n_type: 0xE
+ n_sect: 1
+ n_desc: 0
+ n_value: 7250
+ - n_strx: 543
+ n_type: 0xE
+ n_sect: 1
+ n_desc: 0
+ n_value: 7260
+ - n_strx: 566
+ n_type: 0xE
+ n_sect: 1
+ n_desc: 0
+ n_value: 7266
+ - n_strx: 593
+ n_type: 0xE
+ n_sect: 1
+ n_desc: 0
+ n_value: 7272
+ - n_strx: 615
+ n_type: 0xE
+ n_sect: 1
+ n_desc: 0
+ n_value: 7278
+ - n_strx: 658
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 12288
+ - n_strx: 687
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 12360
+ - n_strx: 712
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 12432
+ - n_strx: 739
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 12504
+ - n_strx: 762
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 12600
+ - n_strx: 793
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 12672
+ - n_strx: 820
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 12768
+ - n_strx: 860
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 12840
+ - n_strx: 896
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 12936
+ - n_strx: 936
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 13008
+ - n_strx: 972
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 13176
+ - n_strx: 997
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 13104
+ - n_strx: 1026
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 13248
+ - n_strx: 1055
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 13320
+ - n_strx: 1080
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 13392
+ - n_strx: 1109
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 13464
+ - n_strx: 1142
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 13592
+ - n_strx: 1177
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 13696
+ - n_strx: 1203
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 13768
+ - n_strx: 1228
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 13840
+ - n_strx: 1257
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 13912
+ - n_strx: 1292
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 14048
+ - n_strx: 1317
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 14120
+ - n_strx: 1348
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 14192
+ - n_strx: 1385
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 14328
+ - n_strx: 1412
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 14400
+ - n_strx: 1443
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 14472
+ - n_strx: 1480
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 14608
+ - n_strx: 1507
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 14680
+ - n_strx: 1537
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 14712
+ - n_strx: 1566
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 14784
+ - n_strx: 1599
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 14816
+ - n_strx: 1624
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 14888
+ - n_strx: 1653
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 14960
+ - n_strx: 1686
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 15040
+ - n_strx: 1721
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 15112
+ - n_strx: 1747
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 15136
+ - n_strx: 1772
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 15208
+ - n_strx: 1820
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 15288
+ - n_strx: 1852
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 15312
+ - n_strx: 1883
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 15376
+ - n_strx: 1912
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 15448
+ - n_strx: 1945
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 15480
+ - n_strx: 1970
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 15552
+ - n_strx: 2014
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 15624
+ - n_strx: 2062
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 15656
+ - n_strx: 2102
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 15728
+ - n_strx: 2162
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 15760
+ - n_strx: 2205
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 15824
+ - n_strx: 2239
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 15896
+ - n_strx: 2269
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 15968
+ - n_strx: 2299
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 16000
+ - n_strx: 2328
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 16072
+ - n_strx: 2361
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 16104
+ - n_strx: 2386
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 16176
+ - n_strx: 2410
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 16248
+ - n_strx: 2438
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 16280
+ - n_strx: 2458
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 16352
+ - n_strx: 2487
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 16424
+ - n_strx: 2520
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 16456
+ - n_strx: 2555
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 16496
+ - n_strx: 2581
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 16520
+ - n_strx: 2606
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 16592
+ - n_strx: 2645
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 16616
+ - n_strx: 2683
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 17008
+ - n_strx: 2710
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 16856
+ - n_strx: 2741
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 16680
+ - n_strx: 2789
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 16712
+ - n_strx: 2833
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 16720
+ - n_strx: 2868
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 16744
+ - n_strx: 2915
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 16776
+ - n_strx: 2958
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 16784
+ - n_strx: 3005
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 16816
+ - n_strx: 3048
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 16824
+ - n_strx: 3082
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 16928
+ - n_strx: 3117
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 17080
+ - n_strx: 3171
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 17112
+ - n_strx: 3222
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 17144
+ - n_strx: 3269
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 17152
+ - n_strx: 3316
+ n_type: 0xE
+ n_sect: 6
+ n_desc: 0
+ n_value: 17176
+ - n_strx: 4000
+ n_type: 0x1E
+ n_sect: 7
+ n_desc: 0
+ n_value: 17960
+ - n_strx: 4027
+ n_type: 0x1E
+ n_sect: 7
+ n_desc: 0
+ n_value: 18000
+ - n_strx: 4192
+ n_type: 0x1E
+ n_sect: 7
+ n_desc: 0
+ n_value: 18280
+ - n_strx: 4217
+ n_type: 0x1E
+ n_sect: 7
+ n_desc: 0
+ n_value: 18320
+ - n_strx: 4314
+ n_type: 0x1E
+ n_sect: 7
+ n_desc: 0
+ n_value: 18440
+ - n_strx: 4344
+ n_type: 0x1E
+ n_sect: 7
+ n_desc: 0
+ n_value: 18480
+ - n_strx: 4548
+ n_type: 0x1E
+ n_sect: 8
+ n_desc: 0
+ n_value: 18840
+ - n_strx: 4578
+ n_type: 0x1E
+ n_sect: 8
+ n_desc: 0
+ n_value: 18848
+ - n_strx: 4608
+ n_type: 0x1E
+ n_sect: 8
+ n_desc: 0
+ n_value: 18856
+ - n_strx: 4690
+ n_type: 0x1E
+ n_sect: 8
+ n_desc: 0
+ n_value: 18880
+ - n_strx: 4716
+ n_type: 0x1E
+ n_sect: 8
+ n_desc: 0
+ n_value: 18888
+ - n_strx: 4742
+ n_type: 0x1E
+ n_sect: 8
+ n_desc: 0
+ n_value: 18896
+ - n_strx: 4770
+ n_type: 0x1E
+ n_sect: 8
+ n_desc: 0
+ n_value: 18904
+ - n_strx: 4798
+ n_type: 0x1E
+ n_sect: 8
+ n_desc: 0
+ n_value: 18912
+ - n_strx: 4826
+ n_type: 0x1E
+ n_sect: 8
+ n_desc: 0
+ n_value: 18920
+ - n_strx: 4854
+ n_type: 0x1E
+ n_sect: 8
+ n_desc: 0
+ n_value: 18928
+ - n_strx: 4882
+ n_type: 0x1E
+ n_sect: 8
+ n_desc: 0
+ n_value: 18936
+ - n_strx: 4992
+ n_type: 0x1E
+ n_sect: 8
+ n_desc: 0
+ n_value: 18968
+ - n_strx: 5022
+ n_type: 0x1E
+ n_sect: 8
+ n_desc: 0
+ n_value: 18976
+ - n_strx: 5053
+ n_type: 0x1E
+ n_sect: 9
+ n_desc: 0
+ n_value: 18984
+ - n_strx: 5084
+ n_type: 0x1E
+ n_sect: 9
+ n_desc: 0
+ n_value: 19080
+ - n_strx: 5114
+ n_type: 0x1E
+ n_sect: 9
+ n_desc: 0
+ n_value: 19176
+ - n_strx: 5144
+ n_type: 0x1E
+ n_sect: 9
+ n_desc: 0
+ n_value: 19272
+ - n_strx: 5231
+ n_type: 0x1E
+ n_sect: 10
+ n_desc: 0
+ n_value: 19376
+ - n_strx: 5268
+ n_type: 0x1E
+ n_sect: 10
+ n_desc: 0
+ n_value: 19384
+ - n_strx: 5304
+ n_type: 0x1E
+ n_sect: 10
+ n_desc: 0
+ n_value: 19392
+ - n_strx: 5340
+ n_type: 0x1E
+ n_sect: 10
+ n_desc: 0
+ n_value: 19400
+ - n_strx: 3353
+ n_type: 0xF
+ n_sect: 14
+ n_desc: 0
+ n_value: 19608
+ - n_strx: 3370
+ n_type: 0xF
+ n_sect: 14
+ n_desc: 0
+ n_value: 19612
+ - n_strx: 3387
+ n_type: 0xF
+ n_sect: 14
+ n_desc: 0
+ n_value: 19616
+ - n_strx: 3410
+ n_type: 0xF
+ n_sect: 14
+ n_desc: 0
+ n_value: 19620
+ - n_strx: 3432
+ n_type: 0xF
+ n_sect: 6
+ n_desc: 0
+ n_value: 12576
+ - n_strx: 3452
+ n_type: 0xF
+ n_sect: 6
+ n_desc: 0
+ n_value: 12744
+ - n_strx: 3476
+ n_type: 0xF
+ n_sect: 6
+ n_desc: 0
+ n_value: 12912
+ - n_strx: 3509
+ n_type: 0xF
+ n_sect: 6
+ n_desc: 0
+ n_value: 13080
+ - n_strx: 3542
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 17240
+ - n_strx: 3567
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 17280
+ - n_strx: 3588
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 17320
+ - n_strx: 3611
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 17360
+ - n_strx: 3630
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 17400
+ - n_strx: 3657
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 17440
+ - n_strx: 3680
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 17480
+ - n_strx: 3716
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 17520
+ - n_strx: 3748
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 17560
+ - n_strx: 3784
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 17600
+ - n_strx: 3816
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 17640
+ - n_strx: 3837
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 17680
+ - n_strx: 3862
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 17720
+ - n_strx: 3887
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 17760
+ - n_strx: 3908
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 17800
+ - n_strx: 3933
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 17840
+ - n_strx: 3954
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 17880
+ - n_strx: 3979
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 17920
+ - n_strx: 4050
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 18040
+ - n_strx: 4077
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 18080
+ - n_strx: 4100
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 18120
+ - n_strx: 4125
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 18160
+ - n_strx: 4146
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 18200
+ - n_strx: 4171
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 18240
+ - n_strx: 4238
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 18360
+ - n_strx: 4278
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 18400
+ - n_strx: 4370
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 18520
+ - n_strx: 4395
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 18560
+ - n_strx: 4416
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 18600
+ - n_strx: 4436
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 18640
+ - n_strx: 4452
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 18680
+ - n_strx: 4477
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 18720
+ - n_strx: 4498
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 18760
+ - n_strx: 4521
+ n_type: 0xF
+ n_sect: 7
+ n_desc: 0
+ n_value: 18800
+ - n_strx: 4638
+ n_type: 0xF
+ n_sect: 8
+ n_desc: 0
+ n_value: 18864
+ - n_strx: 4664
+ n_type: 0xF
+ n_sect: 8
+ n_desc: 0
+ n_value: 18872
+ - n_strx: 4910
+ n_type: 0xF
+ n_sect: 8
+ n_desc: 0
+ n_value: 18944
+ - n_strx: 4938
+ n_type: 0xF
+ n_sect: 8
+ n_desc: 0
+ n_value: 18952
+ - n_strx: 4966
+ n_type: 0xF
+ n_sect: 8
+ n_desc: 0
+ n_value: 18960
+ - n_strx: 5178
+ n_type: 0xF
+ n_sect: 9
+ n_desc: 128
+ n_value: 19368
+ - n_strx: 5204
+ n_type: 0xF
+ n_sect: 9
+ n_desc: 128
+ n_value: 19372
+ - n_strx: 5380
+ n_type: 0x1
+ n_sect: 0
+ n_desc: 768
+ n_value: 0
+ - n_strx: 5410
+ n_type: 0x1
+ n_sect: 0
+ n_desc: 512
+ n_value: 0
+ - n_strx: 5433
+ n_type: 0x1
+ n_sect: 0
+ n_desc: 768
+ n_value: 0
+ - n_strx: 5467
+ n_type: 0x1
+ n_sect: 0
+ n_desc: 512
+ n_value: 0
+ - n_strx: 5494
+ n_type: 0x1
+ n_sect: 0
+ n_desc: 512
+ n_value: 0
+ - n_strx: 5513
+ n_type: 0x1
+ n_sect: 0
+ n_desc: 512
+ n_value: 0
+ - n_strx: 5533
+ n_type: 0x1
+ n_sect: 0
+ n_desc: 1024
+ n_value: 0
+ StringTable:
+ - ' '
+ - '-[Basic3 property1]'
+ - '-[Basic3 setProperty1:]'
+ - '-[Basic3 property2]'
+ - '-[Basic3 isProperty3]'
+ - '-[Basic3 setProperty3:]'
+ - '+[Basic5 aClassMethod]'
+ - '-[Basic5 anInstanceMethod]'
+ - '-[Basic6 anInstanceMethodFromAnExtension]'
+ - '-[Basic6 property1]'
+ - '-[Basic6 setProperty1:]'
+ - '-[Basic6(Foo) property2]'
+ - '-[Basic6(Foo) setProperty2:]'
+ - '-[Basic6(Foo) anInstanceMethodFromACategory]'
+ - '-[Basic7 anInstanceMethodFromAnHiddenExtension]'
+ - '-[ExternalManagedObject foo]'
+ - '-[NSManagedObject(Simple) supportsSimple]'
+ - '+[Basic8 useSameName]'
+ - '-[Basic8 useSameName]'
+ - '-[A aMethod]'
+ - '-[Basic9 aProperty]'
+ - '-[FooClass baseMethod]'
+ - '-[FooClass protocolMethod]'
+ - '-[FooClass barMethod]'
+ - '-[FooClass(Private) privateProcotolMethod]'
+ - '__OBJC_METACLASS_RO_$_Simple'
+ - '__OBJC_CLASS_RO_$_Simple'
+ - '__OBJC_METACLASS_RO_$_Base'
+ - '__OBJC_CLASS_RO_$_Base'
+ - '__OBJC_METACLASS_RO_$_SubClass'
+ - '__OBJC_CLASS_RO_$_SubClass'
+ - '__OBJC_METACLASS_RO_$_SimpleInternalAPI'
+ - '__OBJC_CLASS_RO_$_SimpleInternalAPI'
+ - '__OBJC_METACLASS_RO_$_SimpleInternalSPI'
+ - '__OBJC_CLASS_RO_$_SimpleInternalSPI'
+ - '__OBJC_CLASS_RO_$_Basic1'
+ - '__OBJC_METACLASS_RO_$_Basic1'
+ - '__OBJC_METACLASS_RO_$_Basic2'
+ - '__OBJC_CLASS_RO_$_Basic2'
+ - '__OBJC_METACLASS_RO_$_Basic3'
+ - '__OBJC_$_INSTANCE_METHODS_Basic3'
+ - '__OBJC_$_INSTANCE_VARIABLES_Basic3'
+ - '__OBJC_$_PROP_LIST_Basic3'
+ - '__OBJC_CLASS_RO_$_Basic3'
+ - '__OBJC_METACLASS_RO_$_Basic4'
+ - '__OBJC_$_INSTANCE_VARIABLES_Basic4'
+ - '__OBJC_CLASS_RO_$_Basic4'
+ - '__OBJC_METACLASS_RO_$_Basic4_1'
+ - '__OBJC_$_INSTANCE_VARIABLES_Basic4_1'
+ - '__OBJC_CLASS_RO_$_Basic4_1'
+ - '__OBJC_METACLASS_RO_$_Basic4_2'
+ - '__OBJC_$_INSTANCE_VARIABLES_Basic4_2'
+ - '__OBJC_CLASS_RO_$_Basic4_2'
+ - '__OBJC_$_CLASS_METHODS_Basic5'
+ - '__OBJC_METACLASS_RO_$_Basic5'
+ - '__OBJC_$_INSTANCE_METHODS_Basic5'
+ - '__OBJC_CLASS_RO_$_Basic5'
+ - '__OBJC_METACLASS_RO_$_Basic6'
+ - '__OBJC_$_INSTANCE_METHODS_Basic6'
+ - '__OBJC_$_INSTANCE_VARIABLES_Basic6'
+ - '__OBJC_$_PROP_LIST_Basic6'
+ - '__OBJC_CLASS_RO_$_Basic6'
+ - '__OBJC_$_CATEGORY_INSTANCE_METHODS_Basic6_$_Foo'
+ - '__OBJC_$_PROP_LIST_Basic6_$_Foo'
+ - '__OBJC_$_CATEGORY_Basic6_$_Foo'
+ - '__OBJC_METACLASS_RO_$_Basic7'
+ - '__OBJC_$_INSTANCE_METHODS_Basic7'
+ - '__OBJC_CLASS_RO_$_Basic7'
+ - '__OBJC_METACLASS_RO_$_ExternalManagedObject'
+ - '__OBJC_$_INSTANCE_METHODS_ExternalManagedObject'
+ - '__OBJC_CLASS_RO_$_ExternalManagedObject'
+ - '__OBJC_$_CATEGORY_INSTANCE_METHODS_NSManagedObject_$_Simple'
+ - '__OBJC_$_CATEGORY_NSManagedObject_$_Simple'
+ - '__OBJC_METACLASS_RO_$_HiddenClass'
+ - '__OBJC_CLASS_RO_$_HiddenClass'
+ - '__OBJC_$_CLASS_METHODS_Basic8'
+ - '__OBJC_METACLASS_RO_$_Basic8'
+ - '__OBJC_$_INSTANCE_METHODS_Basic8'
+ - '__OBJC_CLASS_RO_$_Basic8'
+ - '__OBJC_METACLASS_RO_$_A'
+ - '__OBJC_$_INSTANCE_METHODS_A'
+ - '__OBJC_CLASS_RO_$_A'
+ - '__OBJC_METACLASS_RO_$_Basic9'
+ - '__OBJC_$_INSTANCE_METHODS_Basic9'
+ - '__OBJC_$_INSTANCE_VARIABLES_Basic9'
+ - '__OBJC_$_PROP_LIST_Basic9'
+ - '__OBJC_CLASS_RO_$_Basic9'
+ - '__OBJC_$_PROP_LIST_Basic9_$_deprecated'
+ - '__OBJC_$_CATEGORY_Basic9_$_deprecated'
+ - '__OBJC_CLASS_RO_$_FooClass'
+ - '__OBJC_METACLASS_RO_$_FooClass'
+ - '__OBJC_$_PROTOCOL_INSTANCE_METHODS_BaseProtocol'
+ - '__OBJC_$_PROTOCOL_METHOD_TYPES_BaseProtocol'
+ - '__OBJC_$_PROTOCOL_REFS_FooProtocol'
+ - '__OBJC_$_PROTOCOL_INSTANCE_METHODS_FooProtocol'
+ - '__OBJC_$_PROTOCOL_METHOD_TYPES_FooProtocol'
+ - '__OBJC_$_PROTOCOL_INSTANCE_METHODS_BarProtocol'
+ - '__OBJC_$_PROTOCOL_METHOD_TYPES_BarProtocol'
+ - '__OBJC_CLASS_PROTOCOLS_$_FooClass'
+ - '__OBJC_$_INSTANCE_METHODS_FooClass'
+ - '__OBJC_$_CATEGORY_INSTANCE_METHODS_FooClass_$_Private'
+ - '__OBJC_$_PROTOCOL_INSTANCE_METHODS_PrivateProtocol'
+ - '__OBJC_$_PROTOCOL_METHOD_TYPES_PrivateProtocol'
+ - '__OBJC_CATEGORY_PROTOCOLS_$_FooClass_$_Private'
+ - '__OBJC_$_CATEGORY_FooClass_$_Private'
+ - _extraGlobalAPI1
+ - _extraGlobalAPI2
+ - _privateGlobalVariable
+ - _publicGlobalVariable
+ - '_OBJC_EHTYPE_$_Base'
+ - '_OBJC_EHTYPE_$_SubClass'
+ - '_OBJC_EHTYPE_$_SimpleInternalAPI'
+ - '_OBJC_EHTYPE_$_SimpleInternalSPI'
+ - '_OBJC_METACLASS_$_Simple'
+ - '_OBJC_CLASS_$_Simple'
+ - '_OBJC_METACLASS_$_Base'
+ - '_OBJC_CLASS_$_Base'
+ - '_OBJC_METACLASS_$_SubClass'
+ - '_OBJC_CLASS_$_SubClass'
+ - '_OBJC_METACLASS_$_SimpleInternalAPI'
+ - '_OBJC_CLASS_$_SimpleInternalAPI'
+ - '_OBJC_METACLASS_$_SimpleInternalSPI'
+ - '_OBJC_CLASS_$_SimpleInternalSPI'
+ - '_OBJC_CLASS_$_Basic1'
+ - '_OBJC_METACLASS_$_Basic1'
+ - '_OBJC_METACLASS_$_Basic2'
+ - '_OBJC_CLASS_$_Basic2'
+ - '_OBJC_METACLASS_$_Basic3'
+ - '_OBJC_CLASS_$_Basic3'
+ - '_OBJC_METACLASS_$_Basic4'
+ - '_OBJC_CLASS_$_Basic4'
+ - '_OBJC_METACLASS_$_Basic4_1'
+ - '_OBJC_CLASS_$_Basic4_1'
+ - '_OBJC_METACLASS_$_Basic4_2'
+ - '_OBJC_CLASS_$_Basic4_2'
+ - '_OBJC_METACLASS_$_Basic5'
+ - '_OBJC_CLASS_$_Basic5'
+ - '_OBJC_METACLASS_$_Basic6'
+ - '_OBJC_CLASS_$_Basic6'
+ - '_OBJC_METACLASS_$_Basic7'
+ - '_OBJC_CLASS_$_Basic7'
+ - '_OBJC_METACLASS_$_ExternalManagedObject'
+ - '_OBJC_CLASS_$_ExternalManagedObject'
+ - '_OBJC_METACLASS_$_HiddenClass'
+ - '_OBJC_CLASS_$_HiddenClass'
+ - '_OBJC_METACLASS_$_Basic8'
+ - '_OBJC_CLASS_$_Basic8'
+ - '_OBJC_METACLASS_$_A'
+ - '_OBJC_CLASS_$_A'
+ - '_OBJC_METACLASS_$_Basic9'
+ - '_OBJC_CLASS_$_Basic9'
+ - '_OBJC_CLASS_$_FooClass'
+ - '_OBJC_METACLASS_$_FooClass'
+ - '_OBJC_IVAR_$_Basic3.property1'
+ - '_OBJC_IVAR_$_Basic3.property2'
+ - '_OBJC_IVAR_$_Basic3.property3'
+ - '_OBJC_IVAR_$_Basic4.ivar1'
+ - '_OBJC_IVAR_$_Basic4.ivar2'
+ - '_OBJC_IVAR_$_Basic4.ivar3'
+ - '_OBJC_IVAR_$_Basic4.ivar4'
+ - '_OBJC_IVAR_$_Basic4_1.ivar1'
+ - '_OBJC_IVAR_$_Basic4_1.ivar2'
+ - '_OBJC_IVAR_$_Basic4_1.ivar3'
+ - '_OBJC_IVAR_$_Basic4_1.ivar4'
+ - '_OBJC_IVAR_$_Basic4_2.ivar4'
+ - '_OBJC_IVAR_$_Basic4_2.ivar3'
+ - '_OBJC_IVAR_$_Basic4_2.ivar2'
+ - '_OBJC_IVAR_$_Basic4_2.ivar1'
+ - '_OBJC_IVAR_$_Basic6.ivar1'
+ - '_OBJC_IVAR_$_Basic6.property1'
+ - '_OBJC_IVAR_$_Basic9._aProperty'
+ - '__OBJC_PROTOCOL_$_BaseProtocol'
+ - '__OBJC_PROTOCOL_$_FooProtocol'
+ - '__OBJC_PROTOCOL_$_BarProtocol'
+ - '__OBJC_PROTOCOL_$_PrivateProtocol'
+ - _weakPublicGlobalVariable
+ - _weakPrivateGlobalVariable
+ - '__OBJC_LABEL_PROTOCOL_$_BaseProtocol'
+ - '__OBJC_LABEL_PROTOCOL_$_FooProtocol'
+ - '__OBJC_LABEL_PROTOCOL_$_BarProtocol'
+ - '__OBJC_LABEL_PROTOCOL_$_PrivateProtocol'
+ - '_OBJC_CLASS_$_NSManagedObject'
+ - '_OBJC_CLASS_$_NSObject'
+ - '_OBJC_METACLASS_$_NSManagedObject'
+ - '_OBJC_METACLASS_$_NSObject'
+ - __objc_empty_cache
+ - _objc_ehtype_vtable
+ - dyld_stub_binder
+ - ''
+ - ''
+ FunctionStarts: [ 0x1BC0, 0x1BCA, 0x1BD3, 0x1BDD, 0x1BE7, 0x1BF0, 0x1BF6,
+ 0x1BFC, 0x1C02, 0x1C0C, 0x1C15, 0x1C20, 0x1C26, 0x1C2C,
+ 0x1C32, 0x1C38, 0x1C40, 0x1C46, 0x1C4C, 0x1C52, 0x1C5C,
+ 0x1C62, 0x1C68, 0x1C6E ]
+...
diff --git a/clang/test/InstallAPI/Inputs/Simple/SimpleInternalAPI.h b/clang/test/InstallAPI/Inputs/Simple/SimpleInternalAPI.h
new file mode 100644
index 00000000000000..5dd416a0619cfb
--- /dev/null
+++ b/clang/test/InstallAPI/Inputs/Simple/SimpleInternalAPI.h
@@ -0,0 +1,3 @@
+#ifndef HAVE_SEEN_PROJECT_HEADER_FIRST
+#error "Project header was not included in the correct order!"
+#endif
diff --git a/clang/test/InstallAPI/Inputs/Simple/SimpleInternalAPI2.h b/clang/test/InstallAPI/Inputs/Simple/SimpleInternalAPI2.h
new file mode 100644
index 00000000000000..9bbae52d721538
--- /dev/null
+++ b/clang/test/InstallAPI/Inputs/Simple/SimpleInternalAPI2.h
@@ -0,0 +1,7 @@
+#import <Foundation/Foundation.h>
+
+__attribute__((objc_exception))
+ at interface SimpleInternalAPI : NSObject
+ at end
+
+#define HAVE_SEEN_PROJECT_HEADER_FIRST 1
diff --git a/clang/test/InstallAPI/Inputs/Simple/SimpleInternalSPI.h b/clang/test/InstallAPI/Inputs/Simple/SimpleInternalSPI.h
new file mode 100644
index 00000000000000..a816c01abeb0d2
--- /dev/null
+++ b/clang/test/InstallAPI/Inputs/Simple/SimpleInternalSPI.h
@@ -0,0 +1,5 @@
+#import <Foundation/Foundation.h>
+
+__attribute__((objc_exception))
+ at interface SimpleInternalSPI : NSObject
+ at end
diff --git a/clang/test/InstallAPI/extra-exclude-headers.test b/clang/test/InstallAPI/extra-exclude-headers.test
new file mode 100644
index 00000000000000..663ca1a5d5000d
--- /dev/null
+++ b/clang/test/InstallAPI/extra-exclude-headers.test
@@ -0,0 +1,207 @@
+; RUN: rm -rf %t
+; RUN: split-file %s %t
+; RUN: mkdir -p %t/System/Library/Frameworks
+; RUN: cp -r %S/Inputs/Simple/Simple.framework %t/System/Library/Frameworks/
+; RUN: sed -e "s|DSTROOT|%/t|g" %t/inputs.json.in > %t/inputs.json
+; RUN: yaml2obj %S/Inputs/Simple/Simple.yaml -o %t/Simple
+
+// Add exclude options.
+; RUN: clang-installapi -target x86_64-apple-macosx10.12 \
+; RUN: -install_name /System/Library/Frameworks/Simple.framework/Versions/A/Simple \
+; RUN: -current_version 1.2.3 -compatibility_version 1 \
+; RUN: -F%t/System/Library/Frameworks \
+; RUN: %t/inputs.json -o %t/Simple.tbd \
+; RUN: --verify-against=%t/Simple --verify-mode=ErrorsAndWarnings \
+; RUN: --exclude-public-header=**/SimpleAPI.h \
+; RUN: --exclude-private-header=**/SimplePrivateSPI.h 2>&1 | FileCheck -check-prefix=WARNINGS %s
+; RUN: llvm-readtapi -compare %t/Simple.tbd %t/expected-excluded.tbd
+
+// Add extra options.
+; RUN: clang-installapi -target x86_64-apple-macosx10.12 \
+; RUN: -install_name /System/Library/Frameworks/Simple.framework/Versions/A/Simple \
+; RUN: -current_version 1.2.3 -compatibility_version 1 \
+; RUN: -F%t/System/Library/Frameworks \
+; RUN: %t/inputs.json -o %t/Simple.tbd \
+; RUN: --verify-against=%t/Simple --verify-mode=Pedantic \
+; RUN: --extra-project-header=%S/Inputs/Simple/SimpleInternalAPI2.h \
+; RUN: --extra-project-header=%S/Inputs/Simple/SimpleInternalAPI.h \
+; RUN: --extra-public-header=%S/Inputs/Simple/Extra \
+; RUN: --extra-private-header=%S/Inputs/Simple/SimpleInternalSPI.h \
+; RUN: --exclude-public-header=**/SimpleAPI.h \
+; RUN: --exclude-private-header=**/SimplePrivateSPI.h 2>&1 | FileCheck -check-prefix=PEDANTIC -allow-empty %s
+; RUN: llvm-readtapi -compare %t/Simple.tbd %t/expected-extra.tbd
+
+// Check fatal missing file input.
+; RUN: not clang-installapi -target x86_64-apple-macosx10.12 \
+; RUN: -install_name /System/Library/Frameworks/Simple.framework/Versions/A/Simple \
+; RUN: -current_version 1.2.3 -compatibility_version 1 \
+; RUN: -F%t/System/Library/Frameworks \
+; RUN: %t/inputs.json -o %t/Simple.tbd \
+; RUN: --extra-public-header=%S/Inputs/Simple/NoSuchFile.h 2>&1 | FileCheck -allow-empty -check-prefix=NOPUBLIC %s
+
+; WARNINGS: warning: no declaration was found for exported symbol '_extraGlobalAPI1' in dynamic library
+; WARNINGS: warning: no declaration was found for exported symbol '_extraGlobalAPI2' in dynamic library
+; WARNINGS: warning: no declaration was found for exported symbol '(ObjC Class) SimpleInternalSPI' in dynamic library
+; WARNINGS: warning: no declaration was found for exported symbol '(ObjC Class) SimpleInternalAPI' in dynamic library
+
+; PEDANTIC-NOT: error
+; PEDANTIC: warning: cannot find protocol definition for 'ForwardProcotol'
+
+; NOPUBLIC: error: no such public header file:
+
+;--- expected-excluded.tbd
+{
+ "main_library": {
+ "current_versions": [
+ {
+ "version": "1.2.3"
+ }
+ ],
+ "exported_symbols": [
+ {
+ "data": {
+ "global": [
+ "_publicGlobalVariable",
+ "_privateGlobalVariable"
+ ],
+ "objc_class": [
+ "ExternalManagedObject", "Basic6",
+ "Basic1", "Base", "Basic3",
+ "FooClass", "Simple",
+ "Basic4_2", "Basic5",
+ "Basic9","Basic8",
+ "Basic2", "Basic4", "A", "SubClass"
+ ],
+ "objc_eh_type": [
+ "SubClass", "Base"
+ ],
+ "objc_ivar": [
+ "Basic4.ivar2", "Basic4_2.ivar1", "Basic6.ivar1",
+ "Basic4.ivar1", "Basic4_2.ivar2"
+ ],
+ "weak": [
+ "_weakPrivateGlobalVariable", "_weakPublicGlobalVariable"
+ ]
+ }
+ }
+ ],
+ "flags": [
+ {
+ "attributes": ["not_app_extension_safe"]
+ }
+ ],
+ "install_names": [
+ {
+ "name": "/System/Library/Frameworks/Simple.framework/Versions/A/Simple"
+ }
+ ],
+ "target_info": [
+ {"min_deployment": "10.12", "target": "x86_64-macos"}
+ ]
+ },
+ "tapi_tbd_version": 5
+}
+
+;--- expected-extra.tbd
+{
+ "main_library": {
+ "current_versions": [
+ { "version": "1.2.3" }
+ ],
+ "exported_symbols": [
+ {
+ "data": {
+ "global": [
+ "_publicGlobalVariable", "_extraGlobalAPI2",
+ "_extraGlobalAPI1", "_privateGlobalVariable"
+ ],
+ "objc_class": [
+ "SubClass", "SimpleInternalSPI",
+ "Basic6", "Basic1", "Base",
+ "Basic3", "Simple", "Basic4_2",
+ "Basic5", "FooClass", "Basic9",
+ "Basic8", "Basic2", "Basic4",
+ "A", "SimpleInternalAPI",
+ "ExternalManagedObject"
+ ],
+ "objc_eh_type": [
+ "SubClass", "SimpleInternalAPI",
+ "Base", "SimpleInternalSPI"
+ ],
+ "objc_ivar": [
+ "Basic4.ivar2", "Basic4_2.ivar1",
+ "Basic6.ivar1", "Basic4.ivar1",
+ "Basic4_2.ivar2"
+ ],
+ "weak": [
+ "_weakPrivateGlobalVariable", "_weakPublicGlobalVariable"
+ ]
+ }
+ }
+ ],
+ "flags": [
+ {
+ "attributes": [ "not_app_extension_safe"]
+ }
+ ],
+ "install_names": [
+ { "name": "/System/Library/Frameworks/Simple.framework/Versions/A/Simple" }
+ ],
+ "target_info": [
+ { "min_deployment": "10.12", "target": "x86_64-macos" }
+ ]
+ },
+ "tapi_tbd_version": 5
+}
+
+;--- inputs.json.in
+{
+ "headers": [
+ {
+ "path" : "DSTROOT/System/Library/Frameworks/Simple.framework/Headers/Basic.h",
+ "type" : "public"
+ },
+ {
+ "path" : "DSTROOT/System/Library/Frameworks/Simple.framework/Headers/External.h",
+ "type" : "public"
+ },
+ {
+ "path" : "DSTROOT/System/Library/Frameworks/Simple.framework/Headers/Simple.h",
+ "type" : "public"
+ },
+ {
+ "path" : "DSTROOT/System/Library/Frameworks/Simple.framework/Headers/SimpleAPI.h",
+ "type" : "public"
+ },
+ {
+ "path" : "DSTROOT/System/Library/Frameworks/Simple.framework/PrivateHeaders/SimplePrivate.h",
+ "type" : "private"
+ },
+ {
+ "path" : "DSTROOT/System/Library/Frameworks/Simple.framework/PrivateHeaders/SimplePrivateSPI.h",
+ "type" : "private"
+ }
+ ],
+ "version": "3"
+}
+
+;--- System/Library/Frameworks/Foundation.framework/Headers/Foundation.h
+ at interface NSObject
+ at end
+
+typedef unsigned char BOOL;
+#ifndef NS_AVAILABLE
+#define NS_AVAILABLE(x,y) __attribute__((availability(macosx,introduced=x)))
+#endif
+#ifndef NS_UNAVAILABLE
+#define NS_UNAVAILABLE __attribute__((unavailable))
+#endif
+#ifndef NS_DEPRECATED_MAC
+#define NS_DEPRECATED_MAC(x,y) __attribute__((availability(macosx,introduced=x,deprecated=y,message="" )));
+#endif
+
+ at interface NSManagedObject
+ at end
+
+ at interface NSSet
+ at end
diff --git a/clang/tools/clang-installapi/InstallAPIOpts.td b/clang/tools/clang-installapi/InstallAPIOpts.td
index 87f4c3327e8409..ab9e1fe7f2f949 100644
--- a/clang/tools/clang-installapi/InstallAPIOpts.td
+++ b/clang/tools/clang-installapi/InstallAPIOpts.td
@@ -29,3 +29,35 @@ def verify_mode_EQ : Joined<["--"], "verify-mode=">,
HelpText<"Specify the severity and extend of the validation. Valid modes are ErrorsOnly, ErrorsAndWarnings, and Pedantic.">;
def demangle : Flag<["--", "-"], "demangle">,
HelpText<"Demangle symbols when printing warnings and errors">;
+
+// Additional input options.
+def extra_project_header : Separate<["-"], "extra-project-header">,
+ MetaVarName<"<path>">,
+ HelpText<"Add additional project header location for parsing">;
+def extra_project_header_EQ : Joined<["--"], "extra-project-header=">,
+ Alias<extra_project_header>;
+def exclude_project_header : Separate<["-"], "exclude-project-header">,
+ MetaVarName<"<glob>">,
+ HelpText<"Exclude project header from parsing">;
+def exclude_project_header_EQ : Joined<["--"], "exclude-project-header=">,
+ Alias<exclude_project_header>;
+def extra_public_header : Separate<["-"], "extra-public-header">,
+ MetaVarName<"<path>">,
+ HelpText<"Add additional public header location for parsing">;
+def extra_public_header_EQ : Joined<["--"], "extra-public-header=">,
+ Alias<extra_public_header>;
+def extra_private_header : Separate<["-"], "extra-private-header">,
+ MetaVarName<"<path>">,
+ HelpText<"Add additional private header location for parsing">;
+def extra_private_header_EQ : Joined<["--"], "extra-private-header=">,
+ Alias<extra_private_header>;
+def exclude_public_header : Separate<["-"], "exclude-public-header">,
+ MetaVarName<"<glob>">,
+ HelpText<"Exclude public header from parsing">;
+def exclude_public_header_EQ : Joined<["--"], "exclude-public-header=">,
+ Alias<exclude_public_header>;
+def exclude_private_header : Separate<["-"], "exclude-private-header">,
+ MetaVarName<"<glob>">,
+ HelpText<"Exclude private header from parsing">;
+def exclude_private_header_EQ : Joined<["--"], "exclude-private-header=">,
+ Alias<exclude_private_header>;
diff --git a/clang/tools/clang-installapi/Options.cpp b/clang/tools/clang-installapi/Options.cpp
index b8696bb7896d86..1b38a264ad1fe0 100644
--- a/clang/tools/clang-installapi/Options.cpp
+++ b/clang/tools/clang-installapi/Options.cpp
@@ -10,6 +10,7 @@
#include "clang/Driver/Driver.h"
#include "clang/Frontend/FrontendDiagnostic.h"
#include "clang/InstallAPI/FileList.h"
+#include "clang/InstallAPI/HeaderFile.h"
#include "clang/InstallAPI/InstallAPIDiagnostic.h"
#include "llvm/Support/Program.h"
#include "llvm/TargetParser/Host.h"
@@ -181,6 +182,26 @@ bool Options::processFrontendOptions(InputArgList &Args) {
return true;
}
+bool Options::addFilePaths(InputArgList &Args, PathSeq &Headers,
+ OptSpecifier ID) {
+ for (const StringRef Path : Args.getAllArgValues(ID)) {
+ if ((bool)FM->getDirectory(Path, /*CacheFailure=*/false)) {
+ auto InputHeadersOrErr = enumerateFiles(*FM, Path);
+ if (!InputHeadersOrErr) {
+ Diags->Report(diag::err_cannot_open_file)
+ << Path << toString(InputHeadersOrErr.takeError());
+ return false;
+ }
+ // Sort headers to ensure deterministic behavior.
+ sort(*InputHeadersOrErr);
+ for (std::string &H : *InputHeadersOrErr)
+ Headers.emplace_back(std::move(H));
+ } else
+ Headers.emplace_back(Path);
+ }
+ return true;
+}
+
std::vector<const char *>
Options::processAndFilterOutInstallAPIOptions(ArrayRef<const char *> Args) {
std::unique_ptr<llvm::opt::OptTable> Table;
@@ -220,6 +241,35 @@ Options::processAndFilterOutInstallAPIOptions(ArrayRef<const char *> Args) {
if (const Arg *A = ParsedArgs.getLastArg(OPT_verify_against))
DriverOpts.DylibToVerify = A->getValue();
+ // Handle exclude & extra header directories or files.
+ auto handleAdditionalInputArgs = [&](PathSeq &Headers,
+ clang::installapi::ID OptID) {
+ if (ParsedArgs.hasArgNoClaim(OptID))
+ Headers.clear();
+ return addFilePaths(ParsedArgs, Headers, OptID);
+ };
+
+ if (!handleAdditionalInputArgs(DriverOpts.ExtraPublicHeaders,
+ OPT_extra_public_header))
+ return {};
+
+ if (!handleAdditionalInputArgs(DriverOpts.ExtraPrivateHeaders,
+ OPT_extra_private_header))
+ return {};
+ if (!handleAdditionalInputArgs(DriverOpts.ExtraProjectHeaders,
+ OPT_extra_project_header))
+ return {};
+
+ if (!handleAdditionalInputArgs(DriverOpts.ExcludePublicHeaders,
+ OPT_exclude_public_header))
+ return {};
+ if (!handleAdditionalInputArgs(DriverOpts.ExcludePrivateHeaders,
+ OPT_exclude_private_header))
+ return {};
+ if (!handleAdditionalInputArgs(DriverOpts.ExcludeProjectHeaders,
+ OPT_exclude_project_header))
+ return {};
+
/// Any unclaimed arguments should be forwarded to the clang driver.
std::vector<const char *> ClangDriverArgs(ParsedArgs.size());
for (const Arg *A : ParsedArgs) {
@@ -302,6 +352,77 @@ InstallAPIContext Options::createContext() {
return Ctx;
}
}
+ // After initial input has been processed, add any extra headers.
+ auto HandleExtraHeaders = [&](PathSeq &Headers, HeaderType Type) -> bool {
+ assert(Type != HeaderType::Unknown && "Missing header type.");
+ for (const StringRef Path : Headers) {
+ if (!FM->getOptionalFileRef(Path)) {
+ Diags->Report(diag::err_no_such_header_file)
+ << Path << (unsigned)Type - 1;
+ return false;
+ }
+ SmallString<PATH_MAX> FullPath(Path);
+ FM->makeAbsolutePath(FullPath);
+
+ auto IncludeName = createIncludeHeaderName(FullPath);
+ Ctx.InputHeaders.emplace_back(
+ FullPath, Type, IncludeName.has_value() ? *IncludeName : "");
+ Ctx.InputHeaders.back().setExtra();
+ }
+ return true;
+ };
+
+ if (!HandleExtraHeaders(DriverOpts.ExtraPublicHeaders, HeaderType::Public) ||
+ !HandleExtraHeaders(DriverOpts.ExtraPrivateHeaders,
+ HeaderType::Private) ||
+ !HandleExtraHeaders(DriverOpts.ExtraProjectHeaders, HeaderType::Project))
+ return Ctx;
+
+ // After all headers have been added, consider excluded headers.
+ std::vector<std::unique_ptr<HeaderGlob>> ExcludedHeaderGlobs;
+ std::set<const FileEntryRef> ExcludedHeaderFiles;
+ auto ParseGlobs = [&](const PathSeq &Paths, HeaderType Type) {
+ for (const StringRef Path : Paths) {
+ auto Glob = HeaderGlob::create(Path, Type);
+ if (Glob)
+ ExcludedHeaderGlobs.emplace_back(std::move(Glob.get()));
+ else {
+ consumeError(Glob.takeError());
+ if (auto File = FM->getFileRef(Path))
+ ExcludedHeaderFiles.emplace(*File);
+ else {
+ Diags->Report(diag::err_no_such_header_file)
+ << Path << (unsigned)Type;
+ return false;
+ }
+ }
+ }
+ return true;
+ };
+
+ if (!ParseGlobs(DriverOpts.ExcludePublicHeaders, HeaderType::Public) ||
+ !ParseGlobs(DriverOpts.ExcludePrivateHeaders, HeaderType::Private) ||
+ !ParseGlobs(DriverOpts.ExcludeProjectHeaders, HeaderType::Project))
+ return Ctx;
+
+ for (HeaderFile &Header : Ctx.InputHeaders) {
+ for (auto &Glob : ExcludedHeaderGlobs)
+ if (Glob->match(Header))
+ Header.setExcluded();
+ }
+ if (!ExcludedHeaderFiles.empty()) {
+ for (HeaderFile &Header : Ctx.InputHeaders) {
+ auto FileRef = FM->getFileRef(Header.getPath());
+ if (!FileRef)
+ continue;
+ if (ExcludedHeaderFiles.count(*FileRef))
+ Header.setExcluded();
+ }
+ }
+ // Report if glob was ignored.
+ for (const auto &Glob : ExcludedHeaderGlobs)
+ if (!Glob->didMatch())
+ Diags->Report(diag::warn_glob_did_not_match) << Glob->str();
// Parse binary dylib and initialize verifier.
if (DriverOpts.DylibToVerify.empty()) {
diff --git a/clang/tools/clang-installapi/Options.h b/clang/tools/clang-installapi/Options.h
index 2beeafc86bb086..c18309f693701e 100644
--- a/clang/tools/clang-installapi/Options.h
+++ b/clang/tools/clang-installapi/Options.h
@@ -31,6 +31,24 @@ struct DriverOptions {
/// \brief Path to input file lists (JSON).
llvm::MachO::PathSeq FileLists;
+ /// \brief Paths of extra public headers.
+ PathSeq ExtraPublicHeaders;
+
+ /// \brief Paths of extra private headers.
+ PathSeq ExtraPrivateHeaders;
+
+ /// \brief Paths of extra project headers.
+ PathSeq ExtraProjectHeaders;
+
+ /// \brief List of excluded public headers.
+ PathSeq ExcludePublicHeaders;
+
+ /// \brief List of excluded private headers.
+ PathSeq ExcludePrivateHeaders;
+
+ /// \brief List of excluded project headers.
+ PathSeq ExcludeProjectHeaders;
+
/// \brief Mappings of target triples & tapi targets to build for.
std::map<llvm::MachO::Target, llvm::Triple> Targets;
@@ -103,6 +121,9 @@ class Options {
std::vector<std::string> &getClangFrontendArgs() { return FrontendArgs; }
private:
+ bool addFilePaths(llvm::opt::InputArgList &Args, PathSeq &Headers,
+ llvm::opt::OptSpecifier ID);
+
DiagnosticsEngine *Diags;
FileManager *FM;
std::vector<std::string> FrontendArgs;
diff --git a/llvm/include/llvm/TextAPI/Utils.h b/llvm/include/llvm/TextAPI/Utils.h
index 31d3c45f9e2964..353859ca4cea6f 100644
--- a/llvm/include/llvm/TextAPI/Utils.h
+++ b/llvm/include/llvm/TextAPI/Utils.h
@@ -16,6 +16,7 @@
#include "llvm/ADT/Twine.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"
+#include "llvm/Support/Regex.h"
#if !defined(PATH_MAX)
#define PATH_MAX 1024
@@ -68,5 +69,10 @@ std::error_code make_relative(StringRef From, StringRef To,
/// \param IsSymLink Whether path points to a symlink.
bool isPrivateLibrary(StringRef Path, bool IsSymLink = false);
+/// Create a regex rule from provided glob string.
+/// \param Glob String that represents glob input.
+/// \return The equivalent regex rule.
+llvm::Expected<llvm::Regex> createRegexFromGlob(llvm::StringRef Glob);
+
} // namespace llvm::MachO
#endif // LLVM_TEXTAPI_UTILS_H
diff --git a/llvm/lib/TextAPI/Utils.cpp b/llvm/lib/TextAPI/Utils.cpp
index b5c3999a86ea9d..61f4df1d4a6beb 100644
--- a/llvm/lib/TextAPI/Utils.cpp
+++ b/llvm/lib/TextAPI/Utils.cpp
@@ -152,3 +152,49 @@ bool llvm::MachO::isPrivateLibrary(StringRef Path, bool IsSymLink) {
}
return false;
}
+
+static StringLiteral RegexMetachars = "()^$|+.[]\\{}";
+
+Expected<Regex> llvm::MachO::createRegexFromGlob(StringRef Glob) {
+ SmallString<128> RegexString("^");
+ unsigned NumWildcards = 0;
+ for (unsigned i = 0; i < Glob.size(); ++i) {
+ char C = Glob[i];
+ switch (C) {
+ case '?':
+ RegexString += '.';
+ break;
+ case '*': {
+ const char *PrevChar = i > 0 ? Glob.data() + i - 1 : nullptr;
+ NumWildcards = 1;
+ ++i;
+ while (i < Glob.size() && Glob[i] == '*') {
+ ++NumWildcards;
+ ++i;
+ }
+ const char *NextChar = i < Glob.size() ? Glob.data() + i : nullptr;
+
+ if ((NumWildcards > 1) && (PrevChar == nullptr || *PrevChar == '/') &&
+ (NextChar == nullptr || *NextChar == '/')) {
+ RegexString += "(([^/]*(/|$))*)";
+ } else
+ RegexString += "([^/]*)";
+ break;
+ }
+ default:
+ if (RegexMetachars.find(C) != StringRef::npos)
+ RegexString.push_back('\\');
+ RegexString.push_back(C);
+ }
+ }
+ RegexString.push_back('$');
+ if (NumWildcards == 0)
+ return make_error<StringError>("not a glob", inconvertibleErrorCode());
+
+ auto Rule = Regex(RegexString);
+ std::string Error;
+ if (!Rule.isValid(Error))
+ return make_error<StringError>(Error, inconvertibleErrorCode());
+
+ return Rule;
+}
>From 4f1a75f4adb3dbfed6bd006aae5d4d4cf96d6d48 Mon Sep 17 00:00:00 2001
From: Cyndy Ishida <cyndy_ishida at apple.com>
Date: Mon, 25 Mar 2024 12:27:42 -0400
Subject: [PATCH 2/2] Remove `const` from instantiation
---
clang/tools/clang-installapi/Options.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/tools/clang-installapi/Options.cpp b/clang/tools/clang-installapi/Options.cpp
index 1b38a264ad1fe0..4f79c62724a62d 100644
--- a/clang/tools/clang-installapi/Options.cpp
+++ b/clang/tools/clang-installapi/Options.cpp
@@ -380,7 +380,7 @@ InstallAPIContext Options::createContext() {
// After all headers have been added, consider excluded headers.
std::vector<std::unique_ptr<HeaderGlob>> ExcludedHeaderGlobs;
- std::set<const FileEntryRef> ExcludedHeaderFiles;
+ std::set<FileEntryRef> ExcludedHeaderFiles;
auto ParseGlobs = [&](const PathSeq &Paths, HeaderType Type) {
for (const StringRef Path : Paths) {
auto Glob = HeaderGlob::create(Path, Type);
More information about the cfe-commits
mailing list