[ARM] Emit clrex in the expanded cmpxchg fail block.
[oota-llvm.git] / lib / Object / MachOObjectFile.cpp
1 //===- MachOObjectFile.cpp - Mach-O object file binding ---------*- C++ -*-===//
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 defines the MachOObjectFile class, which binds the MachOObject
11 // class to the generic ObjectFile wrapper.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "llvm/Object/MachO.h"
16 #include "llvm/ADT/STLExtras.h"
17 #include "llvm/ADT/StringSwitch.h"
18 #include "llvm/ADT/Triple.h"
19 #include "llvm/Support/DataExtractor.h"
20 #include "llvm/Support/Debug.h"
21 #include "llvm/Support/Format.h"
22 #include "llvm/Support/Host.h"
23 #include "llvm/Support/LEB128.h"
24 #include "llvm/Support/MachO.h"
25 #include "llvm/Support/MemoryBuffer.h"
26 #include "llvm/Support/raw_ostream.h"
27 #include <cctype>
28 #include <cstring>
29 #include <limits>
30
31 using namespace llvm;
32 using namespace object;
33
34 namespace {
35   struct section_base {
36     char sectname[16];
37     char segname[16];
38   };
39 }
40
41 // FIXME: Replace all uses of this function with getStructOrErr.
42 template <typename T>
43 static T getStruct(const MachOObjectFile *O, const char *P) {
44   // Don't read before the beginning or past the end of the file
45   if (P < O->getData().begin() || P + sizeof(T) > O->getData().end())
46     report_fatal_error("Malformed MachO file.");
47
48   T Cmd;
49   memcpy(&Cmd, P, sizeof(T));
50   if (O->isLittleEndian() != sys::IsLittleEndianHost)
51     MachO::swapStruct(Cmd);
52   return Cmd;
53 }
54
55 template <typename T>
56 static ErrorOr<T> getStructOrErr(const MachOObjectFile *O, const char *P) {
57   // Don't read before the beginning or past the end of the file
58   if (P < O->getData().begin() || P + sizeof(T) > O->getData().end())
59     return object_error::parse_failed;
60
61   T Cmd;
62   memcpy(&Cmd, P, sizeof(T));
63   if (O->isLittleEndian() != sys::IsLittleEndianHost)
64     MachO::swapStruct(Cmd);
65   return Cmd;
66 }
67
68 static const char *
69 getSectionPtr(const MachOObjectFile *O, MachOObjectFile::LoadCommandInfo L,
70               unsigned Sec) {
71   uintptr_t CommandAddr = reinterpret_cast<uintptr_t>(L.Ptr);
72
73   bool Is64 = O->is64Bit();
74   unsigned SegmentLoadSize = Is64 ? sizeof(MachO::segment_command_64) :
75                                     sizeof(MachO::segment_command);
76   unsigned SectionSize = Is64 ? sizeof(MachO::section_64) :
77                                 sizeof(MachO::section);
78
79   uintptr_t SectionAddr = CommandAddr + SegmentLoadSize + Sec * SectionSize;
80   return reinterpret_cast<const char*>(SectionAddr);
81 }
82
83 static const char *getPtr(const MachOObjectFile *O, size_t Offset) {
84   return O->getData().substr(Offset, 1).data();
85 }
86
87 static MachO::nlist_base
88 getSymbolTableEntryBase(const MachOObjectFile *O, DataRefImpl DRI) {
89   const char *P = reinterpret_cast<const char *>(DRI.p);
90   return getStruct<MachO::nlist_base>(O, P);
91 }
92
93 static StringRef parseSegmentOrSectionName(const char *P) {
94   if (P[15] == 0)
95     // Null terminated.
96     return P;
97   // Not null terminated, so this is a 16 char string.
98   return StringRef(P, 16);
99 }
100
101 // Helper to advance a section or symbol iterator multiple increments at a time.
102 template<class T>
103 static void advance(T &it, size_t Val) {
104   while (Val--)
105     ++it;
106 }
107
108 static unsigned getCPUType(const MachOObjectFile *O) {
109   return O->getHeader().cputype;
110 }
111
112 static uint32_t
113 getPlainRelocationAddress(const MachO::any_relocation_info &RE) {
114   return RE.r_word0;
115 }
116
117 static unsigned
118 getScatteredRelocationAddress(const MachO::any_relocation_info &RE) {
119   return RE.r_word0 & 0xffffff;
120 }
121
122 static bool getPlainRelocationPCRel(const MachOObjectFile *O,
123                                     const MachO::any_relocation_info &RE) {
124   if (O->isLittleEndian())
125     return (RE.r_word1 >> 24) & 1;
126   return (RE.r_word1 >> 7) & 1;
127 }
128
129 static bool
130 getScatteredRelocationPCRel(const MachOObjectFile *O,
131                             const MachO::any_relocation_info &RE) {
132   return (RE.r_word0 >> 30) & 1;
133 }
134
135 static unsigned getPlainRelocationLength(const MachOObjectFile *O,
136                                          const MachO::any_relocation_info &RE) {
137   if (O->isLittleEndian())
138     return (RE.r_word1 >> 25) & 3;
139   return (RE.r_word1 >> 5) & 3;
140 }
141
142 static unsigned
143 getScatteredRelocationLength(const MachO::any_relocation_info &RE) {
144   return (RE.r_word0 >> 28) & 3;
145 }
146
147 static unsigned getPlainRelocationType(const MachOObjectFile *O,
148                                        const MachO::any_relocation_info &RE) {
149   if (O->isLittleEndian())
150     return RE.r_word1 >> 28;
151   return RE.r_word1 & 0xf;
152 }
153
154 static uint32_t getSectionFlags(const MachOObjectFile *O,
155                                 DataRefImpl Sec) {
156   if (O->is64Bit()) {
157     MachO::section_64 Sect = O->getSection64(Sec);
158     return Sect.flags;
159   }
160   MachO::section Sect = O->getSection(Sec);
161   return Sect.flags;
162 }
163
164 static ErrorOr<MachOObjectFile::LoadCommandInfo>
165 getLoadCommandInfo(const MachOObjectFile *Obj, const char *Ptr) {
166   auto CmdOrErr = getStructOrErr<MachO::load_command>(Obj, Ptr);
167   if (!CmdOrErr)
168     return CmdOrErr.getError();
169   if (CmdOrErr->cmdsize < 8)
170     return object_error::macho_small_load_command;
171   MachOObjectFile::LoadCommandInfo Load;
172   Load.Ptr = Ptr;
173   Load.C = CmdOrErr.get();
174   return Load;
175 }
176
177 static ErrorOr<MachOObjectFile::LoadCommandInfo>
178 getFirstLoadCommandInfo(const MachOObjectFile *Obj) {
179   unsigned HeaderSize = Obj->is64Bit() ? sizeof(MachO::mach_header_64)
180                                        : sizeof(MachO::mach_header);
181   return getLoadCommandInfo(Obj, getPtr(Obj, HeaderSize));
182 }
183
184 static ErrorOr<MachOObjectFile::LoadCommandInfo>
185 getNextLoadCommandInfo(const MachOObjectFile *Obj,
186                        const MachOObjectFile::LoadCommandInfo &L) {
187   return getLoadCommandInfo(Obj, L.Ptr + L.C.cmdsize);
188 }
189
190 template <typename T>
191 static void parseHeader(const MachOObjectFile *Obj, T &Header,
192                         std::error_code &EC) {
193   auto HeaderOrErr = getStructOrErr<T>(Obj, getPtr(Obj, 0));
194   if (HeaderOrErr)
195     Header = HeaderOrErr.get();
196   else
197     EC = HeaderOrErr.getError();
198 }
199
200 // Parses LC_SEGMENT or LC_SEGMENT_64 load command, adds addresses of all
201 // sections to \param Sections, and optionally sets
202 // \param IsPageZeroSegment to true.
203 template <typename SegmentCmd>
204 static std::error_code parseSegmentLoadCommand(
205     const MachOObjectFile *Obj, const MachOObjectFile::LoadCommandInfo &Load,
206     SmallVectorImpl<const char *> &Sections, bool &IsPageZeroSegment) {
207   const unsigned SegmentLoadSize = sizeof(SegmentCmd);
208   if (Load.C.cmdsize < SegmentLoadSize)
209     return object_error::macho_load_segment_too_small;
210   auto SegOrErr = getStructOrErr<SegmentCmd>(Obj, Load.Ptr);
211   if (!SegOrErr)
212     return SegOrErr.getError();
213   SegmentCmd S = SegOrErr.get();
214   const unsigned SectionSize =
215       Obj->is64Bit() ? sizeof(MachO::section_64) : sizeof(MachO::section);
216   if (S.nsects > std::numeric_limits<uint32_t>::max() / SectionSize ||
217       S.nsects * SectionSize > Load.C.cmdsize - SegmentLoadSize)
218     return object_error::macho_load_segment_too_many_sections;
219   for (unsigned J = 0; J < S.nsects; ++J) {
220     const char *Sec = getSectionPtr(Obj, Load, J);
221     Sections.push_back(Sec);
222   }
223   IsPageZeroSegment |= StringRef("__PAGEZERO").equals(S.segname);
224   return std::error_code();
225 }
226
227 MachOObjectFile::MachOObjectFile(MemoryBufferRef Object, bool IsLittleEndian,
228                                  bool Is64bits, std::error_code &EC)
229     : ObjectFile(getMachOType(IsLittleEndian, Is64bits), Object),
230       SymtabLoadCmd(nullptr), DysymtabLoadCmd(nullptr),
231       DataInCodeLoadCmd(nullptr), LinkOptHintsLoadCmd(nullptr),
232       DyldInfoLoadCmd(nullptr), UuidLoadCmd(nullptr),
233       HasPageZeroSegment(false) {
234   if (is64Bit())
235     parseHeader(this, Header64, EC);
236   else
237     parseHeader(this, Header, EC);
238   if (EC)
239     return;
240
241   uint32_t LoadCommandCount = getHeader().ncmds;
242   if (LoadCommandCount == 0)
243     return;
244
245   auto LoadOrErr = getFirstLoadCommandInfo(this);
246   if (!LoadOrErr) {
247     EC = LoadOrErr.getError();
248     return;
249   }
250   LoadCommandInfo Load = LoadOrErr.get();
251   for (unsigned I = 0; I < LoadCommandCount; ++I) {
252     LoadCommands.push_back(Load);
253     if (Load.C.cmd == MachO::LC_SYMTAB) {
254       // Multiple symbol tables
255       if (SymtabLoadCmd) {
256         EC = object_error::parse_failed;
257         return;
258       }
259       SymtabLoadCmd = Load.Ptr;
260     } else if (Load.C.cmd == MachO::LC_DYSYMTAB) {
261       // Multiple dynamic symbol tables
262       if (DysymtabLoadCmd) {
263         EC = object_error::parse_failed;
264         return;
265       }
266       DysymtabLoadCmd = Load.Ptr;
267     } else if (Load.C.cmd == MachO::LC_DATA_IN_CODE) {
268       // Multiple data in code tables
269       if (DataInCodeLoadCmd) {
270         EC = object_error::parse_failed;
271         return;
272       }
273       DataInCodeLoadCmd = Load.Ptr;
274     } else if (Load.C.cmd == MachO::LC_LINKER_OPTIMIZATION_HINT) {
275       // Multiple linker optimization hint tables
276       if (LinkOptHintsLoadCmd) {
277         EC = object_error::parse_failed;
278         return;
279       }
280       LinkOptHintsLoadCmd = Load.Ptr;
281     } else if (Load.C.cmd == MachO::LC_DYLD_INFO ||
282                Load.C.cmd == MachO::LC_DYLD_INFO_ONLY) {
283       // Multiple dyldinfo load commands
284       if (DyldInfoLoadCmd) {
285         EC = object_error::parse_failed;
286         return;
287       }
288       DyldInfoLoadCmd = Load.Ptr;
289     } else if (Load.C.cmd == MachO::LC_UUID) {
290       // Multiple UUID load commands
291       if (UuidLoadCmd) {
292         EC = object_error::parse_failed;
293         return;
294       }
295       UuidLoadCmd = Load.Ptr;
296     } else if (Load.C.cmd == MachO::LC_SEGMENT_64) {
297       if ((EC = parseSegmentLoadCommand<MachO::segment_command_64>(
298                this, Load, Sections, HasPageZeroSegment)))
299         return;
300     } else if (Load.C.cmd == MachO::LC_SEGMENT) {
301       if ((EC = parseSegmentLoadCommand<MachO::segment_command>(
302                this, Load, Sections, HasPageZeroSegment)))
303         return;
304     } else if (Load.C.cmd == MachO::LC_LOAD_DYLIB ||
305                Load.C.cmd == MachO::LC_LOAD_WEAK_DYLIB ||
306                Load.C.cmd == MachO::LC_LAZY_LOAD_DYLIB ||
307                Load.C.cmd == MachO::LC_REEXPORT_DYLIB ||
308                Load.C.cmd == MachO::LC_LOAD_UPWARD_DYLIB) {
309       Libraries.push_back(Load.Ptr);
310     }
311     if (I < LoadCommandCount - 1) {
312       auto LoadOrErr = getNextLoadCommandInfo(this, Load);
313       if (!LoadOrErr) {
314         EC = LoadOrErr.getError();
315         return;
316       }
317       Load = LoadOrErr.get();
318     }
319   }
320   assert(LoadCommands.size() == LoadCommandCount);
321 }
322
323 void MachOObjectFile::moveSymbolNext(DataRefImpl &Symb) const {
324   unsigned SymbolTableEntrySize = is64Bit() ?
325     sizeof(MachO::nlist_64) :
326     sizeof(MachO::nlist);
327   Symb.p += SymbolTableEntrySize;
328 }
329
330 ErrorOr<StringRef> MachOObjectFile::getSymbolName(DataRefImpl Symb) const {
331   StringRef StringTable = getStringTableData();
332   MachO::nlist_base Entry = getSymbolTableEntryBase(this, Symb);
333   const char *Start = &StringTable.data()[Entry.n_strx];
334   if (Start < getData().begin() || Start >= getData().end())
335     report_fatal_error(
336         "Symbol name entry points before beginning or past end of file.");
337   return StringRef(Start);
338 }
339
340 unsigned MachOObjectFile::getSectionType(SectionRef Sec) const {
341   DataRefImpl DRI = Sec.getRawDataRefImpl();
342   uint32_t Flags = getSectionFlags(this, DRI);
343   return Flags & MachO::SECTION_TYPE;
344 }
345
346 uint64_t MachOObjectFile::getNValue(DataRefImpl Sym) const {
347   if (is64Bit()) {
348     MachO::nlist_64 Entry = getSymbol64TableEntry(Sym);
349     return Entry.n_value;
350   }
351   MachO::nlist Entry = getSymbolTableEntry(Sym);
352   return Entry.n_value;
353 }
354
355 // getIndirectName() returns the name of the alias'ed symbol who's string table
356 // index is in the n_value field.
357 std::error_code MachOObjectFile::getIndirectName(DataRefImpl Symb,
358                                                  StringRef &Res) const {
359   StringRef StringTable = getStringTableData();
360   MachO::nlist_base Entry = getSymbolTableEntryBase(this, Symb);
361   if ((Entry.n_type & MachO::N_TYPE) != MachO::N_INDR)
362     return object_error::parse_failed;
363   uint64_t NValue = getNValue(Symb);
364   if (NValue >= StringTable.size())
365     return object_error::parse_failed;
366   const char *Start = &StringTable.data()[NValue];
367   Res = StringRef(Start);
368   return std::error_code();
369 }
370
371 uint64_t MachOObjectFile::getSymbolValueImpl(DataRefImpl Sym) const {
372   return getNValue(Sym);
373 }
374
375 ErrorOr<uint64_t> MachOObjectFile::getSymbolAddress(DataRefImpl Sym) const {
376   return getSymbolValue(Sym);
377 }
378
379 uint32_t MachOObjectFile::getSymbolAlignment(DataRefImpl DRI) const {
380   uint32_t flags = getSymbolFlags(DRI);
381   if (flags & SymbolRef::SF_Common) {
382     MachO::nlist_base Entry = getSymbolTableEntryBase(this, DRI);
383     return 1 << MachO::GET_COMM_ALIGN(Entry.n_desc);
384   }
385   return 0;
386 }
387
388 uint64_t MachOObjectFile::getCommonSymbolSizeImpl(DataRefImpl DRI) const {
389   return getNValue(DRI);
390 }
391
392 SymbolRef::Type MachOObjectFile::getSymbolType(DataRefImpl Symb) const {
393   MachO::nlist_base Entry = getSymbolTableEntryBase(this, Symb);
394   uint8_t n_type = Entry.n_type;
395
396   // If this is a STAB debugging symbol, we can do nothing more.
397   if (n_type & MachO::N_STAB)
398     return SymbolRef::ST_Debug;
399
400   switch (n_type & MachO::N_TYPE) {
401     case MachO::N_UNDF :
402       return SymbolRef::ST_Unknown;
403     case MachO::N_SECT :
404       return SymbolRef::ST_Function;
405   }
406   return SymbolRef::ST_Other;
407 }
408
409 uint32_t MachOObjectFile::getSymbolFlags(DataRefImpl DRI) const {
410   MachO::nlist_base Entry = getSymbolTableEntryBase(this, DRI);
411
412   uint8_t MachOType = Entry.n_type;
413   uint16_t MachOFlags = Entry.n_desc;
414
415   uint32_t Result = SymbolRef::SF_None;
416
417   if ((MachOType & MachO::N_TYPE) == MachO::N_INDR)
418     Result |= SymbolRef::SF_Indirect;
419
420   if (MachOType & MachO::N_STAB)
421     Result |= SymbolRef::SF_FormatSpecific;
422
423   if (MachOType & MachO::N_EXT) {
424     Result |= SymbolRef::SF_Global;
425     if ((MachOType & MachO::N_TYPE) == MachO::N_UNDF) {
426       if (getNValue(DRI))
427         Result |= SymbolRef::SF_Common;
428       else
429         Result |= SymbolRef::SF_Undefined;
430     }
431
432     if (!(MachOType & MachO::N_PEXT))
433       Result |= SymbolRef::SF_Exported;
434   }
435
436   if (MachOFlags & (MachO::N_WEAK_REF | MachO::N_WEAK_DEF))
437     Result |= SymbolRef::SF_Weak;
438
439   if (MachOFlags & (MachO::N_ARM_THUMB_DEF))
440     Result |= SymbolRef::SF_Thumb;
441
442   if ((MachOType & MachO::N_TYPE) == MachO::N_ABS)
443     Result |= SymbolRef::SF_Absolute;
444
445   return Result;
446 }
447
448 ErrorOr<section_iterator>
449 MachOObjectFile::getSymbolSection(DataRefImpl Symb) const {
450   MachO::nlist_base Entry = getSymbolTableEntryBase(this, Symb);
451   uint8_t index = Entry.n_sect;
452
453   if (index == 0)
454     return section_end();
455   DataRefImpl DRI;
456   DRI.d.a = index - 1;
457   if (DRI.d.a >= Sections.size())
458     report_fatal_error("getSymbolSection: Invalid section index.");
459   return section_iterator(SectionRef(DRI, this));
460 }
461
462 unsigned MachOObjectFile::getSymbolSectionID(SymbolRef Sym) const {
463   MachO::nlist_base Entry =
464       getSymbolTableEntryBase(this, Sym.getRawDataRefImpl());
465   return Entry.n_sect - 1;
466 }
467
468 void MachOObjectFile::moveSectionNext(DataRefImpl &Sec) const {
469   Sec.d.a++;
470 }
471
472 std::error_code MachOObjectFile::getSectionName(DataRefImpl Sec,
473                                                 StringRef &Result) const {
474   ArrayRef<char> Raw = getSectionRawName(Sec);
475   Result = parseSegmentOrSectionName(Raw.data());
476   return std::error_code();
477 }
478
479 uint64_t MachOObjectFile::getSectionAddress(DataRefImpl Sec) const {
480   if (is64Bit())
481     return getSection64(Sec).addr;
482   return getSection(Sec).addr;
483 }
484
485 uint64_t MachOObjectFile::getSectionSize(DataRefImpl Sec) const {
486   if (is64Bit())
487     return getSection64(Sec).size;
488   return getSection(Sec).size;
489 }
490
491 std::error_code MachOObjectFile::getSectionContents(DataRefImpl Sec,
492                                                     StringRef &Res) const {
493   uint32_t Offset;
494   uint64_t Size;
495
496   if (is64Bit()) {
497     MachO::section_64 Sect = getSection64(Sec);
498     Offset = Sect.offset;
499     Size = Sect.size;
500   } else {
501     MachO::section Sect = getSection(Sec);
502     Offset = Sect.offset;
503     Size = Sect.size;
504   }
505
506   Res = this->getData().substr(Offset, Size);
507   return std::error_code();
508 }
509
510 uint64_t MachOObjectFile::getSectionAlignment(DataRefImpl Sec) const {
511   uint32_t Align;
512   if (is64Bit()) {
513     MachO::section_64 Sect = getSection64(Sec);
514     Align = Sect.align;
515   } else {
516     MachO::section Sect = getSection(Sec);
517     Align = Sect.align;
518   }
519
520   return uint64_t(1) << Align;
521 }
522
523 bool MachOObjectFile::isSectionText(DataRefImpl Sec) const {
524   uint32_t Flags = getSectionFlags(this, Sec);
525   return Flags & MachO::S_ATTR_PURE_INSTRUCTIONS;
526 }
527
528 bool MachOObjectFile::isSectionData(DataRefImpl Sec) const {
529   uint32_t Flags = getSectionFlags(this, Sec);
530   unsigned SectionType = Flags & MachO::SECTION_TYPE;
531   return !(Flags & MachO::S_ATTR_PURE_INSTRUCTIONS) &&
532          !(SectionType == MachO::S_ZEROFILL ||
533            SectionType == MachO::S_GB_ZEROFILL);
534 }
535
536 bool MachOObjectFile::isSectionBSS(DataRefImpl Sec) const {
537   uint32_t Flags = getSectionFlags(this, Sec);
538   unsigned SectionType = Flags & MachO::SECTION_TYPE;
539   return !(Flags & MachO::S_ATTR_PURE_INSTRUCTIONS) &&
540          (SectionType == MachO::S_ZEROFILL ||
541           SectionType == MachO::S_GB_ZEROFILL);
542 }
543
544 unsigned MachOObjectFile::getSectionID(SectionRef Sec) const {
545   return Sec.getRawDataRefImpl().d.a;
546 }
547
548 bool MachOObjectFile::isSectionVirtual(DataRefImpl Sec) const {
549   // FIXME: Unimplemented.
550   return false;
551 }
552
553 relocation_iterator MachOObjectFile::section_rel_begin(DataRefImpl Sec) const {
554   DataRefImpl Ret;
555   Ret.d.a = Sec.d.a;
556   Ret.d.b = 0;
557   return relocation_iterator(RelocationRef(Ret, this));
558 }
559
560 relocation_iterator
561 MachOObjectFile::section_rel_end(DataRefImpl Sec) const {
562   uint32_t Num;
563   if (is64Bit()) {
564     MachO::section_64 Sect = getSection64(Sec);
565     Num = Sect.nreloc;
566   } else {
567     MachO::section Sect = getSection(Sec);
568     Num = Sect.nreloc;
569   }
570
571   DataRefImpl Ret;
572   Ret.d.a = Sec.d.a;
573   Ret.d.b = Num;
574   return relocation_iterator(RelocationRef(Ret, this));
575 }
576
577 void MachOObjectFile::moveRelocationNext(DataRefImpl &Rel) const {
578   ++Rel.d.b;
579 }
580
581 uint64_t MachOObjectFile::getRelocationOffset(DataRefImpl Rel) const {
582   assert(getHeader().filetype == MachO::MH_OBJECT &&
583          "Only implemented for MH_OBJECT");
584   MachO::any_relocation_info RE = getRelocation(Rel);
585   return getAnyRelocationAddress(RE);
586 }
587
588 symbol_iterator
589 MachOObjectFile::getRelocationSymbol(DataRefImpl Rel) const {
590   MachO::any_relocation_info RE = getRelocation(Rel);
591   if (isRelocationScattered(RE))
592     return symbol_end();
593
594   uint32_t SymbolIdx = getPlainRelocationSymbolNum(RE);
595   bool isExtern = getPlainRelocationExternal(RE);
596   if (!isExtern)
597     return symbol_end();
598
599   MachO::symtab_command S = getSymtabLoadCommand();
600   unsigned SymbolTableEntrySize = is64Bit() ?
601     sizeof(MachO::nlist_64) :
602     sizeof(MachO::nlist);
603   uint64_t Offset = S.symoff + SymbolIdx * SymbolTableEntrySize;
604   DataRefImpl Sym;
605   Sym.p = reinterpret_cast<uintptr_t>(getPtr(this, Offset));
606   return symbol_iterator(SymbolRef(Sym, this));
607 }
608
609 section_iterator
610 MachOObjectFile::getRelocationSection(DataRefImpl Rel) const {
611   return section_iterator(getAnyRelocationSection(getRelocation(Rel)));
612 }
613
614 uint64_t MachOObjectFile::getRelocationType(DataRefImpl Rel) const {
615   MachO::any_relocation_info RE = getRelocation(Rel);
616   return getAnyRelocationType(RE);
617 }
618
619 void MachOObjectFile::getRelocationTypeName(
620     DataRefImpl Rel, SmallVectorImpl<char> &Result) const {
621   StringRef res;
622   uint64_t RType = getRelocationType(Rel);
623
624   unsigned Arch = this->getArch();
625
626   switch (Arch) {
627     case Triple::x86: {
628       static const char *const Table[] =  {
629         "GENERIC_RELOC_VANILLA",
630         "GENERIC_RELOC_PAIR",
631         "GENERIC_RELOC_SECTDIFF",
632         "GENERIC_RELOC_PB_LA_PTR",
633         "GENERIC_RELOC_LOCAL_SECTDIFF",
634         "GENERIC_RELOC_TLV" };
635
636       if (RType > 5)
637         res = "Unknown";
638       else
639         res = Table[RType];
640       break;
641     }
642     case Triple::x86_64: {
643       static const char *const Table[] =  {
644         "X86_64_RELOC_UNSIGNED",
645         "X86_64_RELOC_SIGNED",
646         "X86_64_RELOC_BRANCH",
647         "X86_64_RELOC_GOT_LOAD",
648         "X86_64_RELOC_GOT",
649         "X86_64_RELOC_SUBTRACTOR",
650         "X86_64_RELOC_SIGNED_1",
651         "X86_64_RELOC_SIGNED_2",
652         "X86_64_RELOC_SIGNED_4",
653         "X86_64_RELOC_TLV" };
654
655       if (RType > 9)
656         res = "Unknown";
657       else
658         res = Table[RType];
659       break;
660     }
661     case Triple::arm: {
662       static const char *const Table[] =  {
663         "ARM_RELOC_VANILLA",
664         "ARM_RELOC_PAIR",
665         "ARM_RELOC_SECTDIFF",
666         "ARM_RELOC_LOCAL_SECTDIFF",
667         "ARM_RELOC_PB_LA_PTR",
668         "ARM_RELOC_BR24",
669         "ARM_THUMB_RELOC_BR22",
670         "ARM_THUMB_32BIT_BRANCH",
671         "ARM_RELOC_HALF",
672         "ARM_RELOC_HALF_SECTDIFF" };
673
674       if (RType > 9)
675         res = "Unknown";
676       else
677         res = Table[RType];
678       break;
679     }
680     case Triple::aarch64: {
681       static const char *const Table[] = {
682         "ARM64_RELOC_UNSIGNED",           "ARM64_RELOC_SUBTRACTOR",
683         "ARM64_RELOC_BRANCH26",           "ARM64_RELOC_PAGE21",
684         "ARM64_RELOC_PAGEOFF12",          "ARM64_RELOC_GOT_LOAD_PAGE21",
685         "ARM64_RELOC_GOT_LOAD_PAGEOFF12", "ARM64_RELOC_POINTER_TO_GOT",
686         "ARM64_RELOC_TLVP_LOAD_PAGE21",   "ARM64_RELOC_TLVP_LOAD_PAGEOFF12",
687         "ARM64_RELOC_ADDEND"
688       };
689
690       if (RType >= array_lengthof(Table))
691         res = "Unknown";
692       else
693         res = Table[RType];
694       break;
695     }
696     case Triple::ppc: {
697       static const char *const Table[] =  {
698         "PPC_RELOC_VANILLA",
699         "PPC_RELOC_PAIR",
700         "PPC_RELOC_BR14",
701         "PPC_RELOC_BR24",
702         "PPC_RELOC_HI16",
703         "PPC_RELOC_LO16",
704         "PPC_RELOC_HA16",
705         "PPC_RELOC_LO14",
706         "PPC_RELOC_SECTDIFF",
707         "PPC_RELOC_PB_LA_PTR",
708         "PPC_RELOC_HI16_SECTDIFF",
709         "PPC_RELOC_LO16_SECTDIFF",
710         "PPC_RELOC_HA16_SECTDIFF",
711         "PPC_RELOC_JBSR",
712         "PPC_RELOC_LO14_SECTDIFF",
713         "PPC_RELOC_LOCAL_SECTDIFF" };
714
715       if (RType > 15)
716         res = "Unknown";
717       else
718         res = Table[RType];
719       break;
720     }
721     case Triple::UnknownArch:
722       res = "Unknown";
723       break;
724   }
725   Result.append(res.begin(), res.end());
726 }
727
728 uint8_t MachOObjectFile::getRelocationLength(DataRefImpl Rel) const {
729   MachO::any_relocation_info RE = getRelocation(Rel);
730   return getAnyRelocationLength(RE);
731 }
732
733 //
734 // guessLibraryShortName() is passed a name of a dynamic library and returns a
735 // guess on what the short name is.  Then name is returned as a substring of the
736 // StringRef Name passed in.  The name of the dynamic library is recognized as
737 // a framework if it has one of the two following forms:
738 //      Foo.framework/Versions/A/Foo
739 //      Foo.framework/Foo
740 // Where A and Foo can be any string.  And may contain a trailing suffix
741 // starting with an underbar.  If the Name is recognized as a framework then
742 // isFramework is set to true else it is set to false.  If the Name has a
743 // suffix then Suffix is set to the substring in Name that contains the suffix
744 // else it is set to a NULL StringRef.
745 //
746 // The Name of the dynamic library is recognized as a library name if it has
747 // one of the two following forms:
748 //      libFoo.A.dylib
749 //      libFoo.dylib
750 // The library may have a suffix trailing the name Foo of the form:
751 //      libFoo_profile.A.dylib
752 //      libFoo_profile.dylib
753 //
754 // The Name of the dynamic library is also recognized as a library name if it
755 // has the following form:
756 //      Foo.qtx
757 //
758 // If the Name of the dynamic library is none of the forms above then a NULL
759 // StringRef is returned.
760 //
761 StringRef MachOObjectFile::guessLibraryShortName(StringRef Name,
762                                                  bool &isFramework,
763                                                  StringRef &Suffix) {
764   StringRef Foo, F, DotFramework, V, Dylib, Lib, Dot, Qtx;
765   size_t a, b, c, d, Idx;
766
767   isFramework = false;
768   Suffix = StringRef();
769
770   // Pull off the last component and make Foo point to it
771   a = Name.rfind('/');
772   if (a == Name.npos || a == 0)
773     goto guess_library;
774   Foo = Name.slice(a+1, Name.npos);
775
776   // Look for a suffix starting with a '_'
777   Idx = Foo.rfind('_');
778   if (Idx != Foo.npos && Foo.size() >= 2) {
779     Suffix = Foo.slice(Idx, Foo.npos);
780     Foo = Foo.slice(0, Idx);
781   }
782
783   // First look for the form Foo.framework/Foo
784   b = Name.rfind('/', a);
785   if (b == Name.npos)
786     Idx = 0;
787   else
788     Idx = b+1;
789   F = Name.slice(Idx, Idx + Foo.size());
790   DotFramework = Name.slice(Idx + Foo.size(),
791                             Idx + Foo.size() + sizeof(".framework/")-1);
792   if (F == Foo && DotFramework == ".framework/") {
793     isFramework = true;
794     return Foo;
795   }
796
797   // Next look for the form Foo.framework/Versions/A/Foo
798   if (b == Name.npos)
799     goto guess_library;
800   c =  Name.rfind('/', b);
801   if (c == Name.npos || c == 0)
802     goto guess_library;
803   V = Name.slice(c+1, Name.npos);
804   if (!V.startswith("Versions/"))
805     goto guess_library;
806   d =  Name.rfind('/', c);
807   if (d == Name.npos)
808     Idx = 0;
809   else
810     Idx = d+1;
811   F = Name.slice(Idx, Idx + Foo.size());
812   DotFramework = Name.slice(Idx + Foo.size(),
813                             Idx + Foo.size() + sizeof(".framework/")-1);
814   if (F == Foo && DotFramework == ".framework/") {
815     isFramework = true;
816     return Foo;
817   }
818
819 guess_library:
820   // pull off the suffix after the "." and make a point to it
821   a = Name.rfind('.');
822   if (a == Name.npos || a == 0)
823     return StringRef();
824   Dylib = Name.slice(a, Name.npos);
825   if (Dylib != ".dylib")
826     goto guess_qtx;
827
828   // First pull off the version letter for the form Foo.A.dylib if any.
829   if (a >= 3) {
830     Dot = Name.slice(a-2, a-1);
831     if (Dot == ".")
832       a = a - 2;
833   }
834
835   b = Name.rfind('/', a);
836   if (b == Name.npos)
837     b = 0;
838   else
839     b = b+1;
840   // ignore any suffix after an underbar like Foo_profile.A.dylib
841   Idx = Name.find('_', b);
842   if (Idx != Name.npos && Idx != b) {
843     Lib = Name.slice(b, Idx);
844     Suffix = Name.slice(Idx, a);
845   }
846   else
847     Lib = Name.slice(b, a);
848   // There are incorrect library names of the form:
849   // libATS.A_profile.dylib so check for these.
850   if (Lib.size() >= 3) {
851     Dot = Lib.slice(Lib.size()-2, Lib.size()-1);
852     if (Dot == ".")
853       Lib = Lib.slice(0, Lib.size()-2);
854   }
855   return Lib;
856
857 guess_qtx:
858   Qtx = Name.slice(a, Name.npos);
859   if (Qtx != ".qtx")
860     return StringRef();
861   b = Name.rfind('/', a);
862   if (b == Name.npos)
863     Lib = Name.slice(0, a);
864   else
865     Lib = Name.slice(b+1, a);
866   // There are library names of the form: QT.A.qtx so check for these.
867   if (Lib.size() >= 3) {
868     Dot = Lib.slice(Lib.size()-2, Lib.size()-1);
869     if (Dot == ".")
870       Lib = Lib.slice(0, Lib.size()-2);
871   }
872   return Lib;
873 }
874
875 // getLibraryShortNameByIndex() is used to get the short name of the library
876 // for an undefined symbol in a linked Mach-O binary that was linked with the
877 // normal two-level namespace default (that is MH_TWOLEVEL in the header).
878 // It is passed the index (0 - based) of the library as translated from
879 // GET_LIBRARY_ORDINAL (1 - based).
880 std::error_code MachOObjectFile::getLibraryShortNameByIndex(unsigned Index,
881                                                          StringRef &Res) const {
882   if (Index >= Libraries.size())
883     return object_error::parse_failed;
884
885   // If the cache of LibrariesShortNames is not built up do that first for
886   // all the Libraries.
887   if (LibrariesShortNames.size() == 0) {
888     for (unsigned i = 0; i < Libraries.size(); i++) {
889       MachO::dylib_command D =
890         getStruct<MachO::dylib_command>(this, Libraries[i]);
891       if (D.dylib.name >= D.cmdsize)
892         return object_error::parse_failed;
893       const char *P = (const char *)(Libraries[i]) + D.dylib.name;
894       StringRef Name = StringRef(P);
895       if (D.dylib.name+Name.size() >= D.cmdsize)
896         return object_error::parse_failed;
897       StringRef Suffix;
898       bool isFramework;
899       StringRef shortName = guessLibraryShortName(Name, isFramework, Suffix);
900       if (shortName.empty())
901         LibrariesShortNames.push_back(Name);
902       else
903         LibrariesShortNames.push_back(shortName);
904     }
905   }
906
907   Res = LibrariesShortNames[Index];
908   return std::error_code();
909 }
910
911 section_iterator
912 MachOObjectFile::getRelocationRelocatedSection(relocation_iterator Rel) const {
913   DataRefImpl Sec;
914   Sec.d.a = Rel->getRawDataRefImpl().d.a;
915   return section_iterator(SectionRef(Sec, this));
916 }
917
918 basic_symbol_iterator MachOObjectFile::symbol_begin_impl() const {
919   return getSymbolByIndex(0);
920 }
921
922 basic_symbol_iterator MachOObjectFile::symbol_end_impl() const {
923   DataRefImpl DRI;
924   if (!SymtabLoadCmd)
925     return basic_symbol_iterator(SymbolRef(DRI, this));
926
927   MachO::symtab_command Symtab = getSymtabLoadCommand();
928   unsigned SymbolTableEntrySize = is64Bit() ?
929     sizeof(MachO::nlist_64) :
930     sizeof(MachO::nlist);
931   unsigned Offset = Symtab.symoff +
932     Symtab.nsyms * SymbolTableEntrySize;
933   DRI.p = reinterpret_cast<uintptr_t>(getPtr(this, Offset));
934   return basic_symbol_iterator(SymbolRef(DRI, this));
935 }
936
937 basic_symbol_iterator MachOObjectFile::getSymbolByIndex(unsigned Index) const {
938   DataRefImpl DRI;
939   if (!SymtabLoadCmd)
940     return basic_symbol_iterator(SymbolRef(DRI, this));
941
942   MachO::symtab_command Symtab = getSymtabLoadCommand();
943   if (Index >= Symtab.nsyms)
944     report_fatal_error("Requested symbol index is out of range.");
945   unsigned SymbolTableEntrySize =
946     is64Bit() ? sizeof(MachO::nlist_64) : sizeof(MachO::nlist);
947   DRI.p = reinterpret_cast<uintptr_t>(getPtr(this, Symtab.symoff));
948   DRI.p += Index * SymbolTableEntrySize;
949   return basic_symbol_iterator(SymbolRef(DRI, this));
950 }
951
952 section_iterator MachOObjectFile::section_begin() const {
953   DataRefImpl DRI;
954   return section_iterator(SectionRef(DRI, this));
955 }
956
957 section_iterator MachOObjectFile::section_end() const {
958   DataRefImpl DRI;
959   DRI.d.a = Sections.size();
960   return section_iterator(SectionRef(DRI, this));
961 }
962
963 uint8_t MachOObjectFile::getBytesInAddress() const {
964   return is64Bit() ? 8 : 4;
965 }
966
967 StringRef MachOObjectFile::getFileFormatName() const {
968   unsigned CPUType = getCPUType(this);
969   if (!is64Bit()) {
970     switch (CPUType) {
971     case llvm::MachO::CPU_TYPE_I386:
972       return "Mach-O 32-bit i386";
973     case llvm::MachO::CPU_TYPE_ARM:
974       return "Mach-O arm";
975     case llvm::MachO::CPU_TYPE_POWERPC:
976       return "Mach-O 32-bit ppc";
977     default:
978       return "Mach-O 32-bit unknown";
979     }
980   }
981
982   switch (CPUType) {
983   case llvm::MachO::CPU_TYPE_X86_64:
984     return "Mach-O 64-bit x86-64";
985   case llvm::MachO::CPU_TYPE_ARM64:
986     return "Mach-O arm64";
987   case llvm::MachO::CPU_TYPE_POWERPC64:
988     return "Mach-O 64-bit ppc64";
989   default:
990     return "Mach-O 64-bit unknown";
991   }
992 }
993
994 Triple::ArchType MachOObjectFile::getArch(uint32_t CPUType) {
995   switch (CPUType) {
996   case llvm::MachO::CPU_TYPE_I386:
997     return Triple::x86;
998   case llvm::MachO::CPU_TYPE_X86_64:
999     return Triple::x86_64;
1000   case llvm::MachO::CPU_TYPE_ARM:
1001     return Triple::arm;
1002   case llvm::MachO::CPU_TYPE_ARM64:
1003     return Triple::aarch64;
1004   case llvm::MachO::CPU_TYPE_POWERPC:
1005     return Triple::ppc;
1006   case llvm::MachO::CPU_TYPE_POWERPC64:
1007     return Triple::ppc64;
1008   default:
1009     return Triple::UnknownArch;
1010   }
1011 }
1012
1013 Triple MachOObjectFile::getArch(uint32_t CPUType, uint32_t CPUSubType,
1014                                 const char **McpuDefault) {
1015   if (McpuDefault)
1016     *McpuDefault = nullptr;
1017
1018   switch (CPUType) {
1019   case MachO::CPU_TYPE_I386:
1020     switch (CPUSubType & ~MachO::CPU_SUBTYPE_MASK) {
1021     case MachO::CPU_SUBTYPE_I386_ALL:
1022       return Triple("i386-apple-darwin");
1023     default:
1024       return Triple();
1025     }
1026   case MachO::CPU_TYPE_X86_64:
1027     switch (CPUSubType & ~MachO::CPU_SUBTYPE_MASK) {
1028     case MachO::CPU_SUBTYPE_X86_64_ALL:
1029       return Triple("x86_64-apple-darwin");
1030     case MachO::CPU_SUBTYPE_X86_64_H:
1031       return Triple("x86_64h-apple-darwin");
1032     default:
1033       return Triple();
1034     }
1035   case MachO::CPU_TYPE_ARM:
1036     switch (CPUSubType & ~MachO::CPU_SUBTYPE_MASK) {
1037     case MachO::CPU_SUBTYPE_ARM_V4T:
1038       return Triple("armv4t-apple-darwin");
1039     case MachO::CPU_SUBTYPE_ARM_V5TEJ:
1040       return Triple("armv5e-apple-darwin");
1041     case MachO::CPU_SUBTYPE_ARM_XSCALE:
1042       return Triple("xscale-apple-darwin");
1043     case MachO::CPU_SUBTYPE_ARM_V6:
1044       return Triple("armv6-apple-darwin");
1045     case MachO::CPU_SUBTYPE_ARM_V6M:
1046       if (McpuDefault)
1047         *McpuDefault = "cortex-m0";
1048       return Triple("armv6m-apple-darwin");
1049     case MachO::CPU_SUBTYPE_ARM_V7:
1050       return Triple("armv7-apple-darwin");
1051     case MachO::CPU_SUBTYPE_ARM_V7EM:
1052       if (McpuDefault)
1053         *McpuDefault = "cortex-m4";
1054       return Triple("armv7em-apple-darwin");
1055     case MachO::CPU_SUBTYPE_ARM_V7K:
1056       return Triple("armv7k-apple-darwin");
1057     case MachO::CPU_SUBTYPE_ARM_V7M:
1058       if (McpuDefault)
1059         *McpuDefault = "cortex-m3";
1060       return Triple("armv7m-apple-darwin");
1061     case MachO::CPU_SUBTYPE_ARM_V7S:
1062       return Triple("armv7s-apple-darwin");
1063     default:
1064       return Triple();
1065     }
1066   case MachO::CPU_TYPE_ARM64:
1067     switch (CPUSubType & ~MachO::CPU_SUBTYPE_MASK) {
1068     case MachO::CPU_SUBTYPE_ARM64_ALL:
1069       return Triple("arm64-apple-darwin");
1070     default:
1071       return Triple();
1072     }
1073   case MachO::CPU_TYPE_POWERPC:
1074     switch (CPUSubType & ~MachO::CPU_SUBTYPE_MASK) {
1075     case MachO::CPU_SUBTYPE_POWERPC_ALL:
1076       return Triple("ppc-apple-darwin");
1077     default:
1078       return Triple();
1079     }
1080   case MachO::CPU_TYPE_POWERPC64:
1081     switch (CPUSubType & ~MachO::CPU_SUBTYPE_MASK) {
1082     case MachO::CPU_SUBTYPE_POWERPC_ALL:
1083       return Triple("ppc64-apple-darwin");
1084     default:
1085       return Triple();
1086     }
1087   default:
1088     return Triple();
1089   }
1090 }
1091
1092 Triple MachOObjectFile::getThumbArch(uint32_t CPUType, uint32_t CPUSubType,
1093                                      const char **McpuDefault) {
1094   if (McpuDefault)
1095     *McpuDefault = nullptr;
1096
1097   switch (CPUType) {
1098   case MachO::CPU_TYPE_ARM:
1099     switch (CPUSubType & ~MachO::CPU_SUBTYPE_MASK) {
1100     case MachO::CPU_SUBTYPE_ARM_V4T:
1101       return Triple("thumbv4t-apple-darwin");
1102     case MachO::CPU_SUBTYPE_ARM_V5TEJ:
1103       return Triple("thumbv5e-apple-darwin");
1104     case MachO::CPU_SUBTYPE_ARM_XSCALE:
1105       return Triple("xscale-apple-darwin");
1106     case MachO::CPU_SUBTYPE_ARM_V6:
1107       return Triple("thumbv6-apple-darwin");
1108     case MachO::CPU_SUBTYPE_ARM_V6M:
1109       if (McpuDefault)
1110         *McpuDefault = "cortex-m0";
1111       return Triple("thumbv6m-apple-darwin");
1112     case MachO::CPU_SUBTYPE_ARM_V7:
1113       return Triple("thumbv7-apple-darwin");
1114     case MachO::CPU_SUBTYPE_ARM_V7EM:
1115       if (McpuDefault)
1116         *McpuDefault = "cortex-m4";
1117       return Triple("thumbv7em-apple-darwin");
1118     case MachO::CPU_SUBTYPE_ARM_V7K:
1119       return Triple("thumbv7k-apple-darwin");
1120     case MachO::CPU_SUBTYPE_ARM_V7M:
1121       if (McpuDefault)
1122         *McpuDefault = "cortex-m3";
1123       return Triple("thumbv7m-apple-darwin");
1124     case MachO::CPU_SUBTYPE_ARM_V7S:
1125       return Triple("thumbv7s-apple-darwin");
1126     default:
1127       return Triple();
1128     }
1129   default:
1130     return Triple();
1131   }
1132 }
1133
1134 Triple MachOObjectFile::getArch(uint32_t CPUType, uint32_t CPUSubType,
1135                                 const char **McpuDefault, Triple *ThumbTriple) {
1136   Triple T = MachOObjectFile::getArch(CPUType, CPUSubType, McpuDefault);
1137   *ThumbTriple = MachOObjectFile::getThumbArch(CPUType, CPUSubType,
1138                                                McpuDefault);
1139   return T;
1140 }
1141
1142 Triple MachOObjectFile::getHostArch() {
1143   return Triple(sys::getDefaultTargetTriple());
1144 }
1145
1146 bool MachOObjectFile::isValidArch(StringRef ArchFlag) {
1147   return StringSwitch<bool>(ArchFlag)
1148       .Case("i386", true)
1149       .Case("x86_64", true)
1150       .Case("x86_64h", true)
1151       .Case("armv4t", true)
1152       .Case("arm", true)
1153       .Case("armv5e", true)
1154       .Case("armv6", true)
1155       .Case("armv6m", true)
1156       .Case("armv7", true)
1157       .Case("armv7em", true)
1158       .Case("armv7k", true)
1159       .Case("armv7m", true)
1160       .Case("armv7s", true)
1161       .Case("arm64", true)
1162       .Case("ppc", true)
1163       .Case("ppc64", true)
1164       .Default(false);
1165 }
1166
1167 unsigned MachOObjectFile::getArch() const {
1168   return getArch(getCPUType(this));
1169 }
1170
1171 Triple MachOObjectFile::getArch(const char **McpuDefault,
1172                                 Triple *ThumbTriple) const {
1173   *ThumbTriple = getThumbArch(Header.cputype, Header.cpusubtype, McpuDefault);
1174   return getArch(Header.cputype, Header.cpusubtype, McpuDefault);
1175 }
1176
1177 relocation_iterator MachOObjectFile::section_rel_begin(unsigned Index) const {
1178   DataRefImpl DRI;
1179   DRI.d.a = Index;
1180   return section_rel_begin(DRI);
1181 }
1182
1183 relocation_iterator MachOObjectFile::section_rel_end(unsigned Index) const {
1184   DataRefImpl DRI;
1185   DRI.d.a = Index;
1186   return section_rel_end(DRI);
1187 }
1188
1189 dice_iterator MachOObjectFile::begin_dices() const {
1190   DataRefImpl DRI;
1191   if (!DataInCodeLoadCmd)
1192     return dice_iterator(DiceRef(DRI, this));
1193
1194   MachO::linkedit_data_command DicLC = getDataInCodeLoadCommand();
1195   DRI.p = reinterpret_cast<uintptr_t>(getPtr(this, DicLC.dataoff));
1196   return dice_iterator(DiceRef(DRI, this));
1197 }
1198
1199 dice_iterator MachOObjectFile::end_dices() const {
1200   DataRefImpl DRI;
1201   if (!DataInCodeLoadCmd)
1202     return dice_iterator(DiceRef(DRI, this));
1203
1204   MachO::linkedit_data_command DicLC = getDataInCodeLoadCommand();
1205   unsigned Offset = DicLC.dataoff + DicLC.datasize;
1206   DRI.p = reinterpret_cast<uintptr_t>(getPtr(this, Offset));
1207   return dice_iterator(DiceRef(DRI, this));
1208 }
1209
1210 ExportEntry::ExportEntry(ArrayRef<uint8_t> T)
1211     : Trie(T), Malformed(false), Done(false) {}
1212
1213 void ExportEntry::moveToFirst() {
1214   pushNode(0);
1215   pushDownUntilBottom();
1216 }
1217
1218 void ExportEntry::moveToEnd() {
1219   Stack.clear();
1220   Done = true;
1221 }
1222
1223 bool ExportEntry::operator==(const ExportEntry &Other) const {
1224   // Common case, one at end, other iterating from begin.
1225   if (Done || Other.Done)
1226     return (Done == Other.Done);
1227   // Not equal if different stack sizes.
1228   if (Stack.size() != Other.Stack.size())
1229     return false;
1230   // Not equal if different cumulative strings.
1231   if (!CumulativeString.equals(Other.CumulativeString))
1232     return false;
1233   // Equal if all nodes in both stacks match.
1234   for (unsigned i=0; i < Stack.size(); ++i) {
1235     if (Stack[i].Start != Other.Stack[i].Start)
1236       return false;
1237   }
1238   return true;
1239 }
1240
1241 uint64_t ExportEntry::readULEB128(const uint8_t *&Ptr) {
1242   unsigned Count;
1243   uint64_t Result = decodeULEB128(Ptr, &Count);
1244   Ptr += Count;
1245   if (Ptr > Trie.end()) {
1246     Ptr = Trie.end();
1247     Malformed = true;
1248   }
1249   return Result;
1250 }
1251
1252 StringRef ExportEntry::name() const {
1253   return CumulativeString;
1254 }
1255
1256 uint64_t ExportEntry::flags() const {
1257   return Stack.back().Flags;
1258 }
1259
1260 uint64_t ExportEntry::address() const {
1261   return Stack.back().Address;
1262 }
1263
1264 uint64_t ExportEntry::other() const {
1265   return Stack.back().Other;
1266 }
1267
1268 StringRef ExportEntry::otherName() const {
1269   const char* ImportName = Stack.back().ImportName;
1270   if (ImportName)
1271     return StringRef(ImportName);
1272   return StringRef();
1273 }
1274
1275 uint32_t ExportEntry::nodeOffset() const {
1276   return Stack.back().Start - Trie.begin();
1277 }
1278
1279 ExportEntry::NodeState::NodeState(const uint8_t *Ptr)
1280     : Start(Ptr), Current(Ptr), Flags(0), Address(0), Other(0),
1281       ImportName(nullptr), ChildCount(0), NextChildIndex(0),
1282       ParentStringLength(0), IsExportNode(false) {}
1283
1284 void ExportEntry::pushNode(uint64_t offset) {
1285   const uint8_t *Ptr = Trie.begin() + offset;
1286   NodeState State(Ptr);
1287   uint64_t ExportInfoSize = readULEB128(State.Current);
1288   State.IsExportNode = (ExportInfoSize != 0);
1289   const uint8_t* Children = State.Current + ExportInfoSize;
1290   if (State.IsExportNode) {
1291     State.Flags = readULEB128(State.Current);
1292     if (State.Flags & MachO::EXPORT_SYMBOL_FLAGS_REEXPORT) {
1293       State.Address = 0;
1294       State.Other = readULEB128(State.Current); // dylib ordinal
1295       State.ImportName = reinterpret_cast<const char*>(State.Current);
1296     } else {
1297       State.Address = readULEB128(State.Current);
1298       if (State.Flags & MachO::EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER)
1299         State.Other = readULEB128(State.Current);
1300     }
1301   }
1302   State.ChildCount = *Children;
1303   State.Current = Children + 1;
1304   State.NextChildIndex = 0;
1305   State.ParentStringLength = CumulativeString.size();
1306   Stack.push_back(State);
1307 }
1308
1309 void ExportEntry::pushDownUntilBottom() {
1310   while (Stack.back().NextChildIndex < Stack.back().ChildCount) {
1311     NodeState &Top = Stack.back();
1312     CumulativeString.resize(Top.ParentStringLength);
1313     for (;*Top.Current != 0; Top.Current++) {
1314       char C = *Top.Current;
1315       CumulativeString.push_back(C);
1316     }
1317     Top.Current += 1;
1318     uint64_t childNodeIndex = readULEB128(Top.Current);
1319     Top.NextChildIndex += 1;
1320     pushNode(childNodeIndex);
1321   }
1322   if (!Stack.back().IsExportNode) {
1323     Malformed = true;
1324     moveToEnd();
1325   }
1326 }
1327
1328 // We have a trie data structure and need a way to walk it that is compatible
1329 // with the C++ iterator model. The solution is a non-recursive depth first
1330 // traversal where the iterator contains a stack of parent nodes along with a
1331 // string that is the accumulation of all edge strings along the parent chain
1332 // to this point.
1333 //
1334 // There is one "export" node for each exported symbol.  But because some
1335 // symbols may be a prefix of another symbol (e.g. _dup and _dup2), an export
1336 // node may have child nodes too.
1337 //
1338 // The algorithm for moveNext() is to keep moving down the leftmost unvisited
1339 // child until hitting a node with no children (which is an export node or
1340 // else the trie is malformed). On the way down, each node is pushed on the
1341 // stack ivar.  If there is no more ways down, it pops up one and tries to go
1342 // down a sibling path until a childless node is reached.
1343 void ExportEntry::moveNext() {
1344   if (Stack.empty() || !Stack.back().IsExportNode) {
1345     Malformed = true;
1346     moveToEnd();
1347     return;
1348   }
1349
1350   Stack.pop_back();
1351   while (!Stack.empty()) {
1352     NodeState &Top = Stack.back();
1353     if (Top.NextChildIndex < Top.ChildCount) {
1354       pushDownUntilBottom();
1355       // Now at the next export node.
1356       return;
1357     } else {
1358       if (Top.IsExportNode) {
1359         // This node has no children but is itself an export node.
1360         CumulativeString.resize(Top.ParentStringLength);
1361         return;
1362       }
1363       Stack.pop_back();
1364     }
1365   }
1366   Done = true;
1367 }
1368
1369 iterator_range<export_iterator>
1370 MachOObjectFile::exports(ArrayRef<uint8_t> Trie) {
1371   ExportEntry Start(Trie);
1372   if (Trie.size() == 0)
1373     Start.moveToEnd();
1374   else
1375     Start.moveToFirst();
1376
1377   ExportEntry Finish(Trie);
1378   Finish.moveToEnd();
1379
1380   return iterator_range<export_iterator>(export_iterator(Start),
1381                                          export_iterator(Finish));
1382 }
1383
1384 iterator_range<export_iterator> MachOObjectFile::exports() const {
1385   return exports(getDyldInfoExportsTrie());
1386 }
1387
1388 MachORebaseEntry::MachORebaseEntry(ArrayRef<uint8_t> Bytes, bool is64Bit)
1389     : Opcodes(Bytes), Ptr(Bytes.begin()), SegmentOffset(0), SegmentIndex(0),
1390       RemainingLoopCount(0), AdvanceAmount(0), RebaseType(0),
1391       PointerSize(is64Bit ? 8 : 4), Malformed(false), Done(false) {}
1392
1393 void MachORebaseEntry::moveToFirst() {
1394   Ptr = Opcodes.begin();
1395   moveNext();
1396 }
1397
1398 void MachORebaseEntry::moveToEnd() {
1399   Ptr = Opcodes.end();
1400   RemainingLoopCount = 0;
1401   Done = true;
1402 }
1403
1404 void MachORebaseEntry::moveNext() {
1405   // If in the middle of some loop, move to next rebasing in loop.
1406   SegmentOffset += AdvanceAmount;
1407   if (RemainingLoopCount) {
1408     --RemainingLoopCount;
1409     return;
1410   }
1411   if (Ptr == Opcodes.end()) {
1412     Done = true;
1413     return;
1414   }
1415   bool More = true;
1416   while (More && !Malformed) {
1417     // Parse next opcode and set up next loop.
1418     uint8_t Byte = *Ptr++;
1419     uint8_t ImmValue = Byte & MachO::REBASE_IMMEDIATE_MASK;
1420     uint8_t Opcode = Byte & MachO::REBASE_OPCODE_MASK;
1421     switch (Opcode) {
1422     case MachO::REBASE_OPCODE_DONE:
1423       More = false;
1424       Done = true;
1425       moveToEnd();
1426       DEBUG_WITH_TYPE("mach-o-rebase", llvm::dbgs() << "REBASE_OPCODE_DONE\n");
1427       break;
1428     case MachO::REBASE_OPCODE_SET_TYPE_IMM:
1429       RebaseType = ImmValue;
1430       DEBUG_WITH_TYPE(
1431           "mach-o-rebase",
1432           llvm::dbgs() << "REBASE_OPCODE_SET_TYPE_IMM: "
1433                        << "RebaseType=" << (int) RebaseType << "\n");
1434       break;
1435     case MachO::REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB:
1436       SegmentIndex = ImmValue;
1437       SegmentOffset = readULEB128();
1438       DEBUG_WITH_TYPE(
1439           "mach-o-rebase",
1440           llvm::dbgs() << "REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB: "
1441                        << "SegmentIndex=" << SegmentIndex << ", "
1442                        << format("SegmentOffset=0x%06X", SegmentOffset)
1443                        << "\n");
1444       break;
1445     case MachO::REBASE_OPCODE_ADD_ADDR_ULEB:
1446       SegmentOffset += readULEB128();
1447       DEBUG_WITH_TYPE("mach-o-rebase",
1448                       llvm::dbgs() << "REBASE_OPCODE_ADD_ADDR_ULEB: "
1449                                    << format("SegmentOffset=0x%06X",
1450                                              SegmentOffset) << "\n");
1451       break;
1452     case MachO::REBASE_OPCODE_ADD_ADDR_IMM_SCALED:
1453       SegmentOffset += ImmValue * PointerSize;
1454       DEBUG_WITH_TYPE("mach-o-rebase",
1455                       llvm::dbgs() << "REBASE_OPCODE_ADD_ADDR_IMM_SCALED: "
1456                                    << format("SegmentOffset=0x%06X",
1457                                              SegmentOffset) << "\n");
1458       break;
1459     case MachO::REBASE_OPCODE_DO_REBASE_IMM_TIMES:
1460       AdvanceAmount = PointerSize;
1461       RemainingLoopCount = ImmValue - 1;
1462       DEBUG_WITH_TYPE(
1463           "mach-o-rebase",
1464           llvm::dbgs() << "REBASE_OPCODE_DO_REBASE_IMM_TIMES: "
1465                        << format("SegmentOffset=0x%06X", SegmentOffset)
1466                        << ", AdvanceAmount=" << AdvanceAmount
1467                        << ", RemainingLoopCount=" << RemainingLoopCount
1468                        << "\n");
1469       return;
1470     case MachO::REBASE_OPCODE_DO_REBASE_ULEB_TIMES:
1471       AdvanceAmount = PointerSize;
1472       RemainingLoopCount = readULEB128() - 1;
1473       DEBUG_WITH_TYPE(
1474           "mach-o-rebase",
1475           llvm::dbgs() << "REBASE_OPCODE_DO_REBASE_ULEB_TIMES: "
1476                        << format("SegmentOffset=0x%06X", SegmentOffset)
1477                        << ", AdvanceAmount=" << AdvanceAmount
1478                        << ", RemainingLoopCount=" << RemainingLoopCount
1479                        << "\n");
1480       return;
1481     case MachO::REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB:
1482       AdvanceAmount = readULEB128() + PointerSize;
1483       RemainingLoopCount = 0;
1484       DEBUG_WITH_TYPE(
1485           "mach-o-rebase",
1486           llvm::dbgs() << "REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB: "
1487                        << format("SegmentOffset=0x%06X", SegmentOffset)
1488                        << ", AdvanceAmount=" << AdvanceAmount
1489                        << ", RemainingLoopCount=" << RemainingLoopCount
1490                        << "\n");
1491       return;
1492     case MachO::REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB:
1493       RemainingLoopCount = readULEB128() - 1;
1494       AdvanceAmount = readULEB128() + PointerSize;
1495       DEBUG_WITH_TYPE(
1496           "mach-o-rebase",
1497           llvm::dbgs() << "REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB: "
1498                        << format("SegmentOffset=0x%06X", SegmentOffset)
1499                        << ", AdvanceAmount=" << AdvanceAmount
1500                        << ", RemainingLoopCount=" << RemainingLoopCount
1501                        << "\n");
1502       return;
1503     default:
1504       Malformed = true;
1505     }
1506   }
1507 }
1508
1509 uint64_t MachORebaseEntry::readULEB128() {
1510   unsigned Count;
1511   uint64_t Result = decodeULEB128(Ptr, &Count);
1512   Ptr += Count;
1513   if (Ptr > Opcodes.end()) {
1514     Ptr = Opcodes.end();
1515     Malformed = true;
1516   }
1517   return Result;
1518 }
1519
1520 uint32_t MachORebaseEntry::segmentIndex() const { return SegmentIndex; }
1521
1522 uint64_t MachORebaseEntry::segmentOffset() const { return SegmentOffset; }
1523
1524 StringRef MachORebaseEntry::typeName() const {
1525   switch (RebaseType) {
1526   case MachO::REBASE_TYPE_POINTER:
1527     return "pointer";
1528   case MachO::REBASE_TYPE_TEXT_ABSOLUTE32:
1529     return "text abs32";
1530   case MachO::REBASE_TYPE_TEXT_PCREL32:
1531     return "text rel32";
1532   }
1533   return "unknown";
1534 }
1535
1536 bool MachORebaseEntry::operator==(const MachORebaseEntry &Other) const {
1537   assert(Opcodes == Other.Opcodes && "compare iterators of different files");
1538   return (Ptr == Other.Ptr) &&
1539          (RemainingLoopCount == Other.RemainingLoopCount) &&
1540          (Done == Other.Done);
1541 }
1542
1543 iterator_range<rebase_iterator>
1544 MachOObjectFile::rebaseTable(ArrayRef<uint8_t> Opcodes, bool is64) {
1545   MachORebaseEntry Start(Opcodes, is64);
1546   Start.moveToFirst();
1547
1548   MachORebaseEntry Finish(Opcodes, is64);
1549   Finish.moveToEnd();
1550
1551   return iterator_range<rebase_iterator>(rebase_iterator(Start),
1552                                          rebase_iterator(Finish));
1553 }
1554
1555 iterator_range<rebase_iterator> MachOObjectFile::rebaseTable() const {
1556   return rebaseTable(getDyldInfoRebaseOpcodes(), is64Bit());
1557 }
1558
1559 MachOBindEntry::MachOBindEntry(ArrayRef<uint8_t> Bytes, bool is64Bit, Kind BK)
1560     : Opcodes(Bytes), Ptr(Bytes.begin()), SegmentOffset(0), SegmentIndex(0),
1561       Ordinal(0), Flags(0), Addend(0), RemainingLoopCount(0), AdvanceAmount(0),
1562       BindType(0), PointerSize(is64Bit ? 8 : 4),
1563       TableKind(BK), Malformed(false), Done(false) {}
1564
1565 void MachOBindEntry::moveToFirst() {
1566   Ptr = Opcodes.begin();
1567   moveNext();
1568 }
1569
1570 void MachOBindEntry::moveToEnd() {
1571   Ptr = Opcodes.end();
1572   RemainingLoopCount = 0;
1573   Done = true;
1574 }
1575
1576 void MachOBindEntry::moveNext() {
1577   // If in the middle of some loop, move to next binding in loop.
1578   SegmentOffset += AdvanceAmount;
1579   if (RemainingLoopCount) {
1580     --RemainingLoopCount;
1581     return;
1582   }
1583   if (Ptr == Opcodes.end()) {
1584     Done = true;
1585     return;
1586   }
1587   bool More = true;
1588   while (More && !Malformed) {
1589     // Parse next opcode and set up next loop.
1590     uint8_t Byte = *Ptr++;
1591     uint8_t ImmValue = Byte & MachO::BIND_IMMEDIATE_MASK;
1592     uint8_t Opcode = Byte & MachO::BIND_OPCODE_MASK;
1593     int8_t SignExtended;
1594     const uint8_t *SymStart;
1595     switch (Opcode) {
1596     case MachO::BIND_OPCODE_DONE:
1597       if (TableKind == Kind::Lazy) {
1598         // Lazying bindings have a DONE opcode between entries.  Need to ignore
1599         // it to advance to next entry.  But need not if this is last entry.
1600         bool NotLastEntry = false;
1601         for (const uint8_t *P = Ptr; P < Opcodes.end(); ++P) {
1602           if (*P) {
1603             NotLastEntry = true;
1604           }
1605         }
1606         if (NotLastEntry)
1607           break;
1608       }
1609       More = false;
1610       Done = true;
1611       moveToEnd();
1612       DEBUG_WITH_TYPE("mach-o-bind", llvm::dbgs() << "BIND_OPCODE_DONE\n");
1613       break;
1614     case MachO::BIND_OPCODE_SET_DYLIB_ORDINAL_IMM:
1615       Ordinal = ImmValue;
1616       DEBUG_WITH_TYPE(
1617           "mach-o-bind",
1618           llvm::dbgs() << "BIND_OPCODE_SET_DYLIB_ORDINAL_IMM: "
1619                        << "Ordinal=" << Ordinal << "\n");
1620       break;
1621     case MachO::BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB:
1622       Ordinal = readULEB128();
1623       DEBUG_WITH_TYPE(
1624           "mach-o-bind",
1625           llvm::dbgs() << "BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB: "
1626                        << "Ordinal=" << Ordinal << "\n");
1627       break;
1628     case MachO::BIND_OPCODE_SET_DYLIB_SPECIAL_IMM:
1629       if (ImmValue) {
1630         SignExtended = MachO::BIND_OPCODE_MASK | ImmValue;
1631         Ordinal = SignExtended;
1632       } else
1633         Ordinal = 0;
1634       DEBUG_WITH_TYPE(
1635           "mach-o-bind",
1636           llvm::dbgs() << "BIND_OPCODE_SET_DYLIB_SPECIAL_IMM: "
1637                        << "Ordinal=" << Ordinal << "\n");
1638       break;
1639     case MachO::BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM:
1640       Flags = ImmValue;
1641       SymStart = Ptr;
1642       while (*Ptr) {
1643         ++Ptr;
1644       }
1645       SymbolName = StringRef(reinterpret_cast<const char*>(SymStart),
1646                              Ptr-SymStart);
1647       ++Ptr;
1648       DEBUG_WITH_TYPE(
1649           "mach-o-bind",
1650           llvm::dbgs() << "BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM: "
1651                        << "SymbolName=" << SymbolName << "\n");
1652       if (TableKind == Kind::Weak) {
1653         if (ImmValue & MachO::BIND_SYMBOL_FLAGS_NON_WEAK_DEFINITION)
1654           return;
1655       }
1656       break;
1657     case MachO::BIND_OPCODE_SET_TYPE_IMM:
1658       BindType = ImmValue;
1659       DEBUG_WITH_TYPE(
1660           "mach-o-bind",
1661           llvm::dbgs() << "BIND_OPCODE_SET_TYPE_IMM: "
1662                        << "BindType=" << (int)BindType << "\n");
1663       break;
1664     case MachO::BIND_OPCODE_SET_ADDEND_SLEB:
1665       Addend = readSLEB128();
1666       if (TableKind == Kind::Lazy)
1667         Malformed = true;
1668       DEBUG_WITH_TYPE(
1669           "mach-o-bind",
1670           llvm::dbgs() << "BIND_OPCODE_SET_ADDEND_SLEB: "
1671                        << "Addend=" << Addend << "\n");
1672       break;
1673     case MachO::BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB:
1674       SegmentIndex = ImmValue;
1675       SegmentOffset = readULEB128();
1676       DEBUG_WITH_TYPE(
1677           "mach-o-bind",
1678           llvm::dbgs() << "BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB: "
1679                        << "SegmentIndex=" << SegmentIndex << ", "
1680                        << format("SegmentOffset=0x%06X", SegmentOffset)
1681                        << "\n");
1682       break;
1683     case MachO::BIND_OPCODE_ADD_ADDR_ULEB:
1684       SegmentOffset += readULEB128();
1685       DEBUG_WITH_TYPE("mach-o-bind",
1686                       llvm::dbgs() << "BIND_OPCODE_ADD_ADDR_ULEB: "
1687                                    << format("SegmentOffset=0x%06X",
1688                                              SegmentOffset) << "\n");
1689       break;
1690     case MachO::BIND_OPCODE_DO_BIND:
1691       AdvanceAmount = PointerSize;
1692       RemainingLoopCount = 0;
1693       DEBUG_WITH_TYPE("mach-o-bind",
1694                       llvm::dbgs() << "BIND_OPCODE_DO_BIND: "
1695                                    << format("SegmentOffset=0x%06X",
1696                                              SegmentOffset) << "\n");
1697       return;
1698      case MachO::BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB:
1699       AdvanceAmount = readULEB128() + PointerSize;
1700       RemainingLoopCount = 0;
1701       if (TableKind == Kind::Lazy)
1702         Malformed = true;
1703       DEBUG_WITH_TYPE(
1704           "mach-o-bind",
1705           llvm::dbgs() << "BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB: "
1706                        << format("SegmentOffset=0x%06X", SegmentOffset)
1707                        << ", AdvanceAmount=" << AdvanceAmount
1708                        << ", RemainingLoopCount=" << RemainingLoopCount
1709                        << "\n");
1710       return;
1711     case MachO::BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED:
1712       AdvanceAmount = ImmValue * PointerSize + PointerSize;
1713       RemainingLoopCount = 0;
1714       if (TableKind == Kind::Lazy)
1715         Malformed = true;
1716       DEBUG_WITH_TYPE("mach-o-bind",
1717                       llvm::dbgs()
1718                       << "BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED: "
1719                       << format("SegmentOffset=0x%06X",
1720                                              SegmentOffset) << "\n");
1721       return;
1722     case MachO::BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB:
1723       RemainingLoopCount = readULEB128() - 1;
1724       AdvanceAmount = readULEB128() + PointerSize;
1725       if (TableKind == Kind::Lazy)
1726         Malformed = true;
1727       DEBUG_WITH_TYPE(
1728           "mach-o-bind",
1729           llvm::dbgs() << "BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB: "
1730                        << format("SegmentOffset=0x%06X", SegmentOffset)
1731                        << ", AdvanceAmount=" << AdvanceAmount
1732                        << ", RemainingLoopCount=" << RemainingLoopCount
1733                        << "\n");
1734       return;
1735     default:
1736       Malformed = true;
1737     }
1738   }
1739 }
1740
1741 uint64_t MachOBindEntry::readULEB128() {
1742   unsigned Count;
1743   uint64_t Result = decodeULEB128(Ptr, &Count);
1744   Ptr += Count;
1745   if (Ptr > Opcodes.end()) {
1746     Ptr = Opcodes.end();
1747     Malformed = true;
1748   }
1749   return Result;
1750 }
1751
1752 int64_t MachOBindEntry::readSLEB128() {
1753   unsigned Count;
1754   int64_t Result = decodeSLEB128(Ptr, &Count);
1755   Ptr += Count;
1756   if (Ptr > Opcodes.end()) {
1757     Ptr = Opcodes.end();
1758     Malformed = true;
1759   }
1760   return Result;
1761 }
1762
1763 uint32_t MachOBindEntry::segmentIndex() const { return SegmentIndex; }
1764
1765 uint64_t MachOBindEntry::segmentOffset() const { return SegmentOffset; }
1766
1767 StringRef MachOBindEntry::typeName() const {
1768   switch (BindType) {
1769   case MachO::BIND_TYPE_POINTER:
1770     return "pointer";
1771   case MachO::BIND_TYPE_TEXT_ABSOLUTE32:
1772     return "text abs32";
1773   case MachO::BIND_TYPE_TEXT_PCREL32:
1774     return "text rel32";
1775   }
1776   return "unknown";
1777 }
1778
1779 StringRef MachOBindEntry::symbolName() const { return SymbolName; }
1780
1781 int64_t MachOBindEntry::addend() const { return Addend; }
1782
1783 uint32_t MachOBindEntry::flags() const { return Flags; }
1784
1785 int MachOBindEntry::ordinal() const { return Ordinal; }
1786
1787 bool MachOBindEntry::operator==(const MachOBindEntry &Other) const {
1788   assert(Opcodes == Other.Opcodes && "compare iterators of different files");
1789   return (Ptr == Other.Ptr) &&
1790          (RemainingLoopCount == Other.RemainingLoopCount) &&
1791          (Done == Other.Done);
1792 }
1793
1794 iterator_range<bind_iterator>
1795 MachOObjectFile::bindTable(ArrayRef<uint8_t> Opcodes, bool is64,
1796                            MachOBindEntry::Kind BKind) {
1797   MachOBindEntry Start(Opcodes, is64, BKind);
1798   Start.moveToFirst();
1799
1800   MachOBindEntry Finish(Opcodes, is64, BKind);
1801   Finish.moveToEnd();
1802
1803   return iterator_range<bind_iterator>(bind_iterator(Start),
1804                                        bind_iterator(Finish));
1805 }
1806
1807 iterator_range<bind_iterator> MachOObjectFile::bindTable() const {
1808   return bindTable(getDyldInfoBindOpcodes(), is64Bit(),
1809                    MachOBindEntry::Kind::Regular);
1810 }
1811
1812 iterator_range<bind_iterator> MachOObjectFile::lazyBindTable() const {
1813   return bindTable(getDyldInfoLazyBindOpcodes(), is64Bit(),
1814                    MachOBindEntry::Kind::Lazy);
1815 }
1816
1817 iterator_range<bind_iterator> MachOObjectFile::weakBindTable() const {
1818   return bindTable(getDyldInfoWeakBindOpcodes(), is64Bit(),
1819                    MachOBindEntry::Kind::Weak);
1820 }
1821
1822 MachOObjectFile::load_command_iterator
1823 MachOObjectFile::begin_load_commands() const {
1824   return LoadCommands.begin();
1825 }
1826
1827 MachOObjectFile::load_command_iterator
1828 MachOObjectFile::end_load_commands() const {
1829   return LoadCommands.end();
1830 }
1831
1832 iterator_range<MachOObjectFile::load_command_iterator>
1833 MachOObjectFile::load_commands() const {
1834   return iterator_range<load_command_iterator>(begin_load_commands(),
1835                                                end_load_commands());
1836 }
1837
1838 StringRef
1839 MachOObjectFile::getSectionFinalSegmentName(DataRefImpl Sec) const {
1840   ArrayRef<char> Raw = getSectionRawFinalSegmentName(Sec);
1841   return parseSegmentOrSectionName(Raw.data());
1842 }
1843
1844 ArrayRef<char>
1845 MachOObjectFile::getSectionRawName(DataRefImpl Sec) const {
1846   assert(Sec.d.a < Sections.size() && "Should have detected this earlier");
1847   const section_base *Base =
1848     reinterpret_cast<const section_base *>(Sections[Sec.d.a]);
1849   return makeArrayRef(Base->sectname);
1850 }
1851
1852 ArrayRef<char>
1853 MachOObjectFile::getSectionRawFinalSegmentName(DataRefImpl Sec) const {
1854   assert(Sec.d.a < Sections.size() && "Should have detected this earlier");
1855   const section_base *Base =
1856     reinterpret_cast<const section_base *>(Sections[Sec.d.a]);
1857   return makeArrayRef(Base->segname);
1858 }
1859
1860 bool
1861 MachOObjectFile::isRelocationScattered(const MachO::any_relocation_info &RE)
1862   const {
1863   if (getCPUType(this) == MachO::CPU_TYPE_X86_64)
1864     return false;
1865   return getPlainRelocationAddress(RE) & MachO::R_SCATTERED;
1866 }
1867
1868 unsigned MachOObjectFile::getPlainRelocationSymbolNum(
1869     const MachO::any_relocation_info &RE) const {
1870   if (isLittleEndian())
1871     return RE.r_word1 & 0xffffff;
1872   return RE.r_word1 >> 8;
1873 }
1874
1875 bool MachOObjectFile::getPlainRelocationExternal(
1876     const MachO::any_relocation_info &RE) const {
1877   if (isLittleEndian())
1878     return (RE.r_word1 >> 27) & 1;
1879   return (RE.r_word1 >> 4) & 1;
1880 }
1881
1882 bool MachOObjectFile::getScatteredRelocationScattered(
1883     const MachO::any_relocation_info &RE) const {
1884   return RE.r_word0 >> 31;
1885 }
1886
1887 uint32_t MachOObjectFile::getScatteredRelocationValue(
1888     const MachO::any_relocation_info &RE) const {
1889   return RE.r_word1;
1890 }
1891
1892 uint32_t MachOObjectFile::getScatteredRelocationType(
1893     const MachO::any_relocation_info &RE) const {
1894   return (RE.r_word0 >> 24) & 0xf;
1895 }
1896
1897 unsigned MachOObjectFile::getAnyRelocationAddress(
1898     const MachO::any_relocation_info &RE) const {
1899   if (isRelocationScattered(RE))
1900     return getScatteredRelocationAddress(RE);
1901   return getPlainRelocationAddress(RE);
1902 }
1903
1904 unsigned MachOObjectFile::getAnyRelocationPCRel(
1905     const MachO::any_relocation_info &RE) const {
1906   if (isRelocationScattered(RE))
1907     return getScatteredRelocationPCRel(this, RE);
1908   return getPlainRelocationPCRel(this, RE);
1909 }
1910
1911 unsigned MachOObjectFile::getAnyRelocationLength(
1912     const MachO::any_relocation_info &RE) const {
1913   if (isRelocationScattered(RE))
1914     return getScatteredRelocationLength(RE);
1915   return getPlainRelocationLength(this, RE);
1916 }
1917
1918 unsigned
1919 MachOObjectFile::getAnyRelocationType(
1920                                    const MachO::any_relocation_info &RE) const {
1921   if (isRelocationScattered(RE))
1922     return getScatteredRelocationType(RE);
1923   return getPlainRelocationType(this, RE);
1924 }
1925
1926 SectionRef
1927 MachOObjectFile::getAnyRelocationSection(
1928                                    const MachO::any_relocation_info &RE) const {
1929   if (isRelocationScattered(RE) || getPlainRelocationExternal(RE))
1930     return *section_end();
1931   unsigned SecNum = getPlainRelocationSymbolNum(RE);
1932   if (SecNum == MachO::R_ABS || SecNum > Sections.size())
1933     return *section_end();
1934   DataRefImpl DRI;
1935   DRI.d.a = SecNum - 1;
1936   return SectionRef(DRI, this);
1937 }
1938
1939 MachO::section MachOObjectFile::getSection(DataRefImpl DRI) const {
1940   assert(DRI.d.a < Sections.size() && "Should have detected this earlier");
1941   return getStruct<MachO::section>(this, Sections[DRI.d.a]);
1942 }
1943
1944 MachO::section_64 MachOObjectFile::getSection64(DataRefImpl DRI) const {
1945   assert(DRI.d.a < Sections.size() && "Should have detected this earlier");
1946   return getStruct<MachO::section_64>(this, Sections[DRI.d.a]);
1947 }
1948
1949 MachO::section MachOObjectFile::getSection(const LoadCommandInfo &L,
1950                                            unsigned Index) const {
1951   const char *Sec = getSectionPtr(this, L, Index);
1952   return getStruct<MachO::section>(this, Sec);
1953 }
1954
1955 MachO::section_64 MachOObjectFile::getSection64(const LoadCommandInfo &L,
1956                                                 unsigned Index) const {
1957   const char *Sec = getSectionPtr(this, L, Index);
1958   return getStruct<MachO::section_64>(this, Sec);
1959 }
1960
1961 MachO::nlist
1962 MachOObjectFile::getSymbolTableEntry(DataRefImpl DRI) const {
1963   const char *P = reinterpret_cast<const char *>(DRI.p);
1964   return getStruct<MachO::nlist>(this, P);
1965 }
1966
1967 MachO::nlist_64
1968 MachOObjectFile::getSymbol64TableEntry(DataRefImpl DRI) const {
1969   const char *P = reinterpret_cast<const char *>(DRI.p);
1970   return getStruct<MachO::nlist_64>(this, P);
1971 }
1972
1973 MachO::linkedit_data_command
1974 MachOObjectFile::getLinkeditDataLoadCommand(const LoadCommandInfo &L) const {
1975   return getStruct<MachO::linkedit_data_command>(this, L.Ptr);
1976 }
1977
1978 MachO::segment_command
1979 MachOObjectFile::getSegmentLoadCommand(const LoadCommandInfo &L) const {
1980   return getStruct<MachO::segment_command>(this, L.Ptr);
1981 }
1982
1983 MachO::segment_command_64
1984 MachOObjectFile::getSegment64LoadCommand(const LoadCommandInfo &L) const {
1985   return getStruct<MachO::segment_command_64>(this, L.Ptr);
1986 }
1987
1988 MachO::linker_option_command
1989 MachOObjectFile::getLinkerOptionLoadCommand(const LoadCommandInfo &L) const {
1990   return getStruct<MachO::linker_option_command>(this, L.Ptr);
1991 }
1992
1993 MachO::version_min_command
1994 MachOObjectFile::getVersionMinLoadCommand(const LoadCommandInfo &L) const {
1995   return getStruct<MachO::version_min_command>(this, L.Ptr);
1996 }
1997
1998 MachO::dylib_command
1999 MachOObjectFile::getDylibIDLoadCommand(const LoadCommandInfo &L) const {
2000   return getStruct<MachO::dylib_command>(this, L.Ptr);
2001 }
2002
2003 MachO::dyld_info_command
2004 MachOObjectFile::getDyldInfoLoadCommand(const LoadCommandInfo &L) const {
2005   return getStruct<MachO::dyld_info_command>(this, L.Ptr);
2006 }
2007
2008 MachO::dylinker_command
2009 MachOObjectFile::getDylinkerCommand(const LoadCommandInfo &L) const {
2010   return getStruct<MachO::dylinker_command>(this, L.Ptr);
2011 }
2012
2013 MachO::uuid_command
2014 MachOObjectFile::getUuidCommand(const LoadCommandInfo &L) const {
2015   return getStruct<MachO::uuid_command>(this, L.Ptr);
2016 }
2017
2018 MachO::rpath_command
2019 MachOObjectFile::getRpathCommand(const LoadCommandInfo &L) const {
2020   return getStruct<MachO::rpath_command>(this, L.Ptr);
2021 }
2022
2023 MachO::source_version_command
2024 MachOObjectFile::getSourceVersionCommand(const LoadCommandInfo &L) const {
2025   return getStruct<MachO::source_version_command>(this, L.Ptr);
2026 }
2027
2028 MachO::entry_point_command
2029 MachOObjectFile::getEntryPointCommand(const LoadCommandInfo &L) const {
2030   return getStruct<MachO::entry_point_command>(this, L.Ptr);
2031 }
2032
2033 MachO::encryption_info_command
2034 MachOObjectFile::getEncryptionInfoCommand(const LoadCommandInfo &L) const {
2035   return getStruct<MachO::encryption_info_command>(this, L.Ptr);
2036 }
2037
2038 MachO::encryption_info_command_64
2039 MachOObjectFile::getEncryptionInfoCommand64(const LoadCommandInfo &L) const {
2040   return getStruct<MachO::encryption_info_command_64>(this, L.Ptr);
2041 }
2042
2043 MachO::sub_framework_command
2044 MachOObjectFile::getSubFrameworkCommand(const LoadCommandInfo &L) const {
2045   return getStruct<MachO::sub_framework_command>(this, L.Ptr);
2046 }
2047
2048 MachO::sub_umbrella_command
2049 MachOObjectFile::getSubUmbrellaCommand(const LoadCommandInfo &L) const {
2050   return getStruct<MachO::sub_umbrella_command>(this, L.Ptr);
2051 }
2052
2053 MachO::sub_library_command
2054 MachOObjectFile::getSubLibraryCommand(const LoadCommandInfo &L) const {
2055   return getStruct<MachO::sub_library_command>(this, L.Ptr);
2056 }
2057
2058 MachO::sub_client_command
2059 MachOObjectFile::getSubClientCommand(const LoadCommandInfo &L) const {
2060   return getStruct<MachO::sub_client_command>(this, L.Ptr);
2061 }
2062
2063 MachO::routines_command
2064 MachOObjectFile::getRoutinesCommand(const LoadCommandInfo &L) const {
2065   return getStruct<MachO::routines_command>(this, L.Ptr);
2066 }
2067
2068 MachO::routines_command_64
2069 MachOObjectFile::getRoutinesCommand64(const LoadCommandInfo &L) const {
2070   return getStruct<MachO::routines_command_64>(this, L.Ptr);
2071 }
2072
2073 MachO::thread_command
2074 MachOObjectFile::getThreadCommand(const LoadCommandInfo &L) const {
2075   return getStruct<MachO::thread_command>(this, L.Ptr);
2076 }
2077
2078 MachO::any_relocation_info
2079 MachOObjectFile::getRelocation(DataRefImpl Rel) const {
2080   DataRefImpl Sec;
2081   Sec.d.a = Rel.d.a;
2082   uint32_t Offset;
2083   if (is64Bit()) {
2084     MachO::section_64 Sect = getSection64(Sec);
2085     Offset = Sect.reloff;
2086   } else {
2087     MachO::section Sect = getSection(Sec);
2088     Offset = Sect.reloff;
2089   }
2090
2091   auto P = reinterpret_cast<const MachO::any_relocation_info *>(
2092       getPtr(this, Offset)) + Rel.d.b;
2093   return getStruct<MachO::any_relocation_info>(
2094       this, reinterpret_cast<const char *>(P));
2095 }
2096
2097 MachO::data_in_code_entry
2098 MachOObjectFile::getDice(DataRefImpl Rel) const {
2099   const char *P = reinterpret_cast<const char *>(Rel.p);
2100   return getStruct<MachO::data_in_code_entry>(this, P);
2101 }
2102
2103 const MachO::mach_header &MachOObjectFile::getHeader() const {
2104   return Header;
2105 }
2106
2107 const MachO::mach_header_64 &MachOObjectFile::getHeader64() const {
2108   assert(is64Bit());
2109   return Header64;
2110 }
2111
2112 uint32_t MachOObjectFile::getIndirectSymbolTableEntry(
2113                                              const MachO::dysymtab_command &DLC,
2114                                              unsigned Index) const {
2115   uint64_t Offset = DLC.indirectsymoff + Index * sizeof(uint32_t);
2116   return getStruct<uint32_t>(this, getPtr(this, Offset));
2117 }
2118
2119 MachO::data_in_code_entry
2120 MachOObjectFile::getDataInCodeTableEntry(uint32_t DataOffset,
2121                                          unsigned Index) const {
2122   uint64_t Offset = DataOffset + Index * sizeof(MachO::data_in_code_entry);
2123   return getStruct<MachO::data_in_code_entry>(this, getPtr(this, Offset));
2124 }
2125
2126 MachO::symtab_command MachOObjectFile::getSymtabLoadCommand() const {
2127   if (SymtabLoadCmd)
2128     return getStruct<MachO::symtab_command>(this, SymtabLoadCmd);
2129
2130   // If there is no SymtabLoadCmd return a load command with zero'ed fields.
2131   MachO::symtab_command Cmd;
2132   Cmd.cmd = MachO::LC_SYMTAB;
2133   Cmd.cmdsize = sizeof(MachO::symtab_command);
2134   Cmd.symoff = 0;
2135   Cmd.nsyms = 0;
2136   Cmd.stroff = 0;
2137   Cmd.strsize = 0;
2138   return Cmd;
2139 }
2140
2141 MachO::dysymtab_command MachOObjectFile::getDysymtabLoadCommand() const {
2142   if (DysymtabLoadCmd)
2143     return getStruct<MachO::dysymtab_command>(this, DysymtabLoadCmd);
2144
2145   // If there is no DysymtabLoadCmd return a load command with zero'ed fields.
2146   MachO::dysymtab_command Cmd;
2147   Cmd.cmd = MachO::LC_DYSYMTAB;
2148   Cmd.cmdsize = sizeof(MachO::dysymtab_command);
2149   Cmd.ilocalsym = 0;
2150   Cmd.nlocalsym = 0;
2151   Cmd.iextdefsym = 0;
2152   Cmd.nextdefsym = 0;
2153   Cmd.iundefsym = 0;
2154   Cmd.nundefsym = 0;
2155   Cmd.tocoff = 0;
2156   Cmd.ntoc = 0;
2157   Cmd.modtaboff = 0;
2158   Cmd.nmodtab = 0;
2159   Cmd.extrefsymoff = 0;
2160   Cmd.nextrefsyms = 0;
2161   Cmd.indirectsymoff = 0;
2162   Cmd.nindirectsyms = 0;
2163   Cmd.extreloff = 0;
2164   Cmd.nextrel = 0;
2165   Cmd.locreloff = 0;
2166   Cmd.nlocrel = 0;
2167   return Cmd;
2168 }
2169
2170 MachO::linkedit_data_command
2171 MachOObjectFile::getDataInCodeLoadCommand() const {
2172   if (DataInCodeLoadCmd)
2173     return getStruct<MachO::linkedit_data_command>(this, DataInCodeLoadCmd);
2174
2175   // If there is no DataInCodeLoadCmd return a load command with zero'ed fields.
2176   MachO::linkedit_data_command Cmd;
2177   Cmd.cmd = MachO::LC_DATA_IN_CODE;
2178   Cmd.cmdsize = sizeof(MachO::linkedit_data_command);
2179   Cmd.dataoff = 0;
2180   Cmd.datasize = 0;
2181   return Cmd;
2182 }
2183
2184 MachO::linkedit_data_command
2185 MachOObjectFile::getLinkOptHintsLoadCommand() const {
2186   if (LinkOptHintsLoadCmd)
2187     return getStruct<MachO::linkedit_data_command>(this, LinkOptHintsLoadCmd);
2188
2189   // If there is no LinkOptHintsLoadCmd return a load command with zero'ed
2190   // fields.
2191   MachO::linkedit_data_command Cmd;
2192   Cmd.cmd = MachO::LC_LINKER_OPTIMIZATION_HINT;
2193   Cmd.cmdsize = sizeof(MachO::linkedit_data_command);
2194   Cmd.dataoff = 0;
2195   Cmd.datasize = 0;
2196   return Cmd;
2197 }
2198
2199 ArrayRef<uint8_t> MachOObjectFile::getDyldInfoRebaseOpcodes() const {
2200   if (!DyldInfoLoadCmd)
2201     return None;
2202
2203   MachO::dyld_info_command DyldInfo =
2204       getStruct<MachO::dyld_info_command>(this, DyldInfoLoadCmd);
2205   const uint8_t *Ptr =
2206       reinterpret_cast<const uint8_t *>(getPtr(this, DyldInfo.rebase_off));
2207   return makeArrayRef(Ptr, DyldInfo.rebase_size);
2208 }
2209
2210 ArrayRef<uint8_t> MachOObjectFile::getDyldInfoBindOpcodes() const {
2211   if (!DyldInfoLoadCmd)
2212     return None;
2213
2214   MachO::dyld_info_command DyldInfo =
2215       getStruct<MachO::dyld_info_command>(this, DyldInfoLoadCmd);
2216   const uint8_t *Ptr =
2217       reinterpret_cast<const uint8_t *>(getPtr(this, DyldInfo.bind_off));
2218   return makeArrayRef(Ptr, DyldInfo.bind_size);
2219 }
2220
2221 ArrayRef<uint8_t> MachOObjectFile::getDyldInfoWeakBindOpcodes() const {
2222   if (!DyldInfoLoadCmd)
2223     return None;
2224
2225   MachO::dyld_info_command DyldInfo =
2226       getStruct<MachO::dyld_info_command>(this, DyldInfoLoadCmd);
2227   const uint8_t *Ptr =
2228       reinterpret_cast<const uint8_t *>(getPtr(this, DyldInfo.weak_bind_off));
2229   return makeArrayRef(Ptr, DyldInfo.weak_bind_size);
2230 }
2231
2232 ArrayRef<uint8_t> MachOObjectFile::getDyldInfoLazyBindOpcodes() const {
2233   if (!DyldInfoLoadCmd)
2234     return None;
2235
2236   MachO::dyld_info_command DyldInfo =
2237       getStruct<MachO::dyld_info_command>(this, DyldInfoLoadCmd);
2238   const uint8_t *Ptr =
2239       reinterpret_cast<const uint8_t *>(getPtr(this, DyldInfo.lazy_bind_off));
2240   return makeArrayRef(Ptr, DyldInfo.lazy_bind_size);
2241 }
2242
2243 ArrayRef<uint8_t> MachOObjectFile::getDyldInfoExportsTrie() const {
2244   if (!DyldInfoLoadCmd)
2245     return None;
2246
2247   MachO::dyld_info_command DyldInfo =
2248       getStruct<MachO::dyld_info_command>(this, DyldInfoLoadCmd);
2249   const uint8_t *Ptr =
2250       reinterpret_cast<const uint8_t *>(getPtr(this, DyldInfo.export_off));
2251   return makeArrayRef(Ptr, DyldInfo.export_size);
2252 }
2253
2254 ArrayRef<uint8_t> MachOObjectFile::getUuid() const {
2255   if (!UuidLoadCmd)
2256     return None;
2257   // Returning a pointer is fine as uuid doesn't need endian swapping.
2258   const char *Ptr = UuidLoadCmd + offsetof(MachO::uuid_command, uuid);
2259   return makeArrayRef(reinterpret_cast<const uint8_t *>(Ptr), 16);
2260 }
2261
2262 StringRef MachOObjectFile::getStringTableData() const {
2263   MachO::symtab_command S = getSymtabLoadCommand();
2264   return getData().substr(S.stroff, S.strsize);
2265 }
2266
2267 bool MachOObjectFile::is64Bit() const {
2268   return getType() == getMachOType(false, true) ||
2269     getType() == getMachOType(true, true);
2270 }
2271
2272 void MachOObjectFile::ReadULEB128s(uint64_t Index,
2273                                    SmallVectorImpl<uint64_t> &Out) const {
2274   DataExtractor extractor(ObjectFile::getData(), true, 0);
2275
2276   uint32_t offset = Index;
2277   uint64_t data = 0;
2278   while (uint64_t delta = extractor.getULEB128(&offset)) {
2279     data += delta;
2280     Out.push_back(data);
2281   }
2282 }
2283
2284 bool MachOObjectFile::isRelocatableObject() const {
2285   return getHeader().filetype == MachO::MH_OBJECT;
2286 }
2287
2288 ErrorOr<std::unique_ptr<MachOObjectFile>>
2289 ObjectFile::createMachOObjectFile(MemoryBufferRef Buffer) {
2290   StringRef Magic = Buffer.getBuffer().slice(0, 4);
2291   std::error_code EC;
2292   std::unique_ptr<MachOObjectFile> Ret;
2293   if (Magic == "\xFE\xED\xFA\xCE")
2294     Ret.reset(new MachOObjectFile(Buffer, false, false, EC));
2295   else if (Magic == "\xCE\xFA\xED\xFE")
2296     Ret.reset(new MachOObjectFile(Buffer, true, false, EC));
2297   else if (Magic == "\xFE\xED\xFA\xCF")
2298     Ret.reset(new MachOObjectFile(Buffer, false, true, EC));
2299   else if (Magic == "\xCF\xFA\xED\xFE")
2300     Ret.reset(new MachOObjectFile(Buffer, true, true, EC));
2301   else
2302     return object_error::parse_failed;
2303
2304   if (EC)
2305     return EC;
2306   return std::move(Ret);
2307 }