<div dir="ltr">Hi. <br><br>The asan bot is unhappy: <br><a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/35078/steps/check-llvm%20asan/logs/stdio">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/35078/steps/check-llvm%20asan/logs/stdio</a><br><br>Please fix or revert ASAP. <br><br>=================================================================<br>==10406==ERROR: LeakSanitizer: detected memory leaks<br><br>Direct leak of 312 byte(s) in 1 object(s) allocated from:<br>    #0 0x514d38 in operator new(unsigned long) /b/sanitizer-x86_64-linux-fast/build/llvm-project/compiler-rt/lib/asan/asan_new_delete.cc:105<br>    #1 0x15627c9 in llvm::yaml::MappingTraits<llvm::MachO::InterfaceFile const*>::NormalizedTBD::denormalize(llvm::yaml::IO&) /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/lib/TextAPI/MachO/TextStub.cpp:403:20<br>    #2 0x1548510 in ~MappingNormalization /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/Support/YAMLTraits.h:1321:24<br>    #3 0x1548510 in llvm::yaml::MappingTraits<llvm::MachO::InterfaceFile const*>::mapping(llvm::yaml::IO&, llvm::MachO::InterfaceFile const*&) /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/lib/TextAPI/MachO/TextStub.cpp:592<br>    #4 0x1542bbe in doMapping<const llvm::MachO::InterfaceFile *> /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/Support/YAMLTraits.h:961:3<br>    #5 0x1542bbe in yamlize<const llvm::MachO::InterfaceFile *, llvm::yaml::EmptyContext> /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/Support/YAMLTraits.h:1085<br>    #6 0x1542bbe in operator>><std::__1::vector<const llvm::MachO::InterfaceFile *, std::__1::allocator<const llvm::MachO::InterfaceFile *> > > /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/Support/YAMLTraits.h:1696<br>    #7 0x1542bbe in llvm::MachO::TextAPIReader::get(llvm::MemoryBufferRef) /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/lib/TextAPI/MachO/TextStub.cpp:633<br>    #8 0x139fd27 in llvm::object::TapiUniversal::TapiUniversal(llvm::MemoryBufferRef, llvm::Error&) /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/lib/Object/TapiUniversal.cpp:25:17<br>    #9 0x13a0b0d in llvm::object::TapiUniversal::create(llvm::MemoryBufferRef) /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/lib/Object/TapiUniversal.cpp:50:42<br>    #10 0x122d5e9 in llvm::object::createBinary(llvm::MemoryBufferRef, llvm::LLVMContext*) /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/lib/Object/Binary.cpp:91:12<br>    #11 0x51cf7c in dumpSymbolNamesFromFile(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/tools/llvm-nm/llvm-nm.cpp:1795:7<br>    #12 0x51bbf7 in for_each<std::__1::__wrap_iter<std::__1::basic_string<char> *>, void (*)(std::__1::basic_string<char> &)> /b/sanitizer-x86_64-linux-fast/build/libcxx_build_asan/include/c++/v1/algorithm:886:9<br>    #13 0x51bbf7 in for_each<llvm::cl::list<std::__1::basic_string<char>, bool, llvm::cl::parser<std::string> > &, void (*)(std::__1::basic_string<char> &)> /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/ADT/STLExtras.h:1159<br>    #14 0x51bbf7 in main /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/tools/llvm-nm/llvm-nm.cpp:2163<br>    #15 0x7f08c0c232e0 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x202e0)<br><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Sep 10, 2019 at 4:59 PM Cyndy Ishida via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Author: cishida<br>
Date: Tue Sep 10 17:00:53 2019<br>
New Revision: 371576<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=371576&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=371576&view=rev</a><br>
Log:<br>
[llvm-nm] Add tapi file support<br>
<br>
Summary:<br>
This commit is the final one for adding tapi support to the llvm-nm implementation.<br>
This commit also has accompanying tests the additions to lib/Object<br>
<br>
Reviewers: ributzka, steven_wu<br>
<br>
Reviewed By: ributzka<br>
<br>
Subscribers: hiraditya, plotfi, dexonsmith, rupprecht, llvm-commits<br>
<br>
Tags: #llvm<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D66160" rel="noreferrer" target="_blank">https://reviews.llvm.org/D66160</a><br>
<br>
Added:<br>
    llvm/trunk/test/Object/Inputs/tapi-invalid-v1.tbd<br>
    llvm/trunk/test/Object/Inputs/tapi-invalid-v2.tbd<br>
    llvm/trunk/test/Object/Inputs/tapi-invalid-v3.tbd<br>
    llvm/trunk/test/Object/Inputs/tapi-v1.tbd<br>
    llvm/trunk/test/Object/Inputs/tapi-v2.tbd<br>
    llvm/trunk/test/Object/Inputs/tapi-v3.tbd<br>
    llvm/trunk/test/Object/nm-tapi-invalids.test<br>
    llvm/trunk/test/Object/nm-tapi.test<br>
