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
43cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code getOffset(uint32_t &Result) const;
44cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code getLength(uint16_t &Result) const;
45cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen 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
52fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindolaclass MachOObjectFile : public ObjectFile {
53da2a2372c6ae715befae7f086afe769dd80814f3Rafael Espindolapublic:
54fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  struct LoadCommandInfo {
55fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola    const char *Ptr;      // Where in memory the load command is.
565510728d28bb1ee04abc32da3d21b7df12948053Charles Davis    MachO::load_command C; // The command itself.
57fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  };
58da2a2372c6ae715befae7f086afe769dd80814f3Rafael Espindola
59cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  MachOObjectFile(std::unique_ptr<MemoryBuffer> Object, bool IsLittleEndian,
60cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                  bool Is64Bits, std::error_code &EC);
6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void moveSymbolNext(DataRefImpl &Symb) const override;
63cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code getSymbolName(DataRefImpl Symb,
64cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                StringRef &Res) const override;
65cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
66cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // MachO specific.
67cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code getIndirectName(DataRefImpl Symb, StringRef &Res) const;
68cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
69cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code getSymbolAddress(DataRefImpl Symb,
70cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                   uint64_t &Res) const override;
71cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code getSymbolAlignment(DataRefImpl Symb,
72cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                     uint32_t &Res) const override;
73cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const override;
74cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code getSymbolType(DataRefImpl Symb,
75cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                SymbolRef::Type &Res) const override;
7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint32_t getSymbolFlags(DataRefImpl Symb) const override;
77cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code getSymbolSection(DataRefImpl Symb,
78cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                   section_iterator &Res) const override;
7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void moveSectionNext(DataRefImpl &Sec) const override;
81cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code getSectionName(DataRefImpl Sec,
82cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                 StringRef &Res) const override;
83cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code getSectionAddress(DataRefImpl Sec,
84cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                    uint64_t &Res) const override;
85cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const override;
86cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code getSectionContents(DataRefImpl Sec,
87cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                     StringRef &Res) const override;
88cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code getSectionAlignment(DataRefImpl Sec,
89cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                      uint64_t &Res) const override;
90cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code isSectionText(DataRefImpl Sec, bool &Res) const override;
91cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code isSectionData(DataRefImpl Sec, bool &Res) const override;
92cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code isSectionBSS(DataRefImpl Sec, bool &Res) const override;
93cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code isSectionRequiredForExecution(DataRefImpl Sec,
94cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                                bool &Res) const override;
95cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code isSectionVirtual(DataRefImpl Sec, bool &Res) const override;
96cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code isSectionZeroInit(DataRefImpl Sec, bool &Res) const override;
97cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code isSectionReadOnlyData(DataRefImpl Sec,
98cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                        bool &Res) const override;
99cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb,
100cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                        bool &Result) const override;
10136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  relocation_iterator section_rel_begin(DataRefImpl Sec) const override;
10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  relocation_iterator section_rel_end(DataRefImpl Sec) const override;
10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void moveRelocationNext(DataRefImpl &Rel) const override;
105cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code getRelocationAddress(DataRefImpl Rel,
106cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                       uint64_t &Res) const override;
107cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code getRelocationOffset(DataRefImpl Rel,
108cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                      uint64_t &Res) const override;
10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  symbol_iterator getRelocationSymbol(DataRefImpl Rel) const override;
110cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code getRelocationType(DataRefImpl Rel,
111cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                    uint64_t &Res) const override;
112cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code
113cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  getRelocationTypeName(DataRefImpl Rel,
114cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                        SmallVectorImpl<char> &Result) const override;
115cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code
116cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  getRelocationValueString(DataRefImpl Rel,
117cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                           SmallVectorImpl<char> &Result) const override;
118cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code getRelocationHidden(DataRefImpl Rel,
119cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                      bool &Result) const override;
120cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
121cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code getLibraryNext(DataRefImpl LibData,
122cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                 LibraryRef &Res) const override;
123cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code getLibraryPath(DataRefImpl LibData,
124cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                 StringRef &Res) const override;
12536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
126cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // MachO specific.
127cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code getLibraryShortNameByIndex(unsigned Index, StringRef &Res);
128f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola
1298d8ac09bfba6686bbed262c764502ae3de626ad4Eric Christopher  // TODO: Would be useful to have an iterator based version
1308d8ac09bfba6686bbed262c764502ae3de626ad4Eric Christopher  // of the load command interface too.
1318d8ac09bfba6686bbed262c764502ae3de626ad4Eric Christopher
13236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  basic_symbol_iterator symbol_begin_impl() const override;
13336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  basic_symbol_iterator symbol_end_impl() const override;
134f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola
135dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // MachO specific.
136dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  basic_symbol_iterator getSymbolByIndex(unsigned Index) const;
137dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
13836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  section_iterator section_begin() const override;
13936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  section_iterator section_end() const override;
140f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola
14136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  library_iterator needed_library_begin() const override;
14236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  library_iterator needed_library_end() const override;
143f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola
14436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint8_t getBytesInAddress() const override;
145f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola
14636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  StringRef getFileFormatName() const override;
14736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned getArch() const override;
148f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola
14936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  StringRef getLoadName() const override;
150f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola
15129552222c2e7cbeb37fcd15d247597467f7b8544Rui Ueyama  relocation_iterator section_rel_begin(unsigned Index) const;
15229552222c2e7cbeb37fcd15d247597467f7b8544Rui Ueyama  relocation_iterator section_rel_end(unsigned Index) const;
1532173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola
15454154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  dice_iterator begin_dices() const;
15554154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  dice_iterator end_dices() const;
15654154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
157fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  // In a MachO file, sections have a segment name. This is used in the .o
158fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  // files. They have a single segment, but this field specifies which segment
159fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  // a section should be put in in the final object.
160fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  StringRef getSectionFinalSegmentName(DataRefImpl Sec) const;
161f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola
162fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  // Names are stored as 16 bytes. These returns the raw 16 bytes without
163fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  // interpreting them as a C string.
164fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  ArrayRef<char> getSectionRawName(DataRefImpl Sec) const;
165fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  ArrayRef<char> getSectionRawFinalSegmentName(DataRefImpl Sec) const;
166f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola
167fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  // MachO specific Info about relocations.
1685510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  bool isRelocationScattered(const MachO::any_relocation_info &RE) const;
1695510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  unsigned getPlainRelocationSymbolNum(
1705510728d28bb1ee04abc32da3d21b7df12948053Charles Davis                                    const MachO::any_relocation_info &RE) const;
1715510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  bool getPlainRelocationExternal(const MachO::any_relocation_info &RE) const;
1725510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  bool getScatteredRelocationScattered(
1735510728d28bb1ee04abc32da3d21b7df12948053Charles Davis                                    const MachO::any_relocation_info &RE) const;
1745510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  uint32_t getScatteredRelocationValue(
1755510728d28bb1ee04abc32da3d21b7df12948053Charles Davis                                    const MachO::any_relocation_info &RE) const;
1765510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  unsigned getAnyRelocationAddress(const MachO::any_relocation_info &RE) const;
1775510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  unsigned getAnyRelocationPCRel(const MachO::any_relocation_info &RE) const;
1785510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  unsigned getAnyRelocationLength(const MachO::any_relocation_info &RE) const;
1795510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  unsigned getAnyRelocationType(const MachO::any_relocation_info &RE) const;
1805510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  SectionRef getRelocationSection(const MachO::any_relocation_info &RE) const;
181fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola
182fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  // Walk load commands.
183fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  LoadCommandInfo getFirstLoadCommandInfo() const;
184fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  LoadCommandInfo getNextLoadCommandInfo(const LoadCommandInfo &L) const;
185fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola
186fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  // MachO specific structures.
1875510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::section getSection(DataRefImpl DRI) const;
1885510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::section_64 getSection64(DataRefImpl DRI) const;
1895510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::section getSection(const LoadCommandInfo &L, unsigned Index) const;
1905510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::section_64 getSection64(const LoadCommandInfo &L,unsigned Index) const;
1915510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::nlist getSymbolTableEntry(DataRefImpl DRI) const;
1925510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::nlist_64 getSymbol64TableEntry(DataRefImpl DRI) const;
1935510728d28bb1ee04abc32da3d21b7df12948053Charles Davis
1945510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::linkedit_data_command
195fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  getLinkeditDataLoadCommand(const LoadCommandInfo &L) const;
1965510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::segment_command
1972173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola  getSegmentLoadCommand(const LoadCommandInfo &L) const;
1985510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::segment_command_64
1992173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola  getSegment64LoadCommand(const LoadCommandInfo &L) const;
2005510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::linker_options_command
2012173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola  getLinkerOptionsLoadCommand(const LoadCommandInfo &L) const;
20236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  MachO::version_min_command
20336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  getVersionMinLoadCommand(const LoadCommandInfo &L) const;
204cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  MachO::dylib_command
205cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  getDylibIDLoadCommand(const LoadCommandInfo &L) const;
2062173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola
2075510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::any_relocation_info getRelocation(DataRefImpl Rel) const;
2085510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::data_in_code_entry getDice(DataRefImpl Rel) const;
2095510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::mach_header getHeader() const;
2105510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::mach_header_64 getHeader64() const;
2115510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  uint32_t
2125510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  getIndirectSymbolTableEntry(const MachO::dysymtab_command &DLC,
2132173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola                              unsigned Index) const;
2145510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::data_in_code_entry getDataInCodeTableEntry(uint32_t DataOffset,
2155510728d28bb1ee04abc32da3d21b7df12948053Charles Davis                                                    unsigned Index) const;
2165510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::symtab_command getSymtabLoadCommand() const;
2175510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::dysymtab_command getDysymtabLoadCommand() const;
2185510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::linkedit_data_command getDataInCodeLoadCommand() const;
219f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola
2202173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola  StringRef getStringTableData() const;
221fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  bool is64Bit() const;
222fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  void ReadULEB128s(uint64_t Index, SmallVectorImpl<uint64_t> &Out) const;
223f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola
224cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  static StringRef guessLibraryShortName(StringRef Name, bool &isFramework,
225cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                         StringRef &Suffix);
226cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
2279c22f87b1374b06dc6c07f6e8047890e390bbe2dAlexey Samsonov  static Triple::ArchType getArch(uint32_t CPUType);
228cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  static Triple getArch(uint32_t CPUType, uint32_t CPUSubType);
229cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  static Triple getArch(StringRef ArchFlag);
230cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  static Triple getHostArch();
2319c22f87b1374b06dc6c07f6e8047890e390bbe2dAlexey Samsonov
232fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  static bool classof(const Binary *v) {
233fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola    return v->isMachO();
234f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola  }
235f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola
236cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const char *getSectionPointer(DataRefImpl Rel) const;
237cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
238fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindolaprivate:
239cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  typedef SmallVector<const char *, 1> SectionList;
240fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  SectionList Sections;
241cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  typedef SmallVector<const char *, 1> LibraryList;
242cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  LibraryList Libraries;
243cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  typedef SmallVector<StringRef, 1> LibraryShortName;
244cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  LibraryShortName LibrariesShortNames;
245fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola  const char *SymtabLoadCmd;
2462173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola  const char *DysymtabLoadCmd;
24754154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  const char *DataInCodeLoadCmd;
248fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola};
249f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola
25054154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby/// DiceRef
25154154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderbyinline DiceRef::DiceRef(DataRefImpl DiceP, const ObjectFile *Owner)
25254154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  : DicePimpl(DiceP) , OwningObject(Owner) {}
25354154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
25454154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderbyinline bool DiceRef::operator==(const DiceRef &Other) const {
25554154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  return DicePimpl == Other.DicePimpl;
25654154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby}
25754154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
25854154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderbyinline bool DiceRef::operator<(const DiceRef &Other) const {
25954154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  return DicePimpl < Other.DicePimpl;
26054154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby}
26154154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
26236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesinline void DiceRef::moveNext() {
2635510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  const MachO::data_in_code_entry *P =
26436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    reinterpret_cast<const MachO::data_in_code_entry *>(DicePimpl.p);
26536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DicePimpl.p = reinterpret_cast<uintptr_t>(P + 1);
26654154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby}
26754154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
26854154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby// Since a Mach-O data in code reference, a DiceRef, can only be created when
26954154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby// the OwningObject ObjectFile is a MachOObjectFile a static_cast<> is used for
27054154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby// the methods that get the values of the fields of the reference.
27154154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
272cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesinline std::error_code DiceRef::getOffset(uint32_t &Result) const {
27354154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  const MachOObjectFile *MachOOF =
27454154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby    static_cast<const MachOObjectFile *>(OwningObject);
2755510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::data_in_code_entry Dice = MachOOF->getDice(DicePimpl);
2765510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  Result = Dice.offset;
27754154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  return object_error::success;
27854154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby}
27954154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
280cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesinline std::error_code DiceRef::getLength(uint16_t &Result) const {
28154154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  const MachOObjectFile *MachOOF =
28254154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby    static_cast<const MachOObjectFile *>(OwningObject);
2835510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::data_in_code_entry Dice = MachOOF->getDice(DicePimpl);
2845510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  Result = Dice.length;
28554154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  return object_error::success;
28654154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby}
28754154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
288cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesinline std::error_code DiceRef::getKind(uint16_t &Result) const {
28954154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  const MachOObjectFile *MachOOF =
29054154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby    static_cast<const MachOObjectFile *>(OwningObject);
2915510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  MachO::data_in_code_entry Dice = MachOOF->getDice(DicePimpl);
2925510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  Result = Dice.kind;
29354154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  return object_error::success;
29454154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby}
29554154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
29654154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderbyinline DataRefImpl DiceRef::getRawDataRefImpl() const {
29754154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  return DicePimpl;
29854154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby}
29954154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
30054154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderbyinline const ObjectFile *DiceRef::getObjectFile() const {
30154154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby  return OwningObject;
30254154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby}
30354154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby
304f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson}
305f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson}
306f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson
307f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson#endif
308f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson
309