revert 228308. The code has changed since the review
[oota-llvm.git] / tools / llvm-objdump / MachODump.cpp
1 //===-- MachODump.cpp - Object file dumping utility for llvm --------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the MachO-specific dumper for llvm-objdump.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "llvm-objdump.h"
15 #include "llvm-c/Disassembler.h"
16 #include "llvm/ADT/STLExtras.h"
17 #include "llvm/ADT/StringExtras.h"
18 #include "llvm/ADT/Triple.h"
19 #include "llvm/Config/config.h"
20 #include "llvm/DebugInfo/DWARF/DIContext.h"
21 #include "llvm/MC/MCAsmInfo.h"
22 #include "llvm/MC/MCContext.h"
23 #include "llvm/MC/MCDisassembler.h"
24 #include "llvm/MC/MCInst.h"
25 #include "llvm/MC/MCInstPrinter.h"
26 #include "llvm/MC/MCInstrDesc.h"
27 #include "llvm/MC/MCInstrInfo.h"
28 #include "llvm/MC/MCRegisterInfo.h"
29 #include "llvm/MC/MCSubtargetInfo.h"
30 #include "llvm/Object/MachO.h"
31 #include "llvm/Object/MachOUniversal.h"
32 #include "llvm/Support/Casting.h"
33 #include "llvm/Support/CommandLine.h"
34 #include "llvm/Support/Debug.h"
35 #include "llvm/Support/Endian.h"
36 #include "llvm/Support/Format.h"
37 #include "llvm/Support/FormattedStream.h"
38 #include "llvm/Support/GraphWriter.h"
39 #include "llvm/Support/LEB128.h"
40 #include "llvm/Support/MachO.h"
41 #include "llvm/Support/MemoryBuffer.h"
42 #include "llvm/Support/TargetRegistry.h"
43 #include "llvm/Support/TargetSelect.h"
44 #include "llvm/Support/raw_ostream.h"
45 #include <algorithm>
46 #include <cstring>
47 #include <system_error>
48
49 #if HAVE_CXXABI_H
50 #include <cxxabi.h>
51 #endif
52
53 using namespace llvm;
54 using namespace object;
55
56 static cl::opt<bool>
57     UseDbg("g",
58            cl::desc("Print line information from debug info if available"));
59
60 static cl::opt<std::string> DSYMFile("dsym",
61                                      cl::desc("Use .dSYM file for debug info"));
62
63 static cl::opt<bool> FullLeadingAddr("full-leading-addr",
64                                      cl::desc("Print full leading address"));
65
66 static cl::opt<bool>
67     PrintImmHex("print-imm-hex",
68                 cl::desc("Use hex format for immediate values"));
69
70 cl::opt<bool> llvm::UniversalHeaders("universal-headers",
71                                      cl::desc("Print Mach-O universal headers "
72                                               "(requires -macho)"));
73
74 cl::opt<bool>
75     llvm::ArchiveHeaders("archive-headers",
76                          cl::desc("Print archive headers for Mach-O archives "
77                                   "(requires -macho)"));
78
79 cl::opt<bool>
80     llvm::IndirectSymbols("indirect-symbols",
81                           cl::desc("Print indirect symbol table for Mach-O "
82                                    "objects (requires -macho)"));
83
84 cl::opt<bool>
85     llvm::DataInCode("data-in-code",
86                      cl::desc("Print the data in code table for Mach-O objects "
87                               "(requires -macho)"));
88
89 cl::opt<bool>
90     llvm::LinkOptHints("link-opt-hints",
91                        cl::desc("Print the linker optimization hints for "
92                                 "Mach-O objects (requires -macho)"));
93
94 cl::list<std::string>
95     llvm::DumpSections("section",
96                        cl::desc("Prints the specified segment,section for "
97                                 "Mach-O objects (requires -macho)"));
98
99 static cl::list<std::string>
100     ArchFlags("arch", cl::desc("architecture(s) from a Mach-O file to dump"),
101               cl::ZeroOrMore);
102 bool ArchAll = false;
103
104 static std::string ThumbTripleName;
105
106 static const Target *GetTarget(const MachOObjectFile *MachOObj,
107                                const char **McpuDefault,
108                                const Target **ThumbTarget) {
109   // Figure out the target triple.
110   if (TripleName.empty()) {
111     llvm::Triple TT("unknown-unknown-unknown");
112     llvm::Triple ThumbTriple = Triple();
113     TT = MachOObj->getArch(McpuDefault, &ThumbTriple);
114     TripleName = TT.str();
115     ThumbTripleName = ThumbTriple.str();
116   }
117
118   // Get the target specific parser.
119   std::string Error;
120   const Target *TheTarget = TargetRegistry::lookupTarget(TripleName, Error);
121   if (TheTarget && ThumbTripleName.empty())
122     return TheTarget;
123
124   *ThumbTarget = TargetRegistry::lookupTarget(ThumbTripleName, Error);
125   if (*ThumbTarget)
126     return TheTarget;
127
128   errs() << "llvm-objdump: error: unable to get target for '";
129   if (!TheTarget)
130     errs() << TripleName;
131   else
132     errs() << ThumbTripleName;
133   errs() << "', see --version and --triple.\n";
134   return nullptr;
135 }
136
137 struct SymbolSorter {
138   bool operator()(const SymbolRef &A, const SymbolRef &B) {
139     SymbolRef::Type AType, BType;
140     A.getType(AType);
141     B.getType(BType);
142
143     uint64_t AAddr, BAddr;
144     if (AType != SymbolRef::ST_Function)
145       AAddr = 0;
146     else
147       A.getAddress(AAddr);
148     if (BType != SymbolRef::ST_Function)
149       BAddr = 0;
150     else
151       B.getAddress(BAddr);
152     return AAddr < BAddr;
153   }
154 };
155
156 // Types for the storted data in code table that is built before disassembly
157 // and the predicate function to sort them.
158 typedef std::pair<uint64_t, DiceRef> DiceTableEntry;
159 typedef std::vector<DiceTableEntry> DiceTable;
160 typedef DiceTable::iterator dice_table_iterator;
161
162 // This is used to search for a data in code table entry for the PC being
163 // disassembled.  The j parameter has the PC in j.first.  A single data in code
164 // table entry can cover many bytes for each of its Kind's.  So if the offset,
165 // aka the i.first value, of the data in code table entry plus its Length
166 // covers the PC being searched for this will return true.  If not it will
167 // return false.
168 static bool compareDiceTableEntries(const DiceTableEntry &i,
169                                     const DiceTableEntry &j) {
170   uint16_t Length;
171   i.second.getLength(Length);
172
173   return j.first >= i.first && j.first < i.first + Length;
174 }
175
176 static uint64_t DumpDataInCode(const char *bytes, uint64_t Length,
177                                unsigned short Kind) {
178   uint32_t Value, Size = 1;
179
180   switch (Kind) {
181   default:
182   case MachO::DICE_KIND_DATA:
183     if (Length >= 4) {
184       if (!NoShowRawInsn)
185         DumpBytes(StringRef(bytes, 4));
186       Value = bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];
187       outs() << "\t.long " << Value;
188       Size = 4;
189     } else if (Length >= 2) {
190       if (!NoShowRawInsn)
191         DumpBytes(StringRef(bytes, 2));
192       Value = bytes[1] << 8 | bytes[0];
193       outs() << "\t.short " << Value;
194       Size = 2;
195     } else {
196       if (!NoShowRawInsn)
197         DumpBytes(StringRef(bytes, 2));
198       Value = bytes[0];
199       outs() << "\t.byte " << Value;
200       Size = 1;
201     }
202     if (Kind == MachO::DICE_KIND_DATA)
203       outs() << "\t@ KIND_DATA\n";
204     else
205       outs() << "\t@ data in code kind = " << Kind << "\n";
206     break;
207   case MachO::DICE_KIND_JUMP_TABLE8:
208     if (!NoShowRawInsn)
209       DumpBytes(StringRef(bytes, 1));
210     Value = bytes[0];
211     outs() << "\t.byte " << format("%3u", Value) << "\t@ KIND_JUMP_TABLE8\n";
212     Size = 1;
213     break;
214   case MachO::DICE_KIND_JUMP_TABLE16:
215     if (!NoShowRawInsn)
216       DumpBytes(StringRef(bytes, 2));
217     Value = bytes[1] << 8 | bytes[0];
218     outs() << "\t.short " << format("%5u", Value & 0xffff)
219            << "\t@ KIND_JUMP_TABLE16\n";
220     Size = 2;
221     break;
222   case MachO::DICE_KIND_JUMP_TABLE32:
223   case MachO::DICE_KIND_ABS_JUMP_TABLE32:
224     if (!NoShowRawInsn)
225       DumpBytes(StringRef(bytes, 4));
226     Value = bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];
227     outs() << "\t.long " << Value;
228     if (Kind == MachO::DICE_KIND_JUMP_TABLE32)
229       outs() << "\t@ KIND_JUMP_TABLE32\n";
230     else
231       outs() << "\t@ KIND_ABS_JUMP_TABLE32\n";
232     Size = 4;
233     break;
234   }
235   return Size;
236 }
237
238 static void getSectionsAndSymbols(const MachO::mach_header Header,
239                                   MachOObjectFile *MachOObj,
240                                   std::vector<SectionRef> &Sections,
241                                   std::vector<SymbolRef> &Symbols,
242                                   SmallVectorImpl<uint64_t> &FoundFns,
243                                   uint64_t &BaseSegmentAddress) {
244   for (const SymbolRef &Symbol : MachOObj->symbols()) {
245     StringRef SymName;
246     Symbol.getName(SymName);
247     if (!SymName.startswith("ltmp"))
248       Symbols.push_back(Symbol);
249   }
250
251   for (const SectionRef &Section : MachOObj->sections()) {
252     StringRef SectName;
253     Section.getName(SectName);
254     Sections.push_back(Section);
255   }
256
257   MachOObjectFile::LoadCommandInfo Command =
258       MachOObj->getFirstLoadCommandInfo();
259   bool BaseSegmentAddressSet = false;
260   for (unsigned i = 0;; ++i) {
261     if (Command.C.cmd == MachO::LC_FUNCTION_STARTS) {
262       // We found a function starts segment, parse the addresses for later
263       // consumption.
264       MachO::linkedit_data_command LLC =
265           MachOObj->getLinkeditDataLoadCommand(Command);
266
267       MachOObj->ReadULEB128s(LLC.dataoff, FoundFns);
268     } else if (Command.C.cmd == MachO::LC_SEGMENT) {
269       MachO::segment_command SLC = MachOObj->getSegmentLoadCommand(Command);
270       StringRef SegName = SLC.segname;
271       if (!BaseSegmentAddressSet && SegName != "__PAGEZERO") {
272         BaseSegmentAddressSet = true;
273         BaseSegmentAddress = SLC.vmaddr;
274       }
275     }
276
277     if (i == Header.ncmds - 1)
278       break;
279     else
280       Command = MachOObj->getNextLoadCommandInfo(Command);
281   }
282 }
283
284 static void PrintIndirectSymbolTable(MachOObjectFile *O, bool verbose,
285                                      uint32_t n, uint32_t count,
286                                      uint32_t stride, uint64_t addr) {
287   MachO::dysymtab_command Dysymtab = O->getDysymtabLoadCommand();
288   uint32_t nindirectsyms = Dysymtab.nindirectsyms;
289   if (n > nindirectsyms)
290     outs() << " (entries start past the end of the indirect symbol "
291               "table) (reserved1 field greater than the table size)";
292   else if (n + count > nindirectsyms)
293     outs() << " (entries extends past the end of the indirect symbol "
294               "table)";
295   outs() << "\n";
296   uint32_t cputype = O->getHeader().cputype;
297   if (cputype & MachO::CPU_ARCH_ABI64)
298     outs() << "address            index";
299   else
300     outs() << "address    index";
301   if (verbose)
302     outs() << " name\n";
303   else
304     outs() << "\n";
305   for (uint32_t j = 0; j < count && n + j < nindirectsyms; j++) {
306     if (cputype & MachO::CPU_ARCH_ABI64)
307       outs() << format("0x%016" PRIx64, addr + j * stride) << " ";
308     else
309       outs() << format("0x%08" PRIx32, addr + j * stride) << " ";
310     MachO::dysymtab_command Dysymtab = O->getDysymtabLoadCommand();
311     uint32_t indirect_symbol = O->getIndirectSymbolTableEntry(Dysymtab, n + j);
312     if (indirect_symbol == MachO::INDIRECT_SYMBOL_LOCAL) {
313       outs() << "LOCAL\n";
314       continue;
315     }
316     if (indirect_symbol ==
317         (MachO::INDIRECT_SYMBOL_LOCAL | MachO::INDIRECT_SYMBOL_ABS)) {
318       outs() << "LOCAL ABSOLUTE\n";
319       continue;
320     }
321     if (indirect_symbol == MachO::INDIRECT_SYMBOL_ABS) {
322       outs() << "ABSOLUTE\n";
323       continue;
324     }
325     outs() << format("%5u ", indirect_symbol);
326     MachO::symtab_command Symtab = O->getSymtabLoadCommand();
327     if (indirect_symbol < Symtab.nsyms) {
328       symbol_iterator Sym = O->getSymbolByIndex(indirect_symbol);
329       SymbolRef Symbol = *Sym;
330       StringRef SymName;
331       Symbol.getName(SymName);
332       outs() << SymName;
333     } else {
334       outs() << "?";
335     }
336     outs() << "\n";
337   }
338 }
339
340 static void PrintIndirectSymbols(MachOObjectFile *O, bool verbose) {
341   uint32_t LoadCommandCount = O->getHeader().ncmds;
342   MachOObjectFile::LoadCommandInfo Load = O->getFirstLoadCommandInfo();
343   for (unsigned I = 0;; ++I) {
344     if (Load.C.cmd == MachO::LC_SEGMENT_64) {
345       MachO::segment_command_64 Seg = O->getSegment64LoadCommand(Load);
346       for (unsigned J = 0; J < Seg.nsects; ++J) {
347         MachO::section_64 Sec = O->getSection64(Load, J);
348         uint32_t section_type = Sec.flags & MachO::SECTION_TYPE;
349         if (section_type == MachO::S_NON_LAZY_SYMBOL_POINTERS ||
350             section_type == MachO::S_LAZY_SYMBOL_POINTERS ||
351             section_type == MachO::S_LAZY_DYLIB_SYMBOL_POINTERS ||
352             section_type == MachO::S_THREAD_LOCAL_VARIABLE_POINTERS ||
353             section_type == MachO::S_SYMBOL_STUBS) {
354           uint32_t stride;
355           if (section_type == MachO::S_SYMBOL_STUBS)
356             stride = Sec.reserved2;
357           else
358             stride = 8;
359           if (stride == 0) {
360             outs() << "Can't print indirect symbols for (" << Sec.segname << ","
361                    << Sec.sectname << ") "
362                    << "(size of stubs in reserved2 field is zero)\n";
363             continue;
364           }
365           uint32_t count = Sec.size / stride;
366           outs() << "Indirect symbols for (" << Sec.segname << ","
367                  << Sec.sectname << ") " << count << " entries";
368           uint32_t n = Sec.reserved1;
369           PrintIndirectSymbolTable(O, verbose, n, count, stride, Sec.addr);
370         }
371       }
372     } else if (Load.C.cmd == MachO::LC_SEGMENT) {
373       MachO::segment_command Seg = O->getSegmentLoadCommand(Load);
374       for (unsigned J = 0; J < Seg.nsects; ++J) {
375         MachO::section Sec = O->getSection(Load, J);
376         uint32_t section_type = Sec.flags & MachO::SECTION_TYPE;
377         if (section_type == MachO::S_NON_LAZY_SYMBOL_POINTERS ||
378             section_type == MachO::S_LAZY_SYMBOL_POINTERS ||
379             section_type == MachO::S_LAZY_DYLIB_SYMBOL_POINTERS ||
380             section_type == MachO::S_THREAD_LOCAL_VARIABLE_POINTERS ||
381             section_type == MachO::S_SYMBOL_STUBS) {
382           uint32_t stride;
383           if (section_type == MachO::S_SYMBOL_STUBS)
384             stride = Sec.reserved2;
385           else
386             stride = 4;
387           if (stride == 0) {
388             outs() << "Can't print indirect symbols for (" << Sec.segname << ","
389                    << Sec.sectname << ") "
390                    << "(size of stubs in reserved2 field is zero)\n";
391             continue;
392           }
393           uint32_t count = Sec.size / stride;
394           outs() << "Indirect symbols for (" << Sec.segname << ","
395                  << Sec.sectname << ") " << count << " entries";
396           uint32_t n = Sec.reserved1;
397           PrintIndirectSymbolTable(O, verbose, n, count, stride, Sec.addr);
398         }
399       }
400     }
401     if (I == LoadCommandCount - 1)
402       break;
403     else
404       Load = O->getNextLoadCommandInfo(Load);
405   }
406 }
407
408 static void PrintDataInCodeTable(MachOObjectFile *O, bool verbose) {
409   MachO::linkedit_data_command DIC = O->getDataInCodeLoadCommand();
410   uint32_t nentries = DIC.datasize / sizeof(struct MachO::data_in_code_entry);
411   outs() << "Data in code table (" << nentries << " entries)\n";
412   outs() << "offset     length kind\n";
413   for (dice_iterator DI = O->begin_dices(), DE = O->end_dices(); DI != DE;
414        ++DI) {
415     uint32_t Offset;
416     DI->getOffset(Offset);
417     outs() << format("0x%08" PRIx32, Offset) << " ";
418     uint16_t Length;
419     DI->getLength(Length);
420     outs() << format("%6u", Length) << " ";
421     uint16_t Kind;
422     DI->getKind(Kind);
423     if (verbose) {
424       switch (Kind) {
425       case MachO::DICE_KIND_DATA:
426         outs() << "DATA";
427         break;
428       case MachO::DICE_KIND_JUMP_TABLE8:
429         outs() << "JUMP_TABLE8";
430         break;
431       case MachO::DICE_KIND_JUMP_TABLE16:
432         outs() << "JUMP_TABLE16";
433         break;
434       case MachO::DICE_KIND_JUMP_TABLE32:
435         outs() << "JUMP_TABLE32";
436         break;
437       case MachO::DICE_KIND_ABS_JUMP_TABLE32:
438         outs() << "ABS_JUMP_TABLE32";
439         break;
440       default:
441         outs() << format("0x%04" PRIx32, Kind);
442         break;
443       }
444     } else
445       outs() << format("0x%04" PRIx32, Kind);
446     outs() << "\n";
447   }
448 }
449
450 static void PrintLinkOptHints(MachOObjectFile *O) {
451   MachO::linkedit_data_command LohLC = O->getLinkOptHintsLoadCommand();
452   const char *loh = O->getData().substr(LohLC.dataoff, 1).data();
453   uint32_t nloh = LohLC.datasize;
454   outs() << "Linker optimiztion hints (" << nloh << " total bytes)\n";
455   for (uint32_t i = 0; i < nloh;) {
456     unsigned n;
457     uint64_t identifier = decodeULEB128((const uint8_t *)(loh + i), &n);
458     i += n;
459     outs() << "    identifier " << identifier << " ";
460     if (i >= nloh)
461       return;
462     switch (identifier) {
463     case 1:
464       outs() << "AdrpAdrp\n";
465       break;
466     case 2:
467       outs() << "AdrpLdr\n";
468       break;
469     case 3:
470       outs() << "AdrpAddLdr\n";
471       break;
472     case 4:
473       outs() << "AdrpLdrGotLdr\n";
474       break;
475     case 5:
476       outs() << "AdrpAddStr\n";
477       break;
478     case 6:
479       outs() << "AdrpLdrGotStr\n";
480       break;
481     case 7:
482       outs() << "AdrpAdd\n";
483       break;
484     case 8:
485       outs() << "AdrpLdrGot\n";
486       break;
487     default:
488       outs() << "Unknown identifier value\n";
489       break;
490     }
491     uint64_t narguments = decodeULEB128((const uint8_t *)(loh + i), &n);
492     i += n;
493     outs() << "    narguments " << narguments << "\n";
494     if (i >= nloh)
495       return;
496
497     for (uint32_t j = 0; j < narguments; j++) {
498       uint64_t value = decodeULEB128((const uint8_t *)(loh + i), &n);
499       i += n;
500       outs() << "\tvalue " << format("0x%" PRIx64, value) << "\n";
501       if (i >= nloh)
502         return;
503     }
504   }
505 }
506
507 typedef DenseMap<uint64_t, StringRef> SymbolAddressMap;
508
509 static void CreateSymbolAddressMap(MachOObjectFile *O,
510                                    SymbolAddressMap *AddrMap) {
511   // Create a map of symbol addresses to symbol names.
512   for (const SymbolRef &Symbol : O->symbols()) {
513     SymbolRef::Type ST;
514     Symbol.getType(ST);
515     if (ST == SymbolRef::ST_Function || ST == SymbolRef::ST_Data ||
516         ST == SymbolRef::ST_Other) {
517       uint64_t Address;
518       Symbol.getAddress(Address);
519       StringRef SymName;
520       Symbol.getName(SymName);
521       (*AddrMap)[Address] = SymName;
522     }
523   }
524 }
525
526 // GuessSymbolName is passed the address of what might be a symbol and a
527 // pointer to the SymbolAddressMap.  It returns the name of a symbol
528 // with that address or nullptr if no symbol is found with that address.
529 static const char *GuessSymbolName(uint64_t value, SymbolAddressMap *AddrMap) {
530   const char *SymbolName = nullptr;
531   // A DenseMap can't lookup up some values.
532   if (value != 0xffffffffffffffffULL && value != 0xfffffffffffffffeULL) {
533     StringRef name = AddrMap->lookup(value);
534     if (!name.empty())
535       SymbolName = name.data();
536   }
537   return SymbolName;
538 }
539
540 static void DumpCstringSection(MachOObjectFile *O, const char *sect,
541                                uint32_t sect_size, uint64_t sect_addr,
542                                bool verbose) {
543   for (uint32_t i = 0; i < sect_size; i++) {
544     if (O->is64Bit())
545       outs() << format("0x%016" PRIx64, sect_addr + i) << "  ";
546     else
547       outs() << format("0x%08" PRIx64, sect_addr + i) << "  ";
548     for ( ; i < sect_size && sect[i] != '\0'; i++) {
549       char p[2];
550       p[0] = sect[i];
551       p[1] = '\0';
552       outs().write_escaped(p);
553     }
554     if (i < sect_size && sect[i] == '\0')
555       outs() << "\n";
556   }
557 }
558
559 static void DumpInitTermPointerSection(MachOObjectFile *O, const char *sect,
560                                        uint32_t sect_size, uint64_t sect_addr,
561                                        SymbolAddressMap *AddrMap,
562                                        bool verbose) {
563   uint32_t stride;
564   if (O->is64Bit())
565     stride = sizeof(uint64_t);
566   else
567     stride = sizeof(uint32_t);
568   for (uint32_t i = 0; i < sect_size; i += stride) {
569     const char *SymbolName = nullptr;
570     if (O->is64Bit()) {
571       outs() << format("0x%016" PRIx64, sect_addr + i * stride) << " ";
572       uint64_t pointer_value;
573       memcpy(&pointer_value, sect + i, stride);
574       if (O->isLittleEndian() != sys::IsLittleEndianHost)
575         sys::swapByteOrder(pointer_value);
576       outs() << format("0x%016" PRIx64, pointer_value);
577       if (verbose)
578         SymbolName = GuessSymbolName(pointer_value, AddrMap);
579     } else {
580       outs() << format("0x%08" PRIx64, sect_addr + i * stride) << " ";
581       uint32_t pointer_value;
582       memcpy(&pointer_value, sect + i, stride);
583       if (O->isLittleEndian() != sys::IsLittleEndianHost)
584         sys::swapByteOrder(pointer_value);
585       outs() << format("0x%08" PRIx32, pointer_value);
586       if (verbose)
587         SymbolName = GuessSymbolName(pointer_value, AddrMap);
588     }
589     if (SymbolName)
590       outs() << " " << SymbolName;
591     outs() << "\n";
592   }
593 }
594
595 static void DumpRawSectionContents(MachOObjectFile *O, const char *sect,
596                                    uint32_t size, uint64_t addr) {
597   uint32_t cputype = O->getHeader().cputype;
598   if (cputype == MachO::CPU_TYPE_I386 || cputype == MachO::CPU_TYPE_X86_64) {
599     uint32_t j;
600     for (uint32_t i = 0; i < size; i += j, addr += j) {
601       if (O->is64Bit())
602         outs() << format("%016" PRIx64, addr) << "\t";
603       else
604         outs() << format("%08" PRIx64, sect) << "\t";
605       for (j = 0; j < 16 && i + j < size; j++) {
606         uint8_t byte_word = *(sect + i + j);
607         outs() << format("%02" PRIx32, (uint32_t)byte_word) << " ";
608       }
609       outs() << "\n";
610     }
611   } else {
612     uint32_t j;
613     for (uint32_t i = 0; i < size; i += j, addr += j) {
614       if (O->is64Bit())
615         outs() << format("%016" PRIx64, addr) << "\t";
616       else
617         outs() << format("%08" PRIx64, sect) << "\t";
618       for (j = 0; j < 4 * sizeof(int32_t) && i + j < size;
619            j += sizeof(int32_t)) {
620         if (i + j + sizeof(int32_t) < size) {
621           uint32_t long_word;
622           memcpy(&long_word, sect + i + j, sizeof(int32_t));
623           if (O->isLittleEndian() != sys::IsLittleEndianHost)
624             sys::swapByteOrder(long_word);
625           outs() << format("%08" PRIx32, long_word) << " ";
626         } else {
627           for (uint32_t k = 0; i + j + k < size; k++) {
628             uint8_t byte_word = *(sect + i + j);
629             outs() << format("%02" PRIx32, (uint32_t)byte_word) << " ";
630           }
631         }
632       }
633       outs() << "\n";
634     }
635   }
636 }
637
638 static void DisassembleMachO(StringRef Filename, MachOObjectFile *MachOOF,
639                              StringRef DisSegName, StringRef DisSectName);
640
641 static void DumpSectionContents(StringRef Filename, MachOObjectFile *O,
642                                 bool verbose) {
643   SymbolAddressMap AddrMap;
644   if (verbose)
645     CreateSymbolAddressMap(O, &AddrMap);
646
647   for (unsigned i = 0; i < DumpSections.size(); ++i) {
648     StringRef DumpSection = DumpSections[i];
649     std::pair<StringRef, StringRef> DumpSegSectName;
650     DumpSegSectName = DumpSection.split(',');
651     StringRef DumpSegName, DumpSectName;
652     if (DumpSegSectName.second.size()) {
653       DumpSegName = DumpSegSectName.first;
654       DumpSectName = DumpSegSectName.second;
655     } else {
656       DumpSegName = "";
657       DumpSectName = DumpSegSectName.first;
658     }
659     for (const SectionRef &Section : O->sections()) {
660       StringRef SectName;
661       Section.getName(SectName);
662       DataRefImpl Ref = Section.getRawDataRefImpl();
663       StringRef SegName = O->getSectionFinalSegmentName(Ref);
664       if ((DumpSegName.empty() || SegName == DumpSegName) &&
665           (SectName == DumpSectName)) {
666         outs() << "Contents of (" << SegName << "," << SectName
667                << ") section\n";
668         uint32_t section_flags;
669         if (O->is64Bit()) {
670           const MachO::section_64 Sec = O->getSection64(Ref);
671           section_flags = Sec.flags;
672
673         } else {
674           const MachO::section Sec = O->getSection(Ref);
675           section_flags = Sec.flags;
676         }
677         uint32_t section_type = section_flags & MachO::SECTION_TYPE;
678
679         StringRef BytesStr;
680         Section.getContents(BytesStr);
681         const char *sect = reinterpret_cast<const char *>(BytesStr.data());
682         uint32_t sect_size = BytesStr.size();
683         uint64_t sect_addr = Section.getAddress();
684
685         if (verbose) {
686           if ((section_flags & MachO::S_ATTR_PURE_INSTRUCTIONS) ||
687               (section_flags & MachO::S_ATTR_SOME_INSTRUCTIONS)) {
688             DisassembleMachO(Filename, O, SegName, SectName);
689             continue;
690           }
691           switch (section_type) {
692           case MachO::S_REGULAR:
693             DumpRawSectionContents(O, sect, sect_size, sect_addr);
694             break;
695           case MachO::S_ZEROFILL:
696             outs() << "zerofill section and has no contents in the file\n";
697             break;
698           case MachO::S_CSTRING_LITERALS:
699             DumpCstringSection(O, sect, sect_size, sect_addr, verbose);
700             break;
701           case MachO::S_MOD_INIT_FUNC_POINTERS:
702           case MachO::S_MOD_TERM_FUNC_POINTERS:
703             DumpInitTermPointerSection(O, sect, sect_size, sect_addr, &AddrMap,
704                                        verbose);
705             break;
706           default:
707             outs() << "Unknown section type ("
708                    << format("0x%08" PRIx32, section_type) << ")\n";
709             DumpRawSectionContents(O, sect, sect_size, sect_addr);
710             break;
711           }
712         } else {
713           if (section_type == MachO::S_ZEROFILL)
714             outs() << "zerofill section and has no contents in the file\n";
715           else
716             DumpRawSectionContents(O, sect, sect_size, sect_addr);
717         }
718       }
719     }
720   }
721 }
722
723 // checkMachOAndArchFlags() checks to see if the ObjectFile is a Mach-O file
724 // and if it is and there is a list of architecture flags is specified then
725 // check to make sure this Mach-O file is one of those architectures or all
726 // architectures were specified.  If not then an error is generated and this
727 // routine returns false.  Else it returns true.
728 static bool checkMachOAndArchFlags(ObjectFile *O, StringRef Filename) {
729   if (isa<MachOObjectFile>(O) && !ArchAll && ArchFlags.size() != 0) {
730     MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(O);
731     bool ArchFound = false;
732     MachO::mach_header H;
733     MachO::mach_header_64 H_64;
734     Triple T;
735     if (MachO->is64Bit()) {
736       H_64 = MachO->MachOObjectFile::getHeader64();
737       T = MachOObjectFile::getArch(H_64.cputype, H_64.cpusubtype);
738     } else {
739       H = MachO->MachOObjectFile::getHeader();
740       T = MachOObjectFile::getArch(H.cputype, H.cpusubtype);
741     }
742     unsigned i;
743     for (i = 0; i < ArchFlags.size(); ++i) {
744       if (ArchFlags[i] == T.getArchName())
745         ArchFound = true;
746       break;
747     }
748     if (!ArchFound) {
749       errs() << "llvm-objdump: file: " + Filename + " does not contain "
750              << "architecture: " + ArchFlags[i] + "\n";
751       return false;
752     }
753   }
754   return true;
755 }
756
757 // ProcessMachO() is passed a single opened Mach-O file, which may be an
758 // archive member and or in a slice of a universal file.  It prints the
759 // the file name and header info and then processes it according to the
760 // command line options.
761 static void ProcessMachO(StringRef Filename, MachOObjectFile *MachOOF,
762                          StringRef ArchiveMemberName = StringRef(),
763                          StringRef ArchitectureName = StringRef()) {
764   // If we are doing some processing here on the Mach-O file print the header
765   // info.  And don't print it otherwise like in the case of printing the
766   // UniversalHeaders or ArchiveHeaders.
767   if (Disassemble || PrivateHeaders || ExportsTrie || Rebase || Bind ||
768       LazyBind || WeakBind || IndirectSymbols || DataInCode || LinkOptHints ||
769       DumpSections.size() != 0) {
770     outs() << Filename;
771     if (!ArchiveMemberName.empty())
772       outs() << '(' << ArchiveMemberName << ')';
773     if (!ArchitectureName.empty())
774       outs() << " (architecture " << ArchitectureName << ")";
775     outs() << ":\n";
776   }
777
778   if (Disassemble)
779     DisassembleMachO(Filename, MachOOF, "__TEXT", "__text");
780   if (IndirectSymbols)
781     PrintIndirectSymbols(MachOOF, true);
782   if (DataInCode)
783     PrintDataInCodeTable(MachOOF, true);
784   if (LinkOptHints)
785     PrintLinkOptHints(MachOOF);
786   if (Relocations)
787     PrintRelocations(MachOOF);
788   if (SectionHeaders)
789     PrintSectionHeaders(MachOOF);
790   if (SectionContents)
791     PrintSectionContents(MachOOF);
792   if (DumpSections.size() != 0)
793     DumpSectionContents(Filename, MachOOF, true);
794   if (SymbolTable)
795     PrintSymbolTable(MachOOF);
796   if (UnwindInfo)
797     printMachOUnwindInfo(MachOOF);
798   if (PrivateHeaders)
799     printMachOFileHeader(MachOOF);
800   if (ExportsTrie)
801     printExportsTrie(MachOOF);
802   if (Rebase)
803     printRebaseTable(MachOOF);
804   if (Bind)
805     printBindTable(MachOOF);
806   if (LazyBind)
807     printLazyBindTable(MachOOF);
808   if (WeakBind)
809     printWeakBindTable(MachOOF);
810 }
811
812 // printUnknownCPUType() helps print_fat_headers for unknown CPU's.
813 static void printUnknownCPUType(uint32_t cputype, uint32_t cpusubtype) {
814   outs() << "    cputype (" << cputype << ")\n";
815   outs() << "    cpusubtype (" << cpusubtype << ")\n";
816 }
817
818 // printCPUType() helps print_fat_headers by printing the cputype and
819 // pusubtype (symbolically for the one's it knows about).
820 static void printCPUType(uint32_t cputype, uint32_t cpusubtype) {
821   switch (cputype) {
822   case MachO::CPU_TYPE_I386:
823     switch (cpusubtype) {
824     case MachO::CPU_SUBTYPE_I386_ALL:
825       outs() << "    cputype CPU_TYPE_I386\n";
826       outs() << "    cpusubtype CPU_SUBTYPE_I386_ALL\n";
827       break;
828     default:
829       printUnknownCPUType(cputype, cpusubtype);
830       break;
831     }
832     break;
833   case MachO::CPU_TYPE_X86_64:
834     switch (cpusubtype) {
835     case MachO::CPU_SUBTYPE_X86_64_ALL:
836       outs() << "    cputype CPU_TYPE_X86_64\n";
837       outs() << "    cpusubtype CPU_SUBTYPE_X86_64_ALL\n";
838       break;
839     case MachO::CPU_SUBTYPE_X86_64_H:
840       outs() << "    cputype CPU_TYPE_X86_64\n";
841       outs() << "    cpusubtype CPU_SUBTYPE_X86_64_H\n";
842       break;
843     default:
844       printUnknownCPUType(cputype, cpusubtype);
845       break;
846     }
847     break;
848   case MachO::CPU_TYPE_ARM:
849     switch (cpusubtype) {
850     case MachO::CPU_SUBTYPE_ARM_ALL:
851       outs() << "    cputype CPU_TYPE_ARM\n";
852       outs() << "    cpusubtype CPU_SUBTYPE_ARM_ALL\n";
853       break;
854     case MachO::CPU_SUBTYPE_ARM_V4T:
855       outs() << "    cputype CPU_TYPE_ARM\n";
856       outs() << "    cpusubtype CPU_SUBTYPE_ARM_V4T\n";
857       break;
858     case MachO::CPU_SUBTYPE_ARM_V5TEJ:
859       outs() << "    cputype CPU_TYPE_ARM\n";
860       outs() << "    cpusubtype CPU_SUBTYPE_ARM_V5TEJ\n";
861       break;
862     case MachO::CPU_SUBTYPE_ARM_XSCALE:
863       outs() << "    cputype CPU_TYPE_ARM\n";
864       outs() << "    cpusubtype CPU_SUBTYPE_ARM_XSCALE\n";
865       break;
866     case MachO::CPU_SUBTYPE_ARM_V6:
867       outs() << "    cputype CPU_TYPE_ARM\n";
868       outs() << "    cpusubtype CPU_SUBTYPE_ARM_V6\n";
869       break;
870     case MachO::CPU_SUBTYPE_ARM_V6M:
871       outs() << "    cputype CPU_TYPE_ARM\n";
872       outs() << "    cpusubtype CPU_SUBTYPE_ARM_V6M\n";
873       break;
874     case MachO::CPU_SUBTYPE_ARM_V7:
875       outs() << "    cputype CPU_TYPE_ARM\n";
876       outs() << "    cpusubtype CPU_SUBTYPE_ARM_V7\n";
877       break;
878     case MachO::CPU_SUBTYPE_ARM_V7EM:
879       outs() << "    cputype CPU_TYPE_ARM\n";
880       outs() << "    cpusubtype CPU_SUBTYPE_ARM_V7EM\n";
881       break;
882     case MachO::CPU_SUBTYPE_ARM_V7K:
883       outs() << "    cputype CPU_TYPE_ARM\n";
884       outs() << "    cpusubtype CPU_SUBTYPE_ARM_V7K\n";
885       break;
886     case MachO::CPU_SUBTYPE_ARM_V7M:
887       outs() << "    cputype CPU_TYPE_ARM\n";
888       outs() << "    cpusubtype CPU_SUBTYPE_ARM_V7M\n";
889       break;
890     case MachO::CPU_SUBTYPE_ARM_V7S:
891       outs() << "    cputype CPU_TYPE_ARM\n";
892       outs() << "    cpusubtype CPU_SUBTYPE_ARM_V7S\n";
893       break;
894     default:
895       printUnknownCPUType(cputype, cpusubtype);
896       break;
897     }
898     break;
899   case MachO::CPU_TYPE_ARM64:
900     switch (cpusubtype & ~MachO::CPU_SUBTYPE_MASK) {
901     case MachO::CPU_SUBTYPE_ARM64_ALL:
902       outs() << "    cputype CPU_TYPE_ARM64\n";
903       outs() << "    cpusubtype CPU_SUBTYPE_ARM64_ALL\n";
904       break;
905     default:
906       printUnknownCPUType(cputype, cpusubtype);
907       break;
908     }
909     break;
910   default:
911     printUnknownCPUType(cputype, cpusubtype);
912     break;
913   }
914 }
915
916 static void printMachOUniversalHeaders(const object::MachOUniversalBinary *UB,
917                                        bool verbose) {
918   outs() << "Fat headers\n";
919   if (verbose)
920     outs() << "fat_magic FAT_MAGIC\n";
921   else
922     outs() << "fat_magic " << format("0x%" PRIx32, MachO::FAT_MAGIC) << "\n";
923
924   uint32_t nfat_arch = UB->getNumberOfObjects();
925   StringRef Buf = UB->getData();
926   uint64_t size = Buf.size();
927   uint64_t big_size = sizeof(struct MachO::fat_header) +
928                       nfat_arch * sizeof(struct MachO::fat_arch);
929   outs() << "nfat_arch " << UB->getNumberOfObjects();
930   if (nfat_arch == 0)
931     outs() << " (malformed, contains zero architecture types)\n";
932   else if (big_size > size)
933     outs() << " (malformed, architectures past end of file)\n";
934   else
935     outs() << "\n";
936
937   for (uint32_t i = 0; i < nfat_arch; ++i) {
938     MachOUniversalBinary::ObjectForArch OFA(UB, i);
939     uint32_t cputype = OFA.getCPUType();
940     uint32_t cpusubtype = OFA.getCPUSubType();
941     outs() << "architecture ";
942     for (uint32_t j = 0; i != 0 && j <= i - 1; j++) {
943       MachOUniversalBinary::ObjectForArch other_OFA(UB, j);
944       uint32_t other_cputype = other_OFA.getCPUType();
945       uint32_t other_cpusubtype = other_OFA.getCPUSubType();
946       if (cputype != 0 && cpusubtype != 0 && cputype == other_cputype &&
947           (cpusubtype & ~MachO::CPU_SUBTYPE_MASK) ==
948               (other_cpusubtype & ~MachO::CPU_SUBTYPE_MASK)) {
949         outs() << "(illegal duplicate architecture) ";
950         break;
951       }
952     }
953     if (verbose) {
954       outs() << OFA.getArchTypeName() << "\n";
955       printCPUType(cputype, cpusubtype & ~MachO::CPU_SUBTYPE_MASK);
956     } else {
957       outs() << i << "\n";
958       outs() << "    cputype " << cputype << "\n";
959       outs() << "    cpusubtype " << (cpusubtype & ~MachO::CPU_SUBTYPE_MASK)
960              << "\n";
961     }
962     if (verbose &&
963         (cpusubtype & MachO::CPU_SUBTYPE_MASK) == MachO::CPU_SUBTYPE_LIB64)
964       outs() << "    capabilities CPU_SUBTYPE_LIB64\n";
965     else
966       outs() << "    capabilities "
967              << format("0x%" PRIx32,
968                        (cpusubtype & MachO::CPU_SUBTYPE_MASK) >> 24) << "\n";
969     outs() << "    offset " << OFA.getOffset();
970     if (OFA.getOffset() > size)
971       outs() << " (past end of file)";
972     if (OFA.getOffset() % (1 << OFA.getAlign()) != 0)
973       outs() << " (not aligned on it's alignment (2^" << OFA.getAlign() << ")";
974     outs() << "\n";
975     outs() << "    size " << OFA.getSize();
976     big_size = OFA.getOffset() + OFA.getSize();
977     if (big_size > size)
978       outs() << " (past end of file)";
979     outs() << "\n";
980     outs() << "    align 2^" << OFA.getAlign() << " (" << (1 << OFA.getAlign())
981            << ")\n";
982   }
983 }
984
985 static void printArchiveChild(Archive::Child &C, bool verbose,
986                               bool print_offset) {
987   if (print_offset)
988     outs() << C.getChildOffset() << "\t";
989   sys::fs::perms Mode = C.getAccessMode();
990   if (verbose) {
991     // FIXME: this first dash, "-", is for (Mode & S_IFMT) == S_IFREG.
992     // But there is nothing in sys::fs::perms for S_IFMT or S_IFREG.
993     outs() << "-";
994     if (Mode & sys::fs::owner_read)
995       outs() << "r";
996     else
997       outs() << "-";
998     if (Mode & sys::fs::owner_write)
999       outs() << "w";
1000     else
1001       outs() << "-";
1002     if (Mode & sys::fs::owner_exe)
1003       outs() << "x";
1004     else
1005       outs() << "-";
1006     if (Mode & sys::fs::group_read)
1007       outs() << "r";
1008     else
1009       outs() << "-";
1010     if (Mode & sys::fs::group_write)
1011       outs() << "w";
1012     else
1013       outs() << "-";
1014     if (Mode & sys::fs::group_exe)
1015       outs() << "x";
1016     else
1017       outs() << "-";
1018     if (Mode & sys::fs::others_read)
1019       outs() << "r";
1020     else
1021       outs() << "-";
1022     if (Mode & sys::fs::others_write)
1023       outs() << "w";
1024     else
1025       outs() << "-";
1026     if (Mode & sys::fs::others_exe)
1027       outs() << "x";
1028     else
1029       outs() << "-";
1030   } else {
1031     outs() << format("0%o ", Mode);
1032   }
1033
1034   unsigned UID = C.getUID();
1035   outs() << format("%3d/", UID);
1036   unsigned GID = C.getGID();
1037   outs() << format("%-3d ", GID);
1038   uint64_t Size = C.getRawSize();
1039   outs() << format("%5" PRId64, Size) << " ";
1040
1041   StringRef RawLastModified = C.getRawLastModified();
1042   if (verbose) {
1043     unsigned Seconds;
1044     if (RawLastModified.getAsInteger(10, Seconds))
1045       outs() << "(date: \"%s\" contains non-decimal chars) " << RawLastModified;
1046     else {
1047       // Since cime(3) returns a 26 character string of the form:
1048       // "Sun Sep 16 01:03:52 1973\n\0"
1049       // just print 24 characters.
1050       time_t t = Seconds;
1051       outs() << format("%.24s ", ctime(&t));
1052     }
1053   } else {
1054     outs() << RawLastModified << " ";
1055   }
1056
1057   if (verbose) {
1058     ErrorOr<StringRef> NameOrErr = C.getName();
1059     if (NameOrErr.getError()) {
1060       StringRef RawName = C.getRawName();
1061       outs() << RawName << "\n";
1062     } else {
1063       StringRef Name = NameOrErr.get();
1064       outs() << Name << "\n";
1065     }
1066   } else {
1067     StringRef RawName = C.getRawName();
1068     outs() << RawName << "\n";
1069   }
1070 }
1071
1072 static void printArchiveHeaders(Archive *A, bool verbose, bool print_offset) {
1073   if (A->hasSymbolTable()) {
1074     Archive::child_iterator S = A->getSymbolTableChild();
1075     Archive::Child C = *S;
1076     printArchiveChild(C, verbose, print_offset);
1077   }
1078   for (Archive::child_iterator I = A->child_begin(), E = A->child_end(); I != E;
1079        ++I) {
1080     Archive::Child C = *I;
1081     printArchiveChild(C, verbose, print_offset);
1082   }
1083 }
1084
1085 // ParseInputMachO() parses the named Mach-O file in Filename and handles the
1086 // -arch flags selecting just those slices as specified by them and also parses
1087 // archive files.  Then for each individual Mach-O file ProcessMachO() is
1088 // called to process the file based on the command line options.
1089 void llvm::ParseInputMachO(StringRef Filename) {
1090   // Check for -arch all and verifiy the -arch flags are valid.
1091   for (unsigned i = 0; i < ArchFlags.size(); ++i) {
1092     if (ArchFlags[i] == "all") {
1093       ArchAll = true;
1094     } else {
1095       if (!MachOObjectFile::isValidArch(ArchFlags[i])) {
1096         errs() << "llvm-objdump: Unknown architecture named '" + ArchFlags[i] +
1097                       "'for the -arch option\n";
1098         return;
1099       }
1100     }
1101   }
1102
1103   // Attempt to open the binary.
1104   ErrorOr<OwningBinary<Binary>> BinaryOrErr = createBinary(Filename);
1105   if (std::error_code EC = BinaryOrErr.getError()) {
1106     errs() << "llvm-objdump: '" << Filename << "': " << EC.message() << ".\n";
1107     return;
1108   }
1109   Binary &Bin = *BinaryOrErr.get().getBinary();
1110
1111   if (Archive *A = dyn_cast<Archive>(&Bin)) {
1112     outs() << "Archive : " << Filename << "\n";
1113     if (ArchiveHeaders)
1114       printArchiveHeaders(A, true, false);
1115     for (Archive::child_iterator I = A->child_begin(), E = A->child_end();
1116          I != E; ++I) {
1117       ErrorOr<std::unique_ptr<Binary>> ChildOrErr = I->getAsBinary();
1118       if (ChildOrErr.getError())
1119         continue;
1120       if (MachOObjectFile *O = dyn_cast<MachOObjectFile>(&*ChildOrErr.get())) {
1121         if (!checkMachOAndArchFlags(O, Filename))
1122           return;
1123         ProcessMachO(Filename, O, O->getFileName());
1124       }
1125     }
1126     return;
1127   }
1128   if (UniversalHeaders) {
1129     if (MachOUniversalBinary *UB = dyn_cast<MachOUniversalBinary>(&Bin))
1130       printMachOUniversalHeaders(UB, true);
1131   }
1132   if (MachOUniversalBinary *UB = dyn_cast<MachOUniversalBinary>(&Bin)) {
1133     // If we have a list of architecture flags specified dump only those.
1134     if (!ArchAll && ArchFlags.size() != 0) {
1135       // Look for a slice in the universal binary that matches each ArchFlag.
1136       bool ArchFound;
1137       for (unsigned i = 0; i < ArchFlags.size(); ++i) {
1138         ArchFound = false;
1139         for (MachOUniversalBinary::object_iterator I = UB->begin_objects(),
1140                                                    E = UB->end_objects();
1141              I != E; ++I) {
1142           if (ArchFlags[i] == I->getArchTypeName()) {
1143             ArchFound = true;
1144             ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr =
1145                 I->getAsObjectFile();
1146             std::string ArchitectureName = "";
1147             if (ArchFlags.size() > 1)
1148               ArchitectureName = I->getArchTypeName();
1149             if (ObjOrErr) {
1150               ObjectFile &O = *ObjOrErr.get();
1151               if (MachOObjectFile *MachOOF = dyn_cast<MachOObjectFile>(&O))
1152                 ProcessMachO(Filename, MachOOF, "", ArchitectureName);
1153             } else if (ErrorOr<std::unique_ptr<Archive>> AOrErr =
1154                            I->getAsArchive()) {
1155               std::unique_ptr<Archive> &A = *AOrErr;
1156               outs() << "Archive : " << Filename;
1157               if (!ArchitectureName.empty())
1158                 outs() << " (architecture " << ArchitectureName << ")";
1159               outs() << "\n";
1160               if (ArchiveHeaders)
1161                 printArchiveHeaders(A.get(), true, false);
1162               for (Archive::child_iterator AI = A->child_begin(),
1163                                            AE = A->child_end();
1164                    AI != AE; ++AI) {
1165                 ErrorOr<std::unique_ptr<Binary>> ChildOrErr = AI->getAsBinary();
1166                 if (ChildOrErr.getError())
1167                   continue;
1168                 if (MachOObjectFile *O =
1169                         dyn_cast<MachOObjectFile>(&*ChildOrErr.get()))
1170                   ProcessMachO(Filename, O, O->getFileName(), ArchitectureName);
1171               }
1172             }
1173           }
1174         }
1175         if (!ArchFound) {
1176           errs() << "llvm-objdump: file: " + Filename + " does not contain "
1177                  << "architecture: " + ArchFlags[i] + "\n";
1178           return;
1179         }
1180       }
1181       return;
1182     }
1183     // No architecture flags were specified so if this contains a slice that
1184     // matches the host architecture dump only that.
1185     if (!ArchAll) {
1186       for (MachOUniversalBinary::object_iterator I = UB->begin_objects(),
1187                                                  E = UB->end_objects();
1188            I != E; ++I) {
1189         if (MachOObjectFile::getHostArch().getArchName() ==
1190             I->getArchTypeName()) {
1191           ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr = I->getAsObjectFile();
1192           std::string ArchiveName;
1193           ArchiveName.clear();
1194           if (ObjOrErr) {
1195             ObjectFile &O = *ObjOrErr.get();
1196             if (MachOObjectFile *MachOOF = dyn_cast<MachOObjectFile>(&O))
1197               ProcessMachO(Filename, MachOOF);
1198           } else if (ErrorOr<std::unique_ptr<Archive>> AOrErr =
1199                          I->getAsArchive()) {
1200             std::unique_ptr<Archive> &A = *AOrErr;
1201             outs() << "Archive : " << Filename << "\n";
1202             if (ArchiveHeaders)
1203               printArchiveHeaders(A.get(), true, false);
1204             for (Archive::child_iterator AI = A->child_begin(),
1205                                          AE = A->child_end();
1206                  AI != AE; ++AI) {
1207               ErrorOr<std::unique_ptr<Binary>> ChildOrErr = AI->getAsBinary();
1208               if (ChildOrErr.getError())
1209                 continue;
1210               if (MachOObjectFile *O =
1211                       dyn_cast<MachOObjectFile>(&*ChildOrErr.get()))
1212                 ProcessMachO(Filename, O, O->getFileName());
1213             }
1214           }
1215           return;
1216         }
1217       }
1218     }
1219     // Either all architectures have been specified or none have been specified
1220     // and this does not contain the host architecture so dump all the slices.
1221     bool moreThanOneArch = UB->getNumberOfObjects() > 1;
1222     for (MachOUniversalBinary::object_iterator I = UB->begin_objects(),
1223                                                E = UB->end_objects();
1224          I != E; ++I) {
1225       ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr = I->getAsObjectFile();
1226       std::string ArchitectureName = "";
1227       if (moreThanOneArch)
1228         ArchitectureName = I->getArchTypeName();
1229       if (ObjOrErr) {
1230         ObjectFile &Obj = *ObjOrErr.get();
1231         if (MachOObjectFile *MachOOF = dyn_cast<MachOObjectFile>(&Obj))
1232           ProcessMachO(Filename, MachOOF, "", ArchitectureName);
1233       } else if (ErrorOr<std::unique_ptr<Archive>> AOrErr = I->getAsArchive()) {
1234         std::unique_ptr<Archive> &A = *AOrErr;
1235         outs() << "Archive : " << Filename;
1236         if (!ArchitectureName.empty())
1237           outs() << " (architecture " << ArchitectureName << ")";
1238         outs() << "\n";
1239         if (ArchiveHeaders)
1240           printArchiveHeaders(A.get(), true, false);
1241         for (Archive::child_iterator AI = A->child_begin(), AE = A->child_end();
1242              AI != AE; ++AI) {
1243           ErrorOr<std::unique_ptr<Binary>> ChildOrErr = AI->getAsBinary();
1244           if (ChildOrErr.getError())
1245             continue;
1246           if (MachOObjectFile *O =
1247                   dyn_cast<MachOObjectFile>(&*ChildOrErr.get())) {
1248             if (MachOObjectFile *MachOOF = dyn_cast<MachOObjectFile>(O))
1249               ProcessMachO(Filename, MachOOF, MachOOF->getFileName(),
1250                            ArchitectureName);
1251           }
1252         }
1253       }
1254     }
1255     return;
1256   }
1257   if (ObjectFile *O = dyn_cast<ObjectFile>(&Bin)) {
1258     if (!checkMachOAndArchFlags(O, Filename))
1259       return;
1260     if (MachOObjectFile *MachOOF = dyn_cast<MachOObjectFile>(&*O)) {
1261       ProcessMachO(Filename, MachOOF);
1262     } else
1263       errs() << "llvm-objdump: '" << Filename << "': "
1264              << "Object is not a Mach-O file type.\n";
1265   } else
1266     errs() << "llvm-objdump: '" << Filename << "': "
1267            << "Unrecognized file type.\n";
1268 }
1269
1270 typedef std::pair<uint64_t, const char *> BindInfoEntry;
1271 typedef std::vector<BindInfoEntry> BindTable;
1272 typedef BindTable::iterator bind_table_iterator;
1273
1274 // The block of info used by the Symbolizer call backs.
1275 struct DisassembleInfo {
1276   bool verbose;
1277   MachOObjectFile *O;
1278   SectionRef S;
1279   SymbolAddressMap *AddrMap;
1280   std::vector<SectionRef> *Sections;
1281   const char *class_name;
1282   const char *selector_name;
1283   char *method;
1284   char *demangled_name;
1285   uint64_t adrp_addr;
1286   uint32_t adrp_inst;
1287   BindTable *bindtable;
1288 };
1289
1290 // SymbolizerGetOpInfo() is the operand information call back function.
1291 // This is called to get the symbolic information for operand(s) of an
1292 // instruction when it is being done.  This routine does this from
1293 // the relocation information, symbol table, etc. That block of information
1294 // is a pointer to the struct DisassembleInfo that was passed when the
1295 // disassembler context was created and passed to back to here when
1296 // called back by the disassembler for instruction operands that could have
1297 // relocation information. The address of the instruction containing operand is
1298 // at the Pc parameter.  The immediate value the operand has is passed in
1299 // op_info->Value and is at Offset past the start of the instruction and has a
1300 // byte Size of 1, 2 or 4. The symbolc information is returned in TagBuf is the
1301 // LLVMOpInfo1 struct defined in the header "llvm-c/Disassembler.h" as symbol
1302 // names and addends of the symbolic expression to add for the operand.  The
1303 // value of TagType is currently 1 (for the LLVMOpInfo1 struct). If symbolic
1304 // information is returned then this function returns 1 else it returns 0.
1305 int SymbolizerGetOpInfo(void *DisInfo, uint64_t Pc, uint64_t Offset,
1306                         uint64_t Size, int TagType, void *TagBuf) {
1307   struct DisassembleInfo *info = (struct DisassembleInfo *)DisInfo;
1308   struct LLVMOpInfo1 *op_info = (struct LLVMOpInfo1 *)TagBuf;
1309   uint64_t value = op_info->Value;
1310
1311   // Make sure all fields returned are zero if we don't set them.
1312   memset((void *)op_info, '\0', sizeof(struct LLVMOpInfo1));
1313   op_info->Value = value;
1314
1315   // If the TagType is not the value 1 which it code knows about or if no
1316   // verbose symbolic information is wanted then just return 0, indicating no
1317   // information is being returned.
1318   if (TagType != 1 || info->verbose == false)
1319     return 0;
1320
1321   unsigned int Arch = info->O->getArch();
1322   if (Arch == Triple::x86) {
1323     if (Size != 1 && Size != 2 && Size != 4 && Size != 0)
1324       return 0;
1325     // First search the section's relocation entries (if any) for an entry
1326     // for this section offset.
1327     uint32_t sect_addr = info->S.getAddress();
1328     uint32_t sect_offset = (Pc + Offset) - sect_addr;
1329     bool reloc_found = false;
1330     DataRefImpl Rel;
1331     MachO::any_relocation_info RE;
1332     bool isExtern = false;
1333     SymbolRef Symbol;
1334     bool r_scattered = false;
1335     uint32_t r_value, pair_r_value, r_type;
1336     for (const RelocationRef &Reloc : info->S.relocations()) {
1337       uint64_t RelocOffset;
1338       Reloc.getOffset(RelocOffset);
1339       if (RelocOffset == sect_offset) {
1340         Rel = Reloc.getRawDataRefImpl();
1341         RE = info->O->getRelocation(Rel);
1342         r_type = info->O->getAnyRelocationType(RE);
1343         r_scattered = info->O->isRelocationScattered(RE);
1344         if (r_scattered) {
1345           r_value = info->O->getScatteredRelocationValue(RE);
1346           if (r_type == MachO::GENERIC_RELOC_SECTDIFF ||
1347               r_type == MachO::GENERIC_RELOC_LOCAL_SECTDIFF) {
1348             DataRefImpl RelNext = Rel;
1349             info->O->moveRelocationNext(RelNext);
1350             MachO::any_relocation_info RENext;
1351             RENext = info->O->getRelocation(RelNext);
1352             if (info->O->isRelocationScattered(RENext))
1353               pair_r_value = info->O->getScatteredRelocationValue(RENext);
1354             else
1355               return 0;
1356           }
1357         } else {
1358           isExtern = info->O->getPlainRelocationExternal(RE);
1359           if (isExtern) {
1360             symbol_iterator RelocSym = Reloc.getSymbol();
1361             Symbol = *RelocSym;
1362           }
1363         }
1364         reloc_found = true;
1365         break;
1366       }
1367     }
1368     if (reloc_found && isExtern) {
1369       StringRef SymName;
1370       Symbol.getName(SymName);
1371       const char *name = SymName.data();
1372       op_info->AddSymbol.Present = 1;
1373       op_info->AddSymbol.Name = name;
1374       // For i386 extern relocation entries the value in the instruction is
1375       // the offset from the symbol, and value is already set in op_info->Value.
1376       return 1;
1377     }
1378     if (reloc_found && (r_type == MachO::GENERIC_RELOC_SECTDIFF ||
1379                         r_type == MachO::GENERIC_RELOC_LOCAL_SECTDIFF)) {
1380       const char *add = GuessSymbolName(r_value, info->AddrMap);
1381       const char *sub = GuessSymbolName(pair_r_value, info->AddrMap);
1382       uint32_t offset = value - (r_value - pair_r_value);
1383       op_info->AddSymbol.Present = 1;
1384       if (add != nullptr)
1385         op_info->AddSymbol.Name = add;
1386       else
1387         op_info->AddSymbol.Value = r_value;
1388       op_info->SubtractSymbol.Present = 1;
1389       if (sub != nullptr)
1390         op_info->SubtractSymbol.Name = sub;
1391       else
1392         op_info->SubtractSymbol.Value = pair_r_value;
1393       op_info->Value = offset;
1394       return 1;
1395     }
1396     // TODO:
1397     // Second search the external relocation entries of a fully linked image
1398     // (if any) for an entry that matches this segment offset.
1399     // uint32_t seg_offset = (Pc + Offset);
1400     return 0;
1401   } else if (Arch == Triple::x86_64) {
1402     if (Size != 1 && Size != 2 && Size != 4 && Size != 0)
1403       return 0;
1404     // First search the section's relocation entries (if any) for an entry
1405     // for this section offset.
1406     uint64_t sect_addr = info->S.getAddress();
1407     uint64_t sect_offset = (Pc + Offset) - sect_addr;
1408     bool reloc_found = false;
1409     DataRefImpl Rel;
1410     MachO::any_relocation_info RE;
1411     bool isExtern = false;
1412     SymbolRef Symbol;
1413     for (const RelocationRef &Reloc : info->S.relocations()) {
1414       uint64_t RelocOffset;
1415       Reloc.getOffset(RelocOffset);
1416       if (RelocOffset == sect_offset) {
1417         Rel = Reloc.getRawDataRefImpl();
1418         RE = info->O->getRelocation(Rel);
1419         // NOTE: Scattered relocations don't exist on x86_64.
1420         isExtern = info->O->getPlainRelocationExternal(RE);
1421         if (isExtern) {
1422           symbol_iterator RelocSym = Reloc.getSymbol();
1423           Symbol = *RelocSym;
1424         }
1425         reloc_found = true;
1426         break;
1427       }
1428     }
1429     if (reloc_found && isExtern) {
1430       // The Value passed in will be adjusted by the Pc if the instruction
1431       // adds the Pc.  But for x86_64 external relocation entries the Value
1432       // is the offset from the external symbol.
1433       if (info->O->getAnyRelocationPCRel(RE))
1434         op_info->Value -= Pc + Offset + Size;
1435       StringRef SymName;
1436       Symbol.getName(SymName);
1437       const char *name = SymName.data();
1438       unsigned Type = info->O->getAnyRelocationType(RE);
1439       if (Type == MachO::X86_64_RELOC_SUBTRACTOR) {
1440         DataRefImpl RelNext = Rel;
1441         info->O->moveRelocationNext(RelNext);
1442         MachO::any_relocation_info RENext = info->O->getRelocation(RelNext);
1443         unsigned TypeNext = info->O->getAnyRelocationType(RENext);
1444         bool isExternNext = info->O->getPlainRelocationExternal(RENext);
1445         unsigned SymbolNum = info->O->getPlainRelocationSymbolNum(RENext);
1446         if (TypeNext == MachO::X86_64_RELOC_UNSIGNED && isExternNext) {
1447           op_info->SubtractSymbol.Present = 1;
1448           op_info->SubtractSymbol.Name = name;
1449           symbol_iterator RelocSymNext = info->O->getSymbolByIndex(SymbolNum);
1450           Symbol = *RelocSymNext;
1451           StringRef SymNameNext;
1452           Symbol.getName(SymNameNext);
1453           name = SymNameNext.data();
1454         }
1455       }
1456       // TODO: add the VariantKinds to op_info->VariantKind for relocation types
1457       // like: X86_64_RELOC_TLV, X86_64_RELOC_GOT_LOAD and X86_64_RELOC_GOT.
1458       op_info->AddSymbol.Present = 1;
1459       op_info->AddSymbol.Name = name;
1460       return 1;
1461     }
1462     // TODO:
1463     // Second search the external relocation entries of a fully linked image
1464     // (if any) for an entry that matches this segment offset.
1465     // uint64_t seg_offset = (Pc + Offset);
1466     return 0;
1467   } else if (Arch == Triple::arm) {
1468     if (Offset != 0 || (Size != 4 && Size != 2))
1469       return 0;
1470     // First search the section's relocation entries (if any) for an entry
1471     // for this section offset.
1472     uint32_t sect_addr = info->S.getAddress();
1473     uint32_t sect_offset = (Pc + Offset) - sect_addr;
1474     bool reloc_found = false;
1475     DataRefImpl Rel;
1476     MachO::any_relocation_info RE;
1477     bool isExtern = false;
1478     SymbolRef Symbol;
1479     bool r_scattered = false;
1480     uint32_t r_value, pair_r_value, r_type, r_length, other_half;
1481     for (const RelocationRef &Reloc : info->S.relocations()) {
1482       uint64_t RelocOffset;
1483       Reloc.getOffset(RelocOffset);
1484       if (RelocOffset == sect_offset) {
1485         Rel = Reloc.getRawDataRefImpl();
1486         RE = info->O->getRelocation(Rel);
1487         r_length = info->O->getAnyRelocationLength(RE);
1488         r_scattered = info->O->isRelocationScattered(RE);
1489         if (r_scattered) {
1490           r_value = info->O->getScatteredRelocationValue(RE);
1491           r_type = info->O->getScatteredRelocationType(RE);
1492         } else {
1493           r_type = info->O->getAnyRelocationType(RE);
1494           isExtern = info->O->getPlainRelocationExternal(RE);
1495           if (isExtern) {
1496             symbol_iterator RelocSym = Reloc.getSymbol();
1497             Symbol = *RelocSym;
1498           }
1499         }
1500         if (r_type == MachO::ARM_RELOC_HALF ||
1501             r_type == MachO::ARM_RELOC_SECTDIFF ||
1502             r_type == MachO::ARM_RELOC_LOCAL_SECTDIFF ||
1503             r_type == MachO::ARM_RELOC_HALF_SECTDIFF) {
1504           DataRefImpl RelNext = Rel;
1505           info->O->moveRelocationNext(RelNext);
1506           MachO::any_relocation_info RENext;
1507           RENext = info->O->getRelocation(RelNext);
1508           other_half = info->O->getAnyRelocationAddress(RENext) & 0xffff;
1509           if (info->O->isRelocationScattered(RENext))
1510             pair_r_value = info->O->getScatteredRelocationValue(RENext);
1511         }
1512         reloc_found = true;
1513         break;
1514       }
1515     }
1516     if (reloc_found && isExtern) {
1517       StringRef SymName;
1518       Symbol.getName(SymName);
1519       const char *name = SymName.data();
1520       op_info->AddSymbol.Present = 1;
1521       op_info->AddSymbol.Name = name;
1522       if (value != 0) {
1523         switch (r_type) {
1524         case MachO::ARM_RELOC_HALF:
1525           if ((r_length & 0x1) == 1) {
1526             op_info->Value = value << 16 | other_half;
1527             op_info->VariantKind = LLVMDisassembler_VariantKind_ARM_HI16;
1528           } else {
1529             op_info->Value = other_half << 16 | value;
1530             op_info->VariantKind = LLVMDisassembler_VariantKind_ARM_LO16;
1531           }
1532           break;
1533         default:
1534           break;
1535         }
1536       } else {
1537         switch (r_type) {
1538         case MachO::ARM_RELOC_HALF:
1539           if ((r_length & 0x1) == 1) {
1540             op_info->Value = value << 16 | other_half;
1541             op_info->VariantKind = LLVMDisassembler_VariantKind_ARM_HI16;
1542           } else {
1543             op_info->Value = other_half << 16 | value;
1544             op_info->VariantKind = LLVMDisassembler_VariantKind_ARM_LO16;
1545           }
1546           break;
1547         default:
1548           break;
1549         }
1550       }
1551       return 1;
1552     }
1553     // If we have a branch that is not an external relocation entry then
1554     // return 0 so the code in tryAddingSymbolicOperand() can use the
1555     // SymbolLookUp call back with the branch target address to look up the
1556     // symbol and possiblity add an annotation for a symbol stub.
1557     if (reloc_found && isExtern == 0 && (r_type == MachO::ARM_RELOC_BR24 ||
1558                                          r_type == MachO::ARM_THUMB_RELOC_BR22))
1559       return 0;
1560
1561     uint32_t offset = 0;
1562     if (reloc_found) {
1563       if (r_type == MachO::ARM_RELOC_HALF ||
1564           r_type == MachO::ARM_RELOC_HALF_SECTDIFF) {
1565         if ((r_length & 0x1) == 1)
1566           value = value << 16 | other_half;
1567         else
1568           value = other_half << 16 | value;
1569       }
1570       if (r_scattered && (r_type != MachO::ARM_RELOC_HALF &&
1571                           r_type != MachO::ARM_RELOC_HALF_SECTDIFF)) {
1572         offset = value - r_value;
1573         value = r_value;
1574       }
1575     }
1576
1577     if (reloc_found && r_type == MachO::ARM_RELOC_HALF_SECTDIFF) {
1578       if ((r_length & 0x1) == 1)
1579         op_info->VariantKind = LLVMDisassembler_VariantKind_ARM_HI16;
1580       else
1581         op_info->VariantKind = LLVMDisassembler_VariantKind_ARM_LO16;
1582       const char *add = GuessSymbolName(r_value, info->AddrMap);
1583       const char *sub = GuessSymbolName(pair_r_value, info->AddrMap);
1584       int32_t offset = value - (r_value - pair_r_value);
1585       op_info->AddSymbol.Present = 1;
1586       if (add != nullptr)
1587         op_info->AddSymbol.Name = add;
1588       else
1589         op_info->AddSymbol.Value = r_value;
1590       op_info->SubtractSymbol.Present = 1;
1591       if (sub != nullptr)
1592         op_info->SubtractSymbol.Name = sub;
1593       else
1594         op_info->SubtractSymbol.Value = pair_r_value;
1595       op_info->Value = offset;
1596       return 1;
1597     }
1598
1599     if (reloc_found == false)
1600       return 0;
1601
1602     op_info->AddSymbol.Present = 1;
1603     op_info->Value = offset;
1604     if (reloc_found) {
1605       if (r_type == MachO::ARM_RELOC_HALF) {
1606         if ((r_length & 0x1) == 1)
1607           op_info->VariantKind = LLVMDisassembler_VariantKind_ARM_HI16;
1608         else
1609           op_info->VariantKind = LLVMDisassembler_VariantKind_ARM_LO16;
1610       }
1611     }
1612     const char *add = GuessSymbolName(value, info->AddrMap);
1613     if (add != nullptr) {
1614       op_info->AddSymbol.Name = add;
1615       return 1;
1616     }
1617     op_info->AddSymbol.Value = value;
1618     return 1;
1619   } else if (Arch == Triple::aarch64) {
1620     if (Offset != 0 || Size != 4)
1621       return 0;
1622     // First search the section's relocation entries (if any) for an entry
1623     // for this section offset.
1624     uint64_t sect_addr = info->S.getAddress();
1625     uint64_t sect_offset = (Pc + Offset) - sect_addr;
1626     bool reloc_found = false;
1627     DataRefImpl Rel;
1628     MachO::any_relocation_info RE;
1629     bool isExtern = false;
1630     SymbolRef Symbol;
1631     uint32_t r_type = 0;
1632     for (const RelocationRef &Reloc : info->S.relocations()) {
1633       uint64_t RelocOffset;
1634       Reloc.getOffset(RelocOffset);
1635       if (RelocOffset == sect_offset) {
1636         Rel = Reloc.getRawDataRefImpl();
1637         RE = info->O->getRelocation(Rel);
1638         r_type = info->O->getAnyRelocationType(RE);
1639         if (r_type == MachO::ARM64_RELOC_ADDEND) {
1640           DataRefImpl RelNext = Rel;
1641           info->O->moveRelocationNext(RelNext);
1642           MachO::any_relocation_info RENext = info->O->getRelocation(RelNext);
1643           if (value == 0) {
1644             value = info->O->getPlainRelocationSymbolNum(RENext);
1645             op_info->Value = value;
1646           }
1647         }
1648         // NOTE: Scattered relocations don't exist on arm64.
1649         isExtern = info->O->getPlainRelocationExternal(RE);
1650         if (isExtern) {
1651           symbol_iterator RelocSym = Reloc.getSymbol();
1652           Symbol = *RelocSym;
1653         }
1654         reloc_found = true;
1655         break;
1656       }
1657     }
1658     if (reloc_found && isExtern) {
1659       StringRef SymName;
1660       Symbol.getName(SymName);
1661       const char *name = SymName.data();
1662       op_info->AddSymbol.Present = 1;
1663       op_info->AddSymbol.Name = name;
1664
1665       switch (r_type) {
1666       case MachO::ARM64_RELOC_PAGE21:
1667         /* @page */
1668         op_info->VariantKind = LLVMDisassembler_VariantKind_ARM64_PAGE;
1669         break;
1670       case MachO::ARM64_RELOC_PAGEOFF12:
1671         /* @pageoff */
1672         op_info->VariantKind = LLVMDisassembler_VariantKind_ARM64_PAGEOFF;
1673         break;
1674       case MachO::ARM64_RELOC_GOT_LOAD_PAGE21:
1675         /* @gotpage */
1676         op_info->VariantKind = LLVMDisassembler_VariantKind_ARM64_GOTPAGE;
1677         break;
1678       case MachO::ARM64_RELOC_GOT_LOAD_PAGEOFF12:
1679         /* @gotpageoff */
1680         op_info->VariantKind = LLVMDisassembler_VariantKind_ARM64_GOTPAGEOFF;
1681         break;
1682       case MachO::ARM64_RELOC_TLVP_LOAD_PAGE21:
1683         /* @tvlppage is not implemented in llvm-mc */
1684         op_info->VariantKind = LLVMDisassembler_VariantKind_ARM64_TLVP;
1685         break;
1686       case MachO::ARM64_RELOC_TLVP_LOAD_PAGEOFF12:
1687         /* @tvlppageoff is not implemented in llvm-mc */
1688         op_info->VariantKind = LLVMDisassembler_VariantKind_ARM64_TLVOFF;
1689         break;
1690       default:
1691       case MachO::ARM64_RELOC_BRANCH26:
1692         op_info->VariantKind = LLVMDisassembler_VariantKind_None;
1693         break;
1694       }
1695       return 1;
1696     }
1697     return 0;
1698   } else {
1699     return 0;
1700   }
1701 }
1702
1703 // GuessCstringPointer is passed the address of what might be a pointer to a
1704 // literal string in a cstring section.  If that address is in a cstring section
1705 // it returns a pointer to that string.  Else it returns nullptr.
1706 const char *GuessCstringPointer(uint64_t ReferenceValue,
1707                                 struct DisassembleInfo *info) {
1708   uint32_t LoadCommandCount = info->O->getHeader().ncmds;
1709   MachOObjectFile::LoadCommandInfo Load = info->O->getFirstLoadCommandInfo();
1710   for (unsigned I = 0;; ++I) {
1711     if (Load.C.cmd == MachO::LC_SEGMENT_64) {
1712       MachO::segment_command_64 Seg = info->O->getSegment64LoadCommand(Load);
1713       for (unsigned J = 0; J < Seg.nsects; ++J) {
1714         MachO::section_64 Sec = info->O->getSection64(Load, J);
1715         uint32_t section_type = Sec.flags & MachO::SECTION_TYPE;
1716         if (section_type == MachO::S_CSTRING_LITERALS &&
1717             ReferenceValue >= Sec.addr &&
1718             ReferenceValue < Sec.addr + Sec.size) {
1719           uint64_t sect_offset = ReferenceValue - Sec.addr;
1720           uint64_t object_offset = Sec.offset + sect_offset;
1721           StringRef MachOContents = info->O->getData();
1722           uint64_t object_size = MachOContents.size();
1723           const char *object_addr = (const char *)MachOContents.data();
1724           if (object_offset < object_size) {
1725             const char *name = object_addr + object_offset;
1726             return name;
1727           } else {
1728             return nullptr;
1729           }
1730         }
1731       }
1732     } else if (Load.C.cmd == MachO::LC_SEGMENT) {
1733       MachO::segment_command Seg = info->O->getSegmentLoadCommand(Load);
1734       for (unsigned J = 0; J < Seg.nsects; ++J) {
1735         MachO::section Sec = info->O->getSection(Load, J);
1736         uint32_t section_type = Sec.flags & MachO::SECTION_TYPE;
1737         if (section_type == MachO::S_CSTRING_LITERALS &&
1738             ReferenceValue >= Sec.addr &&
1739             ReferenceValue < Sec.addr + Sec.size) {
1740           uint64_t sect_offset = ReferenceValue - Sec.addr;
1741           uint64_t object_offset = Sec.offset + sect_offset;
1742           StringRef MachOContents = info->O->getData();
1743           uint64_t object_size = MachOContents.size();
1744           const char *object_addr = (const char *)MachOContents.data();
1745           if (object_offset < object_size) {
1746             const char *name = object_addr + object_offset;
1747             return name;
1748           } else {
1749             return nullptr;
1750           }
1751         }
1752       }
1753     }
1754     if (I == LoadCommandCount - 1)
1755       break;
1756     else
1757       Load = info->O->getNextLoadCommandInfo(Load);
1758   }
1759   return nullptr;
1760 }
1761
1762 // GuessIndirectSymbol returns the name of the indirect symbol for the
1763 // ReferenceValue passed in or nullptr.  This is used when ReferenceValue maybe
1764 // an address of a symbol stub or a lazy or non-lazy pointer to associate the
1765 // symbol name being referenced by the stub or pointer.
1766 static const char *GuessIndirectSymbol(uint64_t ReferenceValue,
1767                                        struct DisassembleInfo *info) {
1768   uint32_t LoadCommandCount = info->O->getHeader().ncmds;
1769   MachOObjectFile::LoadCommandInfo Load = info->O->getFirstLoadCommandInfo();
1770   MachO::dysymtab_command Dysymtab = info->O->getDysymtabLoadCommand();
1771   MachO::symtab_command Symtab = info->O->getSymtabLoadCommand();
1772   for (unsigned I = 0;; ++I) {
1773     if (Load.C.cmd == MachO::LC_SEGMENT_64) {
1774       MachO::segment_command_64 Seg = info->O->getSegment64LoadCommand(Load);
1775       for (unsigned J = 0; J < Seg.nsects; ++J) {
1776         MachO::section_64 Sec = info->O->getSection64(Load, J);
1777         uint32_t section_type = Sec.flags & MachO::SECTION_TYPE;
1778         if ((section_type == MachO::S_NON_LAZY_SYMBOL_POINTERS ||
1779              section_type == MachO::S_LAZY_SYMBOL_POINTERS ||
1780              section_type == MachO::S_LAZY_DYLIB_SYMBOL_POINTERS ||
1781              section_type == MachO::S_THREAD_LOCAL_VARIABLE_POINTERS ||
1782              section_type == MachO::S_SYMBOL_STUBS) &&
1783             ReferenceValue >= Sec.addr &&
1784             ReferenceValue < Sec.addr + Sec.size) {
1785           uint32_t stride;
1786           if (section_type == MachO::S_SYMBOL_STUBS)
1787             stride = Sec.reserved2;
1788           else
1789             stride = 8;
1790           if (stride == 0)
1791             return nullptr;
1792           uint32_t index = Sec.reserved1 + (ReferenceValue - Sec.addr) / stride;
1793           if (index < Dysymtab.nindirectsyms) {
1794             uint32_t indirect_symbol =
1795                 info->O->getIndirectSymbolTableEntry(Dysymtab, index);
1796             if (indirect_symbol < Symtab.nsyms) {
1797               symbol_iterator Sym = info->O->getSymbolByIndex(indirect_symbol);
1798               SymbolRef Symbol = *Sym;
1799               StringRef SymName;
1800               Symbol.getName(SymName);
1801               const char *name = SymName.data();
1802               return name;
1803             }
1804           }
1805         }
1806       }
1807     } else if (Load.C.cmd == MachO::LC_SEGMENT) {
1808       MachO::segment_command Seg = info->O->getSegmentLoadCommand(Load);
1809       for (unsigned J = 0; J < Seg.nsects; ++J) {
1810         MachO::section Sec = info->O->getSection(Load, J);
1811         uint32_t section_type = Sec.flags & MachO::SECTION_TYPE;
1812         if ((section_type == MachO::S_NON_LAZY_SYMBOL_POINTERS ||
1813              section_type == MachO::S_LAZY_SYMBOL_POINTERS ||
1814              section_type == MachO::S_LAZY_DYLIB_SYMBOL_POINTERS ||
1815              section_type == MachO::S_THREAD_LOCAL_VARIABLE_POINTERS ||
1816              section_type == MachO::S_SYMBOL_STUBS) &&
1817             ReferenceValue >= Sec.addr &&
1818             ReferenceValue < Sec.addr + Sec.size) {
1819           uint32_t stride;
1820           if (section_type == MachO::S_SYMBOL_STUBS)
1821             stride = Sec.reserved2;
1822           else
1823             stride = 4;
1824           if (stride == 0)
1825             return nullptr;
1826           uint32_t index = Sec.reserved1 + (ReferenceValue - Sec.addr) / stride;
1827           if (index < Dysymtab.nindirectsyms) {
1828             uint32_t indirect_symbol =
1829                 info->O->getIndirectSymbolTableEntry(Dysymtab, index);
1830             if (indirect_symbol < Symtab.nsyms) {
1831               symbol_iterator Sym = info->O->getSymbolByIndex(indirect_symbol);
1832               SymbolRef Symbol = *Sym;
1833               StringRef SymName;
1834               Symbol.getName(SymName);
1835               const char *name = SymName.data();
1836               return name;
1837             }
1838           }
1839         }
1840       }
1841     }
1842     if (I == LoadCommandCount - 1)
1843       break;
1844     else
1845       Load = info->O->getNextLoadCommandInfo(Load);
1846   }
1847   return nullptr;
1848 }
1849
1850 // method_reference() is called passing it the ReferenceName that might be
1851 // a reference it to an Objective-C method call.  If so then it allocates and
1852 // assembles a method call string with the values last seen and saved in
1853 // the DisassembleInfo's class_name and selector_name fields.  This is saved
1854 // into the method field of the info and any previous string is free'ed.
1855 // Then the class_name field in the info is set to nullptr.  The method call
1856 // string is set into ReferenceName and ReferenceType is set to
1857 // LLVMDisassembler_ReferenceType_Out_Objc_Message.  If this not a method call
1858 // then both ReferenceType and ReferenceName are left unchanged.
1859 static void method_reference(struct DisassembleInfo *info,
1860                              uint64_t *ReferenceType,
1861                              const char **ReferenceName) {
1862   unsigned int Arch = info->O->getArch();
1863   if (*ReferenceName != nullptr) {
1864     if (strcmp(*ReferenceName, "_objc_msgSend") == 0) {
1865       if (info->selector_name != nullptr) {
1866         if (info->method != nullptr)
1867           free(info->method);
1868         if (info->class_name != nullptr) {
1869           info->method = (char *)malloc(5 + strlen(info->class_name) +
1870                                         strlen(info->selector_name));
1871           if (info->method != nullptr) {
1872             strcpy(info->method, "+[");
1873             strcat(info->method, info->class_name);
1874             strcat(info->method, " ");
1875             strcat(info->method, info->selector_name);
1876             strcat(info->method, "]");
1877             *ReferenceName = info->method;
1878             *ReferenceType = LLVMDisassembler_ReferenceType_Out_Objc_Message;
1879           }
1880         } else {
1881           info->method = (char *)malloc(9 + strlen(info->selector_name));
1882           if (info->method != nullptr) {
1883             if (Arch == Triple::x86_64)
1884               strcpy(info->method, "-[%rdi ");
1885             else if (Arch == Triple::aarch64)
1886               strcpy(info->method, "-[x0 ");
1887             else
1888               strcpy(info->method, "-[r? ");
1889             strcat(info->method, info->selector_name);
1890             strcat(info->method, "]");
1891             *ReferenceName = info->method;
1892             *ReferenceType = LLVMDisassembler_ReferenceType_Out_Objc_Message;
1893           }
1894         }
1895         info->class_name = nullptr;
1896       }
1897     } else if (strcmp(*ReferenceName, "_objc_msgSendSuper2") == 0) {
1898       if (info->selector_name != nullptr) {
1899         if (info->method != nullptr)
1900           free(info->method);
1901         info->method = (char *)malloc(17 + strlen(info->selector_name));
1902         if (info->method != nullptr) {
1903           if (Arch == Triple::x86_64)
1904             strcpy(info->method, "-[[%rdi super] ");
1905           else if (Arch == Triple::aarch64)
1906             strcpy(info->method, "-[[x0 super] ");
1907           else
1908             strcpy(info->method, "-[[r? super] ");
1909           strcat(info->method, info->selector_name);
1910           strcat(info->method, "]");
1911           *ReferenceName = info->method;
1912           *ReferenceType = LLVMDisassembler_ReferenceType_Out_Objc_Message;
1913         }
1914         info->class_name = nullptr;
1915       }
1916     }
1917   }
1918 }
1919
1920 // GuessPointerPointer() is passed the address of what might be a pointer to
1921 // a reference to an Objective-C class, selector, message ref or cfstring.
1922 // If so the value of the pointer is returned and one of the booleans are set
1923 // to true.  If not zero is returned and all the booleans are set to false.
1924 static uint64_t GuessPointerPointer(uint64_t ReferenceValue,
1925                                     struct DisassembleInfo *info,
1926                                     bool &classref, bool &selref, bool &msgref,
1927                                     bool &cfstring) {
1928   classref = false;
1929   selref = false;
1930   msgref = false;
1931   cfstring = false;
1932   uint32_t LoadCommandCount = info->O->getHeader().ncmds;
1933   MachOObjectFile::LoadCommandInfo Load = info->O->getFirstLoadCommandInfo();
1934   for (unsigned I = 0;; ++I) {
1935     if (Load.C.cmd == MachO::LC_SEGMENT_64) {
1936       MachO::segment_command_64 Seg = info->O->getSegment64LoadCommand(Load);
1937       for (unsigned J = 0; J < Seg.nsects; ++J) {
1938         MachO::section_64 Sec = info->O->getSection64(Load, J);
1939         if ((strncmp(Sec.sectname, "__objc_selrefs", 16) == 0 ||
1940              strncmp(Sec.sectname, "__objc_classrefs", 16) == 0 ||
1941              strncmp(Sec.sectname, "__objc_superrefs", 16) == 0 ||
1942              strncmp(Sec.sectname, "__objc_msgrefs", 16) == 0 ||
1943              strncmp(Sec.sectname, "__cfstring", 16) == 0) &&
1944             ReferenceValue >= Sec.addr &&
1945             ReferenceValue < Sec.addr + Sec.size) {
1946           uint64_t sect_offset = ReferenceValue - Sec.addr;
1947           uint64_t object_offset = Sec.offset + sect_offset;
1948           StringRef MachOContents = info->O->getData();
1949           uint64_t object_size = MachOContents.size();
1950           const char *object_addr = (const char *)MachOContents.data();
1951           if (object_offset < object_size) {
1952             uint64_t pointer_value;
1953             memcpy(&pointer_value, object_addr + object_offset,
1954                    sizeof(uint64_t));
1955             if (info->O->isLittleEndian() != sys::IsLittleEndianHost)
1956               sys::swapByteOrder(pointer_value);
1957             if (strncmp(Sec.sectname, "__objc_selrefs", 16) == 0)
1958               selref = true;
1959             else if (strncmp(Sec.sectname, "__objc_classrefs", 16) == 0 ||
1960                      strncmp(Sec.sectname, "__objc_superrefs", 16) == 0)
1961               classref = true;
1962             else if (strncmp(Sec.sectname, "__objc_msgrefs", 16) == 0 &&
1963                      ReferenceValue + 8 < Sec.addr + Sec.size) {
1964               msgref = true;
1965               memcpy(&pointer_value, object_addr + object_offset + 8,
1966                      sizeof(uint64_t));
1967               if (info->O->isLittleEndian() != sys::IsLittleEndianHost)
1968                 sys::swapByteOrder(pointer_value);
1969             } else if (strncmp(Sec.sectname, "__cfstring", 16) == 0)
1970               cfstring = true;
1971             return pointer_value;
1972           } else {
1973             return 0;
1974           }
1975         }
1976       }
1977     }
1978     // TODO: Look for LC_SEGMENT for 32-bit Mach-O files.
1979     if (I == LoadCommandCount - 1)
1980       break;
1981     else
1982       Load = info->O->getNextLoadCommandInfo(Load);
1983   }
1984   return 0;
1985 }
1986
1987 // get_pointer_64 returns a pointer to the bytes in the object file at the
1988 // Address from a section in the Mach-O file.  And indirectly returns the
1989 // offset into the section, number of bytes left in the section past the offset
1990 // and which section is was being referenced.  If the Address is not in a
1991 // section nullptr is returned.
1992 const char *get_pointer_64(uint64_t Address, uint32_t &offset, uint32_t &left,
1993                            SectionRef &S, DisassembleInfo *info) {
1994   offset = 0;
1995   left = 0;
1996   S = SectionRef();
1997   for (unsigned SectIdx = 0; SectIdx != info->Sections->size(); SectIdx++) {
1998     uint64_t SectAddress = ((*(info->Sections))[SectIdx]).getAddress();
1999     uint64_t SectSize = ((*(info->Sections))[SectIdx]).getSize();
2000     if (Address >= SectAddress && Address < SectAddress + SectSize) {
2001       S = (*(info->Sections))[SectIdx];
2002       offset = Address - SectAddress;
2003       left = SectSize - offset;
2004       StringRef SectContents;
2005       ((*(info->Sections))[SectIdx]).getContents(SectContents);
2006       return SectContents.data() + offset;
2007     }
2008   }
2009   return nullptr;
2010 }
2011
2012 // get_symbol_64() returns the name of a symbol (or nullptr) and the address of
2013 // the symbol indirectly through n_value. Based on the relocation information
2014 // for the specified section offset in the specified section reference.
2015 const char *get_symbol_64(uint32_t sect_offset, SectionRef S,
2016                           DisassembleInfo *info, uint64_t &n_value) {
2017   n_value = 0;
2018   if (info->verbose == false)
2019     return nullptr;
2020
2021   // See if there is an external relocation entry at the sect_offset.
2022   bool reloc_found = false;
2023   DataRefImpl Rel;
2024   MachO::any_relocation_info RE;
2025   bool isExtern = false;
2026   SymbolRef Symbol;
2027   for (const RelocationRef &Reloc : S.relocations()) {
2028     uint64_t RelocOffset;
2029     Reloc.getOffset(RelocOffset);
2030     if (RelocOffset == sect_offset) {
2031       Rel = Reloc.getRawDataRefImpl();
2032       RE = info->O->getRelocation(Rel);
2033       if (info->O->isRelocationScattered(RE))
2034         continue;
2035       isExtern = info->O->getPlainRelocationExternal(RE);
2036       if (isExtern) {
2037         symbol_iterator RelocSym = Reloc.getSymbol();
2038         Symbol = *RelocSym;
2039       }
2040       reloc_found = true;
2041       break;
2042     }
2043   }
2044   // If there is an external relocation entry for a symbol in this section
2045   // at this section_offset then use that symbol's value for the n_value
2046   // and return its name.
2047   const char *SymbolName = nullptr;
2048   if (reloc_found && isExtern) {
2049     Symbol.getAddress(n_value);
2050     StringRef name;
2051     Symbol.getName(name);
2052     if (!name.empty()) {
2053       SymbolName = name.data();
2054       return SymbolName;
2055     }
2056   }
2057
2058   // TODO: For fully linked images, look through the external relocation
2059   // entries off the dynamic symtab command. For these the r_offset is from the
2060   // start of the first writeable segment in the Mach-O file.  So the offset
2061   // to this section from that segment is passed to this routine by the caller,
2062   // as the database_offset. Which is the difference of the section's starting
2063   // address and the first writable segment.
2064   //
2065   // NOTE: need add passing the database_offset to this routine.
2066
2067   // TODO: We did not find an external relocation entry so look up the
2068   // ReferenceValue as an address of a symbol and if found return that symbol's
2069   // name.
2070   //
2071   // NOTE: need add passing the ReferenceValue to this routine.  Then that code
2072   // would simply be this:
2073   // SymbolName = GuessSymbolName(ReferenceValue, info->AddrMap);
2074
2075   return SymbolName;
2076 }
2077
2078 // These are structs in the Objective-C meta data and read to produce the
2079 // comments for disassembly.  While these are part of the ABI they are no
2080 // public defintions.  So the are here not in include/llvm/Support/MachO.h .
2081
2082 // The cfstring object in a 64-bit Mach-O file.
2083 struct cfstring64_t {
2084   uint64_t isa;        // class64_t * (64-bit pointer)
2085   uint64_t flags;      // flag bits
2086   uint64_t characters; // char * (64-bit pointer)
2087   uint64_t length;     // number of non-NULL characters in above
2088 };
2089
2090 // The class object in a 64-bit Mach-O file.
2091 struct class64_t {
2092   uint64_t isa;        // class64_t * (64-bit pointer)
2093   uint64_t superclass; // class64_t * (64-bit pointer)
2094   uint64_t cache;      // Cache (64-bit pointer)
2095   uint64_t vtable;     // IMP * (64-bit pointer)
2096   uint64_t data;       // class_ro64_t * (64-bit pointer)
2097 };
2098
2099 struct class_ro64_t {
2100   uint32_t flags;
2101   uint32_t instanceStart;
2102   uint32_t instanceSize;
2103   uint32_t reserved;
2104   uint64_t ivarLayout;     // const uint8_t * (64-bit pointer)
2105   uint64_t name;           // const char * (64-bit pointer)
2106   uint64_t baseMethods;    // const method_list_t * (64-bit pointer)
2107   uint64_t baseProtocols;  // const protocol_list_t * (64-bit pointer)
2108   uint64_t ivars;          // const ivar_list_t * (64-bit pointer)
2109   uint64_t weakIvarLayout; // const uint8_t * (64-bit pointer)
2110   uint64_t baseProperties; // const struct objc_property_list (64-bit pointer)
2111 };
2112
2113 inline void swapStruct(struct cfstring64_t &cfs) {
2114   sys::swapByteOrder(cfs.isa);
2115   sys::swapByteOrder(cfs.flags);
2116   sys::swapByteOrder(cfs.characters);
2117   sys::swapByteOrder(cfs.length);
2118 }
2119
2120 inline void swapStruct(struct class64_t &c) {
2121   sys::swapByteOrder(c.isa);
2122   sys::swapByteOrder(c.superclass);
2123   sys::swapByteOrder(c.cache);
2124   sys::swapByteOrder(c.vtable);
2125   sys::swapByteOrder(c.data);
2126 }
2127
2128 inline void swapStruct(struct class_ro64_t &cro) {
2129   sys::swapByteOrder(cro.flags);
2130   sys::swapByteOrder(cro.instanceStart);
2131   sys::swapByteOrder(cro.instanceSize);
2132   sys::swapByteOrder(cro.reserved);
2133   sys::swapByteOrder(cro.ivarLayout);
2134   sys::swapByteOrder(cro.name);
2135   sys::swapByteOrder(cro.baseMethods);
2136   sys::swapByteOrder(cro.baseProtocols);
2137   sys::swapByteOrder(cro.ivars);
2138   sys::swapByteOrder(cro.weakIvarLayout);
2139   sys::swapByteOrder(cro.baseProperties);
2140 }
2141
2142 static const char *get_dyld_bind_info_symbolname(uint64_t ReferenceValue,
2143                                                  struct DisassembleInfo *info);
2144
2145 // get_objc2_64bit_class_name() is used for disassembly and is passed a pointer
2146 // to an Objective-C class and returns the class name.  It is also passed the
2147 // address of the pointer, so when the pointer is zero as it can be in an .o
2148 // file, that is used to look for an external relocation entry with a symbol
2149 // name.
2150 const char *get_objc2_64bit_class_name(uint64_t pointer_value,
2151                                        uint64_t ReferenceValue,
2152                                        struct DisassembleInfo *info) {
2153   const char *r;
2154   uint32_t offset, left;
2155   SectionRef S;
2156
2157   // The pointer_value can be 0 in an object file and have a relocation
2158   // entry for the class symbol at the ReferenceValue (the address of the
2159   // pointer).
2160   if (pointer_value == 0) {
2161     r = get_pointer_64(ReferenceValue, offset, left, S, info);
2162     if (r == nullptr || left < sizeof(uint64_t))
2163       return nullptr;
2164     uint64_t n_value;
2165     const char *symbol_name = get_symbol_64(offset, S, info, n_value);
2166     if (symbol_name == nullptr)
2167       return nullptr;
2168     const char *class_name = strrchr(symbol_name, '$');
2169     if (class_name != nullptr && class_name[1] == '_' && class_name[2] != '\0')
2170       return class_name + 2;
2171     else
2172       return nullptr;
2173   }
2174
2175   // The case were the pointer_value is non-zero and points to a class defined
2176   // in this Mach-O file.
2177   r = get_pointer_64(pointer_value, offset, left, S, info);
2178   if (r == nullptr || left < sizeof(struct class64_t))
2179     return nullptr;
2180   struct class64_t c;
2181   memcpy(&c, r, sizeof(struct class64_t));
2182   if (info->O->isLittleEndian() != sys::IsLittleEndianHost)
2183     swapStruct(c);
2184   if (c.data == 0)
2185     return nullptr;
2186   r = get_pointer_64(c.data, offset, left, S, info);
2187   if (r == nullptr || left < sizeof(struct class_ro64_t))
2188     return nullptr;
2189   struct class_ro64_t cro;
2190   memcpy(&cro, r, sizeof(struct class_ro64_t));
2191   if (info->O->isLittleEndian() != sys::IsLittleEndianHost)
2192     swapStruct(cro);
2193   if (cro.name == 0)
2194     return nullptr;
2195   const char *name = get_pointer_64(cro.name, offset, left, S, info);
2196   return name;
2197 }
2198
2199 // get_objc2_64bit_cfstring_name is used for disassembly and is passed a
2200 // pointer to a cfstring and returns its name or nullptr.
2201 const char *get_objc2_64bit_cfstring_name(uint64_t ReferenceValue,
2202                                           struct DisassembleInfo *info) {
2203   const char *r, *name;
2204   uint32_t offset, left;
2205   SectionRef S;
2206   struct cfstring64_t cfs;
2207   uint64_t cfs_characters;
2208
2209   r = get_pointer_64(ReferenceValue, offset, left, S, info);
2210   if (r == nullptr || left < sizeof(struct cfstring64_t))
2211     return nullptr;
2212   memcpy(&cfs, r, sizeof(struct cfstring64_t));
2213   if (info->O->isLittleEndian() != sys::IsLittleEndianHost)
2214     swapStruct(cfs);
2215   if (cfs.characters == 0) {
2216     uint64_t n_value;
2217     const char *symbol_name = get_symbol_64(
2218         offset + offsetof(struct cfstring64_t, characters), S, info, n_value);
2219     if (symbol_name == nullptr)
2220       return nullptr;
2221     cfs_characters = n_value;
2222   } else
2223     cfs_characters = cfs.characters;
2224   name = get_pointer_64(cfs_characters, offset, left, S, info);
2225
2226   return name;
2227 }
2228
2229 // get_objc2_64bit_selref() is used for disassembly and is passed a the address
2230 // of a pointer to an Objective-C selector reference when the pointer value is
2231 // zero as in a .o file and is likely to have a external relocation entry with
2232 // who's symbol's n_value is the real pointer to the selector name.  If that is
2233 // the case the real pointer to the selector name is returned else 0 is
2234 // returned
2235 uint64_t get_objc2_64bit_selref(uint64_t ReferenceValue,
2236                                 struct DisassembleInfo *info) {
2237   uint32_t offset, left;
2238   SectionRef S;
2239
2240   const char *r = get_pointer_64(ReferenceValue, offset, left, S, info);
2241   if (r == nullptr || left < sizeof(uint64_t))
2242     return 0;
2243   uint64_t n_value;
2244   const char *symbol_name = get_symbol_64(offset, S, info, n_value);
2245   if (symbol_name == nullptr)
2246     return 0;
2247   return n_value;
2248 }
2249
2250 // GuessLiteralPointer returns a string which for the item in the Mach-O file
2251 // for the address passed in as ReferenceValue for printing as a comment with
2252 // the instruction and also returns the corresponding type of that item
2253 // indirectly through ReferenceType.
2254 //
2255 // If ReferenceValue is an address of literal cstring then a pointer to the
2256 // cstring is returned and ReferenceType is set to
2257 // LLVMDisassembler_ReferenceType_Out_LitPool_CstrAddr .
2258 //
2259 // If ReferenceValue is an address of an Objective-C CFString, Selector ref or
2260 // Class ref that name is returned and the ReferenceType is set accordingly.
2261 //
2262 // Lastly, literals which are Symbol address in a literal pool are looked for
2263 // and if found the symbol name is returned and ReferenceType is set to
2264 // LLVMDisassembler_ReferenceType_Out_LitPool_SymAddr .
2265 //
2266 // If there is no item in the Mach-O file for the address passed in as
2267 // ReferenceValue nullptr is returned and ReferenceType is unchanged.
2268 const char *GuessLiteralPointer(uint64_t ReferenceValue, uint64_t ReferencePC,
2269                                 uint64_t *ReferenceType,
2270                                 struct DisassembleInfo *info) {
2271   // First see if there is an external relocation entry at the ReferencePC.
2272   uint64_t sect_addr = info->S.getAddress();
2273   uint64_t sect_offset = ReferencePC - sect_addr;
2274   bool reloc_found = false;
2275   DataRefImpl Rel;
2276   MachO::any_relocation_info RE;
2277   bool isExtern = false;
2278   SymbolRef Symbol;
2279   for (const RelocationRef &Reloc : info->S.relocations()) {
2280     uint64_t RelocOffset;
2281     Reloc.getOffset(RelocOffset);
2282     if (RelocOffset == sect_offset) {
2283       Rel = Reloc.getRawDataRefImpl();
2284       RE = info->O->getRelocation(Rel);
2285       if (info->O->isRelocationScattered(RE))
2286         continue;
2287       isExtern = info->O->getPlainRelocationExternal(RE);
2288       if (isExtern) {
2289         symbol_iterator RelocSym = Reloc.getSymbol();
2290         Symbol = *RelocSym;
2291       }
2292       reloc_found = true;
2293       break;
2294     }
2295   }
2296   // If there is an external relocation entry for a symbol in a section
2297   // then used that symbol's value for the value of the reference.
2298   if (reloc_found && isExtern) {
2299     if (info->O->getAnyRelocationPCRel(RE)) {
2300       unsigned Type = info->O->getAnyRelocationType(RE);
2301       if (Type == MachO::X86_64_RELOC_SIGNED) {
2302         Symbol.getAddress(ReferenceValue);
2303       }
2304     }
2305   }
2306
2307   // Look for literals such as Objective-C CFStrings refs, Selector refs,
2308   // Message refs and Class refs.
2309   bool classref, selref, msgref, cfstring;
2310   uint64_t pointer_value = GuessPointerPointer(ReferenceValue, info, classref,
2311                                                selref, msgref, cfstring);
2312   if (classref == true && pointer_value == 0) {
2313     // Note the ReferenceValue is a pointer into the __objc_classrefs section.
2314     // And the pointer_value in that section is typically zero as it will be
2315     // set by dyld as part of the "bind information".
2316     const char *name = get_dyld_bind_info_symbolname(ReferenceValue, info);
2317     if (name != nullptr) {
2318       *ReferenceType = LLVMDisassembler_ReferenceType_Out_Objc_Class_Ref;
2319       const char *class_name = strrchr(name, '$');
2320       if (class_name != nullptr && class_name[1] == '_' &&
2321           class_name[2] != '\0') {
2322         info->class_name = class_name + 2;
2323         return name;
2324       }
2325     }
2326   }
2327
2328   if (classref == true) {
2329     *ReferenceType = LLVMDisassembler_ReferenceType_Out_Objc_Class_Ref;
2330     const char *name =
2331         get_objc2_64bit_class_name(pointer_value, ReferenceValue, info);
2332     if (name != nullptr)
2333       info->class_name = name;
2334     else
2335       name = "bad class ref";
2336     return name;
2337   }
2338
2339   if (cfstring == true) {
2340     *ReferenceType = LLVMDisassembler_ReferenceType_Out_Objc_CFString_Ref;
2341     const char *name = get_objc2_64bit_cfstring_name(ReferenceValue, info);
2342     return name;
2343   }
2344
2345   if (selref == true && pointer_value == 0)
2346     pointer_value = get_objc2_64bit_selref(ReferenceValue, info);
2347
2348   if (pointer_value != 0)
2349     ReferenceValue = pointer_value;
2350
2351   const char *name = GuessCstringPointer(ReferenceValue, info);
2352   if (name) {
2353     if (pointer_value != 0 && selref == true) {
2354       *ReferenceType = LLVMDisassembler_ReferenceType_Out_Objc_Selector_Ref;
2355       info->selector_name = name;
2356     } else if (pointer_value != 0 && msgref == true) {
2357       info->class_name = nullptr;
2358       *ReferenceType = LLVMDisassembler_ReferenceType_Out_Objc_Message_Ref;
2359       info->selector_name = name;
2360     } else
2361       *ReferenceType = LLVMDisassembler_ReferenceType_Out_LitPool_CstrAddr;
2362     return name;
2363   }
2364
2365   // Lastly look for an indirect symbol with this ReferenceValue which is in
2366   // a literal pool.  If found return that symbol name.
2367   name = GuessIndirectSymbol(ReferenceValue, info);
2368   if (name) {
2369     *ReferenceType = LLVMDisassembler_ReferenceType_Out_LitPool_SymAddr;
2370     return name;
2371   }
2372
2373   return nullptr;
2374 }
2375
2376 // SymbolizerSymbolLookUp is the symbol lookup function passed when creating
2377 // the Symbolizer.  It looks up the ReferenceValue using the info passed via the
2378 // pointer to the struct DisassembleInfo that was passed when MCSymbolizer
2379 // is created and returns the symbol name that matches the ReferenceValue or
2380 // nullptr if none.  The ReferenceType is passed in for the IN type of
2381 // reference the instruction is making from the values in defined in the header
2382 // "llvm-c/Disassembler.h".  On return the ReferenceType can set to a specific
2383 // Out type and the ReferenceName will also be set which is added as a comment
2384 // to the disassembled instruction.
2385 //
2386 #if HAVE_CXXABI_H
2387 // If the symbol name is a C++ mangled name then the demangled name is
2388 // returned through ReferenceName and ReferenceType is set to
2389 // LLVMDisassembler_ReferenceType_DeMangled_Name .
2390 #endif
2391 //
2392 // When this is called to get a symbol name for a branch target then the
2393 // ReferenceType will be LLVMDisassembler_ReferenceType_In_Branch and then
2394 // SymbolValue will be looked for in the indirect symbol table to determine if
2395 // it is an address for a symbol stub.  If so then the symbol name for that
2396 // stub is returned indirectly through ReferenceName and then ReferenceType is
2397 // set to LLVMDisassembler_ReferenceType_Out_SymbolStub.
2398 //
2399 // When this is called with an value loaded via a PC relative load then
2400 // ReferenceType will be LLVMDisassembler_ReferenceType_In_PCrel_Load then the
2401 // SymbolValue is checked to be an address of literal pointer, symbol pointer,
2402 // or an Objective-C meta data reference.  If so the output ReferenceType is
2403 // set to correspond to that as well as setting the ReferenceName.
2404 const char *SymbolizerSymbolLookUp(void *DisInfo, uint64_t ReferenceValue,
2405                                    uint64_t *ReferenceType,
2406                                    uint64_t ReferencePC,
2407                                    const char **ReferenceName) {
2408   struct DisassembleInfo *info = (struct DisassembleInfo *)DisInfo;
2409   // If no verbose symbolic information is wanted then just return nullptr.
2410   if (info->verbose == false) {
2411     *ReferenceName = nullptr;
2412     *ReferenceType = LLVMDisassembler_ReferenceType_InOut_None;
2413     return nullptr;
2414   }
2415
2416   const char *SymbolName = GuessSymbolName(ReferenceValue, info->AddrMap);
2417
2418   if (*ReferenceType == LLVMDisassembler_ReferenceType_In_Branch) {
2419     *ReferenceName = GuessIndirectSymbol(ReferenceValue, info);
2420     if (*ReferenceName != nullptr) {
2421       method_reference(info, ReferenceType, ReferenceName);
2422       if (*ReferenceType != LLVMDisassembler_ReferenceType_Out_Objc_Message)
2423         *ReferenceType = LLVMDisassembler_ReferenceType_Out_SymbolStub;
2424     } else
2425 #if HAVE_CXXABI_H
2426         if (SymbolName != nullptr && strncmp(SymbolName, "__Z", 3) == 0) {
2427       if (info->demangled_name != nullptr)
2428         free(info->demangled_name);
2429       int status;
2430       info->demangled_name =
2431           abi::__cxa_demangle(SymbolName + 1, nullptr, nullptr, &status);
2432       if (info->demangled_name != nullptr) {
2433         *ReferenceName = info->demangled_name;
2434         *ReferenceType = LLVMDisassembler_ReferenceType_DeMangled_Name;
2435       } else
2436         *ReferenceType = LLVMDisassembler_ReferenceType_InOut_None;
2437     } else
2438 #endif
2439       *ReferenceType = LLVMDisassembler_ReferenceType_InOut_None;
2440   } else if (*ReferenceType == LLVMDisassembler_ReferenceType_In_PCrel_Load) {
2441     *ReferenceName =
2442         GuessLiteralPointer(ReferenceValue, ReferencePC, ReferenceType, info);
2443     if (*ReferenceName)
2444       method_reference(info, ReferenceType, ReferenceName);
2445     else
2446       *ReferenceType = LLVMDisassembler_ReferenceType_InOut_None;
2447     // If this is arm64 and the reference is an adrp instruction save the
2448     // instruction, passed in ReferenceValue and the address of the instruction
2449     // for use later if we see and add immediate instruction.
2450   } else if (info->O->getArch() == Triple::aarch64 &&
2451              *ReferenceType == LLVMDisassembler_ReferenceType_In_ARM64_ADRP) {
2452     info->adrp_inst = ReferenceValue;
2453     info->adrp_addr = ReferencePC;
2454     SymbolName = nullptr;
2455     *ReferenceName = nullptr;
2456     *ReferenceType = LLVMDisassembler_ReferenceType_InOut_None;
2457     // If this is arm64 and reference is an add immediate instruction and we
2458     // have
2459     // seen an adrp instruction just before it and the adrp's Xd register
2460     // matches
2461     // this add's Xn register reconstruct the value being referenced and look to
2462     // see if it is a literal pointer.  Note the add immediate instruction is
2463     // passed in ReferenceValue.
2464   } else if (info->O->getArch() == Triple::aarch64 &&
2465              *ReferenceType == LLVMDisassembler_ReferenceType_In_ARM64_ADDXri &&
2466              ReferencePC - 4 == info->adrp_addr &&
2467              (info->adrp_inst & 0x9f000000) == 0x90000000 &&
2468              (info->adrp_inst & 0x1f) == ((ReferenceValue >> 5) & 0x1f)) {
2469     uint32_t addxri_inst;
2470     uint64_t adrp_imm, addxri_imm;
2471
2472     adrp_imm =
2473         ((info->adrp_inst & 0x00ffffe0) >> 3) | ((info->adrp_inst >> 29) & 0x3);
2474     if (info->adrp_inst & 0x0200000)
2475       adrp_imm |= 0xfffffffffc000000LL;
2476
2477     addxri_inst = ReferenceValue;
2478     addxri_imm = (addxri_inst >> 10) & 0xfff;
2479     if (((addxri_inst >> 22) & 0x3) == 1)
2480       addxri_imm <<= 12;
2481
2482     ReferenceValue = (info->adrp_addr & 0xfffffffffffff000LL) +
2483                      (adrp_imm << 12) + addxri_imm;
2484
2485     *ReferenceName =
2486         GuessLiteralPointer(ReferenceValue, ReferencePC, ReferenceType, info);
2487     if (*ReferenceName == nullptr)
2488       *ReferenceType = LLVMDisassembler_ReferenceType_InOut_None;
2489     // If this is arm64 and the reference is a load register instruction and we
2490     // have seen an adrp instruction just before it and the adrp's Xd register
2491     // matches this add's Xn register reconstruct the value being referenced and
2492     // look to see if it is a literal pointer.  Note the load register
2493     // instruction is passed in ReferenceValue.
2494   } else if (info->O->getArch() == Triple::aarch64 &&
2495              *ReferenceType == LLVMDisassembler_ReferenceType_In_ARM64_LDRXui &&
2496              ReferencePC - 4 == info->adrp_addr &&
2497              (info->adrp_inst & 0x9f000000) == 0x90000000 &&
2498              (info->adrp_inst & 0x1f) == ((ReferenceValue >> 5) & 0x1f)) {
2499     uint32_t ldrxui_inst;
2500     uint64_t adrp_imm, ldrxui_imm;
2501
2502     adrp_imm =
2503         ((info->adrp_inst & 0x00ffffe0) >> 3) | ((info->adrp_inst >> 29) & 0x3);
2504     if (info->adrp_inst & 0x0200000)
2505       adrp_imm |= 0xfffffffffc000000LL;
2506
2507     ldrxui_inst = ReferenceValue;
2508     ldrxui_imm = (ldrxui_inst >> 10) & 0xfff;
2509
2510     ReferenceValue = (info->adrp_addr & 0xfffffffffffff000LL) +
2511                      (adrp_imm << 12) + (ldrxui_imm << 3);
2512
2513     *ReferenceName =
2514         GuessLiteralPointer(ReferenceValue, ReferencePC, ReferenceType, info);
2515     if (*ReferenceName == nullptr)
2516       *ReferenceType = LLVMDisassembler_ReferenceType_InOut_None;
2517   }
2518   // If this arm64 and is an load register (PC-relative) instruction the
2519   // ReferenceValue is the PC plus the immediate value.
2520   else if (info->O->getArch() == Triple::aarch64 &&
2521            (*ReferenceType == LLVMDisassembler_ReferenceType_In_ARM64_LDRXl ||
2522             *ReferenceType == LLVMDisassembler_ReferenceType_In_ARM64_ADR)) {
2523     *ReferenceName =
2524         GuessLiteralPointer(ReferenceValue, ReferencePC, ReferenceType, info);
2525     if (*ReferenceName == nullptr)
2526       *ReferenceType = LLVMDisassembler_ReferenceType_InOut_None;
2527   }
2528 #if HAVE_CXXABI_H
2529   else if (SymbolName != nullptr && strncmp(SymbolName, "__Z", 3) == 0) {
2530     if (info->demangled_name != nullptr)
2531       free(info->demangled_name);
2532     int status;
2533     info->demangled_name =
2534         abi::__cxa_demangle(SymbolName + 1, nullptr, nullptr, &status);
2535     if (info->demangled_name != nullptr) {
2536       *ReferenceName = info->demangled_name;
2537       *ReferenceType = LLVMDisassembler_ReferenceType_DeMangled_Name;
2538     }
2539   }
2540 #endif
2541   else {
2542     *ReferenceName = nullptr;
2543     *ReferenceType = LLVMDisassembler_ReferenceType_InOut_None;
2544   }
2545
2546   return SymbolName;
2547 }
2548
2549 /// \brief Emits the comments that are stored in the CommentStream.
2550 /// Each comment in the CommentStream must end with a newline.
2551 static void emitComments(raw_svector_ostream &CommentStream,
2552                          SmallString<128> &CommentsToEmit,
2553                          formatted_raw_ostream &FormattedOS,
2554                          const MCAsmInfo &MAI) {
2555   // Flush the stream before taking its content.
2556   CommentStream.flush();
2557   StringRef Comments = CommentsToEmit.str();
2558   // Get the default information for printing a comment.
2559   const char *CommentBegin = MAI.getCommentString();
2560   unsigned CommentColumn = MAI.getCommentColumn();
2561   bool IsFirst = true;
2562   while (!Comments.empty()) {
2563     if (!IsFirst)
2564       FormattedOS << '\n';
2565     // Emit a line of comments.
2566     FormattedOS.PadToColumn(CommentColumn);
2567     size_t Position = Comments.find('\n');
2568     FormattedOS << CommentBegin << ' ' << Comments.substr(0, Position);
2569     // Move after the newline character.
2570     Comments = Comments.substr(Position + 1);
2571     IsFirst = false;
2572   }
2573   FormattedOS.flush();
2574
2575   // Tell the comment stream that the vector changed underneath it.
2576   CommentsToEmit.clear();
2577   CommentStream.resync();
2578 }
2579
2580 static void DisassembleMachO(StringRef Filename, MachOObjectFile *MachOOF,
2581                              StringRef DisSegName, StringRef DisSectName) {
2582   const char *McpuDefault = nullptr;
2583   const Target *ThumbTarget = nullptr;
2584   const Target *TheTarget = GetTarget(MachOOF, &McpuDefault, &ThumbTarget);
2585   if (!TheTarget) {
2586     // GetTarget prints out stuff.
2587     return;
2588   }
2589   if (MCPU.empty() && McpuDefault)
2590     MCPU = McpuDefault;
2591
2592   std::unique_ptr<const MCInstrInfo> InstrInfo(TheTarget->createMCInstrInfo());
2593   std::unique_ptr<const MCInstrInfo> ThumbInstrInfo;
2594   if (ThumbTarget)
2595     ThumbInstrInfo.reset(ThumbTarget->createMCInstrInfo());
2596
2597   // Package up features to be passed to target/subtarget
2598   std::string FeaturesStr;
2599   if (MAttrs.size()) {
2600     SubtargetFeatures Features;
2601     for (unsigned i = 0; i != MAttrs.size(); ++i)
2602       Features.AddFeature(MAttrs[i]);
2603     FeaturesStr = Features.getString();
2604   }
2605
2606   // Set up disassembler.
2607   std::unique_ptr<const MCRegisterInfo> MRI(
2608       TheTarget->createMCRegInfo(TripleName));
2609   std::unique_ptr<const MCAsmInfo> AsmInfo(
2610       TheTarget->createMCAsmInfo(*MRI, TripleName));
2611   std::unique_ptr<const MCSubtargetInfo> STI(
2612       TheTarget->createMCSubtargetInfo(TripleName, MCPU, FeaturesStr));
2613   MCContext Ctx(AsmInfo.get(), MRI.get(), nullptr);
2614   std::unique_ptr<MCDisassembler> DisAsm(
2615       TheTarget->createMCDisassembler(*STI, Ctx));
2616   std::unique_ptr<MCSymbolizer> Symbolizer;
2617   struct DisassembleInfo SymbolizerInfo;
2618   std::unique_ptr<MCRelocationInfo> RelInfo(
2619       TheTarget->createMCRelocationInfo(TripleName, Ctx));
2620   if (RelInfo) {
2621     Symbolizer.reset(TheTarget->createMCSymbolizer(
2622         TripleName, SymbolizerGetOpInfo, SymbolizerSymbolLookUp,
2623         &SymbolizerInfo, &Ctx, std::move(RelInfo)));
2624     DisAsm->setSymbolizer(std::move(Symbolizer));
2625   }
2626   int AsmPrinterVariant = AsmInfo->getAssemblerDialect();
2627   std::unique_ptr<MCInstPrinter> IP(TheTarget->createMCInstPrinter(
2628       AsmPrinterVariant, *AsmInfo, *InstrInfo, *MRI, *STI));
2629   // Set the display preference for hex vs. decimal immediates.
2630   IP->setPrintImmHex(PrintImmHex);
2631   // Comment stream and backing vector.
2632   SmallString<128> CommentsToEmit;
2633   raw_svector_ostream CommentStream(CommentsToEmit);
2634   // FIXME: Setting the CommentStream in the InstPrinter is problematic in that
2635   // if it is done then arm64 comments for string literals don't get printed
2636   // and some constant get printed instead and not setting it causes intel
2637   // (32-bit and 64-bit) comments printed with different spacing before the
2638   // comment causing different diffs with the 'C' disassembler library API.
2639   // IP->setCommentStream(CommentStream);
2640
2641   if (!AsmInfo || !STI || !DisAsm || !IP) {
2642     errs() << "error: couldn't initialize disassembler for target "
2643            << TripleName << '\n';
2644     return;
2645   }
2646
2647   // Set up thumb disassembler.
2648   std::unique_ptr<const MCRegisterInfo> ThumbMRI;
2649   std::unique_ptr<const MCAsmInfo> ThumbAsmInfo;
2650   std::unique_ptr<const MCSubtargetInfo> ThumbSTI;
2651   std::unique_ptr<MCDisassembler> ThumbDisAsm;
2652   std::unique_ptr<MCInstPrinter> ThumbIP;
2653   std::unique_ptr<MCContext> ThumbCtx;
2654   std::unique_ptr<MCSymbolizer> ThumbSymbolizer;
2655   struct DisassembleInfo ThumbSymbolizerInfo;
2656   std::unique_ptr<MCRelocationInfo> ThumbRelInfo;
2657   if (ThumbTarget) {
2658     ThumbMRI.reset(ThumbTarget->createMCRegInfo(ThumbTripleName));
2659     ThumbAsmInfo.reset(
2660         ThumbTarget->createMCAsmInfo(*ThumbMRI, ThumbTripleName));
2661     ThumbSTI.reset(
2662         ThumbTarget->createMCSubtargetInfo(ThumbTripleName, MCPU, FeaturesStr));
2663     ThumbCtx.reset(new MCContext(ThumbAsmInfo.get(), ThumbMRI.get(), nullptr));
2664     ThumbDisAsm.reset(ThumbTarget->createMCDisassembler(*ThumbSTI, *ThumbCtx));
2665     MCContext *PtrThumbCtx = ThumbCtx.get();
2666     ThumbRelInfo.reset(
2667         ThumbTarget->createMCRelocationInfo(ThumbTripleName, *PtrThumbCtx));
2668     if (ThumbRelInfo) {
2669       ThumbSymbolizer.reset(ThumbTarget->createMCSymbolizer(
2670           ThumbTripleName, SymbolizerGetOpInfo, SymbolizerSymbolLookUp,
2671           &ThumbSymbolizerInfo, PtrThumbCtx, std::move(ThumbRelInfo)));
2672       ThumbDisAsm->setSymbolizer(std::move(ThumbSymbolizer));
2673     }
2674     int ThumbAsmPrinterVariant = ThumbAsmInfo->getAssemblerDialect();
2675     ThumbIP.reset(ThumbTarget->createMCInstPrinter(
2676         ThumbAsmPrinterVariant, *ThumbAsmInfo, *ThumbInstrInfo, *ThumbMRI,
2677         *ThumbSTI));
2678     // Set the display preference for hex vs. decimal immediates.
2679     ThumbIP->setPrintImmHex(PrintImmHex);
2680   }
2681
2682   if (ThumbTarget && (!ThumbAsmInfo || !ThumbSTI || !ThumbDisAsm || !ThumbIP)) {
2683     errs() << "error: couldn't initialize disassembler for target "
2684            << ThumbTripleName << '\n';
2685     return;
2686   }
2687
2688   MachO::mach_header Header = MachOOF->getHeader();
2689
2690   // FIXME: Using the -cfg command line option, this code used to be able to
2691   // annotate relocations with the referenced symbol's name, and if this was
2692   // inside a __[cf]string section, the data it points to. This is now replaced
2693   // by the upcoming MCSymbolizer, which needs the appropriate setup done above.
2694   std::vector<SectionRef> Sections;
2695   std::vector<SymbolRef> Symbols;
2696   SmallVector<uint64_t, 8> FoundFns;
2697   uint64_t BaseSegmentAddress;
2698
2699   getSectionsAndSymbols(Header, MachOOF, Sections, Symbols, FoundFns,
2700                         BaseSegmentAddress);
2701
2702   // Sort the symbols by address, just in case they didn't come in that way.
2703   std::sort(Symbols.begin(), Symbols.end(), SymbolSorter());
2704
2705   // Build a data in code table that is sorted on by the address of each entry.
2706   uint64_t BaseAddress = 0;
2707   if (Header.filetype == MachO::MH_OBJECT)
2708     BaseAddress = Sections[0].getAddress();
2709   else
2710     BaseAddress = BaseSegmentAddress;
2711   DiceTable Dices;
2712   for (dice_iterator DI = MachOOF->begin_dices(), DE = MachOOF->end_dices();
2713        DI != DE; ++DI) {
2714     uint32_t Offset;
2715     DI->getOffset(Offset);
2716     Dices.push_back(std::make_pair(BaseAddress + Offset, *DI));
2717   }
2718   array_pod_sort(Dices.begin(), Dices.end());
2719
2720 #ifndef NDEBUG
2721   raw_ostream &DebugOut = DebugFlag ? dbgs() : nulls();
2722 #else
2723   raw_ostream &DebugOut = nulls();
2724 #endif
2725
2726   std::unique_ptr<DIContext> diContext;
2727   ObjectFile *DbgObj = MachOOF;
2728   // Try to find debug info and set up the DIContext for it.
2729   if (UseDbg) {
2730     // A separate DSym file path was specified, parse it as a macho file,
2731     // get the sections and supply it to the section name parsing machinery.
2732     if (!DSYMFile.empty()) {
2733       ErrorOr<std::unique_ptr<MemoryBuffer>> BufOrErr =
2734           MemoryBuffer::getFileOrSTDIN(DSYMFile);
2735       if (std::error_code EC = BufOrErr.getError()) {
2736         errs() << "llvm-objdump: " << Filename << ": " << EC.message() << '\n';
2737         return;
2738       }
2739       DbgObj =
2740           ObjectFile::createMachOObjectFile(BufOrErr.get()->getMemBufferRef())
2741               .get()
2742               .release();
2743     }
2744
2745     // Setup the DIContext
2746     diContext.reset(DIContext::getDWARFContext(*DbgObj));
2747   }
2748
2749   if (DumpSections.size() == 0)
2750     outs() << "(" << DisSegName << "," << DisSectName << ") section\n";
2751
2752   for (unsigned SectIdx = 0; SectIdx != Sections.size(); SectIdx++) {
2753     StringRef SectName;
2754     if (Sections[SectIdx].getName(SectName) || SectName != DisSectName)
2755       continue;
2756
2757     DataRefImpl DR = Sections[SectIdx].getRawDataRefImpl();
2758
2759     StringRef SegmentName = MachOOF->getSectionFinalSegmentName(DR);
2760     if (SegmentName != DisSegName)
2761       continue;
2762
2763     StringRef BytesStr;
2764     Sections[SectIdx].getContents(BytesStr);
2765     ArrayRef<uint8_t> Bytes(reinterpret_cast<const uint8_t *>(BytesStr.data()),
2766                             BytesStr.size());
2767     uint64_t SectAddress = Sections[SectIdx].getAddress();
2768
2769     bool symbolTableWorked = false;
2770
2771     // Parse relocations.
2772     std::vector<std::pair<uint64_t, SymbolRef>> Relocs;
2773     for (const RelocationRef &Reloc : Sections[SectIdx].relocations()) {
2774       uint64_t RelocOffset;
2775       Reloc.getOffset(RelocOffset);
2776       uint64_t SectionAddress = Sections[SectIdx].getAddress();
2777       RelocOffset -= SectionAddress;
2778
2779       symbol_iterator RelocSym = Reloc.getSymbol();
2780
2781       Relocs.push_back(std::make_pair(RelocOffset, *RelocSym));
2782     }
2783     array_pod_sort(Relocs.begin(), Relocs.end());
2784
2785     // Create a map of symbol addresses to symbol names for use by
2786     // the SymbolizerSymbolLookUp() routine.
2787     SymbolAddressMap AddrMap;
2788     for (const SymbolRef &Symbol : MachOOF->symbols()) {
2789       SymbolRef::Type ST;
2790       Symbol.getType(ST);
2791       if (ST == SymbolRef::ST_Function || ST == SymbolRef::ST_Data ||
2792           ST == SymbolRef::ST_Other) {
2793         uint64_t Address;
2794         Symbol.getAddress(Address);
2795         StringRef SymName;
2796         Symbol.getName(SymName);
2797         AddrMap[Address] = SymName;
2798       }
2799     }
2800     // Set up the block of info used by the Symbolizer call backs.
2801     SymbolizerInfo.verbose = true;
2802     SymbolizerInfo.O = MachOOF;
2803     SymbolizerInfo.S = Sections[SectIdx];
2804     SymbolizerInfo.AddrMap = &AddrMap;
2805     SymbolizerInfo.Sections = &Sections;
2806     SymbolizerInfo.class_name = nullptr;
2807     SymbolizerInfo.selector_name = nullptr;
2808     SymbolizerInfo.method = nullptr;
2809     SymbolizerInfo.demangled_name = nullptr;
2810     SymbolizerInfo.bindtable = nullptr;
2811     SymbolizerInfo.adrp_addr = 0;
2812     SymbolizerInfo.adrp_inst = 0;
2813     // Same for the ThumbSymbolizer
2814     ThumbSymbolizerInfo.verbose = true;
2815     ThumbSymbolizerInfo.O = MachOOF;
2816     ThumbSymbolizerInfo.S = Sections[SectIdx];
2817     ThumbSymbolizerInfo.AddrMap = &AddrMap;
2818     ThumbSymbolizerInfo.Sections = &Sections;
2819     ThumbSymbolizerInfo.class_name = nullptr;
2820     ThumbSymbolizerInfo.selector_name = nullptr;
2821     ThumbSymbolizerInfo.method = nullptr;
2822     ThumbSymbolizerInfo.demangled_name = nullptr;
2823     ThumbSymbolizerInfo.bindtable = nullptr;
2824     ThumbSymbolizerInfo.adrp_addr = 0;
2825     ThumbSymbolizerInfo.adrp_inst = 0;
2826
2827     // Disassemble symbol by symbol.
2828     for (unsigned SymIdx = 0; SymIdx != Symbols.size(); SymIdx++) {
2829       StringRef SymName;
2830       Symbols[SymIdx].getName(SymName);
2831
2832       SymbolRef::Type ST;
2833       Symbols[SymIdx].getType(ST);
2834       if (ST != SymbolRef::ST_Function)
2835         continue;
2836
2837       // Make sure the symbol is defined in this section.
2838       bool containsSym = Sections[SectIdx].containsSymbol(Symbols[SymIdx]);
2839       if (!containsSym)
2840         continue;
2841
2842       // Start at the address of the symbol relative to the section's address.
2843       uint64_t Start = 0;
2844       uint64_t SectionAddress = Sections[SectIdx].getAddress();
2845       Symbols[SymIdx].getAddress(Start);
2846       Start -= SectionAddress;
2847
2848       // Stop disassembling either at the beginning of the next symbol or at
2849       // the end of the section.
2850       bool containsNextSym = false;
2851       uint64_t NextSym = 0;
2852       uint64_t NextSymIdx = SymIdx + 1;
2853       while (Symbols.size() > NextSymIdx) {
2854         SymbolRef::Type NextSymType;
2855         Symbols[NextSymIdx].getType(NextSymType);
2856         if (NextSymType == SymbolRef::ST_Function) {
2857           containsNextSym =
2858               Sections[SectIdx].containsSymbol(Symbols[NextSymIdx]);
2859           Symbols[NextSymIdx].getAddress(NextSym);
2860           NextSym -= SectionAddress;
2861           break;
2862         }
2863         ++NextSymIdx;
2864       }
2865
2866       uint64_t SectSize = Sections[SectIdx].getSize();
2867       uint64_t End = containsNextSym ? NextSym : SectSize;
2868       uint64_t Size;
2869
2870       symbolTableWorked = true;
2871
2872       DataRefImpl Symb = Symbols[SymIdx].getRawDataRefImpl();
2873       bool isThumb =
2874           (MachOOF->getSymbolFlags(Symb) & SymbolRef::SF_Thumb) && ThumbTarget;
2875
2876       outs() << SymName << ":\n";
2877       DILineInfo lastLine;
2878       for (uint64_t Index = Start; Index < End; Index += Size) {
2879         MCInst Inst;
2880
2881         uint64_t PC = SectAddress + Index;
2882         if (FullLeadingAddr) {
2883           if (MachOOF->is64Bit())
2884             outs() << format("%016" PRIx64, PC);
2885           else
2886             outs() << format("%08" PRIx64, PC);
2887         } else {
2888           outs() << format("%8" PRIx64 ":", PC);
2889         }
2890         if (!NoShowRawInsn)
2891           outs() << "\t";
2892
2893         // Check the data in code table here to see if this is data not an
2894         // instruction to be disassembled.
2895         DiceTable Dice;
2896         Dice.push_back(std::make_pair(PC, DiceRef()));
2897         dice_table_iterator DTI =
2898             std::search(Dices.begin(), Dices.end(), Dice.begin(), Dice.end(),
2899                         compareDiceTableEntries);
2900         if (DTI != Dices.end()) {
2901           uint16_t Length;
2902           DTI->second.getLength(Length);
2903           uint16_t Kind;
2904           DTI->second.getKind(Kind);
2905           Size = DumpDataInCode(reinterpret_cast<const char *>(Bytes.data()) +
2906                                     Index,
2907                                 Length, Kind);
2908           if ((Kind == MachO::DICE_KIND_JUMP_TABLE8) &&
2909               (PC == (DTI->first + Length - 1)) && (Length & 1))
2910             Size++;
2911           continue;
2912         }
2913
2914         SmallVector<char, 64> AnnotationsBytes;
2915         raw_svector_ostream Annotations(AnnotationsBytes);
2916
2917         bool gotInst;
2918         if (isThumb)
2919           gotInst = ThumbDisAsm->getInstruction(Inst, Size, Bytes.slice(Index),
2920                                                 PC, DebugOut, Annotations);
2921         else
2922           gotInst = DisAsm->getInstruction(Inst, Size, Bytes.slice(Index), PC,
2923                                            DebugOut, Annotations);
2924         if (gotInst) {
2925           if (!NoShowRawInsn) {
2926             DumpBytes(StringRef(
2927                 reinterpret_cast<const char *>(Bytes.data()) + Index, Size));
2928           }
2929           formatted_raw_ostream FormattedOS(outs());
2930           Annotations.flush();
2931           StringRef AnnotationsStr = Annotations.str();
2932           if (isThumb)
2933             ThumbIP->printInst(&Inst, FormattedOS, AnnotationsStr);
2934           else
2935             IP->printInst(&Inst, FormattedOS, AnnotationsStr);
2936           emitComments(CommentStream, CommentsToEmit, FormattedOS, *AsmInfo);
2937
2938           // Print debug info.
2939           if (diContext) {
2940             DILineInfo dli = diContext->getLineInfoForAddress(PC);
2941             // Print valid line info if it changed.
2942             if (dli != lastLine && dli.Line != 0)
2943               outs() << "\t## " << dli.FileName << ':' << dli.Line << ':'
2944                      << dli.Column;
2945             lastLine = dli;
2946           }
2947           outs() << "\n";
2948         } else {
2949           unsigned int Arch = MachOOF->getArch();
2950           if (Arch == Triple::x86_64 || Arch == Triple::x86) {
2951             outs() << format("\t.byte 0x%02x #bad opcode\n",
2952                              *(Bytes.data() + Index) & 0xff);
2953             Size = 1; // skip exactly one illegible byte and move on.
2954           } else if (Arch == Triple::aarch64) {
2955             uint32_t opcode = (*(Bytes.data() + Index) & 0xff) |
2956                               (*(Bytes.data() + Index + 1) & 0xff) << 8 |
2957                               (*(Bytes.data() + Index + 2) & 0xff) << 16 |
2958                               (*(Bytes.data() + Index + 3) & 0xff) << 24;
2959             outs() << format("\t.long\t0x%08x\n", opcode);
2960             Size = 4;
2961           } else {
2962             errs() << "llvm-objdump: warning: invalid instruction encoding\n";
2963             if (Size == 0)
2964               Size = 1; // skip illegible bytes
2965           }
2966         }
2967       }
2968     }
2969     if (!symbolTableWorked) {
2970       // Reading the symbol table didn't work, disassemble the whole section.
2971       uint64_t SectAddress = Sections[SectIdx].getAddress();
2972       uint64_t SectSize = Sections[SectIdx].getSize();
2973       uint64_t InstSize;
2974       for (uint64_t Index = 0; Index < SectSize; Index += InstSize) {
2975         MCInst Inst;
2976
2977         uint64_t PC = SectAddress + Index;
2978         if (DisAsm->getInstruction(Inst, InstSize, Bytes.slice(Index), PC,
2979                                    DebugOut, nulls())) {
2980           if (FullLeadingAddr) {
2981             if (MachOOF->is64Bit())
2982               outs() << format("%016" PRIx64, PC);
2983             else
2984               outs() << format("%08" PRIx64, PC);
2985           } else {
2986             outs() << format("%8" PRIx64 ":", PC);
2987           }
2988           if (!NoShowRawInsn) {
2989             outs() << "\t";
2990             DumpBytes(
2991                 StringRef(reinterpret_cast<const char *>(Bytes.data()) + Index,
2992                           InstSize));
2993           }
2994           IP->printInst(&Inst, outs(), "");
2995           outs() << "\n";
2996         } else {
2997           unsigned int Arch = MachOOF->getArch();
2998           if (Arch == Triple::x86_64 || Arch == Triple::x86) {
2999             outs() << format("\t.byte 0x%02x #bad opcode\n",
3000                              *(Bytes.data() + Index) & 0xff);
3001             InstSize = 1; // skip exactly one illegible byte and move on.
3002           } else {
3003             errs() << "llvm-objdump: warning: invalid instruction encoding\n";
3004             if (InstSize == 0)
3005               InstSize = 1; // skip illegible bytes
3006           }
3007         }
3008       }
3009     }
3010     // The TripleName's need to be reset if we are called again for a different
3011     // archtecture.
3012     TripleName = "";
3013     ThumbTripleName = "";
3014
3015     if (SymbolizerInfo.method != nullptr)
3016       free(SymbolizerInfo.method);
3017     if (SymbolizerInfo.demangled_name != nullptr)
3018       free(SymbolizerInfo.demangled_name);
3019     if (SymbolizerInfo.bindtable != nullptr)
3020       delete SymbolizerInfo.bindtable;
3021     if (ThumbSymbolizerInfo.method != nullptr)
3022       free(ThumbSymbolizerInfo.method);
3023     if (ThumbSymbolizerInfo.demangled_name != nullptr)
3024       free(ThumbSymbolizerInfo.demangled_name);
3025     if (ThumbSymbolizerInfo.bindtable != nullptr)
3026       delete ThumbSymbolizerInfo.bindtable;
3027   }
3028 }
3029
3030 //===----------------------------------------------------------------------===//
3031 // __compact_unwind section dumping
3032 //===----------------------------------------------------------------------===//
3033
3034 namespace {
3035
3036 template <typename T> static uint64_t readNext(const char *&Buf) {
3037   using llvm::support::little;
3038   using llvm::support::unaligned;
3039
3040   uint64_t Val = support::endian::read<T, little, unaligned>(Buf);
3041   Buf += sizeof(T);
3042   return Val;
3043 }
3044
3045 struct CompactUnwindEntry {
3046   uint32_t OffsetInSection;
3047
3048   uint64_t FunctionAddr;
3049   uint32_t Length;
3050   uint32_t CompactEncoding;
3051   uint64_t PersonalityAddr;
3052   uint64_t LSDAAddr;
3053
3054   RelocationRef FunctionReloc;
3055   RelocationRef PersonalityReloc;
3056   RelocationRef LSDAReloc;
3057
3058   CompactUnwindEntry(StringRef Contents, unsigned Offset, bool Is64)
3059       : OffsetInSection(Offset) {
3060     if (Is64)
3061       read<uint64_t>(Contents.data() + Offset);
3062     else
3063       read<uint32_t>(Contents.data() + Offset);
3064   }
3065
3066 private:
3067   template <typename UIntPtr> void read(const char *Buf) {
3068     FunctionAddr = readNext<UIntPtr>(Buf);
3069     Length = readNext<uint32_t>(Buf);
3070     CompactEncoding = readNext<uint32_t>(Buf);
3071     PersonalityAddr = readNext<UIntPtr>(Buf);
3072     LSDAAddr = readNext<UIntPtr>(Buf);
3073   }
3074 };
3075 }
3076
3077 /// Given a relocation from __compact_unwind, consisting of the RelocationRef
3078 /// and data being relocated, determine the best base Name and Addend to use for
3079 /// display purposes.
3080 ///
3081 /// 1. An Extern relocation will directly reference a symbol (and the data is
3082 ///    then already an addend), so use that.
3083 /// 2. Otherwise the data is an offset in the object file's layout; try to find
3084 //     a symbol before it in the same section, and use the offset from there.
3085 /// 3. Finally, if all that fails, fall back to an offset from the start of the
3086 ///    referenced section.
3087 static void findUnwindRelocNameAddend(const MachOObjectFile *Obj,
3088                                       std::map<uint64_t, SymbolRef> &Symbols,
3089                                       const RelocationRef &Reloc, uint64_t Addr,
3090                                       StringRef &Name, uint64_t &Addend) {
3091   if (Reloc.getSymbol() != Obj->symbol_end()) {
3092     Reloc.getSymbol()->getName(Name);
3093     Addend = Addr;
3094     return;
3095   }
3096
3097   auto RE = Obj->getRelocation(Reloc.getRawDataRefImpl());
3098   SectionRef RelocSection = Obj->getRelocationSection(RE);
3099
3100   uint64_t SectionAddr = RelocSection.getAddress();
3101
3102   auto Sym = Symbols.upper_bound(Addr);
3103   if (Sym == Symbols.begin()) {
3104     // The first symbol in the object is after this reference, the best we can
3105     // do is section-relative notation.
3106     RelocSection.getName(Name);
3107     Addend = Addr - SectionAddr;
3108     return;
3109   }
3110
3111   // Go back one so that SymbolAddress <= Addr.
3112   --Sym;
3113
3114   section_iterator SymSection = Obj->section_end();
3115   Sym->second.getSection(SymSection);
3116   if (RelocSection == *SymSection) {
3117     // There's a valid symbol in the same section before this reference.
3118     Sym->second.getName(Name);
3119     Addend = Addr - Sym->first;
3120     return;
3121   }
3122
3123   // There is a symbol before this reference, but it's in a different
3124   // section. Probably not helpful to mention it, so use the section name.
3125   RelocSection.getName(Name);
3126   Addend = Addr - SectionAddr;
3127 }
3128
3129 static void printUnwindRelocDest(const MachOObjectFile *Obj,
3130                                  std::map<uint64_t, SymbolRef> &Symbols,
3131                                  const RelocationRef &Reloc, uint64_t Addr) {
3132   StringRef Name;
3133   uint64_t Addend;
3134
3135   if (!Reloc.getObjectFile())
3136     return;
3137
3138   findUnwindRelocNameAddend(Obj, Symbols, Reloc, Addr, Name, Addend);
3139
3140   outs() << Name;
3141   if (Addend)
3142     outs() << " + " << format("0x%" PRIx64, Addend);
3143 }
3144
3145 static void
3146 printMachOCompactUnwindSection(const MachOObjectFile *Obj,
3147                                std::map<uint64_t, SymbolRef> &Symbols,
3148                                const SectionRef &CompactUnwind) {
3149
3150   assert(Obj->isLittleEndian() &&
3151          "There should not be a big-endian .o with __compact_unwind");
3152
3153   bool Is64 = Obj->is64Bit();
3154   uint32_t PointerSize = Is64 ? sizeof(uint64_t) : sizeof(uint32_t);
3155   uint32_t EntrySize = 3 * PointerSize + 2 * sizeof(uint32_t);
3156
3157   StringRef Contents;
3158   CompactUnwind.getContents(Contents);
3159
3160   SmallVector<CompactUnwindEntry, 4> CompactUnwinds;
3161
3162   // First populate the initial raw offsets, encodings and so on from the entry.
3163   for (unsigned Offset = 0; Offset < Contents.size(); Offset += EntrySize) {
3164     CompactUnwindEntry Entry(Contents.data(), Offset, Is64);
3165     CompactUnwinds.push_back(Entry);
3166   }
3167
3168   // Next we need to look at the relocations to find out what objects are
3169   // actually being referred to.
3170   for (const RelocationRef &Reloc : CompactUnwind.relocations()) {
3171     uint64_t RelocAddress;
3172     Reloc.getOffset(RelocAddress);
3173
3174     uint32_t EntryIdx = RelocAddress / EntrySize;
3175     uint32_t OffsetInEntry = RelocAddress - EntryIdx * EntrySize;
3176     CompactUnwindEntry &Entry = CompactUnwinds[EntryIdx];
3177
3178     if (OffsetInEntry == 0)
3179       Entry.FunctionReloc = Reloc;
3180     else if (OffsetInEntry == PointerSize + 2 * sizeof(uint32_t))
3181       Entry.PersonalityReloc = Reloc;
3182     else if (OffsetInEntry == 2 * PointerSize + 2 * sizeof(uint32_t))
3183       Entry.LSDAReloc = Reloc;
3184     else
3185       llvm_unreachable("Unexpected relocation in __compact_unwind section");
3186   }
3187
3188   // Finally, we're ready to print the data we've gathered.
3189   outs() << "Contents of __compact_unwind section:\n";
3190   for (auto &Entry : CompactUnwinds) {
3191     outs() << "  Entry at offset "
3192            << format("0x%" PRIx32, Entry.OffsetInSection) << ":\n";
3193
3194     // 1. Start of the region this entry applies to.
3195     outs() << "    start:                " << format("0x%" PRIx64,
3196                                                      Entry.FunctionAddr) << ' ';
3197     printUnwindRelocDest(Obj, Symbols, Entry.FunctionReloc, Entry.FunctionAddr);
3198     outs() << '\n';
3199
3200     // 2. Length of the region this entry applies to.
3201     outs() << "    length:               " << format("0x%" PRIx32, Entry.Length)
3202            << '\n';
3203     // 3. The 32-bit compact encoding.
3204     outs() << "    compact encoding:     "
3205            << format("0x%08" PRIx32, Entry.CompactEncoding) << '\n';
3206
3207     // 4. The personality function, if present.
3208     if (Entry.PersonalityReloc.getObjectFile()) {
3209       outs() << "    personality function: "
3210              << format("0x%" PRIx64, Entry.PersonalityAddr) << ' ';
3211       printUnwindRelocDest(Obj, Symbols, Entry.PersonalityReloc,
3212                            Entry.PersonalityAddr);
3213       outs() << '\n';
3214     }
3215
3216     // 5. This entry's language-specific data area.
3217     if (Entry.LSDAReloc.getObjectFile()) {
3218       outs() << "    LSDA:                 " << format("0x%" PRIx64,
3219                                                        Entry.LSDAAddr) << ' ';
3220       printUnwindRelocDest(Obj, Symbols, Entry.LSDAReloc, Entry.LSDAAddr);
3221       outs() << '\n';
3222     }
3223   }
3224 }
3225
3226 //===----------------------------------------------------------------------===//
3227 // __unwind_info section dumping
3228 //===----------------------------------------------------------------------===//
3229
3230 static void printRegularSecondLevelUnwindPage(const char *PageStart) {
3231   const char *Pos = PageStart;
3232   uint32_t Kind = readNext<uint32_t>(Pos);
3233   (void)Kind;
3234   assert(Kind == 2 && "kind for a regular 2nd level index should be 2");
3235
3236   uint16_t EntriesStart = readNext<uint16_t>(Pos);
3237   uint16_t NumEntries = readNext<uint16_t>(Pos);
3238
3239   Pos = PageStart + EntriesStart;
3240   for (unsigned i = 0; i < NumEntries; ++i) {
3241     uint32_t FunctionOffset = readNext<uint32_t>(Pos);
3242     uint32_t Encoding = readNext<uint32_t>(Pos);
3243
3244     outs() << "      [" << i << "]: "
3245            << "function offset=" << format("0x%08" PRIx32, FunctionOffset)
3246            << ", "
3247            << "encoding=" << format("0x%08" PRIx32, Encoding) << '\n';
3248   }
3249 }
3250
3251 static void printCompressedSecondLevelUnwindPage(
3252     const char *PageStart, uint32_t FunctionBase,
3253     const SmallVectorImpl<uint32_t> &CommonEncodings) {
3254   const char *Pos = PageStart;
3255   uint32_t Kind = readNext<uint32_t>(Pos);
3256   (void)Kind;
3257   assert(Kind == 3 && "kind for a compressed 2nd level index should be 3");
3258
3259   uint16_t EntriesStart = readNext<uint16_t>(Pos);
3260   uint16_t NumEntries = readNext<uint16_t>(Pos);
3261
3262   uint16_t EncodingsStart = readNext<uint16_t>(Pos);
3263   readNext<uint16_t>(Pos);
3264   const auto *PageEncodings = reinterpret_cast<const support::ulittle32_t *>(
3265       PageStart + EncodingsStart);
3266
3267   Pos = PageStart + EntriesStart;
3268   for (unsigned i = 0; i < NumEntries; ++i) {
3269     uint32_t Entry = readNext<uint32_t>(Pos);
3270     uint32_t FunctionOffset = FunctionBase + (Entry & 0xffffff);
3271     uint32_t EncodingIdx = Entry >> 24;
3272
3273     uint32_t Encoding;
3274     if (EncodingIdx < CommonEncodings.size())
3275       Encoding = CommonEncodings[EncodingIdx];
3276     else
3277       Encoding = PageEncodings[EncodingIdx - CommonEncodings.size()];
3278
3279     outs() << "      [" << i << "]: "
3280            << "function offset=" << format("0x%08" PRIx32, FunctionOffset)
3281            << ", "
3282            << "encoding[" << EncodingIdx
3283            << "]=" << format("0x%08" PRIx32, Encoding) << '\n';
3284   }
3285 }
3286
3287 static void printMachOUnwindInfoSection(const MachOObjectFile *Obj,
3288                                         std::map<uint64_t, SymbolRef> &Symbols,
3289                                         const SectionRef &UnwindInfo) {
3290
3291   assert(Obj->isLittleEndian() &&
3292          "There should not be a big-endian .o with __unwind_info");
3293
3294   outs() << "Contents of __unwind_info section:\n";
3295
3296   StringRef Contents;
3297   UnwindInfo.getContents(Contents);
3298   const char *Pos = Contents.data();
3299
3300   //===----------------------------------
3301   // Section header
3302   //===----------------------------------
3303
3304   uint32_t Version = readNext<uint32_t>(Pos);
3305   outs() << "  Version:                                   "
3306          << format("0x%" PRIx32, Version) << '\n';
3307   assert(Version == 1 && "only understand version 1");
3308
3309   uint32_t CommonEncodingsStart = readNext<uint32_t>(Pos);
3310   outs() << "  Common encodings array section offset:     "
3311          << format("0x%" PRIx32, CommonEncodingsStart) << '\n';
3312   uint32_t NumCommonEncodings = readNext<uint32_t>(Pos);
3313   outs() << "  Number of common encodings in array:       "
3314          << format("0x%" PRIx32, NumCommonEncodings) << '\n';
3315
3316   uint32_t PersonalitiesStart = readNext<uint32_t>(Pos);
3317   outs() << "  Personality function array section offset: "
3318          << format("0x%" PRIx32, PersonalitiesStart) << '\n';
3319   uint32_t NumPersonalities = readNext<uint32_t>(Pos);
3320   outs() << "  Number of personality functions in array:  "
3321          << format("0x%" PRIx32, NumPersonalities) << '\n';
3322
3323   uint32_t IndicesStart = readNext<uint32_t>(Pos);
3324   outs() << "  Index array section offset:                "
3325          << format("0x%" PRIx32, IndicesStart) << '\n';
3326   uint32_t NumIndices = readNext<uint32_t>(Pos);
3327   outs() << "  Number of indices in array:                "
3328          << format("0x%" PRIx32, NumIndices) << '\n';
3329
3330   //===----------------------------------
3331   // A shared list of common encodings
3332   //===----------------------------------
3333
3334   // These occupy indices in the range [0, N] whenever an encoding is referenced
3335   // from a compressed 2nd level index table. In practice the linker only
3336   // creates ~128 of these, so that indices are available to embed encodings in
3337   // the 2nd level index.
3338
3339   SmallVector<uint32_t, 64> CommonEncodings;
3340   outs() << "  Common encodings: (count = " << NumCommonEncodings << ")\n";
3341   Pos = Contents.data() + CommonEncodingsStart;
3342   for (unsigned i = 0; i < NumCommonEncodings; ++i) {
3343     uint32_t Encoding = readNext<uint32_t>(Pos);
3344     CommonEncodings.push_back(Encoding);
3345
3346     outs() << "    encoding[" << i << "]: " << format("0x%08" PRIx32, Encoding)
3347            << '\n';
3348   }
3349
3350   //===----------------------------------
3351   // Personality functions used in this executable
3352   //===----------------------------------
3353
3354   // There should be only a handful of these (one per source language,
3355   // roughly). Particularly since they only get 2 bits in the compact encoding.
3356
3357   outs() << "  Personality functions: (count = " << NumPersonalities << ")\n";
3358   Pos = Contents.data() + PersonalitiesStart;
3359   for (unsigned i = 0; i < NumPersonalities; ++i) {
3360     uint32_t PersonalityFn = readNext<uint32_t>(Pos);
3361     outs() << "    personality[" << i + 1
3362            << "]: " << format("0x%08" PRIx32, PersonalityFn) << '\n';
3363   }
3364
3365   //===----------------------------------
3366   // The level 1 index entries
3367   //===----------------------------------
3368
3369   // These specify an approximate place to start searching for the more detailed
3370   // information, sorted by PC.
3371
3372   struct IndexEntry {
3373     uint32_t FunctionOffset;
3374     uint32_t SecondLevelPageStart;
3375     uint32_t LSDAStart;
3376   };
3377
3378   SmallVector<IndexEntry, 4> IndexEntries;
3379
3380   outs() << "  Top level indices: (count = " << NumIndices << ")\n";
3381   Pos = Contents.data() + IndicesStart;
3382   for (unsigned i = 0; i < NumIndices; ++i) {
3383     IndexEntry Entry;
3384
3385     Entry.FunctionOffset = readNext<uint32_t>(Pos);
3386     Entry.SecondLevelPageStart = readNext<uint32_t>(Pos);
3387     Entry.LSDAStart = readNext<uint32_t>(Pos);
3388     IndexEntries.push_back(Entry);
3389
3390     outs() << "    [" << i << "]: "
3391            << "function offset=" << format("0x%08" PRIx32, Entry.FunctionOffset)
3392            << ", "
3393            << "2nd level page offset="
3394            << format("0x%08" PRIx32, Entry.SecondLevelPageStart) << ", "
3395            << "LSDA offset=" << format("0x%08" PRIx32, Entry.LSDAStart) << '\n';
3396   }
3397
3398   //===----------------------------------
3399   // Next come the LSDA tables
3400   //===----------------------------------
3401
3402   // The LSDA layout is rather implicit: it's a contiguous array of entries from
3403   // the first top-level index's LSDAOffset to the last (sentinel).
3404
3405   outs() << "  LSDA descriptors:\n";
3406   Pos = Contents.data() + IndexEntries[0].LSDAStart;
3407   int NumLSDAs = (IndexEntries.back().LSDAStart - IndexEntries[0].LSDAStart) /
3408                  (2 * sizeof(uint32_t));
3409   for (int i = 0; i < NumLSDAs; ++i) {
3410     uint32_t FunctionOffset = readNext<uint32_t>(Pos);
3411     uint32_t LSDAOffset = readNext<uint32_t>(Pos);
3412     outs() << "    [" << i << "]: "
3413            << "function offset=" << format("0x%08" PRIx32, FunctionOffset)
3414            << ", "
3415            << "LSDA offset=" << format("0x%08" PRIx32, LSDAOffset) << '\n';
3416   }
3417
3418   //===----------------------------------
3419   // Finally, the 2nd level indices
3420   //===----------------------------------
3421
3422   // Generally these are 4K in size, and have 2 possible forms:
3423   //   + Regular stores up to 511 entries with disparate encodings
3424   //   + Compressed stores up to 1021 entries if few enough compact encoding
3425   //     values are used.
3426   outs() << "  Second level indices:\n";
3427   for (unsigned i = 0; i < IndexEntries.size() - 1; ++i) {
3428     // The final sentinel top-level index has no associated 2nd level page
3429     if (IndexEntries[i].SecondLevelPageStart == 0)
3430       break;
3431
3432     outs() << "    Second level index[" << i << "]: "
3433            << "offset in section="
3434            << format("0x%08" PRIx32, IndexEntries[i].SecondLevelPageStart)
3435            << ", "
3436            << "base function offset="
3437            << format("0x%08" PRIx32, IndexEntries[i].FunctionOffset) << '\n';
3438
3439     Pos = Contents.data() + IndexEntries[i].SecondLevelPageStart;
3440     uint32_t Kind = *reinterpret_cast<const support::ulittle32_t *>(Pos);
3441     if (Kind == 2)
3442       printRegularSecondLevelUnwindPage(Pos);
3443     else if (Kind == 3)
3444       printCompressedSecondLevelUnwindPage(Pos, IndexEntries[i].FunctionOffset,
3445                                            CommonEncodings);
3446     else
3447       llvm_unreachable("Do not know how to print this kind of 2nd level page");
3448   }
3449 }
3450
3451 void llvm::printMachOUnwindInfo(const MachOObjectFile *Obj) {
3452   std::map<uint64_t, SymbolRef> Symbols;
3453   for (const SymbolRef &SymRef : Obj->symbols()) {
3454     // Discard any undefined or absolute symbols. They're not going to take part
3455     // in the convenience lookup for unwind info and just take up resources.
3456     section_iterator Section = Obj->section_end();
3457     SymRef.getSection(Section);
3458     if (Section == Obj->section_end())
3459       continue;
3460
3461     uint64_t Addr;
3462     SymRef.getAddress(Addr);
3463     Symbols.insert(std::make_pair(Addr, SymRef));
3464   }
3465
3466   for (const SectionRef &Section : Obj->sections()) {
3467     StringRef SectName;
3468     Section.getName(SectName);
3469     if (SectName == "__compact_unwind")
3470       printMachOCompactUnwindSection(Obj, Symbols, Section);
3471     else if (SectName == "__unwind_info")
3472       printMachOUnwindInfoSection(Obj, Symbols, Section);
3473     else if (SectName == "__eh_frame")
3474       outs() << "llvm-objdump: warning: unhandled __eh_frame section\n";
3475   }
3476 }
3477
3478 static void PrintMachHeader(uint32_t magic, uint32_t cputype,
3479                             uint32_t cpusubtype, uint32_t filetype,
3480                             uint32_t ncmds, uint32_t sizeofcmds, uint32_t flags,
3481                             bool verbose) {
3482   outs() << "Mach header\n";
3483   outs() << "      magic cputype cpusubtype  caps    filetype ncmds "
3484             "sizeofcmds      flags\n";
3485   if (verbose) {
3486     if (magic == MachO::MH_MAGIC)
3487       outs() << "   MH_MAGIC";
3488     else if (magic == MachO::MH_MAGIC_64)
3489       outs() << "MH_MAGIC_64";
3490     else
3491       outs() << format(" 0x%08" PRIx32, magic);
3492     switch (cputype) {
3493     case MachO::CPU_TYPE_I386:
3494       outs() << "    I386";
3495       switch (cpusubtype & ~MachO::CPU_SUBTYPE_MASK) {
3496       case MachO::CPU_SUBTYPE_I386_ALL:
3497         outs() << "        ALL";
3498         break;
3499       default:
3500         outs() << format(" %10d", cpusubtype & ~MachO::CPU_SUBTYPE_MASK);
3501         break;
3502       }
3503       break;
3504     case MachO::CPU_TYPE_X86_64:
3505       outs() << "  X86_64";
3506       switch (cpusubtype & ~MachO::CPU_SUBTYPE_MASK) {
3507       case MachO::CPU_SUBTYPE_X86_64_ALL:
3508         outs() << "        ALL";
3509         break;
3510       case MachO::CPU_SUBTYPE_X86_64_H:
3511         outs() << "    Haswell";
3512         break;
3513       default:
3514         outs() << format(" %10d", cpusubtype & ~MachO::CPU_SUBTYPE_MASK);
3515         break;
3516       }
3517       break;
3518     case MachO::CPU_TYPE_ARM:
3519       outs() << "     ARM";
3520       switch (cpusubtype & ~MachO::CPU_SUBTYPE_MASK) {
3521       case MachO::CPU_SUBTYPE_ARM_ALL:
3522         outs() << "        ALL";
3523         break;
3524       case MachO::CPU_SUBTYPE_ARM_V4T:
3525         outs() << "        V4T";
3526         break;
3527       case MachO::CPU_SUBTYPE_ARM_V5TEJ:
3528         outs() << "      V5TEJ";
3529         break;
3530       case MachO::CPU_SUBTYPE_ARM_XSCALE:
3531         outs() << "     XSCALE";
3532         break;
3533       case MachO::CPU_SUBTYPE_ARM_V6:
3534         outs() << "         V6";
3535         break;
3536       case MachO::CPU_SUBTYPE_ARM_V6M:
3537         outs() << "        V6M";
3538         break;
3539       case MachO::CPU_SUBTYPE_ARM_V7:
3540         outs() << "         V7";
3541         break;
3542       case MachO::CPU_SUBTYPE_ARM_V7EM:
3543         outs() << "       V7EM";
3544         break;
3545       case MachO::CPU_SUBTYPE_ARM_V7K:
3546         outs() << "        V7K";
3547         break;
3548       case MachO::CPU_SUBTYPE_ARM_V7M:
3549         outs() << "        V7M";
3550         break;
3551       case MachO::CPU_SUBTYPE_ARM_V7S:
3552         outs() << "        V7S";
3553         break;
3554       default:
3555         outs() << format(" %10d", cpusubtype & ~MachO::CPU_SUBTYPE_MASK);
3556         break;
3557       }
3558       break;
3559     case MachO::CPU_TYPE_ARM64:
3560       outs() << "   ARM64";
3561       switch (cpusubtype & ~MachO::CPU_SUBTYPE_MASK) {
3562       case MachO::CPU_SUBTYPE_ARM64_ALL:
3563         outs() << "        ALL";
3564         break;
3565       default:
3566         outs() << format(" %10d", cpusubtype & ~MachO::CPU_SUBTYPE_MASK);
3567         break;
3568       }
3569       break;
3570     case MachO::CPU_TYPE_POWERPC:
3571       outs() << "     PPC";
3572       switch (cpusubtype & ~MachO::CPU_SUBTYPE_MASK) {
3573       case MachO::CPU_SUBTYPE_POWERPC_ALL:
3574         outs() << "        ALL";
3575         break;
3576       default:
3577         outs() << format(" %10d", cpusubtype & ~MachO::CPU_SUBTYPE_MASK);
3578         break;
3579       }
3580       break;
3581     case MachO::CPU_TYPE_POWERPC64:
3582       outs() << "   PPC64";
3583       switch (cpusubtype & ~MachO::CPU_SUBTYPE_MASK) {
3584       case MachO::CPU_SUBTYPE_POWERPC_ALL:
3585         outs() << "        ALL";
3586         break;
3587       default:
3588         outs() << format(" %10d", cpusubtype & ~MachO::CPU_SUBTYPE_MASK);
3589         break;
3590       }
3591       break;
3592     }
3593     if ((cpusubtype & MachO::CPU_SUBTYPE_MASK) == MachO::CPU_SUBTYPE_LIB64) {
3594       outs() << " LIB64";
3595     } else {
3596       outs() << format("  0x%02" PRIx32,
3597                        (cpusubtype & MachO::CPU_SUBTYPE_MASK) >> 24);
3598     }
3599     switch (filetype) {
3600     case MachO::MH_OBJECT:
3601       outs() << "      OBJECT";
3602       break;
3603     case MachO::MH_EXECUTE:
3604       outs() << "     EXECUTE";
3605       break;
3606     case MachO::MH_FVMLIB:
3607       outs() << "      FVMLIB";
3608       break;
3609     case MachO::MH_CORE:
3610       outs() << "        CORE";
3611       break;
3612     case MachO::MH_PRELOAD:
3613       outs() << "     PRELOAD";
3614       break;
3615     case MachO::MH_DYLIB:
3616       outs() << "       DYLIB";
3617       break;
3618     case MachO::MH_DYLIB_STUB:
3619       outs() << "  DYLIB_STUB";
3620       break;
3621     case MachO::MH_DYLINKER:
3622       outs() << "    DYLINKER";
3623       break;
3624     case MachO::MH_BUNDLE:
3625       outs() << "      BUNDLE";
3626       break;
3627     case MachO::MH_DSYM:
3628       outs() << "        DSYM";
3629       break;
3630     case MachO::MH_KEXT_BUNDLE:
3631       outs() << "  KEXTBUNDLE";
3632       break;
3633     default:
3634       outs() << format("  %10u", filetype);
3635       break;
3636     }
3637     outs() << format(" %5u", ncmds);
3638     outs() << format(" %10u", sizeofcmds);
3639     uint32_t f = flags;
3640     if (f & MachO::MH_NOUNDEFS) {
3641       outs() << "   NOUNDEFS";
3642       f &= ~MachO::MH_NOUNDEFS;
3643     }
3644     if (f & MachO::MH_INCRLINK) {
3645       outs() << " INCRLINK";
3646       f &= ~MachO::MH_INCRLINK;
3647     }
3648     if (f & MachO::MH_DYLDLINK) {
3649       outs() << " DYLDLINK";
3650       f &= ~MachO::MH_DYLDLINK;
3651     }
3652     if (f & MachO::MH_BINDATLOAD) {
3653       outs() << " BINDATLOAD";
3654       f &= ~MachO::MH_BINDATLOAD;
3655     }
3656     if (f & MachO::MH_PREBOUND) {
3657       outs() << " PREBOUND";
3658       f &= ~MachO::MH_PREBOUND;
3659     }
3660     if (f & MachO::MH_SPLIT_SEGS) {
3661       outs() << " SPLIT_SEGS";
3662       f &= ~MachO::MH_SPLIT_SEGS;
3663     }
3664     if (f & MachO::MH_LAZY_INIT) {
3665       outs() << " LAZY_INIT";
3666       f &= ~MachO::MH_LAZY_INIT;
3667     }
3668     if (f & MachO::MH_TWOLEVEL) {
3669       outs() << " TWOLEVEL";
3670       f &= ~MachO::MH_TWOLEVEL;
3671     }
3672     if (f & MachO::MH_FORCE_FLAT) {
3673       outs() << " FORCE_FLAT";
3674       f &= ~MachO::MH_FORCE_FLAT;
3675     }
3676     if (f & MachO::MH_NOMULTIDEFS) {
3677       outs() << " NOMULTIDEFS";
3678       f &= ~MachO::MH_NOMULTIDEFS;
3679     }
3680     if (f & MachO::MH_NOFIXPREBINDING) {
3681       outs() << " NOFIXPREBINDING";
3682       f &= ~MachO::MH_NOFIXPREBINDING;
3683     }
3684     if (f & MachO::MH_PREBINDABLE) {
3685       outs() << " PREBINDABLE";
3686       f &= ~MachO::MH_PREBINDABLE;
3687     }
3688     if (f & MachO::MH_ALLMODSBOUND) {
3689       outs() << " ALLMODSBOUND";
3690       f &= ~MachO::MH_ALLMODSBOUND;
3691     }
3692     if (f & MachO::MH_SUBSECTIONS_VIA_SYMBOLS) {
3693       outs() << " SUBSECTIONS_VIA_SYMBOLS";
3694       f &= ~MachO::MH_SUBSECTIONS_VIA_SYMBOLS;
3695     }
3696     if (f & MachO::MH_CANONICAL) {
3697       outs() << " CANONICAL";
3698       f &= ~MachO::MH_CANONICAL;
3699     }
3700     if (f & MachO::MH_WEAK_DEFINES) {
3701       outs() << " WEAK_DEFINES";
3702       f &= ~MachO::MH_WEAK_DEFINES;
3703     }
3704     if (f & MachO::MH_BINDS_TO_WEAK) {
3705       outs() << " BINDS_TO_WEAK";
3706       f &= ~MachO::MH_BINDS_TO_WEAK;
3707     }
3708     if (f & MachO::MH_ALLOW_STACK_EXECUTION) {
3709       outs() << " ALLOW_STACK_EXECUTION";
3710       f &= ~MachO::MH_ALLOW_STACK_EXECUTION;
3711     }
3712     if (f & MachO::MH_DEAD_STRIPPABLE_DYLIB) {
3713       outs() << " DEAD_STRIPPABLE_DYLIB";
3714       f &= ~MachO::MH_DEAD_STRIPPABLE_DYLIB;
3715     }
3716     if (f & MachO::MH_PIE) {
3717       outs() << " PIE";
3718       f &= ~MachO::MH_PIE;
3719     }
3720     if (f & MachO::MH_NO_REEXPORTED_DYLIBS) {
3721       outs() << " NO_REEXPORTED_DYLIBS";
3722       f &= ~MachO::MH_NO_REEXPORTED_DYLIBS;
3723     }
3724     if (f & MachO::MH_HAS_TLV_DESCRIPTORS) {
3725       outs() << " MH_HAS_TLV_DESCRIPTORS";
3726       f &= ~MachO::MH_HAS_TLV_DESCRIPTORS;
3727     }
3728     if (f & MachO::MH_NO_HEAP_EXECUTION) {
3729       outs() << " MH_NO_HEAP_EXECUTION";
3730       f &= ~MachO::MH_NO_HEAP_EXECUTION;
3731     }
3732     if (f & MachO::MH_APP_EXTENSION_SAFE) {
3733       outs() << " APP_EXTENSION_SAFE";
3734       f &= ~MachO::MH_APP_EXTENSION_SAFE;
3735     }
3736     if (f != 0 || flags == 0)
3737       outs() << format(" 0x%08" PRIx32, f);
3738   } else {
3739     outs() << format(" 0x%08" PRIx32, magic);
3740     outs() << format(" %7d", cputype);
3741     outs() << format(" %10d", cpusubtype & ~MachO::CPU_SUBTYPE_MASK);
3742     outs() << format("  0x%02" PRIx32,
3743                      (cpusubtype & MachO::CPU_SUBTYPE_MASK) >> 24);
3744     outs() << format("  %10u", filetype);
3745     outs() << format(" %5u", ncmds);
3746     outs() << format(" %10u", sizeofcmds);
3747     outs() << format(" 0x%08" PRIx32, flags);
3748   }
3749   outs() << "\n";
3750 }
3751
3752 static void PrintSegmentCommand(uint32_t cmd, uint32_t cmdsize,
3753                                 StringRef SegName, uint64_t vmaddr,
3754                                 uint64_t vmsize, uint64_t fileoff,
3755                                 uint64_t filesize, uint32_t maxprot,
3756                                 uint32_t initprot, uint32_t nsects,
3757                                 uint32_t flags, uint32_t object_size,
3758                                 bool verbose) {
3759   uint64_t expected_cmdsize;
3760   if (cmd == MachO::LC_SEGMENT) {
3761     outs() << "      cmd LC_SEGMENT\n";
3762     expected_cmdsize = nsects;
3763     expected_cmdsize *= sizeof(struct MachO::section);
3764     expected_cmdsize += sizeof(struct MachO::segment_command);
3765   } else {
3766     outs() << "      cmd LC_SEGMENT_64\n";
3767     expected_cmdsize = nsects;
3768     expected_cmdsize *= sizeof(struct MachO::section_64);
3769     expected_cmdsize += sizeof(struct MachO::segment_command_64);
3770   }
3771   outs() << "  cmdsize " << cmdsize;
3772   if (cmdsize != expected_cmdsize)
3773     outs() << " Inconsistent size\n";
3774   else
3775     outs() << "\n";
3776   outs() << "  segname " << SegName << "\n";
3777   if (cmd == MachO::LC_SEGMENT_64) {
3778     outs() << "   vmaddr " << format("0x%016" PRIx64, vmaddr) << "\n";
3779     outs() << "   vmsize " << format("0x%016" PRIx64, vmsize) << "\n";
3780   } else {
3781     outs() << "   vmaddr " << format("0x%08" PRIx64, vmaddr) << "\n";
3782     outs() << "   vmsize " << format("0x%08" PRIx64, vmsize) << "\n";
3783   }
3784   outs() << "  fileoff " << fileoff;
3785   if (fileoff > object_size)
3786     outs() << " (past end of file)\n";
3787   else
3788     outs() << "\n";
3789   outs() << " filesize " << filesize;
3790   if (fileoff + filesize > object_size)
3791     outs() << " (past end of file)\n";
3792   else
3793     outs() << "\n";
3794   if (verbose) {
3795     if ((maxprot &
3796          ~(MachO::VM_PROT_READ | MachO::VM_PROT_WRITE |
3797            MachO::VM_PROT_EXECUTE)) != 0)
3798       outs() << "  maxprot ?" << format("0x%08" PRIx32, maxprot) << "\n";
3799     else {
3800       if (maxprot & MachO::VM_PROT_READ)
3801         outs() << "  maxprot r";
3802       else
3803         outs() << "  maxprot -";
3804       if (maxprot & MachO::VM_PROT_WRITE)
3805         outs() << "w";
3806       else
3807         outs() << "-";
3808       if (maxprot & MachO::VM_PROT_EXECUTE)
3809         outs() << "x\n";
3810       else
3811         outs() << "-\n";
3812     }
3813     if ((initprot &
3814          ~(MachO::VM_PROT_READ | MachO::VM_PROT_WRITE |
3815            MachO::VM_PROT_EXECUTE)) != 0)
3816       outs() << "  initprot ?" << format("0x%08" PRIx32, initprot) << "\n";
3817     else {
3818       if (initprot & MachO::VM_PROT_READ)
3819         outs() << " initprot r";
3820       else
3821         outs() << " initprot -";
3822       if (initprot & MachO::VM_PROT_WRITE)
3823         outs() << "w";
3824       else
3825         outs() << "-";
3826       if (initprot & MachO::VM_PROT_EXECUTE)
3827         outs() << "x\n";
3828       else
3829         outs() << "-\n";
3830     }
3831   } else {
3832     outs() << "  maxprot " << format("0x%08" PRIx32, maxprot) << "\n";
3833     outs() << " initprot " << format("0x%08" PRIx32, initprot) << "\n";
3834   }
3835   outs() << "   nsects " << nsects << "\n";
3836   if (verbose) {
3837     outs() << "    flags";
3838     if (flags == 0)
3839       outs() << " (none)\n";
3840     else {
3841       if (flags & MachO::SG_HIGHVM) {
3842         outs() << " HIGHVM";
3843         flags &= ~MachO::SG_HIGHVM;
3844       }
3845       if (flags & MachO::SG_FVMLIB) {
3846         outs() << " FVMLIB";
3847         flags &= ~MachO::SG_FVMLIB;
3848       }
3849       if (flags & MachO::SG_NORELOC) {
3850         outs() << " NORELOC";
3851         flags &= ~MachO::SG_NORELOC;
3852       }
3853       if (flags & MachO::SG_PROTECTED_VERSION_1) {
3854         outs() << " PROTECTED_VERSION_1";
3855         flags &= ~MachO::SG_PROTECTED_VERSION_1;
3856       }
3857       if (flags)
3858         outs() << format(" 0x%08" PRIx32, flags) << " (unknown flags)\n";
3859       else
3860         outs() << "\n";
3861     }
3862   } else {
3863     outs() << "    flags " << format("0x%" PRIx32, flags) << "\n";
3864   }
3865 }
3866
3867 static void PrintSection(const char *sectname, const char *segname,
3868                          uint64_t addr, uint64_t size, uint32_t offset,
3869                          uint32_t align, uint32_t reloff, uint32_t nreloc,
3870                          uint32_t flags, uint32_t reserved1, uint32_t reserved2,
3871                          uint32_t cmd, const char *sg_segname,
3872                          uint32_t filetype, uint32_t object_size,
3873                          bool verbose) {
3874   outs() << "Section\n";
3875   outs() << "  sectname " << format("%.16s\n", sectname);
3876   outs() << "   segname " << format("%.16s", segname);
3877   if (filetype != MachO::MH_OBJECT && strncmp(sg_segname, segname, 16) != 0)
3878     outs() << " (does not match segment)\n";
3879   else
3880     outs() << "\n";
3881   if (cmd == MachO::LC_SEGMENT_64) {
3882     outs() << "      addr " << format("0x%016" PRIx64, addr) << "\n";
3883     outs() << "      size " << format("0x%016" PRIx64, size);
3884   } else {
3885     outs() << "      addr " << format("0x%08" PRIx64, addr) << "\n";
3886     outs() << "      size " << format("0x%08" PRIx64, size);
3887   }
3888   if ((flags & MachO::S_ZEROFILL) != 0 && offset + size > object_size)
3889     outs() << " (past end of file)\n";
3890   else
3891     outs() << "\n";
3892   outs() << "    offset " << offset;
3893   if (offset > object_size)
3894     outs() << " (past end of file)\n";
3895   else
3896     outs() << "\n";
3897   uint32_t align_shifted = 1 << align;
3898   outs() << "     align 2^" << align << " (" << align_shifted << ")\n";
3899   outs() << "    reloff " << reloff;
3900   if (reloff > object_size)
3901     outs() << " (past end of file)\n";
3902   else
3903     outs() << "\n";
3904   outs() << "    nreloc " << nreloc;
3905   if (reloff + nreloc * sizeof(struct MachO::relocation_info) > object_size)
3906     outs() << " (past end of file)\n";
3907   else
3908     outs() << "\n";
3909   uint32_t section_type = flags & MachO::SECTION_TYPE;
3910   if (verbose) {
3911     outs() << "      type";
3912     if (section_type == MachO::S_REGULAR)
3913       outs() << " S_REGULAR\n";
3914     else if (section_type == MachO::S_ZEROFILL)
3915       outs() << " S_ZEROFILL\n";
3916     else if (section_type == MachO::S_CSTRING_LITERALS)
3917       outs() << " S_CSTRING_LITERALS\n";
3918     else if (section_type == MachO::S_4BYTE_LITERALS)
3919       outs() << " S_4BYTE_LITERALS\n";
3920     else if (section_type == MachO::S_8BYTE_LITERALS)
3921       outs() << " S_8BYTE_LITERALS\n";
3922     else if (section_type == MachO::S_16BYTE_LITERALS)
3923       outs() << " S_16BYTE_LITERALS\n";
3924     else if (section_type == MachO::S_LITERAL_POINTERS)
3925       outs() << " S_LITERAL_POINTERS\n";
3926     else if (section_type == MachO::S_NON_LAZY_SYMBOL_POINTERS)
3927       outs() << " S_NON_LAZY_SYMBOL_POINTERS\n";
3928     else if (section_type == MachO::S_LAZY_SYMBOL_POINTERS)
3929       outs() << " S_LAZY_SYMBOL_POINTERS\n";
3930     else if (section_type == MachO::S_SYMBOL_STUBS)
3931       outs() << " S_SYMBOL_STUBS\n";
3932     else if (section_type == MachO::S_MOD_INIT_FUNC_POINTERS)
3933       outs() << " S_MOD_INIT_FUNC_POINTERS\n";
3934     else if (section_type == MachO::S_MOD_TERM_FUNC_POINTERS)
3935       outs() << " S_MOD_TERM_FUNC_POINTERS\n";
3936     else if (section_type == MachO::S_COALESCED)
3937       outs() << " S_COALESCED\n";
3938     else if (section_type == MachO::S_INTERPOSING)
3939       outs() << " S_INTERPOSING\n";
3940     else if (section_type == MachO::S_DTRACE_DOF)
3941       outs() << " S_DTRACE_DOF\n";
3942     else if (section_type == MachO::S_LAZY_DYLIB_SYMBOL_POINTERS)
3943       outs() << " S_LAZY_DYLIB_SYMBOL_POINTERS\n";
3944     else if (section_type == MachO::S_THREAD_LOCAL_REGULAR)
3945       outs() << " S_THREAD_LOCAL_REGULAR\n";
3946     else if (section_type == MachO::S_THREAD_LOCAL_ZEROFILL)
3947       outs() << " S_THREAD_LOCAL_ZEROFILL\n";
3948     else if (section_type == MachO::S_THREAD_LOCAL_VARIABLES)
3949       outs() << " S_THREAD_LOCAL_VARIABLES\n";
3950     else if (section_type == MachO::S_THREAD_LOCAL_VARIABLE_POINTERS)
3951       outs() << " S_THREAD_LOCAL_VARIABLE_POINTERS\n";
3952     else if (section_type == MachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS)
3953       outs() << " S_THREAD_LOCAL_INIT_FUNCTION_POINTERS\n";
3954     else
3955       outs() << format("0x%08" PRIx32, section_type) << "\n";
3956     outs() << "attributes";
3957     uint32_t section_attributes = flags & MachO::SECTION_ATTRIBUTES;
3958     if (section_attributes & MachO::S_ATTR_PURE_INSTRUCTIONS)
3959       outs() << " PURE_INSTRUCTIONS";
3960     if (section_attributes & MachO::S_ATTR_NO_TOC)
3961       outs() << " NO_TOC";
3962     if (section_attributes & MachO::S_ATTR_STRIP_STATIC_SYMS)
3963       outs() << " STRIP_STATIC_SYMS";
3964     if (section_attributes & MachO::S_ATTR_NO_DEAD_STRIP)
3965       outs() << " NO_DEAD_STRIP";
3966     if (section_attributes & MachO::S_ATTR_LIVE_SUPPORT)
3967       outs() << " LIVE_SUPPORT";
3968     if (section_attributes & MachO::S_ATTR_SELF_MODIFYING_CODE)
3969       outs() << " SELF_MODIFYING_CODE";
3970     if (section_attributes & MachO::S_ATTR_DEBUG)
3971       outs() << " DEBUG";
3972     if (section_attributes & MachO::S_ATTR_SOME_INSTRUCTIONS)
3973       outs() << " SOME_INSTRUCTIONS";
3974     if (section_attributes & MachO::S_ATTR_EXT_RELOC)
3975       outs() << " EXT_RELOC";
3976     if (section_attributes & MachO::S_ATTR_LOC_RELOC)
3977       outs() << " LOC_RELOC";
3978     if (section_attributes == 0)
3979       outs() << " (none)";
3980     outs() << "\n";
3981   } else
3982     outs() << "     flags " << format("0x%08" PRIx32, flags) << "\n";
3983   outs() << " reserved1 " << reserved1;
3984   if (section_type == MachO::S_SYMBOL_STUBS ||
3985       section_type == MachO::S_LAZY_SYMBOL_POINTERS ||
3986       section_type == MachO::S_LAZY_DYLIB_SYMBOL_POINTERS ||
3987       section_type == MachO::S_NON_LAZY_SYMBOL_POINTERS ||
3988       section_type == MachO::S_THREAD_LOCAL_VARIABLE_POINTERS)
3989     outs() << " (index into indirect symbol table)\n";
3990   else
3991     outs() << "\n";
3992   outs() << " reserved2 " << reserved2;
3993   if (section_type == MachO::S_SYMBOL_STUBS)
3994     outs() << " (size of stubs)\n";
3995   else
3996     outs() << "\n";
3997 }
3998
3999 static void PrintSymtabLoadCommand(MachO::symtab_command st, bool Is64Bit,
4000                                    uint32_t object_size) {
4001   outs() << "     cmd LC_SYMTAB\n";
4002   outs() << " cmdsize " << st.cmdsize;
4003   if (st.cmdsize != sizeof(struct MachO::symtab_command))
4004     outs() << " Incorrect size\n";
4005   else
4006     outs() << "\n";
4007   outs() << "  symoff " << st.symoff;
4008   if (st.symoff > object_size)
4009     outs() << " (past end of file)\n";
4010   else
4011     outs() << "\n";
4012   outs() << "   nsyms " << st.nsyms;
4013   uint64_t big_size;
4014   if (Is64Bit) {
4015     big_size = st.nsyms;
4016     big_size *= sizeof(struct MachO::nlist_64);
4017     big_size += st.symoff;
4018     if (big_size > object_size)
4019       outs() << " (past end of file)\n";
4020     else
4021       outs() << "\n";
4022   } else {
4023     big_size = st.nsyms;
4024     big_size *= sizeof(struct MachO::nlist);
4025     big_size += st.symoff;
4026     if (big_size > object_size)
4027       outs() << " (past end of file)\n";
4028     else
4029       outs() << "\n";
4030   }
4031   outs() << "  stroff " << st.stroff;
4032   if (st.stroff > object_size)
4033     outs() << " (past end of file)\n";
4034   else
4035     outs() << "\n";
4036   outs() << " strsize " << st.strsize;
4037   big_size = st.stroff;
4038   big_size += st.strsize;
4039   if (big_size > object_size)
4040     outs() << " (past end of file)\n";
4041   else
4042     outs() << "\n";
4043 }
4044
4045 static void PrintDysymtabLoadCommand(MachO::dysymtab_command dyst,
4046                                      uint32_t nsyms, uint32_t object_size,
4047                                      bool Is64Bit) {
4048   outs() << "            cmd LC_DYSYMTAB\n";
4049   outs() << "        cmdsize " << dyst.cmdsize;
4050   if (dyst.cmdsize != sizeof(struct MachO::dysymtab_command))
4051     outs() << " Incorrect size\n";
4052   else
4053     outs() << "\n";
4054   outs() << "      ilocalsym " << dyst.ilocalsym;
4055   if (dyst.ilocalsym > nsyms)
4056     outs() << " (greater than the number of symbols)\n";
4057   else
4058     outs() << "\n";
4059   outs() << "      nlocalsym " << dyst.nlocalsym;
4060   uint64_t big_size;
4061   big_size = dyst.ilocalsym;
4062   big_size += dyst.nlocalsym;
4063   if (big_size > nsyms)
4064     outs() << " (past the end of the symbol table)\n";
4065   else
4066     outs() << "\n";
4067   outs() << "     iextdefsym " << dyst.iextdefsym;
4068   if (dyst.iextdefsym > nsyms)
4069     outs() << " (greater than the number of symbols)\n";
4070   else
4071     outs() << "\n";
4072   outs() << "     nextdefsym " << dyst.nextdefsym;
4073   big_size = dyst.iextdefsym;
4074   big_size += dyst.nextdefsym;
4075   if (big_size > nsyms)
4076     outs() << " (past the end of the symbol table)\n";
4077   else
4078     outs() << "\n";
4079   outs() << "      iundefsym " << dyst.iundefsym;
4080   if (dyst.iundefsym > nsyms)
4081     outs() << " (greater than the number of symbols)\n";
4082   else
4083     outs() << "\n";
4084   outs() << "      nundefsym " << dyst.nundefsym;
4085   big_size = dyst.iundefsym;
4086   big_size += dyst.nundefsym;
4087   if (big_size > nsyms)
4088     outs() << " (past the end of the symbol table)\n";
4089   else
4090     outs() << "\n";
4091   outs() << "         tocoff " << dyst.tocoff;
4092   if (dyst.tocoff > object_size)
4093     outs() << " (past end of file)\n";
4094   else
4095     outs() << "\n";
4096   outs() << "           ntoc " << dyst.ntoc;
4097   big_size = dyst.ntoc;
4098   big_size *= sizeof(struct MachO::dylib_table_of_contents);
4099   big_size += dyst.tocoff;
4100   if (big_size > object_size)
4101     outs() << " (past end of file)\n";
4102   else
4103     outs() << "\n";
4104   outs() << "      modtaboff " << dyst.modtaboff;
4105   if (dyst.modtaboff > object_size)
4106     outs() << " (past end of file)\n";
4107   else
4108     outs() << "\n";
4109   outs() << "        nmodtab " << dyst.nmodtab;
4110   uint64_t modtabend;
4111   if (Is64Bit) {
4112     modtabend = dyst.nmodtab;
4113     modtabend *= sizeof(struct MachO::dylib_module_64);
4114     modtabend += dyst.modtaboff;
4115   } else {
4116     modtabend = dyst.nmodtab;
4117     modtabend *= sizeof(struct MachO::dylib_module);
4118     modtabend += dyst.modtaboff;
4119   }
4120   if (modtabend > object_size)
4121     outs() << " (past end of file)\n";
4122   else
4123     outs() << "\n";
4124   outs() << "   extrefsymoff " << dyst.extrefsymoff;
4125   if (dyst.extrefsymoff > object_size)
4126     outs() << " (past end of file)\n";
4127   else
4128     outs() << "\n";
4129   outs() << "    nextrefsyms " << dyst.nextrefsyms;
4130   big_size = dyst.nextrefsyms;
4131   big_size *= sizeof(struct MachO::dylib_reference);
4132   big_size += dyst.extrefsymoff;
4133   if (big_size > object_size)
4134     outs() << " (past end of file)\n";
4135   else
4136     outs() << "\n";
4137   outs() << " indirectsymoff " << dyst.indirectsymoff;
4138   if (dyst.indirectsymoff > object_size)
4139     outs() << " (past end of file)\n";
4140   else
4141     outs() << "\n";
4142   outs() << "  nindirectsyms " << dyst.nindirectsyms;
4143   big_size = dyst.nindirectsyms;
4144   big_size *= sizeof(uint32_t);
4145   big_size += dyst.indirectsymoff;
4146   if (big_size > object_size)
4147     outs() << " (past end of file)\n";
4148   else
4149     outs() << "\n";
4150   outs() << "      extreloff " << dyst.extreloff;
4151   if (dyst.extreloff > object_size)
4152     outs() << " (past end of file)\n";
4153   else
4154     outs() << "\n";
4155   outs() << "        nextrel " << dyst.nextrel;
4156   big_size = dyst.nextrel;
4157   big_size *= sizeof(struct MachO::relocation_info);
4158   big_size += dyst.extreloff;
4159   if (big_size > object_size)
4160     outs() << " (past end of file)\n";
4161   else
4162     outs() << "\n";
4163   outs() << "      locreloff " << dyst.locreloff;
4164   if (dyst.locreloff > object_size)
4165     outs() << " (past end of file)\n";
4166   else
4167     outs() << "\n";
4168   outs() << "        nlocrel " << dyst.nlocrel;
4169   big_size = dyst.nlocrel;
4170   big_size *= sizeof(struct MachO::relocation_info);
4171   big_size += dyst.locreloff;
4172   if (big_size > object_size)
4173     outs() << " (past end of file)\n";
4174   else
4175     outs() << "\n";
4176 }
4177
4178 static void PrintDyldInfoLoadCommand(MachO::dyld_info_command dc,
4179                                      uint32_t object_size) {
4180   if (dc.cmd == MachO::LC_DYLD_INFO)
4181     outs() << "            cmd LC_DYLD_INFO\n";
4182   else
4183     outs() << "            cmd LC_DYLD_INFO_ONLY\n";
4184   outs() << "        cmdsize " << dc.cmdsize;
4185   if (dc.cmdsize != sizeof(struct MachO::dyld_info_command))
4186     outs() << " Incorrect size\n";
4187   else
4188     outs() << "\n";
4189   outs() << "     rebase_off " << dc.rebase_off;
4190   if (dc.rebase_off > object_size)
4191     outs() << " (past end of file)\n";
4192   else
4193     outs() << "\n";
4194   outs() << "    rebase_size " << dc.rebase_size;
4195   uint64_t big_size;
4196   big_size = dc.rebase_off;
4197   big_size += dc.rebase_size;
4198   if (big_size > object_size)
4199     outs() << " (past end of file)\n";
4200   else
4201     outs() << "\n";
4202   outs() << "       bind_off " << dc.bind_off;
4203   if (dc.bind_off > object_size)
4204     outs() << " (past end of file)\n";
4205   else
4206     outs() << "\n";
4207   outs() << "      bind_size " << dc.bind_size;
4208   big_size = dc.bind_off;
4209   big_size += dc.bind_size;
4210   if (big_size > object_size)
4211     outs() << " (past end of file)\n";
4212   else
4213     outs() << "\n";
4214   outs() << "  weak_bind_off " << dc.weak_bind_off;
4215   if (dc.weak_bind_off > object_size)
4216     outs() << " (past end of file)\n";
4217   else
4218     outs() << "\n";
4219   outs() << " weak_bind_size " << dc.weak_bind_size;
4220   big_size = dc.weak_bind_off;
4221   big_size += dc.weak_bind_size;
4222   if (big_size > object_size)
4223     outs() << " (past end of file)\n";
4224   else
4225     outs() << "\n";
4226   outs() << "  lazy_bind_off " << dc.lazy_bind_off;
4227   if (dc.lazy_bind_off > object_size)
4228     outs() << " (past end of file)\n";
4229   else
4230     outs() << "\n";
4231   outs() << " lazy_bind_size " << dc.lazy_bind_size;
4232   big_size = dc.lazy_bind_off;
4233   big_size += dc.lazy_bind_size;
4234   if (big_size > object_size)
4235     outs() << " (past end of file)\n";
4236   else
4237     outs() << "\n";
4238   outs() << "     export_off " << dc.export_off;
4239   if (dc.export_off > object_size)
4240     outs() << " (past end of file)\n";
4241   else
4242     outs() << "\n";
4243   outs() << "    export_size " << dc.export_size;
4244   big_size = dc.export_off;
4245   big_size += dc.export_size;
4246   if (big_size > object_size)
4247     outs() << " (past end of file)\n";
4248   else
4249     outs() << "\n";
4250 }
4251
4252 static void PrintDyldLoadCommand(MachO::dylinker_command dyld,
4253                                  const char *Ptr) {
4254   if (dyld.cmd == MachO::LC_ID_DYLINKER)
4255     outs() << "          cmd LC_ID_DYLINKER\n";
4256   else if (dyld.cmd == MachO::LC_LOAD_DYLINKER)
4257     outs() << "          cmd LC_LOAD_DYLINKER\n";
4258   else if (dyld.cmd == MachO::LC_DYLD_ENVIRONMENT)
4259     outs() << "          cmd LC_DYLD_ENVIRONMENT\n";
4260   else
4261     outs() << "          cmd ?(" << dyld.cmd << ")\n";
4262   outs() << "      cmdsize " << dyld.cmdsize;
4263   if (dyld.cmdsize < sizeof(struct MachO::dylinker_command))
4264     outs() << " Incorrect size\n";
4265   else
4266     outs() << "\n";
4267   if (dyld.name >= dyld.cmdsize)
4268     outs() << "         name ?(bad offset " << dyld.name << ")\n";
4269   else {
4270     const char *P = (const char *)(Ptr) + dyld.name;
4271     outs() << "         name " << P << " (offset " << dyld.name << ")\n";
4272   }
4273 }
4274
4275 static void PrintUuidLoadCommand(MachO::uuid_command uuid) {
4276   outs() << "     cmd LC_UUID\n";
4277   outs() << " cmdsize " << uuid.cmdsize;
4278   if (uuid.cmdsize != sizeof(struct MachO::uuid_command))
4279     outs() << " Incorrect size\n";
4280   else
4281     outs() << "\n";
4282   outs() << "    uuid ";
4283   outs() << format("%02" PRIX32, uuid.uuid[0]);
4284   outs() << format("%02" PRIX32, uuid.uuid[1]);
4285   outs() << format("%02" PRIX32, uuid.uuid[2]);
4286   outs() << format("%02" PRIX32, uuid.uuid[3]);
4287   outs() << "-";
4288   outs() << format("%02" PRIX32, uuid.uuid[4]);
4289   outs() << format("%02" PRIX32, uuid.uuid[5]);
4290   outs() << "-";
4291   outs() << format("%02" PRIX32, uuid.uuid[6]);
4292   outs() << format("%02" PRIX32, uuid.uuid[7]);
4293   outs() << "-";
4294   outs() << format("%02" PRIX32, uuid.uuid[8]);
4295   outs() << format("%02" PRIX32, uuid.uuid[9]);
4296   outs() << "-";
4297   outs() << format("%02" PRIX32, uuid.uuid[10]);
4298   outs() << format("%02" PRIX32, uuid.uuid[11]);
4299   outs() << format("%02" PRIX32, uuid.uuid[12]);
4300   outs() << format("%02" PRIX32, uuid.uuid[13]);
4301   outs() << format("%02" PRIX32, uuid.uuid[14]);
4302   outs() << format("%02" PRIX32, uuid.uuid[15]);
4303   outs() << "\n";
4304 }
4305
4306 static void PrintRpathLoadCommand(MachO::rpath_command rpath, const char *Ptr) {
4307   outs() << "          cmd LC_RPATH\n";
4308   outs() << "      cmdsize " << rpath.cmdsize;
4309   if (rpath.cmdsize < sizeof(struct MachO::rpath_command))
4310     outs() << " Incorrect size\n";
4311   else
4312     outs() << "\n";
4313   if (rpath.path >= rpath.cmdsize)
4314     outs() << "         path ?(bad offset " << rpath.path << ")\n";
4315   else {
4316     const char *P = (const char *)(Ptr) + rpath.path;
4317     outs() << "         path " << P << " (offset " << rpath.path << ")\n";
4318   }
4319 }
4320
4321 static void PrintVersionMinLoadCommand(MachO::version_min_command vd) {
4322   if (vd.cmd == MachO::LC_VERSION_MIN_MACOSX)
4323     outs() << "      cmd LC_VERSION_MIN_MACOSX\n";
4324   else if (vd.cmd == MachO::LC_VERSION_MIN_IPHONEOS)
4325     outs() << "      cmd LC_VERSION_MIN_IPHONEOS\n";
4326   else
4327     outs() << "      cmd " << vd.cmd << " (?)\n";
4328   outs() << "  cmdsize " << vd.cmdsize;
4329   if (vd.cmdsize != sizeof(struct MachO::version_min_command))
4330     outs() << " Incorrect size\n";
4331   else
4332     outs() << "\n";
4333   outs() << "  version " << ((vd.version >> 16) & 0xffff) << "."
4334          << ((vd.version >> 8) & 0xff);
4335   if ((vd.version & 0xff) != 0)
4336     outs() << "." << (vd.version & 0xff);
4337   outs() << "\n";
4338   if (vd.sdk == 0)
4339     outs() << "      sdk n/a";
4340   else {
4341     outs() << "      sdk " << ((vd.sdk >> 16) & 0xffff) << "."
4342            << ((vd.sdk >> 8) & 0xff);
4343   }
4344   if ((vd.sdk & 0xff) != 0)
4345     outs() << "." << (vd.sdk & 0xff);
4346   outs() << "\n";
4347 }
4348
4349 static void PrintSourceVersionCommand(MachO::source_version_command sd) {
4350   outs() << "      cmd LC_SOURCE_VERSION\n";
4351   outs() << "  cmdsize " << sd.cmdsize;
4352   if (sd.cmdsize != sizeof(struct MachO::source_version_command))
4353     outs() << " Incorrect size\n";
4354   else
4355     outs() << "\n";
4356   uint64_t a = (sd.version >> 40) & 0xffffff;
4357   uint64_t b = (sd.version >> 30) & 0x3ff;
4358   uint64_t c = (sd.version >> 20) & 0x3ff;
4359   uint64_t d = (sd.version >> 10) & 0x3ff;
4360   uint64_t e = sd.version & 0x3ff;
4361   outs() << "  version " << a << "." << b;
4362   if (e != 0)
4363     outs() << "." << c << "." << d << "." << e;
4364   else if (d != 0)
4365     outs() << "." << c << "." << d;
4366   else if (c != 0)
4367     outs() << "." << c;
4368   outs() << "\n";
4369 }
4370
4371 static void PrintEntryPointCommand(MachO::entry_point_command ep) {
4372   outs() << "       cmd LC_MAIN\n";
4373   outs() << "   cmdsize " << ep.cmdsize;
4374   if (ep.cmdsize != sizeof(struct MachO::entry_point_command))
4375     outs() << " Incorrect size\n";
4376   else
4377     outs() << "\n";
4378   outs() << "  entryoff " << ep.entryoff << "\n";
4379   outs() << " stacksize " << ep.stacksize << "\n";
4380 }
4381
4382 static void PrintEncryptionInfoCommand(MachO::encryption_info_command ec,
4383                                        uint32_t object_size) {
4384   outs() << "          cmd LC_ENCRYPTION_INFO\n";
4385   outs() << "      cmdsize " << ec.cmdsize;
4386   if (ec.cmdsize != sizeof(struct MachO::encryption_info_command))
4387     outs() << " Incorrect size\n";
4388   else
4389     outs() << "\n";
4390   outs() << "     cryptoff " << ec.cryptoff;
4391   if (ec.cryptoff > object_size)
4392     outs() << " (past end of file)\n";
4393   else
4394     outs() << "\n";
4395   outs() << "    cryptsize " << ec.cryptsize;
4396   if (ec.cryptsize > object_size)
4397     outs() << " (past end of file)\n";
4398   else
4399     outs() << "\n";
4400   outs() << "      cryptid " << ec.cryptid << "\n";
4401 }
4402
4403 static void PrintEncryptionInfoCommand64(MachO::encryption_info_command_64 ec,
4404                                          uint32_t object_size) {
4405   outs() << "          cmd LC_ENCRYPTION_INFO_64\n";
4406   outs() << "      cmdsize " << ec.cmdsize;
4407   if (ec.cmdsize != sizeof(struct MachO::encryption_info_command_64))
4408     outs() << " Incorrect size\n";
4409   else
4410     outs() << "\n";
4411   outs() << "     cryptoff " << ec.cryptoff;
4412   if (ec.cryptoff > object_size)
4413     outs() << " (past end of file)\n";
4414   else
4415     outs() << "\n";
4416   outs() << "    cryptsize " << ec.cryptsize;
4417   if (ec.cryptsize > object_size)
4418     outs() << " (past end of file)\n";
4419   else
4420     outs() << "\n";
4421   outs() << "      cryptid " << ec.cryptid << "\n";
4422   outs() << "          pad " << ec.pad << "\n";
4423 }
4424
4425 static void PrintLinkerOptionCommand(MachO::linker_option_command lo,
4426                                      const char *Ptr) {
4427   outs() << "     cmd LC_LINKER_OPTION\n";
4428   outs() << " cmdsize " << lo.cmdsize;
4429   if (lo.cmdsize < sizeof(struct MachO::linker_option_command))
4430     outs() << " Incorrect size\n";
4431   else
4432     outs() << "\n";
4433   outs() << "   count " << lo.count << "\n";
4434   const char *string = Ptr + sizeof(struct MachO::linker_option_command);
4435   uint32_t left = lo.cmdsize - sizeof(struct MachO::linker_option_command);
4436   uint32_t i = 0;
4437   while (left > 0) {
4438     while (*string == '\0' && left > 0) {
4439       string++;
4440       left--;
4441     }
4442     if (left > 0) {
4443       i++;
4444       outs() << "  string #" << i << " " << format("%.*s\n", left, string);
4445       uint32_t NullPos = StringRef(string, left).find('\0');
4446       uint32_t len = std::min(NullPos, left) + 1;
4447       string += len;
4448       left -= len;
4449     }
4450   }
4451   if (lo.count != i)
4452     outs() << "   count " << lo.count << " does not match number of strings "
4453            << i << "\n";
4454 }
4455
4456 static void PrintSubFrameworkCommand(MachO::sub_framework_command sub,
4457                                      const char *Ptr) {
4458   outs() << "          cmd LC_SUB_FRAMEWORK\n";
4459   outs() << "      cmdsize " << sub.cmdsize;
4460   if (sub.cmdsize < sizeof(struct MachO::sub_framework_command))
4461     outs() << " Incorrect size\n";
4462   else
4463     outs() << "\n";
4464   if (sub.umbrella < sub.cmdsize) {
4465     const char *P = Ptr + sub.umbrella;
4466     outs() << "     umbrella " << P << " (offset " << sub.umbrella << ")\n";
4467   } else {
4468     outs() << "     umbrella ?(bad offset " << sub.umbrella << ")\n";
4469   }
4470 }
4471
4472 static void PrintSubUmbrellaCommand(MachO::sub_umbrella_command sub,
4473                                     const char *Ptr) {
4474   outs() << "          cmd LC_SUB_UMBRELLA\n";
4475   outs() << "      cmdsize " << sub.cmdsize;
4476   if (sub.cmdsize < sizeof(struct MachO::sub_umbrella_command))
4477     outs() << " Incorrect size\n";
4478   else
4479     outs() << "\n";
4480   if (sub.sub_umbrella < sub.cmdsize) {
4481     const char *P = Ptr + sub.sub_umbrella;
4482     outs() << " sub_umbrella " << P << " (offset " << sub.sub_umbrella << ")\n";
4483   } else {
4484     outs() << " sub_umbrella ?(bad offset " << sub.sub_umbrella << ")\n";
4485   }
4486 }
4487
4488 static void PrintSubLibraryCommand(MachO::sub_library_command sub,
4489                                    const char *Ptr) {
4490   outs() << "          cmd LC_SUB_LIBRARY\n";
4491   outs() << "      cmdsize " << sub.cmdsize;
4492   if (sub.cmdsize < sizeof(struct MachO::sub_library_command))
4493     outs() << " Incorrect size\n";
4494   else
4495     outs() << "\n";
4496   if (sub.sub_library < sub.cmdsize) {
4497     const char *P = Ptr + sub.sub_library;
4498     outs() << "  sub_library " << P << " (offset " << sub.sub_library << ")\n";
4499   } else {
4500     outs() << "  sub_library ?(bad offset " << sub.sub_library << ")\n";
4501   }
4502 }
4503
4504 static void PrintSubClientCommand(MachO::sub_client_command sub,
4505                                   const char *Ptr) {
4506   outs() << "          cmd LC_SUB_CLIENT\n";
4507   outs() << "      cmdsize " << sub.cmdsize;
4508   if (sub.cmdsize < sizeof(struct MachO::sub_client_command))
4509     outs() << " Incorrect size\n";
4510   else
4511     outs() << "\n";
4512   if (sub.client < sub.cmdsize) {
4513     const char *P = Ptr + sub.client;
4514     outs() << "       client " << P << " (offset " << sub.client << ")\n";
4515   } else {
4516     outs() << "       client ?(bad offset " << sub.client << ")\n";
4517   }
4518 }
4519
4520 static void PrintRoutinesCommand(MachO::routines_command r) {
4521   outs() << "          cmd LC_ROUTINES\n";
4522   outs() << "      cmdsize " << r.cmdsize;
4523   if (r.cmdsize != sizeof(struct MachO::routines_command))
4524     outs() << " Incorrect size\n";
4525   else
4526     outs() << "\n";
4527   outs() << " init_address " << format("0x%08" PRIx32, r.init_address) << "\n";
4528   outs() << "  init_module " << r.init_module << "\n";
4529   outs() << "    reserved1 " << r.reserved1 << "\n";
4530   outs() << "    reserved2 " << r.reserved2 << "\n";
4531   outs() << "    reserved3 " << r.reserved3 << "\n";
4532   outs() << "    reserved4 " << r.reserved4 << "\n";
4533   outs() << "    reserved5 " << r.reserved5 << "\n";
4534   outs() << "    reserved6 " << r.reserved6 << "\n";
4535 }
4536
4537 static void PrintRoutinesCommand64(MachO::routines_command_64 r) {
4538   outs() << "          cmd LC_ROUTINES_64\n";
4539   outs() << "      cmdsize " << r.cmdsize;
4540   if (r.cmdsize != sizeof(struct MachO::routines_command_64))
4541     outs() << " Incorrect size\n";
4542   else
4543     outs() << "\n";
4544   outs() << " init_address " << format("0x%016" PRIx64, r.init_address) << "\n";
4545   outs() << "  init_module " << r.init_module << "\n";
4546   outs() << "    reserved1 " << r.reserved1 << "\n";
4547   outs() << "    reserved2 " << r.reserved2 << "\n";
4548   outs() << "    reserved3 " << r.reserved3 << "\n";
4549   outs() << "    reserved4 " << r.reserved4 << "\n";
4550   outs() << "    reserved5 " << r.reserved5 << "\n";
4551   outs() << "    reserved6 " << r.reserved6 << "\n";
4552 }
4553
4554 static void Print_x86_thread_state64_t(MachO::x86_thread_state64_t &cpu64) {
4555   outs() << "   rax  " << format("0x%016" PRIx64, cpu64.rax);
4556   outs() << " rbx " << format("0x%016" PRIx64, cpu64.rbx);
4557   outs() << " rcx  " << format("0x%016" PRIx64, cpu64.rcx) << "\n";
4558   outs() << "   rdx  " << format("0x%016" PRIx64, cpu64.rdx);
4559   outs() << " rdi " << format("0x%016" PRIx64, cpu64.rdi);
4560   outs() << " rsi  " << format("0x%016" PRIx64, cpu64.rsi) << "\n";
4561   outs() << "   rbp  " << format("0x%016" PRIx64, cpu64.rbp);
4562   outs() << " rsp " << format("0x%016" PRIx64, cpu64.rsp);
4563   outs() << " r8   " << format("0x%016" PRIx64, cpu64.r8) << "\n";
4564   outs() << "    r9  " << format("0x%016" PRIx64, cpu64.r9);
4565   outs() << " r10 " << format("0x%016" PRIx64, cpu64.r10);
4566   outs() << " r11  " << format("0x%016" PRIx64, cpu64.r11) << "\n";
4567   outs() << "   r12  " << format("0x%016" PRIx64, cpu64.r12);
4568   outs() << " r13 " << format("0x%016" PRIx64, cpu64.r13);
4569   outs() << " r14  " << format("0x%016" PRIx64, cpu64.r14) << "\n";
4570   outs() << "   r15  " << format("0x%016" PRIx64, cpu64.r15);
4571   outs() << " rip " << format("0x%016" PRIx64, cpu64.rip) << "\n";
4572   outs() << "rflags  " << format("0x%016" PRIx64, cpu64.rflags);
4573   outs() << " cs  " << format("0x%016" PRIx64, cpu64.cs);
4574   outs() << " fs   " << format("0x%016" PRIx64, cpu64.fs) << "\n";
4575   outs() << "    gs  " << format("0x%016" PRIx64, cpu64.gs) << "\n";
4576 }
4577
4578 static void Print_mmst_reg(MachO::mmst_reg_t &r) {
4579   uint32_t f;
4580   outs() << "\t      mmst_reg  ";
4581   for (f = 0; f < 10; f++)
4582     outs() << format("%02" PRIx32, (r.mmst_reg[f] & 0xff)) << " ";
4583   outs() << "\n";
4584   outs() << "\t      mmst_rsrv ";
4585   for (f = 0; f < 6; f++)
4586     outs() << format("%02" PRIx32, (r.mmst_rsrv[f] & 0xff)) << " ";
4587   outs() << "\n";
4588 }
4589
4590 static void Print_xmm_reg(MachO::xmm_reg_t &r) {
4591   uint32_t f;
4592   outs() << "\t      xmm_reg ";
4593   for (f = 0; f < 16; f++)
4594     outs() << format("%02" PRIx32, (r.xmm_reg[f] & 0xff)) << " ";
4595   outs() << "\n";
4596 }
4597
4598 static void Print_x86_float_state_t(MachO::x86_float_state64_t &fpu) {
4599   outs() << "\t    fpu_reserved[0] " << fpu.fpu_reserved[0];
4600   outs() << " fpu_reserved[1] " << fpu.fpu_reserved[1] << "\n";
4601   outs() << "\t    control: invalid " << fpu.fpu_fcw.invalid;
4602   outs() << " denorm " << fpu.fpu_fcw.denorm;
4603   outs() << " zdiv " << fpu.fpu_fcw.zdiv;
4604   outs() << " ovrfl " << fpu.fpu_fcw.ovrfl;
4605   outs() << " undfl " << fpu.fpu_fcw.undfl;
4606   outs() << " precis " << fpu.fpu_fcw.precis << "\n";
4607   outs() << "\t\t     pc ";
4608   if (fpu.fpu_fcw.pc == MachO::x86_FP_PREC_24B)
4609     outs() << "FP_PREC_24B ";
4610   else if (fpu.fpu_fcw.pc == MachO::x86_FP_PREC_53B)
4611     outs() << "FP_PREC_53B ";
4612   else if (fpu.fpu_fcw.pc == MachO::x86_FP_PREC_64B)
4613     outs() << "FP_PREC_64B ";
4614   else
4615     outs() << fpu.fpu_fcw.pc << " ";
4616   outs() << "rc ";
4617   if (fpu.fpu_fcw.rc == MachO::x86_FP_RND_NEAR)
4618     outs() << "FP_RND_NEAR ";
4619   else if (fpu.fpu_fcw.rc == MachO::x86_FP_RND_DOWN)
4620     outs() << "FP_RND_DOWN ";
4621   else if (fpu.fpu_fcw.rc == MachO::x86_FP_RND_UP)
4622     outs() << "FP_RND_UP ";
4623   else if (fpu.fpu_fcw.rc == MachO::x86_FP_CHOP)
4624     outs() << "FP_CHOP ";
4625   outs() << "\n";
4626   outs() << "\t    status: invalid " << fpu.fpu_fsw.invalid;
4627   outs() << " denorm " << fpu.fpu_fsw.denorm;
4628   outs() << " zdiv " << fpu.fpu_fsw.zdiv;
4629   outs() << " ovrfl " << fpu.fpu_fsw.ovrfl;
4630   outs() << " undfl " << fpu.fpu_fsw.undfl;
4631   outs() << " precis " << fpu.fpu_fsw.precis;
4632   outs() << " stkflt " << fpu.fpu_fsw.stkflt << "\n";
4633   outs() << "\t            errsumm " << fpu.fpu_fsw.errsumm;
4634   outs() << " c0 " << fpu.fpu_fsw.c0;
4635   outs() << " c1 " << fpu.fpu_fsw.c1;
4636   outs() << " c2 " << fpu.fpu_fsw.c2;
4637   outs() << " tos " << fpu.fpu_fsw.tos;
4638   outs() << " c3 " << fpu.fpu_fsw.c3;
4639   outs() << " busy " << fpu.fpu_fsw.busy << "\n";
4640   outs() << "\t    fpu_ftw " << format("0x%02" PRIx32, fpu.fpu_ftw);
4641   outs() << " fpu_rsrv1 " << format("0x%02" PRIx32, fpu.fpu_rsrv1);
4642   outs() << " fpu_fop " << format("0x%04" PRIx32, fpu.fpu_fop);
4643   outs() << " fpu_ip " << format("0x%08" PRIx32, fpu.fpu_ip) << "\n";
4644   outs() << "\t    fpu_cs " << format("0x%04" PRIx32, fpu.fpu_cs);
4645   outs() << " fpu_rsrv2 " << format("0x%04" PRIx32, fpu.fpu_rsrv2);
4646   outs() << " fpu_dp " << format("0x%08" PRIx32, fpu.fpu_dp);
4647   outs() << " fpu_ds " << format("0x%04" PRIx32, fpu.fpu_ds) << "\n";
4648   outs() << "\t    fpu_rsrv3 " << format("0x%04" PRIx32, fpu.fpu_rsrv3);
4649   outs() << " fpu_mxcsr " << format("0x%08" PRIx32, fpu.fpu_mxcsr);
4650   outs() << " fpu_mxcsrmask " << format("0x%08" PRIx32, fpu.fpu_mxcsrmask);
4651   outs() << "\n";
4652   outs() << "\t    fpu_stmm0:\n";
4653   Print_mmst_reg(fpu.fpu_stmm0);
4654   outs() << "\t    fpu_stmm1:\n";
4655   Print_mmst_reg(fpu.fpu_stmm1);
4656   outs() << "\t    fpu_stmm2:\n";
4657   Print_mmst_reg(fpu.fpu_stmm2);
4658   outs() << "\t    fpu_stmm3:\n";
4659   Print_mmst_reg(fpu.fpu_stmm3);
4660   outs() << "\t    fpu_stmm4:\n";
4661   Print_mmst_reg(fpu.fpu_stmm4);
4662   outs() << "\t    fpu_stmm5:\n";
4663   Print_mmst_reg(fpu.fpu_stmm5);
4664   outs() << "\t    fpu_stmm6:\n";
4665   Print_mmst_reg(fpu.fpu_stmm6);
4666   outs() << "\t    fpu_stmm7:\n";
4667   Print_mmst_reg(fpu.fpu_stmm7);
4668   outs() << "\t    fpu_xmm0:\n";
4669   Print_xmm_reg(fpu.fpu_xmm0);
4670   outs() << "\t    fpu_xmm1:\n";
4671   Print_xmm_reg(fpu.fpu_xmm1);
4672   outs() << "\t    fpu_xmm2:\n";
4673   Print_xmm_reg(fpu.fpu_xmm2);
4674   outs() << "\t    fpu_xmm3:\n";
4675   Print_xmm_reg(fpu.fpu_xmm3);
4676   outs() << "\t    fpu_xmm4:\n";
4677   Print_xmm_reg(fpu.fpu_xmm4);
4678   outs() << "\t    fpu_xmm5:\n";
4679   Print_xmm_reg(fpu.fpu_xmm5);
4680   outs() << "\t    fpu_xmm6:\n";
4681   Print_xmm_reg(fpu.fpu_xmm6);
4682   outs() << "\t    fpu_xmm7:\n";
4683   Print_xmm_reg(fpu.fpu_xmm7);
4684   outs() << "\t    fpu_xmm8:\n";
4685   Print_xmm_reg(fpu.fpu_xmm8);
4686   outs() << "\t    fpu_xmm9:\n";
4687   Print_xmm_reg(fpu.fpu_xmm9);
4688   outs() << "\t    fpu_xmm10:\n";
4689   Print_xmm_reg(fpu.fpu_xmm10);
4690   outs() << "\t    fpu_xmm11:\n";
4691   Print_xmm_reg(fpu.fpu_xmm11);
4692   outs() << "\t    fpu_xmm12:\n";
4693   Print_xmm_reg(fpu.fpu_xmm12);
4694   outs() << "\t    fpu_xmm13:\n";
4695   Print_xmm_reg(fpu.fpu_xmm13);
4696   outs() << "\t    fpu_xmm14:\n";
4697   Print_xmm_reg(fpu.fpu_xmm14);
4698   outs() << "\t    fpu_xmm15:\n";
4699   Print_xmm_reg(fpu.fpu_xmm15);
4700   outs() << "\t    fpu_rsrv4:\n";
4701   for (uint32_t f = 0; f < 6; f++) {
4702     outs() << "\t            ";
4703     for (uint32_t g = 0; g < 16; g++)
4704       outs() << format("%02" PRIx32, fpu.fpu_rsrv4[f * g]) << " ";
4705     outs() << "\n";
4706   }
4707   outs() << "\t    fpu_reserved1 " << format("0x%08" PRIx32, fpu.fpu_reserved1);
4708   outs() << "\n";
4709 }
4710
4711 static void Print_x86_exception_state_t(MachO::x86_exception_state64_t &exc64) {
4712   outs() << "\t    trapno " << format("0x%08" PRIx32, exc64.trapno);
4713   outs() << " err " << format("0x%08" PRIx32, exc64.err);
4714   outs() << " faultvaddr " << format("0x%016" PRIx64, exc64.faultvaddr) << "\n";
4715 }
4716
4717 static void PrintThreadCommand(MachO::thread_command t, const char *Ptr,
4718                                bool isLittleEndian, uint32_t cputype) {
4719   if (t.cmd == MachO::LC_THREAD)
4720     outs() << "        cmd LC_THREAD\n";
4721   else if (t.cmd == MachO::LC_UNIXTHREAD)
4722     outs() << "        cmd LC_UNIXTHREAD\n";
4723   else
4724     outs() << "        cmd " << t.cmd << " (unknown)\n";
4725   outs() << "    cmdsize " << t.cmdsize;
4726   if (t.cmdsize < sizeof(struct MachO::thread_command) + 2 * sizeof(uint32_t))
4727     outs() << " Incorrect size\n";
4728   else
4729     outs() << "\n";
4730
4731   const char *begin = Ptr + sizeof(struct MachO::thread_command);
4732   const char *end = Ptr + t.cmdsize;
4733   uint32_t flavor, count, left;
4734   if (cputype == MachO::CPU_TYPE_X86_64) {
4735     while (begin < end) {
4736       if (end - begin > (ptrdiff_t)sizeof(uint32_t)) {
4737         memcpy((char *)&flavor, begin, sizeof(uint32_t));
4738         begin += sizeof(uint32_t);
4739       } else {
4740         flavor = 0;
4741         begin = end;
4742       }
4743       if (isLittleEndian != sys::IsLittleEndianHost)
4744         sys::swapByteOrder(flavor);
4745       if (end - begin > (ptrdiff_t)sizeof(uint32_t)) {
4746         memcpy((char *)&count, begin, sizeof(uint32_t));
4747         begin += sizeof(uint32_t);
4748       } else {
4749         count = 0;
4750         begin = end;
4751       }
4752       if (isLittleEndian != sys::IsLittleEndianHost)
4753         sys::swapByteOrder(count);
4754       if (flavor == MachO::x86_THREAD_STATE64) {
4755         outs() << "     flavor x86_THREAD_STATE64\n";
4756         if (count == MachO::x86_THREAD_STATE64_COUNT)
4757           outs() << "      count x86_THREAD_STATE64_COUNT\n";
4758         else
4759           outs() << "      count " << count
4760                  << " (not x86_THREAD_STATE64_COUNT)\n";
4761         MachO::x86_thread_state64_t cpu64;
4762         left = end - begin;
4763         if (left >= sizeof(MachO::x86_thread_state64_t)) {
4764           memcpy(&cpu64, begin, sizeof(MachO::x86_thread_state64_t));
4765           begin += sizeof(MachO::x86_thread_state64_t);
4766         } else {
4767           memset(&cpu64, '\0', sizeof(MachO::x86_thread_state64_t));
4768           memcpy(&cpu64, begin, left);
4769           begin += left;
4770         }
4771         if (isLittleEndian != sys::IsLittleEndianHost)
4772           swapStruct(cpu64);
4773         Print_x86_thread_state64_t(cpu64);
4774       } else if (flavor == MachO::x86_THREAD_STATE) {
4775         outs() << "     flavor x86_THREAD_STATE\n";
4776         if (count == MachO::x86_THREAD_STATE_COUNT)
4777           outs() << "      count x86_THREAD_STATE_COUNT\n";
4778         else
4779           outs() << "      count " << count
4780                  << " (not x86_THREAD_STATE_COUNT)\n";
4781         struct MachO::x86_thread_state_t ts;
4782         left = end - begin;
4783         if (left >= sizeof(MachO::x86_thread_state_t)) {
4784           memcpy(&ts, begin, sizeof(MachO::x86_thread_state_t));
4785           begin += sizeof(MachO::x86_thread_state_t);
4786         } else {
4787           memset(&ts, '\0', sizeof(MachO::x86_thread_state_t));
4788           memcpy(&ts, begin, left);
4789           begin += left;
4790         }
4791         if (isLittleEndian != sys::IsLittleEndianHost)
4792           swapStruct(ts);
4793         if (ts.tsh.flavor == MachO::x86_THREAD_STATE64) {
4794           outs() << "\t    tsh.flavor x86_THREAD_STATE64 ";
4795           if (ts.tsh.count == MachO::x86_THREAD_STATE64_COUNT)
4796             outs() << "tsh.count x86_THREAD_STATE64_COUNT\n";
4797           else
4798             outs() << "tsh.count " << ts.tsh.count
4799                    << " (not x86_THREAD_STATE64_COUNT\n";
4800           Print_x86_thread_state64_t(ts.uts.ts64);
4801         } else {
4802           outs() << "\t    tsh.flavor " << ts.tsh.flavor << "  tsh.count "
4803                  << ts.tsh.count << "\n";
4804         }
4805       } else if (flavor == MachO::x86_FLOAT_STATE) {
4806         outs() << "     flavor x86_FLOAT_STATE\n";
4807         if (count == MachO::x86_FLOAT_STATE_COUNT)
4808           outs() << "      count x86_FLOAT_STATE_COUNT\n";
4809         else
4810           outs() << "      count " << count << " (not x86_FLOAT_STATE_COUNT)\n";
4811         struct MachO::x86_float_state_t fs;
4812         left = end - begin;
4813         if (left >= sizeof(MachO::x86_float_state_t)) {
4814           memcpy(&fs, begin, sizeof(MachO::x86_float_state_t));
4815           begin += sizeof(MachO::x86_float_state_t);
4816         } else {
4817           memset(&fs, '\0', sizeof(MachO::x86_float_state_t));
4818           memcpy(&fs, begin, left);
4819           begin += left;
4820         }
4821         if (isLittleEndian != sys::IsLittleEndianHost)
4822           swapStruct(fs);
4823         if (fs.fsh.flavor == MachO::x86_FLOAT_STATE64) {
4824           outs() << "\t    fsh.flavor x86_FLOAT_STATE64 ";
4825           if (fs.fsh.count == MachO::x86_FLOAT_STATE64_COUNT)
4826             outs() << "fsh.count x86_FLOAT_STATE64_COUNT\n";
4827           else
4828             outs() << "fsh.count " << fs.fsh.count
4829                    << " (not x86_FLOAT_STATE64_COUNT\n";
4830           Print_x86_float_state_t(fs.ufs.fs64);
4831         } else {
4832           outs() << "\t    fsh.flavor " << fs.fsh.flavor << "  fsh.count "
4833                  << fs.fsh.count << "\n";
4834         }
4835       } else if (flavor == MachO::x86_EXCEPTION_STATE) {
4836         outs() << "     flavor x86_EXCEPTION_STATE\n";
4837         if (count == MachO::x86_EXCEPTION_STATE_COUNT)
4838           outs() << "      count x86_EXCEPTION_STATE_COUNT\n";
4839         else
4840           outs() << "      count " << count
4841                  << " (not x86_EXCEPTION_STATE_COUNT)\n";
4842         struct MachO::x86_exception_state_t es;
4843         left = end - begin;
4844         if (left >= sizeof(MachO::x86_exception_state_t)) {
4845           memcpy(&es, begin, sizeof(MachO::x86_exception_state_t));
4846           begin += sizeof(MachO::x86_exception_state_t);
4847         } else {
4848           memset(&es, '\0', sizeof(MachO::x86_exception_state_t));
4849           memcpy(&es, begin, left);
4850           begin += left;
4851         }
4852         if (isLittleEndian != sys::IsLittleEndianHost)
4853           swapStruct(es);
4854         if (es.esh.flavor == MachO::x86_EXCEPTION_STATE64) {
4855           outs() << "\t    esh.flavor x86_EXCEPTION_STATE64\n";
4856           if (es.esh.count == MachO::x86_EXCEPTION_STATE64_COUNT)
4857             outs() << "\t    esh.count x86_EXCEPTION_STATE64_COUNT\n";
4858           else
4859             outs() << "\t    esh.count " << es.esh.count
4860                    << " (not x86_EXCEPTION_STATE64_COUNT\n";
4861           Print_x86_exception_state_t(es.ues.es64);
4862         } else {
4863           outs() << "\t    esh.flavor " << es.esh.flavor << "  esh.count "
4864                  << es.esh.count << "\n";
4865         }
4866       } else {
4867         outs() << "     flavor " << flavor << " (unknown)\n";
4868         outs() << "      count " << count << "\n";
4869         outs() << "      state (unknown)\n";
4870         begin += count * sizeof(uint32_t);
4871       }
4872     }
4873   } else {
4874     while (begin < end) {
4875       if (end - begin > (ptrdiff_t)sizeof(uint32_t)) {
4876         memcpy((char *)&flavor, begin, sizeof(uint32_t));
4877         begin += sizeof(uint32_t);
4878       } else {
4879         flavor = 0;
4880         begin = end;
4881       }
4882       if (isLittleEndian != sys::IsLittleEndianHost)
4883         sys::swapByteOrder(flavor);
4884       if (end - begin > (ptrdiff_t)sizeof(uint32_t)) {
4885         memcpy((char *)&count, begin, sizeof(uint32_t));
4886         begin += sizeof(uint32_t);
4887       } else {
4888         count = 0;
4889         begin = end;
4890       }
4891       if (isLittleEndian != sys::IsLittleEndianHost)
4892         sys::swapByteOrder(count);
4893       outs() << "     flavor " << flavor << "\n";
4894       outs() << "      count " << count << "\n";
4895       outs() << "      state (Unknown cputype/cpusubtype)\n";
4896       begin += count * sizeof(uint32_t);
4897     }
4898   }
4899 }
4900
4901 static void PrintDylibCommand(MachO::dylib_command dl, const char *Ptr) {
4902   if (dl.cmd == MachO::LC_ID_DYLIB)
4903     outs() << "          cmd LC_ID_DYLIB\n";
4904   else if (dl.cmd == MachO::LC_LOAD_DYLIB)
4905     outs() << "          cmd LC_LOAD_DYLIB\n";
4906   else if (dl.cmd == MachO::LC_LOAD_WEAK_DYLIB)
4907     outs() << "          cmd LC_LOAD_WEAK_DYLIB\n";
4908   else if (dl.cmd == MachO::LC_REEXPORT_DYLIB)
4909     outs() << "          cmd LC_REEXPORT_DYLIB\n";
4910   else if (dl.cmd == MachO::LC_LAZY_LOAD_DYLIB)
4911     outs() << "          cmd LC_LAZY_LOAD_DYLIB\n";
4912   else if (dl.cmd == MachO::LC_LOAD_UPWARD_DYLIB)
4913     outs() << "          cmd LC_LOAD_UPWARD_DYLIB\n";
4914   else
4915     outs() << "          cmd " << dl.cmd << " (unknown)\n";
4916   outs() << "      cmdsize " << dl.cmdsize;
4917   if (dl.cmdsize < sizeof(struct MachO::dylib_command))
4918     outs() << " Incorrect size\n";
4919   else
4920     outs() << "\n";
4921   if (dl.dylib.name < dl.cmdsize) {
4922     const char *P = (const char *)(Ptr) + dl.dylib.name;
4923     outs() << "         name " << P << " (offset " << dl.dylib.name << ")\n";
4924   } else {
4925     outs() << "         name ?(bad offset " << dl.dylib.name << ")\n";
4926   }
4927   outs() << "   time stamp " << dl.dylib.timestamp << " ";
4928   time_t t = dl.dylib.timestamp;
4929   outs() << ctime(&t);
4930   outs() << "      current version ";
4931   if (dl.dylib.current_version == 0xffffffff)
4932     outs() << "n/a\n";
4933   else
4934     outs() << ((dl.dylib.current_version >> 16) & 0xffff) << "."
4935            << ((dl.dylib.current_version >> 8) & 0xff) << "."
4936            << (dl.dylib.current_version & 0xff) << "\n";
4937   outs() << "compatibility version ";
4938   if (dl.dylib.compatibility_version == 0xffffffff)
4939     outs() << "n/a\n";
4940   else
4941     outs() << ((dl.dylib.compatibility_version >> 16) & 0xffff) << "."
4942            << ((dl.dylib.compatibility_version >> 8) & 0xff) << "."
4943            << (dl.dylib.compatibility_version & 0xff) << "\n";
4944 }
4945
4946 static void PrintLinkEditDataCommand(MachO::linkedit_data_command ld,
4947                                      uint32_t object_size) {
4948   if (ld.cmd == MachO::LC_CODE_SIGNATURE)
4949     outs() << "      cmd LC_FUNCTION_STARTS\n";
4950   else if (ld.cmd == MachO::LC_SEGMENT_SPLIT_INFO)
4951     outs() << "      cmd LC_SEGMENT_SPLIT_INFO\n";
4952   else if (ld.cmd == MachO::LC_FUNCTION_STARTS)
4953     outs() << "      cmd LC_FUNCTION_STARTS\n";
4954   else if (ld.cmd == MachO::LC_DATA_IN_CODE)
4955     outs() << "      cmd LC_DATA_IN_CODE\n";
4956   else if (ld.cmd == MachO::LC_DYLIB_CODE_SIGN_DRS)
4957     outs() << "      cmd LC_DYLIB_CODE_SIGN_DRS\n";
4958   else if (ld.cmd == MachO::LC_LINKER_OPTIMIZATION_HINT)
4959     outs() << "      cmd LC_LINKER_OPTIMIZATION_HINT\n";
4960   else
4961     outs() << "      cmd " << ld.cmd << " (?)\n";
4962   outs() << "  cmdsize " << ld.cmdsize;
4963   if (ld.cmdsize != sizeof(struct MachO::linkedit_data_command))
4964     outs() << " Incorrect size\n";
4965   else
4966     outs() << "\n";
4967   outs() << "  dataoff " << ld.dataoff;
4968   if (ld.dataoff > object_size)
4969     outs() << " (past end of file)\n";
4970   else
4971     outs() << "\n";
4972   outs() << " datasize " << ld.datasize;
4973   uint64_t big_size = ld.dataoff;
4974   big_size += ld.datasize;
4975   if (big_size > object_size)
4976     outs() << " (past end of file)\n";
4977   else
4978     outs() << "\n";
4979 }
4980
4981 static void PrintLoadCommands(const MachOObjectFile *Obj, uint32_t ncmds,
4982                               uint32_t filetype, uint32_t cputype,
4983                               bool verbose) {
4984   if (ncmds == 0)
4985     return;
4986   StringRef Buf = Obj->getData();
4987   MachOObjectFile::LoadCommandInfo Command = Obj->getFirstLoadCommandInfo();
4988   for (unsigned i = 0;; ++i) {
4989     outs() << "Load command " << i << "\n";
4990     if (Command.C.cmd == MachO::LC_SEGMENT) {
4991       MachO::segment_command SLC = Obj->getSegmentLoadCommand(Command);
4992       const char *sg_segname = SLC.segname;
4993       PrintSegmentCommand(SLC.cmd, SLC.cmdsize, SLC.segname, SLC.vmaddr,
4994                           SLC.vmsize, SLC.fileoff, SLC.filesize, SLC.maxprot,
4995                           SLC.initprot, SLC.nsects, SLC.flags, Buf.size(),
4996                           verbose);
4997       for (unsigned j = 0; j < SLC.nsects; j++) {
4998         MachO::section S = Obj->getSection(Command, j);
4999         PrintSection(S.sectname, S.segname, S.addr, S.size, S.offset, S.align,
5000                      S.reloff, S.nreloc, S.flags, S.reserved1, S.reserved2,
5001                      SLC.cmd, sg_segname, filetype, Buf.size(), verbose);
5002       }
5003     } else if (Command.C.cmd == MachO::LC_SEGMENT_64) {
5004       MachO::segment_command_64 SLC_64 = Obj->getSegment64LoadCommand(Command);
5005       const char *sg_segname = SLC_64.segname;
5006       PrintSegmentCommand(SLC_64.cmd, SLC_64.cmdsize, SLC_64.segname,
5007                           SLC_64.vmaddr, SLC_64.vmsize, SLC_64.fileoff,
5008                           SLC_64.filesize, SLC_64.maxprot, SLC_64.initprot,
5009                           SLC_64.nsects, SLC_64.flags, Buf.size(), verbose);
5010       for (unsigned j = 0; j < SLC_64.nsects; j++) {
5011         MachO::section_64 S_64 = Obj->getSection64(Command, j);
5012         PrintSection(S_64.sectname, S_64.segname, S_64.addr, S_64.size,
5013                      S_64.offset, S_64.align, S_64.reloff, S_64.nreloc,
5014                      S_64.flags, S_64.reserved1, S_64.reserved2, SLC_64.cmd,
5015                      sg_segname, filetype, Buf.size(), verbose);
5016       }
5017     } else if (Command.C.cmd == MachO::LC_SYMTAB) {
5018       MachO::symtab_command Symtab = Obj->getSymtabLoadCommand();
5019       PrintSymtabLoadCommand(Symtab, Obj->is64Bit(), Buf.size());
5020     } else if (Command.C.cmd == MachO::LC_DYSYMTAB) {
5021       MachO::dysymtab_command Dysymtab = Obj->getDysymtabLoadCommand();
5022       MachO::symtab_command Symtab = Obj->getSymtabLoadCommand();
5023       PrintDysymtabLoadCommand(Dysymtab, Symtab.nsyms, Buf.size(),
5024                                Obj->is64Bit());
5025     } else if (Command.C.cmd == MachO::LC_DYLD_INFO ||
5026                Command.C.cmd == MachO::LC_DYLD_INFO_ONLY) {
5027       MachO::dyld_info_command DyldInfo = Obj->getDyldInfoLoadCommand(Command);
5028       PrintDyldInfoLoadCommand(DyldInfo, Buf.size());
5029     } else if (Command.C.cmd == MachO::LC_LOAD_DYLINKER ||
5030                Command.C.cmd == MachO::LC_ID_DYLINKER ||
5031                Command.C.cmd == MachO::LC_DYLD_ENVIRONMENT) {
5032       MachO::dylinker_command Dyld = Obj->getDylinkerCommand(Command);
5033       PrintDyldLoadCommand(Dyld, Command.Ptr);
5034     } else if (Command.C.cmd == MachO::LC_UUID) {
5035       MachO::uuid_command Uuid = Obj->getUuidCommand(Command);
5036       PrintUuidLoadCommand(Uuid);
5037     } else if (Command.C.cmd == MachO::LC_RPATH) {
5038       MachO::rpath_command Rpath = Obj->getRpathCommand(Command);
5039       PrintRpathLoadCommand(Rpath, Command.Ptr);
5040     } else if (Command.C.cmd == MachO::LC_VERSION_MIN_MACOSX ||
5041                Command.C.cmd == MachO::LC_VERSION_MIN_IPHONEOS) {
5042       MachO::version_min_command Vd = Obj->getVersionMinLoadCommand(Command);
5043       PrintVersionMinLoadCommand(Vd);
5044     } else if (Command.C.cmd == MachO::LC_SOURCE_VERSION) {
5045       MachO::source_version_command Sd = Obj->getSourceVersionCommand(Command);
5046       PrintSourceVersionCommand(Sd);
5047     } else if (Command.C.cmd == MachO::LC_MAIN) {
5048       MachO::entry_point_command Ep = Obj->getEntryPointCommand(Command);
5049       PrintEntryPointCommand(Ep);
5050     } else if (Command.C.cmd == MachO::LC_ENCRYPTION_INFO) {
5051       MachO::encryption_info_command Ei =
5052           Obj->getEncryptionInfoCommand(Command);
5053       PrintEncryptionInfoCommand(Ei, Buf.size());
5054     } else if (Command.C.cmd == MachO::LC_ENCRYPTION_INFO_64) {
5055       MachO::encryption_info_command_64 Ei =
5056           Obj->getEncryptionInfoCommand64(Command);
5057       PrintEncryptionInfoCommand64(Ei, Buf.size());
5058     } else if (Command.C.cmd == MachO::LC_LINKER_OPTION) {
5059       MachO::linker_option_command Lo =
5060           Obj->getLinkerOptionLoadCommand(Command);
5061       PrintLinkerOptionCommand(Lo, Command.Ptr);
5062     } else if (Command.C.cmd == MachO::LC_SUB_FRAMEWORK) {
5063       MachO::sub_framework_command Sf = Obj->getSubFrameworkCommand(Command);
5064       PrintSubFrameworkCommand(Sf, Command.Ptr);
5065     } else if (Command.C.cmd == MachO::LC_SUB_UMBRELLA) {
5066       MachO::sub_umbrella_command Sf = Obj->getSubUmbrellaCommand(Command);
5067       PrintSubUmbrellaCommand(Sf, Command.Ptr);
5068     } else if (Command.C.cmd == MachO::LC_SUB_LIBRARY) {
5069       MachO::sub_library_command Sl = Obj->getSubLibraryCommand(Command);
5070       PrintSubLibraryCommand(Sl, Command.Ptr);
5071     } else if (Command.C.cmd == MachO::LC_SUB_CLIENT) {
5072       MachO::sub_client_command Sc = Obj->getSubClientCommand(Command);
5073       PrintSubClientCommand(Sc, Command.Ptr);
5074     } else if (Command.C.cmd == MachO::LC_ROUTINES) {
5075       MachO::routines_command Rc = Obj->getRoutinesCommand(Command);
5076       PrintRoutinesCommand(Rc);
5077     } else if (Command.C.cmd == MachO::LC_ROUTINES_64) {
5078       MachO::routines_command_64 Rc = Obj->getRoutinesCommand64(Command);
5079       PrintRoutinesCommand64(Rc);
5080     } else if (Command.C.cmd == MachO::LC_THREAD ||
5081                Command.C.cmd == MachO::LC_UNIXTHREAD) {
5082       MachO::thread_command Tc = Obj->getThreadCommand(Command);
5083       PrintThreadCommand(Tc, Command.Ptr, Obj->isLittleEndian(), cputype);
5084     } else if (Command.C.cmd == MachO::LC_LOAD_DYLIB ||
5085                Command.C.cmd == MachO::LC_ID_DYLIB ||
5086                Command.C.cmd == MachO::LC_LOAD_WEAK_DYLIB ||
5087                Command.C.cmd == MachO::LC_REEXPORT_DYLIB ||
5088                Command.C.cmd == MachO::LC_LAZY_LOAD_DYLIB ||
5089                Command.C.cmd == MachO::LC_LOAD_UPWARD_DYLIB) {
5090       MachO::dylib_command Dl = Obj->getDylibIDLoadCommand(Command);
5091       PrintDylibCommand(Dl, Command.Ptr);
5092     } else if (Command.C.cmd == MachO::LC_CODE_SIGNATURE ||
5093                Command.C.cmd == MachO::LC_SEGMENT_SPLIT_INFO ||
5094                Command.C.cmd == MachO::LC_FUNCTION_STARTS ||
5095                Command.C.cmd == MachO::LC_DATA_IN_CODE ||
5096                Command.C.cmd == MachO::LC_DYLIB_CODE_SIGN_DRS ||
5097                Command.C.cmd == MachO::LC_LINKER_OPTIMIZATION_HINT) {
5098       MachO::linkedit_data_command Ld =
5099           Obj->getLinkeditDataLoadCommand(Command);
5100       PrintLinkEditDataCommand(Ld, Buf.size());
5101     } else {
5102       outs() << "      cmd ?(" << format("0x%08" PRIx32, Command.C.cmd)
5103              << ")\n";
5104       outs() << "  cmdsize " << Command.C.cmdsize << "\n";
5105       // TODO: get and print the raw bytes of the load command.
5106     }
5107     // TODO: print all the other kinds of load commands.
5108     if (i == ncmds - 1)
5109       break;
5110     else
5111       Command = Obj->getNextLoadCommandInfo(Command);
5112   }
5113 }
5114
5115 static void getAndPrintMachHeader(const MachOObjectFile *Obj, uint32_t &ncmds,
5116                                   uint32_t &filetype, uint32_t &cputype,
5117                                   bool verbose) {
5118   if (Obj->is64Bit()) {
5119     MachO::mach_header_64 H_64;
5120     H_64 = Obj->getHeader64();
5121     PrintMachHeader(H_64.magic, H_64.cputype, H_64.cpusubtype, H_64.filetype,
5122                     H_64.ncmds, H_64.sizeofcmds, H_64.flags, verbose);
5123     ncmds = H_64.ncmds;
5124     filetype = H_64.filetype;
5125     cputype = H_64.cputype;
5126   } else {
5127     MachO::mach_header H;
5128     H = Obj->getHeader();
5129     PrintMachHeader(H.magic, H.cputype, H.cpusubtype, H.filetype, H.ncmds,
5130                     H.sizeofcmds, H.flags, verbose);
5131     ncmds = H.ncmds;
5132     filetype = H.filetype;
5133     cputype = H.cputype;
5134   }
5135 }
5136
5137 void llvm::printMachOFileHeader(const object::ObjectFile *Obj) {
5138   const MachOObjectFile *file = dyn_cast<const MachOObjectFile>(Obj);
5139   uint32_t ncmds = 0;
5140   uint32_t filetype = 0;
5141   uint32_t cputype = 0;
5142   getAndPrintMachHeader(file, ncmds, filetype, cputype, true);
5143   PrintLoadCommands(file, ncmds, filetype, cputype, true);
5144 }
5145
5146 //===----------------------------------------------------------------------===//
5147 // export trie dumping
5148 //===----------------------------------------------------------------------===//
5149
5150 void llvm::printMachOExportsTrie(const object::MachOObjectFile *Obj) {
5151   for (const llvm::object::ExportEntry &Entry : Obj->exports()) {
5152     uint64_t Flags = Entry.flags();
5153     bool ReExport = (Flags & MachO::EXPORT_SYMBOL_FLAGS_REEXPORT);
5154     bool WeakDef = (Flags & MachO::EXPORT_SYMBOL_FLAGS_WEAK_DEFINITION);
5155     bool ThreadLocal = ((Flags & MachO::EXPORT_SYMBOL_FLAGS_KIND_MASK) ==
5156                         MachO::EXPORT_SYMBOL_FLAGS_KIND_THREAD_LOCAL);
5157     bool Abs = ((Flags & MachO::EXPORT_SYMBOL_FLAGS_KIND_MASK) ==
5158                 MachO::EXPORT_SYMBOL_FLAGS_KIND_ABSOLUTE);
5159     bool Resolver = (Flags & MachO::EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER);
5160     if (ReExport)
5161       outs() << "[re-export] ";
5162     else
5163       outs() << format("0x%08llX  ",
5164                        Entry.address()); // FIXME:add in base address
5165     outs() << Entry.name();
5166     if (WeakDef || ThreadLocal || Resolver || Abs) {
5167       bool NeedsComma = false;
5168       outs() << " [";
5169       if (WeakDef) {
5170         outs() << "weak_def";
5171         NeedsComma = true;
5172       }
5173       if (ThreadLocal) {
5174         if (NeedsComma)
5175           outs() << ", ";
5176         outs() << "per-thread";
5177         NeedsComma = true;
5178       }
5179       if (Abs) {
5180         if (NeedsComma)
5181           outs() << ", ";
5182         outs() << "absolute";
5183         NeedsComma = true;
5184       }
5185       if (Resolver) {
5186         if (NeedsComma)
5187           outs() << ", ";
5188         outs() << format("resolver=0x%08llX", Entry.other());
5189         NeedsComma = true;
5190       }
5191       outs() << "]";
5192     }
5193     if (ReExport) {
5194       StringRef DylibName = "unknown";
5195       int Ordinal = Entry.other() - 1;
5196       Obj->getLibraryShortNameByIndex(Ordinal, DylibName);
5197       if (Entry.otherName().empty())
5198         outs() << " (from " << DylibName << ")";
5199       else
5200         outs() << " (" << Entry.otherName() << " from " << DylibName << ")";
5201     }
5202     outs() << "\n";
5203   }
5204 }
5205
5206 //===----------------------------------------------------------------------===//
5207 // rebase table dumping
5208 //===----------------------------------------------------------------------===//
5209
5210 namespace {
5211 class SegInfo {
5212 public:
5213   SegInfo(const object::MachOObjectFile *Obj);
5214
5215   StringRef segmentName(uint32_t SegIndex);
5216   StringRef sectionName(uint32_t SegIndex, uint64_t SegOffset);
5217   uint64_t address(uint32_t SegIndex, uint64_t SegOffset);
5218
5219 private:
5220   struct SectionInfo {
5221     uint64_t Address;
5222     uint64_t Size;
5223     StringRef SectionName;
5224     StringRef SegmentName;
5225     uint64_t OffsetInSegment;
5226     uint64_t SegmentStartAddress;
5227     uint32_t SegmentIndex;
5228   };
5229   const SectionInfo &findSection(uint32_t SegIndex, uint64_t SegOffset);
5230   SmallVector<SectionInfo, 32> Sections;
5231 };
5232 }
5233
5234 SegInfo::SegInfo(const object::MachOObjectFile *Obj) {
5235   // Build table of sections so segIndex/offset pairs can be translated.
5236   uint32_t CurSegIndex = Obj->hasPageZeroSegment() ? 1 : 0;
5237   StringRef CurSegName;
5238   uint64_t CurSegAddress;
5239   for (const SectionRef &Section : Obj->sections()) {
5240     SectionInfo Info;
5241     if (error(Section.getName(Info.SectionName)))
5242       return;
5243     Info.Address = Section.getAddress();
5244     Info.Size = Section.getSize();
5245     Info.SegmentName =
5246         Obj->getSectionFinalSegmentName(Section.getRawDataRefImpl());
5247     if (!Info.SegmentName.equals(CurSegName)) {
5248       ++CurSegIndex;
5249       CurSegName = Info.SegmentName;
5250       CurSegAddress = Info.Address;
5251     }
5252     Info.SegmentIndex = CurSegIndex - 1;
5253     Info.OffsetInSegment = Info.Address - CurSegAddress;
5254     Info.SegmentStartAddress = CurSegAddress;
5255     Sections.push_back(Info);
5256   }
5257 }
5258
5259 StringRef SegInfo::segmentName(uint32_t SegIndex) {
5260   for (const SectionInfo &SI : Sections) {
5261     if (SI.SegmentIndex == SegIndex)
5262       return SI.SegmentName;
5263   }
5264   llvm_unreachable("invalid segIndex");
5265 }
5266
5267 const SegInfo::SectionInfo &SegInfo::findSection(uint32_t SegIndex,
5268                                                  uint64_t OffsetInSeg) {
5269   for (const SectionInfo &SI : Sections) {
5270     if (SI.SegmentIndex != SegIndex)
5271       continue;
5272     if (SI.OffsetInSegment > OffsetInSeg)
5273       continue;
5274     if (OffsetInSeg >= (SI.OffsetInSegment + SI.Size))
5275       continue;
5276     return SI;
5277   }
5278   llvm_unreachable("segIndex and offset not in any section");
5279 }
5280
5281 StringRef SegInfo::sectionName(uint32_t SegIndex, uint64_t OffsetInSeg) {
5282   return findSection(SegIndex, OffsetInSeg).SectionName;
5283 }
5284
5285 uint64_t SegInfo::address(uint32_t SegIndex, uint64_t OffsetInSeg) {
5286   const SectionInfo &SI = findSection(SegIndex, OffsetInSeg);
5287   return SI.SegmentStartAddress + OffsetInSeg;
5288 }
5289
5290 void llvm::printMachORebaseTable(const object::MachOObjectFile *Obj) {
5291   // Build table of sections so names can used in final output.
5292   SegInfo sectionTable(Obj);
5293
5294   outs() << "segment  section            address     type\n";
5295   for (const llvm::object::MachORebaseEntry &Entry : Obj->rebaseTable()) {
5296     uint32_t SegIndex = Entry.segmentIndex();
5297     uint64_t OffsetInSeg = Entry.segmentOffset();
5298     StringRef SegmentName = sectionTable.segmentName(SegIndex);
5299     StringRef SectionName = sectionTable.sectionName(SegIndex, OffsetInSeg);
5300     uint64_t Address = sectionTable.address(SegIndex, OffsetInSeg);
5301
5302     // Table lines look like: __DATA  __nl_symbol_ptr  0x0000F00C  pointer
5303     outs() << format("%-8s %-18s 0x%08" PRIX64 "  %s\n",
5304                      SegmentName.str().c_str(), SectionName.str().c_str(),
5305                      Address, Entry.typeName().str().c_str());
5306   }
5307 }
5308
5309 static StringRef ordinalName(const object::MachOObjectFile *Obj, int Ordinal) {
5310   StringRef DylibName;
5311   switch (Ordinal) {
5312   case MachO::BIND_SPECIAL_DYLIB_SELF:
5313     return "this-image";
5314   case MachO::BIND_SPECIAL_DYLIB_MAIN_EXECUTABLE:
5315     return "main-executable";
5316   case MachO::BIND_SPECIAL_DYLIB_FLAT_LOOKUP:
5317     return "flat-namespace";
5318   default:
5319     if (Ordinal > 0) {
5320       std::error_code EC =
5321           Obj->getLibraryShortNameByIndex(Ordinal - 1, DylibName);
5322       if (EC)
5323         return "<<bad library ordinal>>";
5324       return DylibName;
5325     }
5326   }
5327   return "<<unknown special ordinal>>";
5328 }
5329
5330 //===----------------------------------------------------------------------===//
5331 // bind table dumping
5332 //===----------------------------------------------------------------------===//
5333
5334 void llvm::printMachOBindTable(const object::MachOObjectFile *Obj) {
5335   // Build table of sections so names can used in final output.
5336   SegInfo sectionTable(Obj);
5337
5338   outs() << "segment  section            address    type       "
5339             "addend dylib            symbol\n";
5340   for (const llvm::object::MachOBindEntry &Entry : Obj->bindTable()) {
5341     uint32_t SegIndex = Entry.segmentIndex();
5342     uint64_t OffsetInSeg = Entry.segmentOffset();
5343     StringRef SegmentName = sectionTable.segmentName(SegIndex);
5344     StringRef SectionName = sectionTable.sectionName(SegIndex, OffsetInSeg);
5345     uint64_t Address = sectionTable.address(SegIndex, OffsetInSeg);
5346
5347     // Table lines look like:
5348     //  __DATA  __got  0x00012010    pointer   0 libSystem ___stack_chk_guard
5349     StringRef Attr;
5350     if (Entry.flags() & MachO::BIND_SYMBOL_FLAGS_WEAK_IMPORT)
5351       Attr = " (weak_import)";
5352     outs() << left_justify(SegmentName, 8) << " "
5353            << left_justify(SectionName, 18) << " "
5354            << format_hex(Address, 10, true) << " "
5355            << left_justify(Entry.typeName(), 8) << " "
5356            << format_decimal(Entry.addend(), 8) << " "
5357            << left_justify(ordinalName(Obj, Entry.ordinal()), 16) << " "
5358            << Entry.symbolName() << Attr << "\n";
5359   }
5360 }
5361
5362 //===----------------------------------------------------------------------===//
5363 // lazy bind table dumping
5364 //===----------------------------------------------------------------------===//
5365
5366 void llvm::printMachOLazyBindTable(const object::MachOObjectFile *Obj) {
5367   // Build table of sections so names can used in final output.
5368   SegInfo sectionTable(Obj);
5369
5370   outs() << "segment  section            address     "
5371             "dylib            symbol\n";
5372   for (const llvm::object::MachOBindEntry &Entry : Obj->lazyBindTable()) {
5373     uint32_t SegIndex = Entry.segmentIndex();
5374     uint64_t OffsetInSeg = Entry.segmentOffset();
5375     StringRef SegmentName = sectionTable.segmentName(SegIndex);
5376     StringRef SectionName = sectionTable.sectionName(SegIndex, OffsetInSeg);
5377     uint64_t Address = sectionTable.address(SegIndex, OffsetInSeg);
5378
5379     // Table lines look like:
5380     //  __DATA  __got  0x00012010 libSystem ___stack_chk_guard
5381     outs() << left_justify(SegmentName, 8) << " "
5382            << left_justify(SectionName, 18) << " "
5383            << format_hex(Address, 10, true) << " "
5384            << left_justify(ordinalName(Obj, Entry.ordinal()), 16) << " "
5385            << Entry.symbolName() << "\n";
5386   }
5387 }
5388
5389 //===----------------------------------------------------------------------===//
5390 // weak bind table dumping
5391 //===----------------------------------------------------------------------===//
5392
5393 void llvm::printMachOWeakBindTable(const object::MachOObjectFile *Obj) {
5394   // Build table of sections so names can used in final output.
5395   SegInfo sectionTable(Obj);
5396
5397   outs() << "segment  section            address     "
5398             "type       addend   symbol\n";
5399   for (const llvm::object::MachOBindEntry &Entry : Obj->weakBindTable()) {
5400     // Strong symbols don't have a location to update.
5401     if (Entry.flags() & MachO::BIND_SYMBOL_FLAGS_NON_WEAK_DEFINITION) {
5402       outs() << "                                        strong              "
5403              << Entry.symbolName() << "\n";
5404       continue;
5405     }
5406     uint32_t SegIndex = Entry.segmentIndex();
5407     uint64_t OffsetInSeg = Entry.segmentOffset();
5408     StringRef SegmentName = sectionTable.segmentName(SegIndex);
5409     StringRef SectionName = sectionTable.sectionName(SegIndex, OffsetInSeg);
5410     uint64_t Address = sectionTable.address(SegIndex, OffsetInSeg);
5411
5412     // Table lines look like:
5413     // __DATA  __data  0x00001000  pointer    0   _foo
5414     outs() << left_justify(SegmentName, 8) << " "
5415            << left_justify(SectionName, 18) << " "
5416            << format_hex(Address, 10, true) << " "
5417            << left_justify(Entry.typeName(), 8) << " "
5418            << format_decimal(Entry.addend(), 8) << "   " << Entry.symbolName()
5419            << "\n";
5420   }
5421 }
5422
5423 // get_dyld_bind_info_symbolname() is used for disassembly and passed an
5424 // address, ReferenceValue, in the Mach-O file and looks in the dyld bind
5425 // information for that address. If the address is found its binding symbol
5426 // name is returned.  If not nullptr is returned.
5427 static const char *get_dyld_bind_info_symbolname(uint64_t ReferenceValue,
5428                                                  struct DisassembleInfo *info) {
5429   if (info->bindtable == nullptr) {
5430     info->bindtable = new (BindTable);
5431     SegInfo sectionTable(info->O);
5432     for (const llvm::object::MachOBindEntry &Entry : info->O->bindTable()) {
5433       uint32_t SegIndex = Entry.segmentIndex();
5434       uint64_t OffsetInSeg = Entry.segmentOffset();
5435       uint64_t Address = sectionTable.address(SegIndex, OffsetInSeg);
5436       const char *SymbolName = nullptr;
5437       StringRef name = Entry.symbolName();
5438       if (!name.empty())
5439         SymbolName = name.data();
5440       info->bindtable->push_back(std::make_pair(Address, SymbolName));
5441     }
5442   }
5443   for (bind_table_iterator BI = info->bindtable->begin(),
5444                            BE = info->bindtable->end();
5445        BI != BE; ++BI) {
5446     uint64_t Address = BI->first;
5447     if (ReferenceValue == Address) {
5448       const char *SymbolName = BI->second;
5449       return SymbolName;
5450     }
5451   }
5452   return nullptr;
5453 }