Modified:<br>
    llvm/trunk/include/llvm/Object/TapiFile.h<br>
    llvm/trunk/include/llvm/TextAPI/MachO/Architecture.def<br>
    llvm/trunk/include/llvm/TextAPI/MachO/Architecture.h<br>
    llvm/trunk/lib/Object/TapiFile.cpp<br>
    llvm/trunk/lib/TextAPI/MachO/Architecture.cpp<br>
    llvm/trunk/lib/TextAPI/MachO/TextStubCommon.cpp<br>
    llvm/trunk/tools/llvm-nm/llvm-nm.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/Object/TapiFile.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/TapiFile.h?rev=371576&r1=371575&r2=371576&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/TapiFile.h?rev=371576&r1=371575&r2=371576&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Object/TapiFile.h (original)<br>
+++ llvm/trunk/include/llvm/Object/TapiFile.h Tue Sep 10 17:00:53 2019<br>
@@ -41,6 +41,8 @@ public:<br>
<br>
   static bool classof(const Binary *v) { return v->isTapiFile(); }<br>
<br>
+  bool is64Bit() { return MachO::is64Bit(Arch); }<br>
+<br>
 private:<br>
   struct Symbol {<br>
     StringRef Prefix;<br>
@@ -52,6 +54,7 @@ private:<br>
   };<br>
<br>
   std::vector<Symbol> Symbols;<br>
+  MachO::Architecture Arch;<br>
 };<br>
<br>
 } // end namespace object.<br>
<br>
Modified: llvm/trunk/include/llvm/TextAPI/MachO/Architecture.def<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/TextAPI/MachO/Architecture.def?rev=371576&r1=371575&r2=371576&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/TextAPI/MachO/Architecture.def?rev=371576&r1=371575&r2=371576&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/TextAPI/MachO/Architecture.def (original)<br>
+++ llvm/trunk/include/llvm/TextAPI/MachO/Architecture.def Tue Sep 10 17:00:53 2019<br>
@@ -13,26 +13,26 @@<br>
 ///<br>
 /// X86 architectures sorted by cpu type and sub type id.<br>
 ///<br>
-ARCHINFO(i386, MachO::CPU_TYPE_I386, MachO::CPU_SUBTYPE_I386_ALL)<br>
-ARCHINFO(x86_64, MachO::CPU_TYPE_X86_64, MachO::CPU_SUBTYPE_X86_64_ALL)<br>
-ARCHINFO(x86_64h, MachO::CPU_TYPE_X86_64, MachO::CPU_SUBTYPE_X86_64_H)<br>
+ARCHINFO(i386, MachO::CPU_TYPE_I386, MachO::CPU_SUBTYPE_I386_ALL, 32)<br>
+ARCHINFO(x86_64, MachO::CPU_TYPE_X86_64, MachO::CPU_SUBTYPE_X86_64_ALL, 64)<br>
+ARCHINFO(x86_64h, MachO::CPU_TYPE_X86_64, MachO::CPU_SUBTYPE_X86_64_H, 64)<br>
<br>
<br>
 ///<br>
 /// ARM architectures sorted by cpu sub type id.<br>
 ///<br>
