<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Hi Vitaly,<div class=""><br class=""></div><div class="">Thanks for point this out.  I didn’t seem to get an email for the sanitizer-x86_64-linux-fast bot.  I think it is because of the fields I added to the struct NMSymbol that are not set on the main path.  I’ve got a diff I’m building now to memset the structs to 0.  Should fix this.</div><div class=""><br class=""></div><div class="">Kev</div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jun 19, 2017, at 5:02 PM, Vitaly Buka <<a href="mailto:vitalybuka@google.com" class="">vitalybuka@google.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><pre class=""><span class="gmail-stdout"><font face="Courier New, courier, monotype, monospace" size="3" class=""><a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/5758/steps/check-llvm%20msan/logs/stdio" class="">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/5758/steps/check-llvm%20msan/logs/stdio</a><br class=""></font></span></pre><pre class=""><span class="gmail-stdout"><font face="Courier New, courier, monotype, monospace" size="3" class=""><br class=""></font></span></pre><pre style="font-family: 'Courier New', courier, monotype, monospace; font-size: inherit;" class=""><span class="gmail-stdout">Command Output (stderr):
--
==28618==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x51239a in sortAndPrintSymbolList(llvm::object::SymbolicFile&, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-nm/llvm-nm.cpp:733:21
    #1 0x5043d7 in dumpSymbolNamesFromObject(llvm::object::SymbolicFile&, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-nm/llvm-nm.cpp:1534:3
    #2 0x4ef45c in dumpSymbolNamesFromFile(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-nm/llvm-nm.cpp:1633:11
    #3 0x4e34f2 in for_each<std::__1::__wrap_iter<std::__1::basic_string<char> *>, void (*)(std::__1::basic_string<char> &)> /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/libcxx_build_msan/include/c++/v1/algorithm:965:9
    #4 0x4e34f2 in main /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-nm/llvm-nm.cpp:1925
    #5 0x7f4274b8482f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
    #6 0x476fd8 in _start (/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm_build_msan/bin/llvm-nm+0x476fd8)

SUMMARY: MemorySanitizer: use-of-uninitialized-value /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-nm/llvm-nm.cpp:733:21 in sortAndPrintSymbolList(llvm::object::SymbolicFile&, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Exiting
FileCheck error: '-' is empty.
FileCheck command line:  /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm_build_msan/./bin/FileCheck --check-prefix=COFF-SHORT-IMPORT /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/test/Object/archive-symtab.test

--
</span></pre><div class=""><span class="gmail-stdout"><br class=""></span></div></div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Mon, Jun 19, 2017 at 12:38 PM, Kevin Enderby via llvm-commits <span dir="ltr" class=""><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank" class="">llvm-commits@lists.llvm.org</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: enderby<br class="">
Date: Mon Jun 19 14:38:22 2017<br class="">
New Revision: 305733<br class="">
<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=305733&view=rev" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project?rev=305733&view=rev</a><br class="">
Log:<br class="">
Change llvm-nm for Mach-O files to use dyld info in some cases when printing symbols.<br class="">
<br class="">
In order to reduce swift binary sizes, Apple is now stripping swift symbols<br class="">
from the nlist symbol table.  llvm-nm currently only looks at the nlist symbol<br class="">
table and misses symbols that are present in dyld info.   This makes it hard to<br class="">
know the set of symbols for a binary using just llvm-nm.  Unless you know to<br class="">
run llvm-objdump -exports-trie that can output the exported symbols in the dyld<br class="">
info from the export trie, which does so but in a different format.<br class="">
<br class="">
Also moving forward the time may come a when a fully linked Mach-O file that<br class="">
uses dyld will no longer have an nlist symbol table to avoid duplicating the<br class="">
symbol information.<br class="">
<br class="">
This change adds three flags to llvm-nm, -add-dyldinfo, -no-dyldinfo, and<br class="">
-dyldinfo-only.<br class="">
<br class="">
The first, -add-dyldinfo, has the same effect as when the new bit in the Mach-O<br class="">
header, MH_NLIST_OUTOFSYNC_WITH_<wbr class="">DYLDINFO, appears in a binary.  In that it<br class="">
looks through the dyld info from the export trie and adds symbols to be printed<br class="">
that are not already in its internal SymbolList variable.  The -no-dyldinfo<br class="">
option turns this behavior off.<br class="">
<br class="">
The -dyldinfo-only option only looks at the dyld information and recreates the<br class="">
symbol table from the dyld info from the export trie and binding information.<br class="">
As if it the Mach-O file had no nlist symbol table.<br class="">
<br class="">
Also fixed a few bugs with Mach-O N_INDR symbols not correctly printing the<br class="">
indirect name, or in the same format as the old nm-classic program.<br class="">
<br class="">
<a href="rdar://32021551" class="">rdar://32021551</a><br class="">
<br class="">
Added:<br class="">
    llvm/trunk/test/tools/llvm-nm/<wbr class="">X86/Inputs/Strip-ST.dylib.<wbr class="">macho-x86_64   (with props)<br class="">
    llvm/trunk/test/tools/llvm-nm/<wbr class="">X86/dyldinfo.test<br class="">
Modified:<br class="">
    llvm/trunk/include/llvm/<wbr class="">BinaryFormat/MachO.h<br class="">
    llvm/trunk/tools/llvm-nm/llvm-<wbr class="">nm.cpp<br class="">
    llvm/trunk/tools/llvm-objdump/<wbr class="">MachODump.cpp<br class="">
<br class="">
Modified: llvm/trunk/include/llvm/<wbr class="">BinaryFormat/MachO.h<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/BinaryFormat/MachO.h?rev=305733&r1=305732&r2=305733&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/llvm/trunk/include/<wbr class="">llvm/BinaryFormat/MachO.h?rev=<wbr class="">305733&r1=305732&r2=305733&<wbr class="">view=diff</a><br class="">
==============================<wbr class="">==============================<wbr class="">==================<br class="">
--- llvm/trunk/include/llvm/<wbr class="">BinaryFormat/MachO.h (original)<br class="">
+++ llvm/trunk/include/llvm/<wbr class="">BinaryFormat/MachO.h Mon Jun 19 14:38:22 2017<br class="">
@@ -78,7 +78,8 @@ enum {<br class="">
   MH_DEAD_STRIPPABLE_DYLIB = 0x00400000u,<br class="">
   MH_HAS_TLV_DESCRIPTORS = 0x00800000u,<br class="">
   MH_NO_HEAP_EXECUTION = 0x01000000u,<br class="">
-  MH_APP_EXTENSION_SAFE = 0x02000000u<br class="">
+  MH_APP_EXTENSION_SAFE = 0x02000000u,<br class="">
+  MH_NLIST_OUTOFSYNC_WITH_<wbr class="">DYLDINFO = 0x04000000u<br class="">
 };<br class="">
<br class="">
 enum : uint32_t {<br class="">
<br class="">
Added: llvm/trunk/test/tools/llvm-nm/<wbr class="">X86/Inputs/Strip-ST.dylib.<wbr class="">macho-x86_64<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-nm/X86/Inputs/Strip-ST.dylib.macho-x86_64?rev=305733&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/llvm/trunk/test/tools/<wbr class="">llvm-nm/X86/Inputs/Strip-ST.<wbr class="">dylib.macho-x86_64?rev=305733&<wbr class="">view=auto</a><br class="">
==============================<wbr class="">==============================<wbr class="">==================<br class="">
Binary file - no diff available.<br class="">
<br class="">
Propchange: llvm/trunk/test/tools/llvm-nm/<wbr class="">X86/Inputs/Strip-ST.dylib.<wbr class="">macho-x86_64<br class="">
------------------------------<wbr class="">------------------------------<wbr class="">------------------<br class="">
    svn:executable = *<br class="">
<br class="">
Propchange: llvm/trunk/test/tools/llvm-nm/<wbr class="">X86/Inputs/Strip-ST.dylib.<wbr class="">macho-x86_64<br class="">
------------------------------<wbr class="">------------------------------<wbr class="">------------------<br class="">
    svn:mime-type = application/octet-stream<br class="">
<br class="">
Added: llvm/trunk/test/tools/llvm-nm/<wbr class="">X86/dyldinfo.test<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-nm/X86/dyldinfo.test?rev=305733&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/llvm/trunk/test/tools/<wbr class="">llvm-nm/X86/dyldinfo.test?rev=<wbr class="">305733&view=auto</a><br class="">
==============================<wbr class="">==============================<wbr class="">==================<br class="">
--- llvm/trunk/test/tools/llvm-nm/<wbr class="">X86/dyldinfo.test (added)<br class="">
+++ llvm/trunk/test/tools/llvm-nm/<wbr class="">X86/dyldinfo.test Mon Jun 19 14:38:22 2017<br class="">
@@ -0,0 +1,18 @@<br class="">
+# RUN: llvm-nm %p/Inputs/Strip-ST.dylib.<wbr class="">macho-x86_64 | FileCheck --check-prefix=DEFAULT %s<br class="">
+# RUN: llvm-nm -no-dyldinfo %p/Inputs/Strip-ST.dylib.<wbr class="">macho-x86_64 | FileCheck --check-prefix=NO-DYLDINFO %s<br class="">
+# RUN: llvm-nm -dyldinfo-only %p/Inputs/Strip-ST.dylib.<wbr class="">macho-x86_64 | FileCheck --check-prefix=DYLDINFO-ONLY %s<br class="">
+<br class="">
+# DEFAULT: 0000000000000f90 T __Bob_is_slow<br class="">
+# DEFAULT: 0000000000001008 D __T0ims_data<br class="">
+# DEFAULT: 0000000000000f80 T __T0om_is_not_swift<br class="">
+# DEFAULT: U dyld_stub_binder<br class="">
+<br class="">
+# NO-DYLDINFO: 0000000000000f90 T __Bob_is_slow<br class="">
+# NO-DYLDINFO-NOT: __T0ims_data<br class="">
+# NO-DYLDINFO-NOT: __T0om_is_not_swift<br class="">
+# NO-DYLDINFO: U dyld_stub_binder<br class="">
+<br class="">
+# DYLDINFO-ONLY: 0000000000000f90 T __Bob_is_slow<br class="">
+# DYLDINFO-ONLY: 0000000000001008 D __T0ims_data<br class="">
+# DYLDINFO-ONLY: 0000000000000f80 T __T0om_is_not_swift<br class="">
+# DYLDINFO-ONLY-NOT: U dyld_stub_binder<br class="">
<br class="">
Modified: llvm/trunk/tools/llvm-nm/llvm-<wbr class="">nm.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-nm/llvm-nm.cpp?rev=305733&r1=305732&r2=305733&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/llvm/trunk/tools/llvm-<wbr class="">nm/llvm-nm.cpp?rev=305733&r1=<wbr class="">305732&r2=305733&view=diff</a><br class="">
==============================<wbr class="">==============================<wbr class="">==================<br class="">
--- llvm/trunk/tools/llvm-nm/llvm-<wbr class="">nm.cpp (original)<br class="">
+++ llvm/trunk/tools/llvm-nm/llvm-<wbr class="">nm.cpp Mon Jun 19 14:38:22 2017<br class="">
@@ -167,6 +167,15 @@ cl::list<std::string> SegSect("s", cl::P<br class="">
<br class="">
 cl::opt<bool> FormatMachOasHex("x", cl::desc("Print symbol entry in hex, "<br class="">
                                              "Mach-O only"), cl::Grouping);<br class="">
+cl::opt<bool> AddDyldInfo("add-dyldinfo",<br class="">
+                          cl::desc("Add symbols from the dyldinfo not already "<br class="">
+                                   "in the symbol table, Mach-O only"));<br class="">
+cl::opt<bool> NoDyldInfo("no-dyldinfo",<br class="">
+                         cl::desc("Don't add any symbols from the dyldinfo, "<br class="">
+                                  "Mach-O only"));<br class="">
+cl::opt<bool> DyldInfoOnly("dyldinfo-only",<br class="">
+                           cl::desc("Show only symbols from the dyldinfo, "<br class="">
+                                    "Mach-O only"));<br class="">
<br class="">
 cl::opt<bool> NoLLVMBitcode("no-llvm-bc",<br class="">
                             cl::desc("Disable LLVM bitcode reader"));<br class="">
@@ -247,6 +256,17 @@ struct NMSymbol {<br class="">
   char TypeChar;<br class="">
   StringRef Name;<br class="">
   BasicSymbolRef Sym;<br class="">
+  // The Sym field above points to the native symbol in the object file,<br class="">
+  // for Mach-O when we are creating symbols from the dyld info the above<br class="">
+  // pointer is null as there is no native symbol.  In these cases the fields<br class="">
+  // below are filled in to represent what would have been a Mach-O nlist<br class="">
+  // native symbol.<br class="">
+  uint32_t SymFlags;<br class="">
+  SectionRef Section;<br class="">
+  uint8_t NType;<br class="">
+  uint8_t NSect;<br class="">
+  uint16_t NDesc;<br class="">
+  StringRef IndirectName;<br class="">
 };<br class="">
 } // anonymous namespace<br class="">
<br class="">
@@ -331,22 +351,38 @@ static void darwinPrintSymbol(SymbolicFi<br class="">
       H_64 = MachO->MachOObjectFile::<wbr class="">getHeader64();<br class="">
       Filetype = H_64.filetype;<br class="">
       Flags = H_64.flags;<br class="">
-      MachO::nlist_64 STE_64 = MachO->getSymbol64TableEntry(<wbr class="">SymDRI);<br class="">
-      NType = STE_64.n_type;<br class="">
-      NSect = STE_64.n_sect;<br class="">
-      NDesc = STE_64.n_desc;<br class="">
-      NStrx = STE_64.n_strx;<br class="">
-      NValue = STE_64.n_value;<br class="">
+      if (SymDRI.p){<br class="">
+        MachO::nlist_64 STE_64 = MachO->getSymbol64TableEntry(<wbr class="">SymDRI);<br class="">
+        NType = STE_64.n_type;<br class="">
+        NSect = STE_64.n_sect;<br class="">
+        NDesc = STE_64.n_desc;<br class="">
+        NStrx = STE_64.n_strx;<br class="">
+        NValue = STE_64.n_value;<br class="">
+      } else {<br class="">
+        NType = I->NType;<br class="">
+        NSect = I->NSect;<br class="">
+        NDesc = I->NDesc;<br class="">
+        NStrx = 0;<br class="">
+        NValue = I->Address;<br class="">
+      }<br class="">
     } else {<br class="">
       H = MachO->MachOObjectFile::<wbr class="">getHeader();<br class="">
       Filetype = H.filetype;<br class="">
       Flags = H.flags;<br class="">
-      MachO::nlist STE = MachO->getSymbolTableEntry(<wbr class="">SymDRI);<br class="">
-      NType = STE.n_type;<br class="">
-      NSect = STE.n_sect;<br class="">
-      NDesc = STE.n_desc;<br class="">
-      NStrx = STE.n_strx;<br class="">
-      NValue = STE.n_value;<br class="">
+      if (SymDRI.p){<br class="">
+        MachO::nlist STE = MachO->getSymbolTableEntry(<wbr class="">SymDRI);<br class="">
+        NType = STE.n_type;<br class="">
+        NSect = STE.n_sect;<br class="">
+        NDesc = STE.n_desc;<br class="">
+        NStrx = STE.n_strx;<br class="">
+        NValue = STE.n_value;<br class="">
+      } else {<br class="">
+        NType = I->NType;<br class="">
+        NSect = I->NSect;<br class="">
+        NDesc = I->NDesc;<br class="">
+        NStrx = 0;<br class="">
+        NValue = I->Address;<br class="">
+      }<br class="">
     }<br class="">
   }<br class="">
<br class="">
@@ -363,7 +399,22 @@ static void darwinPrintSymbol(SymbolicFi<br class="">
     outs() << Str << ' ';<br class="">
     format("%08x", NStrx).print(Str, sizeof(Str));<br class="">
     outs() << Str << ' ';<br class="">
-    outs() << I->Name << "\n";<br class="">
+    outs() << I->Name;<br class="">
+    if ((NType & MachO::N_TYPE) == MachO::N_INDR) {<br class="">
+      outs() << " (indirect for ";<br class="">
+      format(printFormat, NValue).print(Str, sizeof(Str));<br class="">
+      outs() << Str << ' ';<br class="">
+      StringRef IndirectName;<br class="">
+      if (I->Sym.getRawDataRefImpl().p) {<br class="">
+        if (MachO->getIndirectName(I-><wbr class="">Sym.getRawDataRefImpl(), IndirectName))<br class="">
+          outs() << "?)";<br class="">
+        else<br class="">
+          outs() << IndirectName << ")";<br class="">
+      }<br class="">
+      else<br class="">
+        outs() << I->IndirectName << ")";<br class="">
+    }<br class="">
+    outs() << "\n";<br class="">
     return;<br class="">
   }<br class="">
<br class="">
@@ -419,14 +470,19 @@ static void darwinPrintSymbol(SymbolicFi<br class="">
         outs() << "(?,?) ";<br class="">
       break;<br class="">
     }<br class="">
-    Expected<section_iterator> SecOrErr =<br class="">
-      MachO->getSymbolSection(I-><wbr class="">Sym.getRawDataRefImpl());<br class="">
-    if (!SecOrErr) {<br class="">
-      consumeError(SecOrErr.<wbr class="">takeError());<br class="">
-      outs() << "(?,?) ";<br class="">
-      break;<br class="">
+    section_iterator Sec = SectionRef();<br class="">
+    if (I->Sym.getRawDataRefImpl().p) {<br class="">
+      Expected<section_iterator> SecOrErr =<br class="">
+        MachO->getSymbolSection(I-><wbr class="">Sym.getRawDataRefImpl());<br class="">
+      if (!SecOrErr) {<br class="">
+        consumeError(SecOrErr.<wbr class="">takeError());<br class="">
+        outs() << "(?,?) ";<br class="">
+        break;<br class="">
+      }<br class="">
+      Sec = *SecOrErr;<br class="">
+    } else {<br class="">
+      Sec = I->Section;<br class="">
     }<br class="">
-    section_iterator Sec = *SecOrErr;<br class="">
     DataRefImpl Ref = Sec->getRawDataRefImpl();<br class="">
     StringRef SectionName;<br class="">
     MachO->getSectionName(Ref, SectionName);<br class="">
@@ -485,11 +541,17 @@ static void darwinPrintSymbol(SymbolicFi<br class="">
   if ((NType & MachO::N_TYPE) == MachO::N_INDR) {<br class="">
     outs() << I->Name << " (for ";<br class="">
     StringRef IndirectName;<br class="">
-    if (!MachO ||<br class="">
-        MachO->getIndirectName(I->Sym.<wbr class="">getRawDataRefImpl(), IndirectName))<br class="">
+    if (MachO) {<br class="">
+      if (I->Sym.getRawDataRefImpl().p) {<br class="">
+        if (MachO->getIndirectName(I-><wbr class="">Sym.getRawDataRefImpl(), IndirectName))<br class="">
+          outs() << "?)";<br class="">
+        else<br class="">
+          outs() << IndirectName << ")";<br class="">
+      }<br class="">
+      else<br class="">
+        outs() << I->IndirectName << ")";<br class="">
+    } else<br class="">
       outs() << "?)";<br class="">
-    else<br class="">
-      outs() << IndirectName << ")";<br class="">
   } else<br class="">
     outs() << I->Name;<br class="">
<br class="">
@@ -660,7 +722,12 @@ static void sortAndPrintSymbolList(Symbo<br class="">
<br class="">
   for (SymbolListT::iterator I = SymbolList.begin(), E = SymbolList.end();<br class="">
        I != E; ++I) {<br class="">
-    uint32_t SymFlags = I->Sym.getFlags();<br class="">
+    uint32_t SymFlags;<br class="">
+    if (I->Sym.getRawDataRefImpl().p)<br class="">
+      SymFlags = I->Sym.getFlags();<br class="">
+    else<br class="">
+      SymFlags = I->SymFlags;<br class="">
+<br class="">
     bool Undefined = SymFlags & SymbolRef::SF_Undefined;<br class="">
     bool Global = SymFlags & SymbolRef::SF_Global;<br class="">
     if ((!Undefined && UndefinedOnly) || (Undefined && DefinedOnly) ||<br class="">
@@ -699,10 +766,13 @@ static void sortAndPrintSymbolList(Symbo<br class="">
       }<br class="">
     }<br class="">
<br class="">
+    MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(&<wbr class="">Obj);<br class="">
     // Otherwise, print the symbol address and size.<br class="">
     if (symbolIsDefined(*I)) {<br class="">
       if (Obj.isIR())<br class="">
         strcpy(SymbolAddrStr, printDashes);<br class="">
+      else if(MachO && I->TypeChar == 'I')<br class="">
+        strcpy(SymbolAddrStr, printBlanks);<br class="">
       else<br class="">
         format(printFormat, I->Address)<br class="">
           .print(SymbolAddrStr, sizeof(SymbolAddrStr));<br class="">
@@ -714,7 +784,6 @@ static void sortAndPrintSymbolList(Symbo<br class="">
     // nm(1) -m output or hex, else if OutputFormat is darwin or we are<br class="">
     // printing Mach-O symbols in hex and not a Mach-O object fall back to<br class="">
     // OutputFormat bsd (see below).<br class="">
-    MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(&<wbr class="">Obj);<br class="">
     if ((OutputFormat == darwin || FormatMachOasHex) && (MachO || Obj.isIR())) {<br class="">
       darwinPrintSymbol(Obj, I, SymbolAddrStr, printBlanks, printDashes,<br class="">
                         printFormat);<br class="">
@@ -734,7 +803,19 @@ static void sortAndPrintSymbolList(Symbo<br class="">
       outs() << I->TypeChar;<br class="">
       if (I->TypeChar == '-' && MachO)<br class="">
         darwinPrintStab(MachO, I);<br class="">
-      outs() << " " << I->Name << "\n";<br class="">
+      outs() << " " << I->Name;<br class="">
+      if (I->TypeChar == 'I' && MachO) {<br class="">
+        outs() << " (indirect for ";<br class="">
+        if (I->Sym.getRawDataRefImpl().p) {<br class="">
+          StringRef IndirectName;<br class="">
+          if (MachO->getIndirectName(I-><wbr class="">Sym.getRawDataRefImpl(), IndirectName))<br class="">
+            outs() << "?)";<br class="">
+          else<br class="">
+            outs() << IndirectName << ")";<br class="">
+        } else<br class="">
+          outs() << I->IndirectName << ")";<br class="">
+      }<br class="">
+      outs() << "\n";<br class="">
     } else if (OutputFormat == sysv) {<br class="">
       std::string PaddedName(I->Name);<br class="">
       while (PaddedName.length() < 20)<br class="">
@@ -1022,51 +1103,433 @@ dumpSymbolNamesFromObject(<wbr class="">SymbolicFile &<br class="">
     if (Nsect == 0)<br class="">
       return;<br class="">
   }<br class="">
-  for (BasicSymbolRef Sym : Symbols) {<br class="">
-    uint32_t SymFlags = Sym.getFlags();<br class="">
-    if (!DebugSyms && (SymFlags & SymbolRef::SF_FormatSpecific))<br class="">
-      continue;<br class="">
-    if (WithoutAliases && (SymFlags & SymbolRef::SF_Indirect))<br class="">
-      continue;<br class="">
-    // If a "-s segname sectname" option was specified and this is a Mach-O<br class="">
-    // file and this section appears in this file, Nsect will be non-zero then<br class="">
-    // see if this symbol is a symbol from that section and if not skip it.<br class="">
-    if (Nsect && Nsect != getNsectInMachO(*MachO, Sym))<br class="">
-      continue;<br class="">
-    NMSymbol S;<br class="">
-    S.Size = 0;<br class="">
-    S.Address = 0;<br class="">
-    if (PrintSize) {<br class="">
-      if (isa<ELFObjectFileBase>(&Obj))<br class="">
-        S.Size = ELFSymbolRef(Sym).getSize();<br class="">
-    }<br class="">
-    if (PrintAddress && isa<ObjectFile>(Obj)) {<br class="">
-      SymbolRef SymRef(Sym);<br class="">
-      Expected<uint64_t> AddressOrErr = SymRef.getAddress();<br class="">
-      if (!AddressOrErr) {<br class="">
-        consumeError(AddressOrErr.<wbr class="">takeError());<br class="">
-        break;<br class="">
+  if (!MachO || !DyldInfoOnly) {<br class="">
+    for (BasicSymbolRef Sym : Symbols) {<br class="">
+      uint32_t SymFlags = Sym.getFlags();<br class="">
+      if (!DebugSyms && (SymFlags & SymbolRef::SF_FormatSpecific))<br class="">
+        continue;<br class="">
+      if (WithoutAliases && (SymFlags & SymbolRef::SF_Indirect))<br class="">
+        continue;<br class="">
+      // If a "-s segname sectname" option was specified and this is a Mach-O<br class="">
+      // file and this section appears in this file, Nsect will be non-zero then<br class="">
+      // see if this symbol is a symbol from that section and if not skip it.<br class="">
+      if (Nsect && Nsect != getNsectInMachO(*MachO, Sym))<br class="">
+        continue;<br class="">
+      NMSymbol S;<br class="">
+      S.Size = 0;<br class="">
+      S.Address = 0;<br class="">
+      if (PrintSize) {<br class="">
+        if (isa<ELFObjectFileBase>(&Obj))<br class="">
+          S.Size = ELFSymbolRef(Sym).getSize();<br class="">
+      }<br class="">
+      if (PrintAddress && isa<ObjectFile>(Obj)) {<br class="">
+        SymbolRef SymRef(Sym);<br class="">
+        Expected<uint64_t> AddressOrErr = SymRef.getAddress();<br class="">
+        if (!AddressOrErr) {<br class="">
+          consumeError(AddressOrErr.<wbr class="">takeError());<br class="">
+          break;<br class="">
+        }<br class="">
+        S.Address = *AddressOrErr;<br class="">
       }<br class="">
-      S.Address = *AddressOrErr;<br class="">
+      S.TypeChar = getNMTypeChar(Obj, Sym);<br class="">
+      std::error_code EC = Sym.printName(OS);<br class="">
+      if (EC && MachO)<br class="">
+        OS << "bad string index";<br class="">
+      else<br class="">
+        error(EC);<br class="">
+      OS << '\0';<br class="">
+      S.Sym = Sym;<br class="">
+      SymbolList.push_back(S);<br class="">
     }<br class="">
-    S.TypeChar = getNMTypeChar(Obj, Sym);<br class="">
-    std::error_code EC = Sym.printName(OS);<br class="">
-    if (EC && MachO)<br class="">
-      OS << "bad string index";<br class="">
-    else<br class="">
-      error(EC);<br class="">
-    OS << '\0';<br class="">
-    S.Sym = Sym;<br class="">
-    SymbolList.push_back(S);<br class="">
   }<br class="">
<br class="">
   OS.flush();<br class="">
   const char *P = NameBuffer.c_str();<br class="">
-  for (unsigned I = 0; I < SymbolList.size(); ++I) {<br class="">
+  unsigned I;<br class="">
+  for (I = 0; I < SymbolList.size(); ++I) {<br class="">
     SymbolList[I].Name = P;<br class="">
     P += strlen(P) + 1;<br class="">
   }<br class="">
<br class="">
+  // If this is a Mach-O file where the nlist symbol table is out of sync<br class="">
+  // with the dyld export trie then look through exports and fake up symbols<br class="">
+  // for the ones that are missing (also done with the -add-dyldinfo flag).<br class="">
+  // This is needed if strip(1) -T is run on a binary containing swift<br class="">
+  // language symbols for example.  The option -only-dyldinfo will fake up<br class="">
+  // all symbols from the dyld export trie as well as the bind info.<br class="">
+  std::string ExportsNameBuffer;<br class="">
+  raw_string_ostream EOS(ExportsNameBuffer);<br class="">
+  std::string BindsNameBuffer;<br class="">
+  raw_string_ostream BOS(BindsNameBuffer);<br class="">
+  std::string LazysNameBuffer;<br class="">
+  raw_string_ostream LOS(LazysNameBuffer);<br class="">
+  std::string WeaksNameBuffer;<br class="">
+  raw_string_ostream WOS(WeaksNameBuffer);<br class="">
+  if (MachO && !NoDyldInfo) {<br class="">
+    MachO::mach_header H;<br class="">
+    MachO::mach_header_64 H_64;<br class="">
+    uint32_t HFlags = 0;<br class="">
+    if (MachO->is64Bit()) {<br class="">
+      H_64 = MachO->MachOObjectFile::<wbr class="">getHeader64();<br class="">
+      HFlags = H_64.flags;<br class="">
+    } else {<br class="">
+      H = MachO->MachOObjectFile::<wbr class="">getHeader();<br class="">
+      HFlags = H.flags;<br class="">
+    }<br class="">
+    uint64_t BaseSegmentAddress = 0;<br class="">
+    for (const auto &Command : MachO->load_commands()) {<br class="">
+      if (Command.C.cmd == MachO::LC_SEGMENT) {<br class="">
+        MachO::segment_command Seg = MachO->getSegmentLoadCommand(<wbr class="">Command);<br class="">
+        if (Seg.fileoff == 0 && Seg.filesize != 0) {<br class="">
+          BaseSegmentAddress = Seg.vmaddr;<br class="">
+          break;<br class="">
+        }<br class="">
+      } else if (Command.C.cmd == MachO::LC_SEGMENT_64) {<br class="">
+        MachO::segment_command_64 Seg = MachO-><wbr class="">getSegment64LoadCommand(<wbr class="">Command);<br class="">
+        if (Seg.fileoff == 0 && Seg.filesize != 0) {<br class="">
+          BaseSegmentAddress = Seg.vmaddr;<br class="">
+          break;<br class="">
+        }<br class="">
+      }<br class="">
+    }<br class="">
+    if (DyldInfoOnly || AddDyldInfo ||<br class="">
+        HFlags & MachO::MH_NLIST_OUTOFSYNC_<wbr class="">WITH_DYLDINFO) {<br class="">
+      unsigned ExportsAdded = 0;<br class="">
+      for (const llvm::object::ExportEntry &Entry : MachO->exports()) {<br class="">
+        bool found = false;<br class="">
+        bool ReExport = false;<br class="">
+        if (!DyldInfoOnly) {<br class="">
+          for (unsigned J = 0; J < SymbolList.size() && !found; ++J) {<br class="">
+            if (SymbolList[J].Address == Entry.address() + BaseSegmentAddress &&<br class="">
+                SymbolList[J].Name == Entry.name())<br class="">
+              found = true;<br class="">
+          }<br class="">
+        }<br class="">
+        if (!found) {<br class="">
+          NMSymbol S;<br class="">
+          S.Address = Entry.address() + BaseSegmentAddress;<br class="">
+          S.Size = 0;<br class="">
+          S.TypeChar = '\0';<br class="">
+          S.Name = Entry.name();<br class="">
+          // There is no symbol in the nlist symbol table for this so we set<br class="">
+          // Sym effectivly to null and the rest of code in here must test for<br class="">
+          // it and not do things like Sym.getFlags() for it.<br class="">
+          S.Sym = BasicSymbolRef();<br class="">
+          S.SymFlags = SymbolRef::SF_Global;<br class="">
+          S.Section = SectionRef();<br class="">
+          S.NType = 0;<br class="">
+          S.NSect = 0;<br class="">
+          S.NDesc = 0;<br class="">
+          S.IndirectName = StringRef();<br class="">
+<br class="">
+          uint64_t EFlags = Entry.flags();<br class="">
+          bool Abs = ((EFlags & MachO::EXPORT_SYMBOL_FLAGS_<wbr class="">KIND_MASK) ==<br class="">
+                      MachO::EXPORT_SYMBOL_FLAGS_<wbr class="">KIND_ABSOLUTE);<br class="">
+          bool Resolver = (EFlags &<br class="">
+                           MachO::EXPORT_SYMBOL_FLAGS_<wbr class="">STUB_AND_RESOLVER);<br class="">
+          ReExport = (EFlags & MachO::EXPORT_SYMBOL_FLAGS_<wbr class="">REEXPORT);<br class="">
+          bool WeakDef = (EFlags & MachO::EXPORT_SYMBOL_FLAGS_<wbr class="">WEAK_DEFINITION);<br class="">
+          if (WeakDef)<br class="">
+            S.NDesc |= MachO::N_WEAK_DEF;<br class="">
+          if (Abs) {<br class="">
+            S.NType = MachO::N_EXT | MachO::N_ABS;<br class="">
+            S.TypeChar = 'A';<br class="">
+          } else if (ReExport) {<br class="">
+            S.NType = MachO::N_EXT | MachO::N_INDR;<br class="">
+            S.TypeChar = 'I';<br class="">
+          } else {<br class="">
+            S.NType = MachO::N_EXT | MachO::N_SECT;<br class="">
+            if (Resolver) {<br class="">
+              S.Address = Entry.other() + BaseSegmentAddress;<br class="">
+              if ((S.Address & 1) != 0 &&<br class="">
+                  !MachO->is64Bit() && H.cputype == MachO::CPU_TYPE_ARM){<br class="">
+                S.Address &= ~1LL;<br class="">
+                S.NDesc |= MachO::N_ARM_THUMB_DEF;<br class="">
+              }<br class="">
+            } else {<br class="">
+              S.Address = Entry.address() + BaseSegmentAddress;<br class="">
+            }<br class="">
+            StringRef SegmentName = StringRef();<br class="">
+            StringRef SectionName = StringRef();<br class="">
+            for (const SectionRef &Section : MachO->sections()) {<br class="">
+              S.NSect++;<br class="">
+              Section.getName(SectionName);<br class="">
+              SegmentName = MachO-><wbr class="">getSectionFinalSegmentName(<br class="">
+                                                  Section.getRawDataRefImpl());<br class="">
+              if (S.Address >= Section.getAddress() &&<br class="">
+                  S.Address < Section.getAddress() + Section.getSize()) {<br class="">
+                S.Section = Section;<br class="">
+                break;<br class="">
+              } else if (Entry.name() == "__mh_execute_header" &&<br class="">
+                         SegmentName == "__TEXT" && SectionName == "__text") {<br class="">
+                S.Section = Section;<br class="">
+                S.NDesc |= MachO::REFERENCED_DYNAMICALLY;<br class="">
+                break;<br class="">
+              }<br class="">
+            }<br class="">
+            if (SegmentName == "__TEXT" && SectionName == "__text")<br class="">
+              S.TypeChar = 'T';<br class="">
+            else if (SegmentName == "__DATA" && SectionName == "__data")<br class="">
+              S.TypeChar = 'D';<br class="">
+            else if (SegmentName == "__DATA" && SectionName == "__bss")<br class="">
+              S.TypeChar = 'B';<br class="">
+            else<br class="">
+              S.TypeChar = 'S';<br class="">
+          }<br class="">
+          SymbolList.push_back(S);<br class="">
+<br class="">
+          EOS << Entry.name();<br class="">
+          EOS << '\0';<br class="">
+          ExportsAdded++;<br class="">
+<br class="">
+          // For ReExports there are a two more things to do, first add the<br class="">
+          // indirect name and second create the undefined symbol using the<br class="">
+          // referened dynamic library.<br class="">
+          if (ReExport) {<br class="">
+<br class="">
+            // Add the indirect name.<br class="">
+            if (Entry.otherName().empty())<br class="">
+              EOS << Entry.name();<br class="">
+            else<br class="">
+              EOS << Entry.otherName();<br class="">
+            EOS << '\0';<br class="">
+<br class="">
+            // Now create the undefined symbol using the referened dynamic<br class="">
+            // library.<br class="">
+            NMSymbol U;<br class="">
+            U.Address = 0;<br class="">
+            U.Size = 0;<br class="">
+            U.TypeChar = 'U';<br class="">
+            if (Entry.otherName().empty())<br class="">
+              U.Name = Entry.name();<br class="">
+            else<br class="">
+              U.Name = Entry.otherName();<br class="">
+            // Again there is no symbol in the nlist symbol table for this so<br class="">
+            // we set Sym effectivly to null and the rest of code in here must<br class="">
+            // test for it and not do things like Sym.getFlags() for it.<br class="">
+            U.Sym = BasicSymbolRef();<br class="">
+            U.SymFlags = SymbolRef::SF_Global | SymbolRef::SF_Undefined;<br class="">
+            U.Section = SectionRef();<br class="">
+            U.NType = MachO::N_EXT | MachO::N_UNDF;<br class="">
+            U.NSect = 0;<br class="">
+            U.NDesc = 0;<br class="">
+            // The library ordinal for this undefined symbol is in the export<br class="">
+            // trie Entry.other().<br class="">
+            MachO::SET_LIBRARY_ORDINAL(U.<wbr class="">NDesc, Entry.other());<br class="">
+            U.IndirectName = StringRef();<br class="">
+            SymbolList.push_back(U);<br class="">
+<br class="">
+            // Finally add the undefined symbol's name.<br class="">
+            if (Entry.otherName().empty())<br class="">
+              EOS << Entry.name();<br class="">
+            else<br class="">
+              EOS << Entry.otherName();<br class="">
+            EOS << '\0';<br class="">
+            ExportsAdded++;<br class="">
+          }<br class="">
+        }<br class="">
+      }<br class="">
+      // Set the symbol names and indirect names for the added symbols.<br class="">
+      if (ExportsAdded) {<br class="">
+        EOS.flush();<br class="">
+        const char *Q = ExportsNameBuffer.c_str();<br class="">
+        for (unsigned K = 0; K < ExportsAdded; K++) {<br class="">
+          SymbolList[I].Name = Q;<br class="">
+          Q += strlen(Q) + 1;<br class="">
+          if (SymbolList[I].TypeChar == 'I') {<br class="">
+            SymbolList[I].IndirectName = Q;<br class="">
+            Q += strlen(Q) + 1;<br class="">
+          }<br class="">
+          I++;<br class="">
+        }<br class="">
+      }<br class="">
+<br class="">
+      // Add the undefined symbols from the bind entries.<br class="">
+      unsigned BindsAdded = 0;<br class="">
+      Error BErr = Error::success();<br class="">
+      StringRef LastSymbolName = StringRef();<br class="">
+      for (const llvm::object::MachOBindEntry &Entry : MachO->bindTable(BErr)) {<br class="">
+        bool found = false;<br class="">
+        if (LastSymbolName == Entry.symbolName())<br class="">
+          found = true;<br class="">
+        else if(!DyldInfoOnly) {<br class="">
+          for (unsigned J = 0; J < SymbolList.size() && !found; ++J) {<br class="">
+            if (SymbolList[J].Name == Entry.symbolName())<br class="">
+              found = true;<br class="">
+          }<br class="">
+        }<br class="">
+        if (!found) {<br class="">
+          LastSymbolName = Entry.symbolName();<br class="">
+          NMSymbol B;<br class="">
+          B.Address = 0;<br class="">
+          B.Size = 0;<br class="">
+          B.TypeChar = 'U';<br class="">
+          // There is no symbol in the nlist symbol table for this so we set<br class="">
+          // Sym effectivly to null and the rest of code in here must test for<br class="">
+          // it and not do things like Sym.getFlags() for it.<br class="">
+          B.Sym = BasicSymbolRef();<br class="">
+          B.SymFlags = SymbolRef::SF_Global | SymbolRef::SF_Undefined;<br class="">
+          B.NType = MachO::N_EXT | MachO::N_UNDF;<br class="">
+          B.NSect = 0;<br class="">
+          B.NDesc = 0;<br class="">
+          B.NDesc = 0;<br class="">
+          MachO::SET_LIBRARY_ORDINAL(B.<wbr class="">NDesc, Entry.ordinal());<br class="">
+          B.IndirectName = StringRef();<br class="">
+          B.Name = Entry.symbolName();<br class="">
+          SymbolList.push_back(B);<br class="">
+          BOS << Entry.symbolName();<br class="">
+          BOS << '\0';<br class="">
+          BindsAdded++;<br class="">
+        }<br class="">
+      }<br class="">
+      if (BErr)<br class="">
+        error(std::move(BErr), MachO->getFileName());<br class="">
+      // Set the symbol names and indirect names for the added symbols.<br class="">
+      if (BindsAdded) {<br class="">
+        BOS.flush();<br class="">
+        const char *Q = BindsNameBuffer.c_str();<br class="">
+        for (unsigned K = 0; K < BindsAdded; K++) {<br class="">
+          SymbolList[I].Name = Q;<br class="">
+          Q += strlen(Q) + 1;<br class="">
+          if (SymbolList[I].TypeChar == 'I') {<br class="">
+            SymbolList[I].IndirectName = Q;<br class="">
+            Q += strlen(Q) + 1;<br class="">
+          }<br class="">
+          I++;<br class="">
+        }<br class="">
+      }<br class="">
+<br class="">
+      // Add the undefined symbols from the lazy bind entries.<br class="">
+      unsigned LazysAdded = 0;<br class="">
+      Error LErr = Error::success();<br class="">
+      LastSymbolName = StringRef();<br class="">
+      for (const llvm::object::MachOBindEntry &Entry :<br class="">
+           MachO->lazyBindTable(LErr)) {<br class="">
+        bool found = false;<br class="">
+        if (LastSymbolName == Entry.symbolName())<br class="">
+          found = true;<br class="">
+        else {<br class="">
+          // Here we must check to see it this symbol is already in the<br class="">
+          // SymbolList as it might have already have been added above via a<br class="">
+          // non-lazy (bind) entry.<br class="">
+          for (unsigned J = 0; J < SymbolList.size() && !found; ++J) {<br class="">
+            if (SymbolList[J].Name == Entry.symbolName())<br class="">
+              found = true;<br class="">
+          }<br class="">
+        }<br class="">
+        if (!found) {<br class="">
+          LastSymbolName = Entry.symbolName();<br class="">
+          NMSymbol L;<br class="">
+          L.Name = Entry.symbolName();<br class="">
+          L.Address = 0;<br class="">
+          L.Size = 0;<br class="">
+          L.TypeChar = 'U';<br class="">
+          // There is no symbol in the nlist symbol table for this so we set<br class="">
+          // Sym effectivly to null and the rest of code in here must test for<br class="">
+          // it and not do things like Sym.getFlags() for it.<br class="">
+          L.Sym = BasicSymbolRef();<br class="">
+          L.SymFlags = SymbolRef::SF_Global | SymbolRef::SF_Undefined;<br class="">
+          L.NType = MachO::N_EXT | MachO::N_UNDF;<br class="">
+          L.NSect = 0;<br class="">
+          // The REFERENCE_FLAG_UNDEFINED_LAZY is no longer used but here it<br class="">
+          // makes sence since we are creating this from a lazy bind entry.<br class="">
+          L.NDesc = MachO::REFERENCE_FLAG_<wbr class="">UNDEFINED_LAZY;<br class="">
+          MachO::SET_LIBRARY_ORDINAL(L.<wbr class="">NDesc, Entry.ordinal());<br class="">
+          L.IndirectName = StringRef();<br class="">
+          SymbolList.push_back(L);<br class="">
+          LOS << Entry.symbolName();<br class="">
+          LOS << '\0';<br class="">
+          LazysAdded++;<br class="">
+        }<br class="">
+      }<br class="">
+      if (LErr)<br class="">
+        error(std::move(LErr), MachO->getFileName());<br class="">
+      // Set the symbol names and indirect names for the added symbols.<br class="">
+      if (LazysAdded) {<br class="">
+        LOS.flush();<br class="">
+        const char *Q = LazysNameBuffer.c_str();<br class="">
+        for (unsigned K = 0; K < LazysAdded; K++) {<br class="">
+          SymbolList[I].Name = Q;<br class="">
+          Q += strlen(Q) + 1;<br class="">
+          if (SymbolList[I].TypeChar == 'I') {<br class="">
+            SymbolList[I].IndirectName = Q;<br class="">
+            Q += strlen(Q) + 1;<br class="">
+          }<br class="">
+          I++;<br class="">
+        }<br class="">
+      }<br class="">
+<br class="">
+      // Add the undefineds symbol from the weak bind entries which are not<br class="">
+      // strong symbols.<br class="">
+      unsigned WeaksAdded = 0;<br class="">
+      Error WErr = Error::success();<br class="">
+      LastSymbolName = StringRef();<br class="">
+      for (const llvm::object::MachOBindEntry &Entry :<br class="">
+           MachO->weakBindTable(WErr)) {<br class="">
+        bool found = false;<br class="">
+        unsigned J = 0;<br class="">
+        if (LastSymbolName == Entry.symbolName() ||<br class="">
+            Entry.flags() & MachO::BIND_SYMBOL_FLAGS_NON_<wbr class="">WEAK_DEFINITION) {<br class="">
+          found = true;<br class="">
+        } else {<br class="">
+          for (J = 0; J < SymbolList.size() && !found; ++J) {<br class="">
+            if (SymbolList[J].Name == Entry.symbolName()) {<br class="">
+               found = true;<br class="">
+               break;<br class="">
+            }<br class="">
+          }<br class="">
+        }<br class="">
+        if (!found) {<br class="">
+          LastSymbolName = Entry.symbolName();<br class="">
+          NMSymbol W;<br class="">
+          W.Name = Entry.symbolName();<br class="">
+          W.Address = 0;<br class="">
+          W.Size = 0;<br class="">
+          W.TypeChar = 'U';<br class="">
+          // There is no symbol in the nlist symbol table for this so we set<br class="">
+          // Sym effectivly to null and the rest of code in here must test for<br class="">
+          // it and not do things like Sym.getFlags() for it.<br class="">
+          W.Sym = BasicSymbolRef();<br class="">
+          W.SymFlags = SymbolRef::SF_Global | SymbolRef::SF_Undefined;<br class="">
+          W.NType = MachO::N_EXT | MachO::N_UNDF;<br class="">
+          W.NSect = 0;<br class="">
+          // Odd that we are using N_WEAK_DEF on an undefined symbol but that is<br class="">
+          // what is created in this case by the linker when there are real<br class="">
+          // symbols in the nlist structs.<br class="">
+          W.NDesc = MachO::N_WEAK_DEF;<br class="">
+          W.IndirectName = StringRef();<br class="">
+          SymbolList.push_back(W);<br class="">
+          WOS << Entry.symbolName();<br class="">
+          WOS << '\0';<br class="">
+          WeaksAdded++;<br class="">
+        } else {<br class="">
+          // This is the case the symbol was previously been found and it could<br class="">
+          // have been added from a bind or lazy bind symbol.  If so and not<br class="">
+          // a definition also mark it as weak.<br class="">
+          if (SymbolList[J].TypeChar == 'U')<br class="">
+            // See comment above about N_WEAK_DEF.<br class="">
+            SymbolList[J].NDesc |= MachO::N_WEAK_DEF;<br class="">
+        }<br class="">
+      }<br class="">
+      if (WErr)<br class="">
+        error(std::move(WErr), MachO->getFileName());<br class="">
+      // Set the symbol names and indirect names for the added symbols.<br class="">
+      if (WeaksAdded) {<br class="">
+        WOS.flush();<br class="">
+        const char *Q = WeaksNameBuffer.c_str();<br class="">
+        for (unsigned K = 0; K < WeaksAdded; K++) {<br class="">
+          SymbolList[I].Name = Q;<br class="">
+          Q += strlen(Q) + 1;<br class="">
+          if (SymbolList[I].TypeChar == 'I') {<br class="">
+            SymbolList[I].IndirectName = Q;<br class="">
+            Q += strlen(Q) + 1;<br class="">
+          }<br class="">
+          I++;<br class="">
+        }<br class="">
+      }<br class="">
+    }<br class="">
+  }<br class="">
+<br class="">
   CurrentFilename = Obj.getFileName();<br class="">
   sortAndPrintSymbolList(Obj, printName, ArchiveName, ArchitectureName);<br class="">
 }<br class="">
@@ -1456,6 +1919,9 @@ int main(int argc, char **argv) {<br class="">
     error("bad number of arguments (must be two arguments)",<br class="">
           "for the -s option");<br class="">
<br class="">
+  if (NoDyldInfo && (AddDyldInfo || DyldInfoOnly))<br class="">
+    error("-no-dyldinfo can't be used with -add-dyldinfo or -dyldinfo-only");<br class="">
+<br class="">
   std::for_each(InputFilenames.<wbr class="">begin(), InputFilenames.end(),<br class="">
                 dumpSymbolNamesFromFile);<br class="">
<br class="">
<br class="">
Modified: llvm/trunk/tools/llvm-objdump/<wbr class="">MachODump.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/MachODump.cpp?rev=305733&r1=305732&r2=305733&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/llvm/trunk/tools/llvm-<wbr class="">objdump/MachODump.cpp?rev=<wbr class="">305733&r1=305732&r2=305733&<wbr class="">view=diff</a><br class="">
==============================<wbr class="">==============================<wbr class="">==================<br class="">
--- llvm/trunk/tools/llvm-objdump/<wbr class="">MachODump.cpp (original)<br class="">
+++ llvm/trunk/tools/llvm-objdump/<wbr class="">MachODump.cpp Mon Jun 19 14:38:22 2017<br class="">
@@ -7634,6 +7634,10 @@ static void PrintMachHeader(uint32_t mag<br class="">
       outs() << " APP_EXTENSION_SAFE";<br class="">
       f &= ~MachO::MH_APP_EXTENSION_SAFE;<br class="">
     }<br class="">
+    if (f & MachO::MH_NLIST_OUTOFSYNC_<wbr class="">WITH_DYLDINFO) {<br class="">
+      outs() << " NLIST_OUTOFSYNC_WITH_DYLDINFO"<wbr class="">;<br class="">
+      f &= ~MachO::MH_NLIST_OUTOFSYNC_<wbr class="">WITH_DYLDINFO;<br class="">
+    }<br class="">
     if (f != 0 || flags == 0)<br class="">
       outs() << format(" 0x%08" PRIx32, f);<br class="">
   } else {<br class="">
<br class="">
<br class="">
______________________________<wbr class="">_________________<br class="">
llvm-commits mailing list<br class="">
<a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a><br class="">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/<wbr class="">mailman/listinfo/llvm-commits</a><br class="">
</blockquote></div><br class=""></div>
</div></blockquote></div><br class=""></div></body></html>