1f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson//===- MachO.h - MachO object file implementation ---------------*- C++ -*-===//
2f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson//
3f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson//                     The LLVM Compiler Infrastructure
4f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson//
5f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson// This file is distributed under the University of Illinois Open Source
6f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson// License. See LICENSE.TXT for details.
7f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson//
8f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson//===----------------------------------------------------------------------===//
9f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson//
10fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola// This file declares the MachOObjectFile class, which implement the ObjectFile
11fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola// interface for MachO files.
12f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson//
13f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson//===----------------------------------------------------------------------===//
14f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson
15f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson#ifndef LLVM_OBJECT_MACHO_H
16f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson#define LLVM_OBJECT_MACHO_H
17f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson
18f16c2bb320f4d5b33dfaf8df8865f547e6d66005Rafael Espindola#include "llvm/ADT/ArrayRef.h"
19255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/ADT/SmallVector.h"
209c22f87b1374b06dc6c07f6e8047890e390bbe2dAlexey Samsonov#include "llvm/ADT/Triple.h"
21255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/Object/ObjectFile.h"
225510728d28bb1ee04abc32da3d21b7df12948053Charles Davis#include "llvm/Support/MachO.h"
23f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson
24f7c93a3867b45e42db6927536f76e7d2869ead60Owen Andersonnamespace llvm {
25f7c93a3867b45e42db6927536f76e7d2869ead60Owen Andersonnamespace object {
26f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson
2754154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby/// DiceRef - This is a value type class that represents a single
2854154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby/// data in code entry in the table in a Mach-O object file.
2954154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderbyclass DiceRef {
3054154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  DataRefImpl DicePimpl;
3154154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  const ObjectFile *OwningObject;
3254154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
3354154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderbypublic:
34dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  DiceRef() : OwningObject(nullptr) { }
3554154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
3654154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  DiceRef(DataRefImpl DiceP, const ObjectFile *Owner);
3754154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
3854154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  bool operator==(const DiceRef &Other) const;
3954154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  bool operator<(const DiceRef &Other) const;
4054154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void moveNext();
4254154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
43c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  std::error_code getOffset(uint32_t &Result) const;
44c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  std::error_code getLength(uint16_t &Result) const;
45c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  std::error_code getKind(uint16_t &Result) const;
4654154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
4754154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  DataRefImpl getRawDataRefImpl() const;
4854154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  const ObjectFile *getObjectFile() const;
4954154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby};
5054154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderbytypedef content_iterator<DiceRef> dice_iterator;
5154154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
5237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// ExportEntry encapsulates the current-state-of-the-walk used when doing a
5337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// non-recursive walk of the trie data structure.  This allows you to iterate
5437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// across all exported symbols using:
5537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines///      for (const llvm::object::ExportEntry &AnExport : Obj->exports()) {
5637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines///      }
5737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesclass ExportEntry {
5837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinespublic:
5937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  ExportEntry(ArrayRef<uint8_t> Trie);
6037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
6137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  StringRef name() const;
6237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint64_t flags() const;
6337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint64_t address() const;
6437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint64_t other() const;
6537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  StringRef otherName() const;
6637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint32_t nodeOffset() const;
6737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
6837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool operator==(const ExportEntry &) const;
6937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
7037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  void moveNext();
7137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
7237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesprivate:
7337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  friend class MachOObjectFile;
7437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  void moveToFirst();
7537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  void moveToEnd();
7637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint64_t readULEB128(const uint8_t *&p);
7737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  void pushDownUntilBottom();
7837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  void pushNode(uint64_t Offset);
7937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
8037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // Represents a node in the mach-o exports trie.
8137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  struct NodeState {
8237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    NodeState(const uint8_t *Ptr);
8337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    const uint8_t *Start;
8437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    const uint8_t *Current;
8537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    uint64_t Flags;
8637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    uint64_t Address;
8737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    uint64_t Other;
8837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    const char *ImportName;
8937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    unsigned ChildCount;
9037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    unsigned NextChildIndex;
9137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    unsigned ParentStringLength;
9237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    bool IsExportNode;
9337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  };
9437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
9537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  ArrayRef<uint8_t> Trie;
9637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  SmallString<256> CumulativeString;
9737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  SmallVector<NodeState, 16> Stack;
9837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool Malformed;
9937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool Done;
10037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines};
10137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinestypedef content_iterator<ExportEntry> export_iterator;
10237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
103f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// MachORebaseEntry encapsulates the current state in the decompression of
10437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// rebasing opcodes. This allows you to iterate through the compressed table of
10537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// rebasing using:
10637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines///    for (const llvm::object::MachORebaseEntry &Entry : Obj->rebaseTable()) {
10737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines///    }
10837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesclass MachORebaseEntry {
10937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinespublic:
11037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  MachORebaseEntry(ArrayRef<uint8_t> opcodes, bool is64Bit);
11137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
11237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint32_t segmentIndex() const;
11337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint64_t segmentOffset() const;
11437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  StringRef typeName() const;
11537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
11637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool operator==(const MachORebaseEntry &) const;
11737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
11837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  void moveNext();
119f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
12037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesprivate:
12137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  friend class MachOObjectFile;
12237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  void moveToFirst();
12337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  void moveToEnd();
12437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint64_t readULEB128();
12537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
12637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  ArrayRef<uint8_t> Opcodes;
12737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  const uint8_t *Ptr;
12837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint64_t SegmentOffset;
12937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint32_t SegmentIndex;
13037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint64_t RemainingLoopCount;
13137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint64_t AdvanceAmount;
13237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint8_t  RebaseType;
13337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint8_t  PointerSize;
13437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool     Malformed;
13537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool     Done;
13637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines};
13737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinestypedef content_iterator<MachORebaseEntry> rebase_iterator;
13837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
13937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// MachOBindEntry encapsulates the current state in the decompression of
14037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// binding opcodes. This allows you to iterate through the compressed table of
14137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// bindings using:
14237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines///    for (const llvm::object::MachOBindEntry &Entry : Obj->bindTable()) {
14337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines///    }
14437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesclass MachOBindEntry {
14537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinespublic:
14637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  enum class Kind { Regular, Lazy, Weak };
14737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
14837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  MachOBindEntry(ArrayRef<uint8_t> Opcodes, bool is64Bit, MachOBindEntry::Kind);
14937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
15037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint32_t segmentIndex() const;
15137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint64_t segmentOffset() const;
15237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  StringRef typeName() const;
15337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  StringRef symbolName() const;
15437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint32_t flags() const;
15537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  int64_t addend() const;
15637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  int ordinal() const;
15737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
15837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool operator==(const MachOBindEntry &) const;
15937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
16037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  void moveNext();
16137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
16237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesprivate:
16337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  friend class MachOObjectFile;
16437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  void moveToFirst();
16537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  void moveToEnd();
16637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint64_t readULEB128();
16737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  int64_t readSLEB128();
16837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
16937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  ArrayRef<uint8_t> Opcodes;
17037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  const uint8_t *Ptr;
17137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint64_t SegmentOffset;
17237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint32_t SegmentIndex;
17337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  StringRef SymbolName;
17437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  int      Ordinal;
17537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint32_t Flags;
17637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  int64_t  Addend;
17737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint64_t RemainingLoopCount;
17837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint64_t AdvanceAmount;
17937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint8_t  BindType;
18037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint8_t  PointerSize;
18137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Kind     TableKind;
18237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool     Malformed;
18337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool     Done;
18437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines};
18537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinestypedef content_iterator<MachOBindEntry> bind_iterator;
18637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
187fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindolaclass MachOObjectFile : public ObjectFile {
188da2a2372c6ae715befae7f086afe769dd80814f3Rafael Espindolapublic:
189fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  struct LoadCommandInfo {
190fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola    const char *Ptr;      // Where in memory the load command is.
1915510728d28bb1ee04abc32da3d21b7df12948053Charles Davis    MachO::load_command C; // The command itself.
192fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  };
1936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  typedef SmallVector<LoadCommandInfo, 4> LoadCommandList;
1946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  typedef LoadCommandList::const_iterator load_command_iterator;
195da2a2372c6ae715befae7f086afe769dd80814f3Rafael Espindola
196de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static Expected<std::unique_ptr<MachOObjectFile>>
197de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  create(MemoryBufferRef Object, bool IsLittleEndian, bool Is64Bits);
19836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
19936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void moveSymbolNext(DataRefImpl &Symb) const override;
200f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
201f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  uint64_t getNValue(DataRefImpl Sym) const;
202de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Expected<StringRef> getSymbolName(DataRefImpl Symb) const override;
203c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
204c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // MachO specific.
205c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  std::error_code getIndirectName(DataRefImpl Symb, StringRef &Res) const;
206ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  unsigned getSectionType(SectionRef Sec) const;
207c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
208de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Expected<uint64_t> getSymbolAddress(DataRefImpl Symb) const override;
2096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  uint32_t getSymbolAlignment(DataRefImpl Symb) const override;
210f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  uint64_t getCommonSymbolSizeImpl(DataRefImpl Symb) const override;
211de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Expected<SymbolRef::Type> getSymbolType(DataRefImpl Symb) const override;
21236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint32_t getSymbolFlags(DataRefImpl Symb) const override;
213de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Expected<section_iterator> getSymbolSection(DataRefImpl Symb) const override;
214f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  unsigned getSymbolSectionID(SymbolRef Symb) const;
215f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  unsigned getSectionID(SectionRef Sec) const;
21636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
21736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void moveSectionNext(DataRefImpl &Sec) const override;
218c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  std::error_code getSectionName(DataRefImpl Sec,
219c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                                 StringRef &Res) const override;
22037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint64_t getSectionAddress(DataRefImpl Sec) const override;
22137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint64_t getSectionSize(DataRefImpl Sec) const override;
222c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  std::error_code getSectionContents(DataRefImpl Sec,
223c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                                     StringRef &Res) const override;
22437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint64_t getSectionAlignment(DataRefImpl Sec) const override;
225de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool isSectionCompressed(DataRefImpl Sec) const override;
22637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool isSectionText(DataRefImpl Sec) const override;
22737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool isSectionData(DataRefImpl Sec) const override;
22837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool isSectionBSS(DataRefImpl Sec) const override;
22937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool isSectionVirtual(DataRefImpl Sec) const override;
230de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool isSectionBitcode(DataRefImpl Sec) const override;
23136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  relocation_iterator section_rel_begin(DataRefImpl Sec) const override;
23236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  relocation_iterator section_rel_end(DataRefImpl Sec) const override;
23336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
23436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void moveRelocationNext(DataRefImpl &Rel) const override;
235f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  uint64_t getRelocationOffset(DataRefImpl Rel) const override;
23636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  symbol_iterator getRelocationSymbol(DataRefImpl Rel) const override;
237f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  section_iterator getRelocationSection(DataRefImpl Rel) const;
238f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  uint64_t getRelocationType(DataRefImpl Rel) const override;
239f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void getRelocationTypeName(DataRefImpl Rel,
240f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                             SmallVectorImpl<char> &Result) const override;
2416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  uint8_t getRelocationLength(DataRefImpl Rel) const;
242c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
243c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // MachO specific.
24437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  std::error_code getLibraryShortNameByIndex(unsigned Index, StringRef &) const;
245f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola
246f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  section_iterator getRelocationRelocatedSection(relocation_iterator Rel) const;
247f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
2488d8ac09bfba6686bbed262c764502ae3de626ad4Eric Christopher  // TODO: Would be useful to have an iterator based version
2498d8ac09bfba6686bbed262c764502ae3de626ad4Eric Christopher  // of the load command interface too.
2508d8ac09bfba6686bbed262c764502ae3de626ad4Eric Christopher
25136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  basic_symbol_iterator symbol_begin_impl() const override;
25236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  basic_symbol_iterator symbol_end_impl() const override;
253f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola
254dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // MachO specific.
255dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  basic_symbol_iterator getSymbolByIndex(unsigned Index) const;
256de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint64_t getSymbolIndex(DataRefImpl Symb) const;
257dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
25836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  section_iterator section_begin() const override;
25936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  section_iterator section_end() const override;
260f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola
26136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint8_t getBytesInAddress() const override;
262f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola
26336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  StringRef getFileFormatName() const override;
26436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned getArch() const override;
265de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  SubtargetFeatures getFeatures() const override { return SubtargetFeatures(); }
266de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Triple getArchTriple(const char **McpuDefault = nullptr) const;
267f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola
26829552222c2e7cbeb37fcd15d247597467f7b8544Rui Ueyama  relocation_iterator section_rel_begin(unsigned Index) const;
26929552222c2e7cbeb37fcd15d247597467f7b8544Rui Ueyama  relocation_iterator section_rel_end(unsigned Index) const;
2702173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola
27154154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  dice_iterator begin_dices() const;
27254154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  dice_iterator end_dices() const;
2736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
2746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  load_command_iterator begin_load_commands() const;
2756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  load_command_iterator end_load_commands() const;
2766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  iterator_range<load_command_iterator> load_commands() const;
2776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
27837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// For use iterating over all exported symbols.
27937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  iterator_range<export_iterator> exports() const;
2806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
28137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// For use examining a trie not in a MachOObjectFile.
28237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  static iterator_range<export_iterator> exports(ArrayRef<uint8_t> Trie);
28337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
28437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// For use iterating over all rebase table entries.
28537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  iterator_range<rebase_iterator> rebaseTable() const;
28637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
28737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// For use examining rebase opcodes not in a MachOObjectFile.
28837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  static iterator_range<rebase_iterator> rebaseTable(ArrayRef<uint8_t> Opcodes,
28937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                                     bool is64);
29037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
29137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// For use iterating over all bind table entries.
29237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  iterator_range<bind_iterator> bindTable() const;
29337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
29437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// For use iterating over all lazy bind table entries.
29537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  iterator_range<bind_iterator> lazyBindTable() const;
29637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
29737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// For use iterating over all lazy bind table entries.
29837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  iterator_range<bind_iterator> weakBindTable() const;
29937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
30037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// For use examining bind opcodes not in a MachOObjectFile.
30137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  static iterator_range<bind_iterator> bindTable(ArrayRef<uint8_t> Opcodes,
30237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                                 bool is64,
30337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                                 MachOBindEntry::Kind);
30437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
30554154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
306fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  // In a MachO file, sections have a segment name. This is used in the .o
307fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  // files. They have a single segment, but this field specifies which segment
308fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  // a section should be put in in the final object.
309fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  StringRef getSectionFinalSegmentName(DataRefImpl Sec) const;
310f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola
311fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  // Names are stored as 16 bytes. These returns the raw 16 bytes without
312fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  // interpreting them as a C string.
313fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  ArrayRef<char> getSectionRawName(DataRefImpl Sec) const;
314fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  ArrayRef<char> getSectionRawFinalSegmentName(DataRefImpl Sec) const;
315f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola
316fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  // MachO specific Info about relocations.
3175510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  bool isRelocationScattered(const MachO::any_relocation_info &RE) const;
3185510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  unsigned getPlainRelocationSymbolNum(
3195510728d28bb1ee04abc32da3d21b7df12948053Charles Davis                                    const MachO::any_relocation_info &RE) const;
3205510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  bool getPlainRelocationExternal(const MachO::any_relocation_info &RE) const;
3215510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  bool getScatteredRelocationScattered(
3225510728d28bb1ee04abc32da3d21b7df12948053Charles Davis                                    const MachO::any_relocation_info &RE) const;
3235510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  uint32_t getScatteredRelocationValue(
3245510728d28bb1ee04abc32da3d21b7df12948053Charles Davis                                    const MachO::any_relocation_info &RE) const;
32537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint32_t getScatteredRelocationType(
32637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                    const MachO::any_relocation_info &RE) const;
3275510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  unsigned getAnyRelocationAddress(const MachO::any_relocation_info &RE) const;
3285510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  unsigned getAnyRelocationPCRel(const MachO::any_relocation_info &RE) const;
3295510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  unsigned getAnyRelocationLength(const MachO::any_relocation_info &RE) const;
3305510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  unsigned getAnyRelocationType(const MachO::any_relocation_info &RE) const;
3316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  SectionRef getAnyRelocationSection(const MachO::any_relocation_info &RE) const;
332fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola
333fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  // MachO specific structures.
3345510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::section getSection(DataRefImpl DRI) const;
3355510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::section_64 getSection64(DataRefImpl DRI) const;
3365510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::section getSection(const LoadCommandInfo &L, unsigned Index) const;
3375510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::section_64 getSection64(const LoadCommandInfo &L,unsigned Index) const;
3385510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::nlist getSymbolTableEntry(DataRefImpl DRI) const;
3395510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::nlist_64 getSymbol64TableEntry(DataRefImpl DRI) const;
3405510728d28bb1ee04abc32da3d21b7df12948053Charles Davis
3415510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::linkedit_data_command
342fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  getLinkeditDataLoadCommand(const LoadCommandInfo &L) const;
3435510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::segment_command
3442173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola  getSegmentLoadCommand(const LoadCommandInfo &L) const;
3455510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::segment_command_64
3462173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola  getSegment64LoadCommand(const LoadCommandInfo &L) const;
347ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  MachO::linker_option_command
348ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  getLinkerOptionLoadCommand(const LoadCommandInfo &L) const;
34936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  MachO::version_min_command
35036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  getVersionMinLoadCommand(const LoadCommandInfo &L) const;
351c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  MachO::dylib_command
352c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  getDylibIDLoadCommand(const LoadCommandInfo &L) const;
35337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  MachO::dyld_info_command
35437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  getDyldInfoLoadCommand(const LoadCommandInfo &L) const;
35537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  MachO::dylinker_command
35637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  getDylinkerCommand(const LoadCommandInfo &L) const;
35737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  MachO::uuid_command
35837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  getUuidCommand(const LoadCommandInfo &L) const;
359ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  MachO::rpath_command
360ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  getRpathCommand(const LoadCommandInfo &L) const;
36137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  MachO::source_version_command
36237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  getSourceVersionCommand(const LoadCommandInfo &L) const;
36337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  MachO::entry_point_command
36437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  getEntryPointCommand(const LoadCommandInfo &L) const;
365ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  MachO::encryption_info_command
366ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  getEncryptionInfoCommand(const LoadCommandInfo &L) const;
367ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  MachO::encryption_info_command_64
368ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  getEncryptionInfoCommand64(const LoadCommandInfo &L) const;
369ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  MachO::sub_framework_command
370ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  getSubFrameworkCommand(const LoadCommandInfo &L) const;
371ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  MachO::sub_umbrella_command
372ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  getSubUmbrellaCommand(const LoadCommandInfo &L) const;
373ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  MachO::sub_library_command
374ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  getSubLibraryCommand(const LoadCommandInfo &L) const;
375ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  MachO::sub_client_command
376ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  getSubClientCommand(const LoadCommandInfo &L) const;
377ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  MachO::routines_command
378ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  getRoutinesCommand(const LoadCommandInfo &L) const;
379ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  MachO::routines_command_64
380ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  getRoutinesCommand64(const LoadCommandInfo &L) const;
381ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  MachO::thread_command
382ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  getThreadCommand(const LoadCommandInfo &L) const;
3832173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola
3845510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::any_relocation_info getRelocation(DataRefImpl Rel) const;
3855510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::data_in_code_entry getDice(DataRefImpl Rel) const;
3866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  const MachO::mach_header &getHeader() const;
3876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  const MachO::mach_header_64 &getHeader64() const;
3885510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  uint32_t
3895510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  getIndirectSymbolTableEntry(const MachO::dysymtab_command &DLC,
3902173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola                              unsigned Index) const;
3915510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::data_in_code_entry getDataInCodeTableEntry(uint32_t DataOffset,
3925510728d28bb1ee04abc32da3d21b7df12948053Charles Davis                                                    unsigned Index) const;
3935510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::symtab_command getSymtabLoadCommand() const;
3945510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::dysymtab_command getDysymtabLoadCommand() const;
3955510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::linkedit_data_command getDataInCodeLoadCommand() const;
396ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  MachO::linkedit_data_command getLinkOptHintsLoadCommand() const;
39737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  ArrayRef<uint8_t> getDyldInfoRebaseOpcodes() const;
39837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  ArrayRef<uint8_t> getDyldInfoBindOpcodes() const;
39937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  ArrayRef<uint8_t> getDyldInfoWeakBindOpcodes() const;
40037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  ArrayRef<uint8_t> getDyldInfoLazyBindOpcodes() const;
40137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  ArrayRef<uint8_t> getDyldInfoExportsTrie() const;
40237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  ArrayRef<uint8_t> getUuid() const;
403f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola
4042173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola  StringRef getStringTableData() const;
405fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  bool is64Bit() const;
406fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  void ReadULEB128s(uint64_t Index, SmallVectorImpl<uint64_t> &Out) const;
407f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola
408c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  static StringRef guessLibraryShortName(StringRef Name, bool &isFramework,
409c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                                         StringRef &Suffix);
410c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
4119c22f87b1374b06dc6c07f6e8047890e390bbe2dAlexey Samsonov  static Triple::ArchType getArch(uint32_t CPUType);
412de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static Triple getArchTriple(uint32_t CPUType, uint32_t CPUSubType,
413de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                              const char **McpuDefault = nullptr);
41437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  static bool isValidArch(StringRef ArchFlag);
415c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  static Triple getHostArch();
4169c22f87b1374b06dc6c07f6e8047890e390bbe2dAlexey Samsonov
41737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool isRelocatableObject() const override;
41837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
41937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool hasPageZeroSegment() const { return HasPageZeroSegment; }
42037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
421fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  static bool classof(const Binary *v) {
422fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola    return v->isMachO();
423f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola  }
424f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola
425f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  static uint32_t
426f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  getVersionMinMajor(MachO::version_min_command &C, bool SDK) {
427f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    uint32_t VersionOrSDK = (SDK) ? C.sdk : C.version;
428f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return (VersionOrSDK >> 16) & 0xffff;
429f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
430f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
431f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  static uint32_t
432f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  getVersionMinMinor(MachO::version_min_command &C, bool SDK) {
433f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    uint32_t VersionOrSDK = (SDK) ? C.sdk : C.version;
434f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return (VersionOrSDK >> 8) & 0xff;
435f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
436f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
437f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  static uint32_t
438f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  getVersionMinUpdate(MachO::version_min_command &C, bool SDK) {
439f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    uint32_t VersionOrSDK = (SDK) ? C.sdk : C.version;
440f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return VersionOrSDK & 0xff;
441f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
442f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
443fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindolaprivate:
444de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
445de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  MachOObjectFile(MemoryBufferRef Object, bool IsLittleEndian, bool Is64Bits,
446de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                  Error &Err);
447de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
448f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  uint64_t getSymbolValueImpl(DataRefImpl Symb) const override;
449f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
4506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  union {
4516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    MachO::mach_header_64 Header64;
4526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    MachO::mach_header Header;
4536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  };
45437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  typedef SmallVector<const char*, 1> SectionList;
455fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  SectionList Sections;
45637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  typedef SmallVector<const char*, 1> LibraryList;
457c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  LibraryList Libraries;
4586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  LoadCommandList LoadCommands;
459c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  typedef SmallVector<StringRef, 1> LibraryShortName;
46037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  mutable LibraryShortName LibrariesShortNames;
461fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  const char *SymtabLoadCmd;
4622173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola  const char *DysymtabLoadCmd;
46354154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  const char *DataInCodeLoadCmd;
464ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  const char *LinkOptHintsLoadCmd;
46537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  const char *DyldInfoLoadCmd;
46637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  const char *UuidLoadCmd;
46737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool HasPageZeroSegment;
468fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola};
469f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola
47054154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby/// DiceRef
47154154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderbyinline DiceRef::DiceRef(DataRefImpl DiceP, const ObjectFile *Owner)
47254154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  : DicePimpl(DiceP) , OwningObject(Owner) {}
47354154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
47454154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderbyinline bool DiceRef::operator==(const DiceRef &Other) const {
47554154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  return DicePimpl == Other.DicePimpl;
47654154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby}
47754154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
47854154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderbyinline bool DiceRef::operator<(const DiceRef &Other) const {
47954154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  return DicePimpl < Other.DicePimpl;
48054154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby}
48154154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
48236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesinline void DiceRef::moveNext() {
4835510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  const MachO::data_in_code_entry *P =
48436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    reinterpret_cast<const MachO::data_in_code_entry *>(DicePimpl.p);
48536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DicePimpl.p = reinterpret_cast<uintptr_t>(P + 1);
48654154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby}
48754154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
48854154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby// Since a Mach-O data in code reference, a DiceRef, can only be created when
48954154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby// the OwningObject ObjectFile is a MachOObjectFile a static_cast<> is used for
49054154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby// the methods that get the values of the fields of the reference.
49154154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
492c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesinline std::error_code DiceRef::getOffset(uint32_t &Result) const {
49354154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  const MachOObjectFile *MachOOF =
49454154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby    static_cast<const MachOObjectFile *>(OwningObject);
4955510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::data_in_code_entry Dice = MachOOF->getDice(DicePimpl);
4965510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  Result = Dice.offset;
4976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return std::error_code();
49854154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby}
49954154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
500c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesinline std::error_code DiceRef::getLength(uint16_t &Result) const {
50154154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  const MachOObjectFile *MachOOF =
50254154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby    static_cast<const MachOObjectFile *>(OwningObject);
5035510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::data_in_code_entry Dice = MachOOF->getDice(DicePimpl);
5045510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  Result = Dice.length;
5056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return std::error_code();
50654154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby}
50754154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
508c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesinline std::error_code DiceRef::getKind(uint16_t &Result) const {
50954154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  const MachOObjectFile *MachOOF =
51054154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby    static_cast<const MachOObjectFile *>(OwningObject);
5115510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::data_in_code_entry Dice = MachOOF->getDice(DicePimpl);
5125510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  Result = Dice.kind;
5136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return std::error_code();
51454154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby}
51554154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
51654154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderbyinline DataRefImpl DiceRef::getRawDataRefImpl() const {
51754154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  return DicePimpl;
51854154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby}
51954154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
52054154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderbyinline const ObjectFile *DiceRef::getObjectFile() const {
52154154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  return OwningObject;
52254154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby}
52354154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
524f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson}
525f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson}
526f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson
527f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson#endif
528