-ARCHINFO(armv4t, MachO::CPU_TYPE_ARM, MachO::CPU_SUBTYPE_ARM_V4T)<br>
-ARCHINFO(armv6, MachO::CPU_TYPE_ARM, MachO::CPU_SUBTYPE_ARM_V6)<br>
-ARCHINFO(armv5, MachO::CPU_TYPE_ARM, MachO::CPU_SUBTYPE_ARM_V5TEJ)<br>
-ARCHINFO(armv7, MachO::CPU_TYPE_ARM, MachO::CPU_SUBTYPE_ARM_V7)<br>
-ARCHINFO(armv7s, MachO::CPU_TYPE_ARM, MachO::CPU_SUBTYPE_ARM_V7S)<br>
-ARCHINFO(armv7k, MachO::CPU_TYPE_ARM, MachO::CPU_SUBTYPE_ARM_V7K)<br>
-ARCHINFO(armv6m, MachO::CPU_TYPE_ARM, MachO::CPU_SUBTYPE_ARM_V6M)<br>
-ARCHINFO(armv7m, MachO::CPU_TYPE_ARM, MachO::CPU_SUBTYPE_ARM_V7M)<br>
-ARCHINFO(armv7em, MachO::CPU_TYPE_ARM, MachO::CPU_SUBTYPE_ARM_V7EM)<br>
+ARCHINFO(armv4t, MachO::CPU_TYPE_ARM, MachO::CPU_SUBTYPE_ARM_V4T, 32)<br>
+ARCHINFO(armv6, MachO::CPU_TYPE_ARM, MachO::CPU_SUBTYPE_ARM_V6, 32)<br>
+ARCHINFO(armv5, MachO::CPU_TYPE_ARM, MachO::CPU_SUBTYPE_ARM_V5TEJ, 32)<br>
+ARCHINFO(armv7, MachO::CPU_TYPE_ARM, MachO::CPU_SUBTYPE_ARM_V7, 32)<br>
+ARCHINFO(armv7s, MachO::CPU_TYPE_ARM, MachO::CPU_SUBTYPE_ARM_V7S, 32)<br>
+ARCHINFO(armv7k, MachO::CPU_TYPE_ARM, MachO::CPU_SUBTYPE_ARM_V7K, 32)<br>
+ARCHINFO(armv6m, MachO::CPU_TYPE_ARM, MachO::CPU_SUBTYPE_ARM_V6M, 32)<br>
+ARCHINFO(armv7m, MachO::CPU_TYPE_ARM, MachO::CPU_SUBTYPE_ARM_V7M, 32)<br>
+ARCHINFO(armv7em, MachO::CPU_TYPE_ARM, MachO::CPU_SUBTYPE_ARM_V7EM, 32)<br>
<br>
<br>
 ///<br>
 /// ARM64 architectures sorted by cpu sub type id.<br>
 ///<br>
-ARCHINFO(arm64, MachO::CPU_TYPE_ARM64, MachO::CPU_SUBTYPE_ARM64_ALL)<br>
+ARCHINFO(arm64, MachO::CPU_TYPE_ARM64, MachO::CPU_SUBTYPE_ARM64_ALL, 64)<br>
<br>
Modified: llvm/trunk/include/llvm/TextAPI/MachO/Architecture.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/TextAPI/MachO/Architecture.h?rev=371576&r1=371575&r2=371576&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/TextAPI/MachO/Architecture.h?rev=371576&r1=371575&r2=371576&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/TextAPI/MachO/Architecture.h (original)<br>
+++ llvm/trunk/include/llvm/TextAPI/MachO/Architecture.h Tue Sep 10 17:00:53 2019<br>
@@ -21,7 +21,7 @@ namespace MachO {<br>
<br>
 /// Defines the architecture slices that are supported by Text-based Stub files.<br>
 enum Architecture : uint8_t {<br>
-#define ARCHINFO(Arch, Type, SubType) AK_##Arch,<br>
+#define ARCHINFO(Arch, Type, SubType, NumBits) AK_##Arch,<br>
 #include "llvm/TextAPI/MachO/Architecture.def"<br>
 #undef ARCHINFO<br>
   AK_unknown, // this has to go last.<br>
@@ -39,6 +39,9 @@ StringRef getArchitectureName(Architectu<br>
 /// Convert an architecture slice to a CPU Type and Subtype pair.<br>
 std::pair<uint32_t, uint32_t> getCPUTypeFromArchitecture(Architecture Arch);<br>
<br>
+/// Check if architecture is 64 bit<br>
+bool is64Bit(Architecture);<br>
+<br>
 raw_ostream &operator<<(raw_ostream &OS, Architecture Arch);<br>
<br>
 } // end namespace MachO.<br>
<br>
Modified: llvm/trunk/lib/Object/TapiFile.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/TapiFile.cpp?rev=371576&r1=371575&r2=371576&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/TapiFile.cpp?rev=371576&r1=371575&r2=371576&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Object/TapiFile.cpp (original)<br>
+++ llvm/trunk/lib/Object/TapiFile.cpp Tue Sep 10 17:00:53 2019<br>
@@ -40,7 +40,7 @@ static uint32_t getFlags(const Symbol *S<br>
<br>
 TapiFile::TapiFile(MemoryBufferRef Source, const InterfaceFile &interface,<br>
                    Architecture Arch)<br>
-    : SymbolicFile(ID_TapiFile, Source) {<br>
+    : SymbolicFile(ID_TapiFile, Source), Arch(Arch) {<br>
   for (const auto *Symbol : interface.symbols()) {<br>
     if (!Symbol->getArchitectures().has(Arch))<br>
       continue;<br>
<br>
Modified: llvm/trunk/lib/TextAPI/MachO/Architecture.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/TextAPI/MachO/Architecture.cpp?rev=371576&r1=371575&r2=371576&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/TextAPI/MachO/Architecture.cpp?rev=371576&r1=371575&r2=371576&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/TextAPI/MachO/Architecture.cpp (original)<br>
+++ llvm/trunk/lib/TextAPI/MachO/Architecture.cpp Tue Sep 10 17:00:53 2019<br>
@@ -11,6 +11,7 @@<br>
 //===----------------------------------------------------------------------===//<br>
<br>
 #include "llvm/TextAPI/MachO/Architecture.h"<br>
+#include "llvm/TextAPI/MachO/ArchitectureSet.h"<br>
 #include "llvm/ADT/StringSwitch.h"<br>
 #include "llvm/BinaryFormat/MachO.h"<br>
<br>
@@ -18,7 +19,7 @@ namespace llvm {<br>
 namespace MachO {<br>
<br>
 Architecture getArchitectureFromCpuType(uint32_t CPUType, uint32_t CPUSubType) {<br>
-#define ARCHINFO(Arch, Type, Subtype)                                          \<br>
+#define ARCHINFO(Arch, Type, Subtype, NumBits)                                 \<br>
   if (CPUType == (Type) &&                                                     \<br>
       (CPUSubType & ~MachO::CPU_SUBTYPE_MASK) == (Subtype))                    \<br>
     return AK_##Arch;<br>
@@ -30,7 +31,7 @@ Architecture getArchitectureFromCpuType(<br>
<br>
 Architecture getArchitectureFromName(StringRef Name) {<br>
   return StringSwitch<Architecture>(Name)<br>
-#define ARCHINFO(Arch, Type, Subtype) .Case(#Arch, AK_##Arch)<br>
+#define ARCHINFO(Arch, Type, Subtype, NumBits) .Case(#Arch, AK_##Arch)<br>
 #include "llvm/TextAPI/MachO/Architecture.def"<br>
 #undef ARCHINFO<br>
       .Default(AK_unknown);<br>
@@ -38,7 +39,7 @@ Architecture getArchitectureFromName(Str<br>
<br>
 StringRef getArchitectureName(Architecture Arch) {<br>
   switch (Arch) {<br>
-#define ARCHINFO(Arch, Type, Subtype)                                          \<br>
+#define ARCHINFO(Arch, Type, Subtype, NumBits)                                 \<br>
   case AK_##Arch:                                                              \<br>
     return #Arch;<br>
 #include "llvm/TextAPI/MachO/Architecture.def"<br>
@@ -54,7 +55,7 @@ StringRef getArchitectureName(Architectu<br>
<br>
 std::pair<uint32_t, uint32_t> getCPUTypeFromArchitecture(Architecture Arch) {<br>
   switch (Arch) {<br>
-#define ARCHINFO(Arch, Type, Subtype)                                          \<br>
+#define ARCHINFO(Arch, Type, Subtype, NumBits)                                 \<br>
   case AK_##Arch:                                                              \<br>
     return std::make_pair(Type, Subtype);<br>
 #include "llvm/TextAPI/MachO/Architecture.def"<br>
@@ -68,6 +69,22 @@ std::pair<uint32_t, uint32_t> getCPUType<br>
   return std::make_pair(0, 0);<br>
 }<br>
<br>
+bool is64Bit(Architecture Arch) {<br>
+  switch (Arch) {<br>
+#define ARCHINFO(Arch, Type, Subtype, NumBits)                                 \<br>
+  case AK_##Arch:                                                              \<br>
+    return NumBits == 64;<br>
+#include "llvm/TextAPI/MachO/Architecture.def"<br>
+#undef ARCHINFO<br>
+  case AK_unknown:<br>
+    return false;<br>
+  }<br>
+<br>
+  // Appease some compilers that cannot figure out that this is a fully covered<br>
+  // switch statement.<br>
+  return false;<br>
+}<br>
+<br>
 raw_ostream &operator<<(raw_ostream &OS, Architecture Arch) {<br>
   OS << getArchitectureName(Arch);<br>
   return OS;<br>
<br>
Modified: llvm/trunk/lib/TextAPI/MachO/TextStubCommon.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/TextAPI/MachO/TextStubCommon.cpp?rev=371576&r1=371575&r2=371576&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/TextAPI/MachO/TextStubCommon.cpp?rev=371576&r1=371575&r2=371576&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/TextAPI/MachO/TextStubCommon.cpp (original)<br>
+++ llvm/trunk/lib/TextAPI/MachO/TextStubCommon.cpp Tue Sep 10 17:00:53 2019<br>
@@ -84,7 +84,7 @@ QuotingType ScalarTraits<PlatformKind>::<br>
<br>
 void ScalarBitSetTraits<ArchitectureSet>::bitset(IO &IO,<br>
                                                  ArchitectureSet &Archs) {<br>
-#define ARCHINFO(arch, type, subtype)                                          \<br>
+#define ARCHINFO(arch, type, subtype, numbits)                                 \<br>
   IO.bitSetCase(Archs, #arch, 1U << static_cast<int>(AK_##arch));<br>
 #include "llvm/TextAPI/MachO/Architecture.def"<br>
 #undef ARCHINFO<br>
<br>
Added: llvm/trunk/test/Object/Inputs/tapi-invalid-v1.tbd<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/tapi-invalid-v1.tbd?rev=371576&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/tapi-invalid-v1.tbd?rev=371576&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Object/Inputs/tapi-invalid-v1.tbd (added)<br>
+++ llvm/trunk/test/Object/Inputs/tapi-invalid-v1.tbd Tue Sep 10 17:00:53 2019<br>
@@ -0,0 +1,21 @@<br>
+--- !tapi-tbd-v1<br>
+<br>
+archs: [ armv7, armv7s, arm64 ]<br>
+<br>
+platform: ios<br>
+install-name: /u/l/libfoo.dylib<br>
+current-version: 1.2.3<br>
+compatibility-version: 1.0<br>
+swift-version: 0<br>
+objc-constraint: none<br>
+expors:<br>
+ - archs: [ arm64, armv7 ]<br>
+   allowed-clients: [ client ]<br>
+   re-exports: [ ]<br>
+   symbols: [ _sym, _test, _a, _b, ]<br>
+   objc-classes: []<br>
+   objc-ivars: []<br>
+<br>
+   weak-def-symbols: []<br>
+   thread-local-symbols: []<br>
+...<br>
<br>
Added: llvm/trunk/test/Object/Inputs/tapi-invalid-v2.tbd<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/tapi-invalid-v2.tbd?rev=371576&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/tapi-invalid-v2.tbd?rev=371576&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Object/Inputs/tapi-invalid-v2.tbd (added)<br>
+++ llvm/trunk/test/Object/Inputs/tapi-invalid-v2.tbd Tue Sep 10 17:00:53 2019<br>
@@ -0,0 +1,29 @@<br>
+--- !tapi-tbd-v2<br>
+uuids: [ "armv7: 00000000-0000-0000-0000-000000000000",<br>
+         "armv7s: 11111111-1111-1111-1111-111111111111",<br>
+         "arm64: 22222222-2222-2222-2222-222222222222" ]<br>
+platform: ios<br>
+flags: [ installapi ]<br>
+install-name: /u/l/libfoo.dylib<br>
+current-version: 1.2.3<br>
+compatibility-version: 1.0<br>
+swift-version: 0<br>
+objc-constraint: retain_release<br>
+parent-umbrella: Umbrella.dylib<br>
+exports:<br>
+  - archs: [ armv7, armv7s, arm64 ]<br>
+    allowable-clients: [ client ]<br>
+    re-exports: [ ]<br>
+    symbols: [ _sym1, _sym2, _sym3 ]<br>
+    objc-classes: []<br>
+    objc-ivars: []<br>
+<br>
+    weak-def-symbols: []<br>
+    thread-local-symbols: []<br>
+undefineds:<br>
+  - archs: [ arm64 ]<br>
+    symbols: [ _sym ]<br>
+    objc-classes: []<br>
+    objc-ivars: []<br>
+    weak-ref-symbols: []<br>
+...<br>
<br>
Added: llvm/trunk/test/Object/Inputs/tapi-invalid-v3.tbd<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/tapi-invalid-v3.tbd?rev=371576&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/tapi-invalid-v3.tbd?rev=371576&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Object/Inputs/tapi-invalid-v3.tbd (added)<br>
+++ llvm/trunk/test/Object/Inputs/tapi-invalid-v3.tbd Tue Sep 10 17:00:53 2019<br>
@@ -0,0 +1,24 @@<br>
+--- !tapi-tbd-v3<br>
+archs: [ i386, armv7, armv7s ]<br>
+platform: ios<br>
+install-name: /usr/lib/libfoo.dylib<br>
+swift-abi-version: 3<br>
+exports:<br>
+  - archs: [ i386, armv7, armv7s ]<br>
+    re-exports: [ /usr/lib/external/liba.dylib ]<br>
+    symbols: [ _sym1, _sym2 ]<br>
+    objc-classes: [ NSString, NSBlockPredicate ]<br>
+    objc-eh-types: [ NSString ]<br>
+    objc-ivars: [ NSBlockPredicate._block ]<br>
+  - archs: [ i386 ]<br>
+    symbols: [ _sym3 ]<br>
+--- !tapi-tbd-v3<br>
+archs: [ armv7, armv7s ]<br>
+platform: ios<br>
+install-name: /usr/lib/liba.dylib<br>
+swift-version: 3<br>
+exports:<br>
+  - archs: [ armv7, armv7s ]<br>
+    re-exports: [ /usr/lib/internal/liba.dylib ]<br>
+    symbols: [ _sym10, _sym11 ]<br>
+...<br>
<br>
Added: llvm/trunk/test/Object/Inputs/tapi-v1.tbd<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/tapi-v1.tbd?rev=371576&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/tapi-v1.tbd?rev=371576&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Object/Inputs/tapi-v1.tbd (added)<br>
+++ llvm/trunk/test/Object/Inputs/tapi-v1.tbd Tue Sep 10 17:00:53 2019<br>
@@ -0,0 +1,21 @@<br>
+--- !tapi-tbd-v1<br>
+<br>
+archs: [ armv7, armv7s ]<br>
+<br>
+platform: ios<br>
+install-name: /u/l/libfoo.dylib<br>
+current-version: 1.2.3<br>
+compatibility-version: 1.0<br>
+swift-version: 0<br>
+objc-constraint: none<br>
+exports:<br>
+ - archs: [ armv7 ]<br>
+   allowed-clients: [ client ]<br>
+   re-exports: [ ]<br>
+   symbols: [ _sym, ]<br>
+   objc-classes: []<br>
+   objc-ivars: []<br>
+<br>
+   weak-def-symbols: []<br>
+   thread-local-symbols: [_sym]<br>
+...<br>
<br>
Added: llvm/trunk/test/Object/Inputs/tapi-v2.tbd<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/tapi-v2.tbd?rev=371576&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/tapi-v2.tbd?rev=371576&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Object/Inputs/tapi-v2.tbd (added)<br>
+++ llvm/trunk/test/Object/Inputs/tapi-v2.tbd Tue Sep 10 17:00:53 2019<br>
@@ -0,0 +1,30 @@<br>
+--- !tapi-tbd-v2<br>
+archs: [ armv7, armv7s, arm64 ]<br>
+uuids: [ "armv7: 00000000-0000-0000-0000-000000000000",<br>
+         "armv7s: 11111111-1111-1111-1111-111111111111",<br>
+         "arm64: 22222222-2222-2222-2222-222222222222" ]<br>
+platform: ios<br>
+flags: [ installapi ]<br>
+install-name: /u/l/libfoo.dylib<br>
+current-version: 1.2.3<br>
+compatibility-version: 1.0<br>
+swift-version: 0<br>
+objc-constraint: retain_release<br>
+parent-umbrella: Umbrella.dylib<br>
+exports:<br>
+  - archs: [ armv7, armv7s, arm64 ]<br>
+    allowable-clients: [ client ]<br>
+    re-exports: [ ]<br>
+    symbols: [ _sym1, _sym2, _sym3 ]<br>
+    objc-classes: []<br>
+    objc-ivars: []<br>
+<br>
+    weak-def-symbols: []<br>
+    thread-local-symbols: []<br>
+undefineds:<br>
+  - archs: [ arm64 ]<br>
+    symbols: [ _sym ]<br>
+    objc-classes: []<br>
+    objc-ivars: []<br>
+    weak-ref-symbols: []<br>
+...<br>
<br>
Added: llvm/trunk/test/Object/Inputs/tapi-v3.tbd<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/tapi-v3.tbd?rev=371576&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/tapi-v3.tbd?rev=371576&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Object/Inputs/tapi-v3.tbd (added)<br>
+++ llvm/trunk/test/Object/Inputs/tapi-v3.tbd Tue Sep 10 17:00:53 2019<br>
@@ -0,0 +1,24 @@<br>
+--- !tapi-tbd-v3<br>
+archs: [ i386, armv7, armv7s ]<br>
+platform: ios<br>
+install-name: /usr/lib/libfoo.dylib<br>
+swift-abi-version: 3<br>
+exports:<br>
+  - archs: [ i386, armv7, armv7s ]<br>
+    re-exports: [ /usr/lib/external/liba.dylib ]<br>
+    symbols: [ _sym1, _sym2 ]<br>
+    objc-classes: [ NSString, NSBlockPredicate ]<br>
+    objc-eh-types: [ NSString ]<br>
+    objc-ivars: [ NSBlockPredicate._block ]<br>
+  - archs: [ i386 ]<br>
+    symbols: [ _sym3 ]<br>
+--- !tapi-tbd-v3<br>
+archs: [ armv7, armv7s ]<br>
+platform: ios<br>
+install-name: /usr/lib/liba.dylib<br>
+swift-abi-version: 3<br>
+exports:<br>
+  - archs: [ armv7, armv7s ]<br>
+    re-exports: [ /usr/lib/internal/liba.dylib ]<br>
+    symbols: [ _sym10, _sym11 ]<br>
+...<br>
<br>
Added: llvm/trunk/test/Object/nm-tapi-invalids.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/nm-tapi-invalids.test?rev=371576&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/nm-tapi-invalids.test?rev=371576&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Object/nm-tapi-invalids.test (added)<br>
+++ llvm/trunk/test/Object/nm-tapi-invalids.test Tue Sep 10 17:00:53 2019<br>
@@ -0,0 +1,20 @@<br>
+RUN: not llvm-nm %p/Inputs/tapi-invalid-v1.tbd 2>&1\<br>
+RUN:          | Filecheck %s -check-prefix v1<br>
+<br>
+RUN: not llvm-nm %p/Inputs/tapi-invalid-v2.tbd 2>&1\<br>
+RUN:          | Filecheck %s -check-prefix v2<br>
+<br>
+RUN: not llvm-nm %p/Inputs/tapi-invalid-v3.tbd 2>&1\<br>
+RUN:          | Filecheck %s -check-prefix v3<br>
+<br>
+# Typo Check<br>
+v1: tapi-invalid-v1.tbd malformed file<br>
+v1: tapi-invalid-v1.tbd:12:2: error: unknown key 'expors'<br>
+<br>
+# Missing required key<br>
+v2: tapi-invalid-v2.tbd malformed file<br>
+v2: tapi-invalid-v2.tbd:2:1: error: missing required key 'archs'<br>
+<br>
+# v2 key in v3 specified file<br>
+v3: tapi-invalid-v3.tbd malformed file<br>
+v3: tapi-invalid-v3.tbd:19:16: error: unknown key 'swift-version'<br>
<br>
Added: llvm/trunk/test/Object/nm-tapi.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/nm-tapi.test?rev=371576&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/nm-tapi.test?rev=371576&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Object/nm-tapi.test (added)<br>
+++ llvm/trunk/test/Object/nm-tapi.test Tue Sep 10 17:00:53 2019<br>
@@ -0,0 +1,56 @@<br>
+RUN: llvm-nm %p/Inputs/tapi-v1.tbd 2>&1\<br>
+RUN:          | Filecheck %s -check-prefix v1<br>
+<br>
+RUN: llvm-nm %p/Inputs/tapi-v2.tbd \<br>
+RUN:          | Filecheck %s -check-prefix v2<br>
+<br>
+RUN: llvm-nm %p/Inputs/tapi-v3.tbd \<br>
+RUN:          | Filecheck %s -check-prefix v3<br>
+<br>
+v1: no symbols<br>
+v1: tapi-v1.tbd (for architecture armv7):<br>
+v1: 00000000 S _sym<br>
+v1: tapi-v1.tbd (for architecture armv7s):<br>
+<br>
+v2: tapi-v2.tbd (for architecture armv7):<br>
+v2: 00000000 S _sym1<br>
+v2: 00000000 S _sym2<br>
+v2: 00000000 S _sym3<br>
+v2: tapi-v2.tbd (for architecture armv7s):<br>
+v2: 00000000 S _sym1<br>
+v2: 00000000 S _sym2<br>
+v2: 00000000 S _sym3<br>
+v2: tapi-v2.tbd (for architecture arm64):<br>
+v2:          U _sym<br>
+v2: 0000000000000000 S _sym1<br>
+v2: 0000000000000000 S _sym2<br>
+v2: 0000000000000000 S _sym3<br>
+<br>
+v3: tapi-v3.tbd (for architecture i386):<br>
+v3: 00000000 S _OBJC_CLASS_$_NSBlockPredicate<br>
+v3: 00000000 S _OBJC_CLASS_$_NSString<br>
+v3: 00000000 S _OBJC_EHTYPE_$_NSString<br>
+v3: 00000000 S _OBJC_IVAR_$_NSBlockPredicate._block<br>
+v3: 00000000 S _OBJC_METACLASS_$_NSBlockPredicate<br>
+v3: 00000000 S _OBJC_METACLASS_$_NSString<br>
+v3: 00000000 S _sym1<br>
+v3: 00000000 S _sym2<br>
+v3: 00000000 S _sym3<br>
+v3: tapi-v3.tbd (for architecture armv7):<br>
+v3: 00000000 S _OBJC_CLASS_$_NSBlockPredicate<br>
+v3: 00000000 S _OBJC_CLASS_$_NSString<br>
+v3: 00000000 S _OBJC_EHTYPE_$_NSString<br>
+v3: 00000000 S _OBJC_IVAR_$_NSBlockPredicate._block<br>
+v3: 00000000 S _OBJC_METACLASS_$_NSBlockPredicate<br>
+v3: 00000000 S _OBJC_METACLASS_$_NSString<br>
+v3: 00000000 S _sym1<br>
+v3: 00000000 S _sym2<br>
+v3: tapi-v3.tbd (for architecture armv7s):<br>
+v3: 00000000 S _OBJC_CLASS_$_NSBlockPredicate<br>
+v3: 00000000 S _OBJC_CLASS_$_NSString<br>
+v3: 00000000 S _OBJC_EHTYPE_$_NSString<br>
+v3: 00000000 S _OBJC_IVAR_$_NSBlockPredicate._block<br>
+v3: 00000000 S _OBJC_METACLASS_$_NSBlockPredicate<br>
+v3: 00000000 S _OBJC_METACLASS_$_NSString<br>
+v3: 00000000 S _sym1<br>
+v3: 00000000 S _sym2<br>
<br>
Modified: llvm/trunk/tools/llvm-nm/llvm-nm.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-nm/llvm-nm.cpp?rev=371576&r1=371575&r2=371576&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-nm/llvm-nm.cpp?rev=371576&r1=371575&r2=371576&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-nm/llvm-nm.cpp (original)<br>
+++ llvm/trunk/tools/llvm-nm/llvm-nm.cpp Tue Sep 10 17:00:53 2019<br>
@@ -28,6 +28,8 @@<br>
 #include "llvm/Object/MachO.h"<br>
 #include "llvm/Object/MachOUniversal.h"<br>
 #include "llvm/Object/ObjectFile.h"<br>
+#include "llvm/Object/TapiFile.h"<br>
+#include "llvm/Object/TapiUniversal.h"<br>
 #include "llvm/Object/Wasm.h"<br>
 #include "llvm/Support/CommandLine.h"<br>
 #include "llvm/Support/FileSystem.h"<br>
@@ -336,6 +338,8 @@ static char isSymbolList64Bit(SymbolicFi<br>
     return false;<br>
   if (isa<WasmObjectFile>(Obj))<br>
     return false;<br>
+  if (TapiFile *Tapi = dyn_cast<TapiFile>(&Obj))<br>
+    return Tapi->is64Bit();<br>
   if (MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(&Obj))<br>
     return MachO->is64Bit();<br>
   return cast<ELFObjectFileBase>(Obj).getBytesInAddress() == 8;<br>
@@ -1041,6 +1045,10 @@ static char getSymbolNMTypeChar(MachOObj<br>
   return '?';<br>
 }<br>
<br>
+static char getSymbolNMTypeChar(TapiFile &Obj, basic_symbol_iterator I) {<br>
+  return 's';<br>
+}<br>
+<br>
 static char getSymbolNMTypeChar(WasmObjectFile &Obj, basic_symbol_iterator I) {<br>
   uint32_t Flags = I->getFlags();<br>
   if (Flags & SymbolRef::SF_Executable)<br>
@@ -1133,6 +1141,8 @@ static char getNMSectionTagAndName(Symbo<br>
     Ret = getSymbolNMTypeChar(*MachO, I);<br>
   else if (WasmObjectFile *Wasm = dyn_cast<WasmObjectFile>(&Obj))<br>
     Ret = getSymbolNMTypeChar(*Wasm, I);<br>
+  else if (TapiFile *Tapi = dyn_cast<TapiFile>(&Obj))<br>
+    Ret = getSymbolNMTypeChar(*Tapi, I);<br>
   else<br>
     Ret = getSymbolNMTypeChar(cast<ELFObjectFileBase>(Obj), I);<br>
<br>
@@ -2063,6 +2073,26 @@ static void dumpSymbolNamesFromFile(std:<br>
     }<br>
     return;<br>
   }<br>
+<br>
+  if (TapiUniversal *TU = dyn_cast<TapiUniversal>(&Bin)) {<br>
+    for (auto &I : TU->objects()) {<br>
+      auto ObjOrErr = I.getAsObjectFile();<br>
+      if (ObjOrErr) {<br>
+        auto &Obj = *ObjOrErr.get();<br>
+        outs() << "\n"<br>
+               << Obj.getFileName() << " (for architecture "<br>
+               << I.getArchFlagName() << ")"<br>
+               << ":\n";<br>
+        dumpSymbolNamesFromObject(Obj, false, {}, I.getArchFlagName());<br>
+      } else if (auto E =<br>
+                     isNotObjectErrorInvalidFileType(ObjOrErr.takeError())) {<br>
+        error(std::move(E), Filename, I.getArchFlagName());<br>
+      }<br>
+    }<br>
+<br>
+    return;<br>
+  }<br>
+<br>
   if (SymbolicFile *O = dyn_cast<SymbolicFile>(&Bin)) {<br>
     if (!MachOPrintSizeWarning && PrintSize &&  isa<MachOObjectFile>(O)) {<br>
       WithColor::warning(errs(), ToolName)<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>