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" 21774e7c82a84189a1f8194a63dc8040136ca6b4d8Rafael Espindola#include "llvm/Object/MachOFormat.h" 22255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/Object/ObjectFile.h" 23f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson#include "llvm/Support/MachO.h" 241832f4d94eb292d63824eaa043118ed6cc61389bOwen Anderson#include "llvm/Support/raw_ostream.h" 25f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson 26f7c93a3867b45e42db6927536f76e7d2869ead60Owen Andersonnamespace llvm { 27f7c93a3867b45e42db6927536f76e7d2869ead60Owen Andersonnamespace object { 28f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson 2954154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby/// DiceRef - This is a value type class that represents a single 3054154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby/// data in code entry in the table in a Mach-O object file. 3154154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderbyclass DiceRef { 3254154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby DataRefImpl DicePimpl; 3354154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby const ObjectFile *OwningObject; 3454154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby 3554154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderbypublic: 3654154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby DiceRef() : OwningObject(NULL) { } 3754154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby 3854154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby DiceRef(DataRefImpl DiceP, const ObjectFile *Owner); 3954154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby 4054154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby bool operator==(const DiceRef &Other) const; 4154154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby bool operator<(const DiceRef &Other) const; 4254154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby 4354154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby error_code getNext(DiceRef &Result) const; 4454154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby 4554154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby error_code getOffset(uint32_t &Result) const; 4654154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby error_code getLength(uint16_t &Result) const; 4754154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby error_code getKind(uint16_t &Result) const; 4854154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby 4954154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby DataRefImpl getRawDataRefImpl() const; 5054154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby const ObjectFile *getObjectFile() const; 5154154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby}; 5254154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderbytypedef content_iterator<DiceRef> dice_iterator; 5354154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby 54fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindolaclass MachOObjectFile : public ObjectFile { 55da2a2372c6ae715befae7f086afe769dd80814f3Rafael Espindolapublic: 56fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola struct LoadCommandInfo { 57fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola const char *Ptr; // Where in memory the load command is. 58fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola macho::LoadCommand C; // The command itself. 59fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola }; 60da2a2372c6ae715befae7f086afe769dd80814f3Rafael Espindola 61fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola MachOObjectFile(MemoryBuffer *Object, bool IsLittleEndian, bool Is64Bits, 62fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola error_code &ec); 63da2a2372c6ae715befae7f086afe769dd80814f3Rafael Espindola 64fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const; 65fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const; 66fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const; 67fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getSymbolFileOffset(DataRefImpl Symb, uint64_t &Res) const; 6859a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindola virtual error_code getSymbolAlignment(DataRefImpl Symb, uint32_t &Res) const; 69fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const; 70da2a2372c6ae715befae7f086afe769dd80814f3Rafael Espindola virtual error_code getSymbolType(DataRefImpl Symb, 71da2a2372c6ae715befae7f086afe769dd80814f3Rafael Espindola SymbolRef::Type &Res) const; 72fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getSymbolNMTypeChar(DataRefImpl Symb, char &Res) const; 73fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getSymbolFlags(DataRefImpl Symb, uint32_t &Res) const; 74da2a2372c6ae715befae7f086afe769dd80814f3Rafael Espindola virtual error_code getSymbolSection(DataRefImpl Symb, 75da2a2372c6ae715befae7f086afe769dd80814f3Rafael Espindola section_iterator &Res) const; 76fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getSymbolValue(DataRefImpl Symb, uint64_t &Val) const; 77f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 78fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getSectionNext(DataRefImpl Sec, SectionRef &Res) const; 79fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getSectionName(DataRefImpl Sec, StringRef &Res) const; 80f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual error_code getSectionAddress(DataRefImpl Sec, uint64_t &Res) const; 81f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const; 82f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual error_code getSectionContents(DataRefImpl Sec, StringRef &Res) const; 83f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual error_code getSectionAlignment(DataRefImpl Sec, uint64_t &Res) const; 84f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const; 85fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code isSectionData(DataRefImpl Sec, bool &Res) const; 86fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code isSectionBSS(DataRefImpl Sec, bool &Res) const; 87fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code isSectionRequiredForExecution(DataRefImpl Sec, 88fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola bool &Res) const; 89fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code isSectionVirtual(DataRefImpl Sec, bool &Res) const; 90f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual error_code isSectionZeroInit(DataRefImpl Sec, bool &Res) const; 91fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code isSectionReadOnlyData(DataRefImpl Sec, bool &Res) const; 92fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb, 93fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola bool &Result) const; 94fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual relocation_iterator getSectionRelBegin(DataRefImpl Sec) const; 95f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual relocation_iterator getSectionRelEnd(DataRefImpl Sec) const; 96fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola 97fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getRelocationNext(DataRefImpl Rel, 98fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola RelocationRef &Res) const; 99f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual error_code getRelocationAddress(DataRefImpl Rel, uint64_t &Res) const; 100f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual error_code getRelocationOffset(DataRefImpl Rel, uint64_t &Res) const; 1016c1202c459ffa6d693ad92fa84e43902bc780bcaRafael Espindola virtual symbol_iterator getRelocationSymbol(DataRefImpl Rel) const; 102f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual error_code getRelocationType(DataRefImpl Rel, uint64_t &Res) const; 103f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual error_code getRelocationTypeName(DataRefImpl Rel, 104f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola SmallVectorImpl<char> &Result) const; 105f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual error_code getRelocationValueString(DataRefImpl Rel, 106f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola SmallVectorImpl<char> &Result) const; 107f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual error_code getRelocationHidden(DataRefImpl Rel, bool &Result) const; 108f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 109fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getLibraryNext(DataRefImpl LibData, LibraryRef &Res) const; 110fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getLibraryPath(DataRefImpl LibData, StringRef &Res) const; 111f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 1128d8ac09bfba6686bbed262c764502ae3de626ad4Eric Christopher // TODO: Would be useful to have an iterator based version 1138d8ac09bfba6686bbed262c764502ae3de626ad4Eric Christopher // of the load command interface too. 1148d8ac09bfba6686bbed262c764502ae3de626ad4Eric Christopher 115fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual symbol_iterator begin_symbols() const; 116fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual symbol_iterator end_symbols() const; 117f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 118fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual symbol_iterator begin_dynamic_symbols() const; 119fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual symbol_iterator end_dynamic_symbols() const; 120f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 121fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual section_iterator begin_sections() const; 122fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual section_iterator end_sections() const; 123f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 124fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual library_iterator begin_libraries_needed() const; 125fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual library_iterator end_libraries_needed() const; 126f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 127fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual uint8_t getBytesInAddress() const; 128f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 129fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual StringRef getFileFormatName() const; 130fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual unsigned getArch() const; 131f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 132fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual StringRef getLoadName() const; 133f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 1342173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola relocation_iterator getSectionRelBegin(unsigned Index) const; 1352173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola relocation_iterator getSectionRelEnd(unsigned Index) const; 1362173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola 13754154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby dice_iterator begin_dices() const; 13854154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby dice_iterator end_dices() const; 13954154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby 140fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola // In a MachO file, sections have a segment name. This is used in the .o 141fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola // files. They have a single segment, but this field specifies which segment 142fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola // a section should be put in in the final object. 143fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola StringRef getSectionFinalSegmentName(DataRefImpl Sec) const; 144f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 145fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola // Names are stored as 16 bytes. These returns the raw 16 bytes without 146fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola // interpreting them as a C string. 147fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola ArrayRef<char> getSectionRawName(DataRefImpl Sec) const; 148fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola ArrayRef<char> getSectionRawFinalSegmentName(DataRefImpl Sec) const; 149f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 150fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola // MachO specific Info about relocations. 151fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola bool isRelocationScattered(const macho::RelocationEntry &RE) const; 152fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola unsigned getPlainRelocationSymbolNum(const macho::RelocationEntry &RE) const; 153fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola bool getPlainRelocationExternal(const macho::RelocationEntry &RE) const; 154fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola bool getScatteredRelocationScattered(const macho::RelocationEntry &RE) const; 155fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola uint32_t getScatteredRelocationValue(const macho::RelocationEntry &RE) const; 156fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola unsigned getAnyRelocationAddress(const macho::RelocationEntry &RE) const; 157fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola unsigned getAnyRelocationPCRel(const macho::RelocationEntry &RE) const; 158fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola unsigned getAnyRelocationLength(const macho::RelocationEntry &RE) const; 159fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola unsigned getAnyRelocationType(const macho::RelocationEntry &RE) const; 160e87dadc44b1544c35e13cf48dfe167109929a944Rafael Espindola SectionRef getRelocationSection(const macho::RelocationEntry &RE) const; 161fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola 162fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola // Walk load commands. 163fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola LoadCommandInfo getFirstLoadCommandInfo() const; 164fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola LoadCommandInfo getNextLoadCommandInfo(const LoadCommandInfo &L) const; 165fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola 166fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola // MachO specific structures. 167fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola macho::Section getSection(DataRefImpl DRI) const; 168fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola macho::Section64 getSection64(DataRefImpl DRI) const; 1692173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola macho::Section getSection(const LoadCommandInfo &L, unsigned Index) const; 1702173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola macho::Section64 getSection64(const LoadCommandInfo &L, unsigned Index) const; 171fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola macho::SymbolTableEntry getSymbolTableEntry(DataRefImpl DRI) const; 172fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola macho::Symbol64TableEntry getSymbol64TableEntry(DataRefImpl DRI) const; 1732173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola 174fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola macho::LinkeditDataLoadCommand 175fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola getLinkeditDataLoadCommand(const LoadCommandInfo &L) const; 1762173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola macho::SegmentLoadCommand 1772173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola getSegmentLoadCommand(const LoadCommandInfo &L) const; 1782173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola macho::Segment64LoadCommand 1792173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola getSegment64LoadCommand(const LoadCommandInfo &L) const; 1802173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola macho::LinkerOptionsLoadCommand 1812173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola getLinkerOptionsLoadCommand(const LoadCommandInfo &L) const; 1822173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola 183fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola macho::RelocationEntry getRelocation(DataRefImpl Rel) const; 18454154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby macho::DataInCodeTableEntry getDice(DataRefImpl Rel) const; 185fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola macho::Header getHeader() const; 1862173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola macho::Header64Ext getHeader64Ext() const; 1872173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola macho::IndirectSymbolTableEntry 1882173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola getIndirectSymbolTableEntry(const macho::DysymtabLoadCommand &DLC, 1892173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola unsigned Index) const; 1902173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola macho::DataInCodeTableEntry getDataInCodeTableEntry(uint32_t DataOffset, 1912173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola unsigned Index) const; 192fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola macho::SymtabLoadCommand getSymtabLoadCommand() const; 1932173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola macho::DysymtabLoadCommand getDysymtabLoadCommand() const; 19454154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby macho::LinkeditDataLoadCommand getDataInCodeLoadCommand() const; 195f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 1962173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola StringRef getStringTableData() const; 197fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola bool is64Bit() const; 198fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola void ReadULEB128s(uint64_t Index, SmallVectorImpl<uint64_t> &Out) const; 199f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 2009c22f87b1374b06dc6c07f6e8047890e390bbe2dAlexey Samsonov static Triple::ArchType getArch(uint32_t CPUType); 2019c22f87b1374b06dc6c07f6e8047890e390bbe2dAlexey Samsonov 202fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola static bool classof(const Binary *v) { 203fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola return v->isMachO(); 204f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola } 205f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 206fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindolaprivate: 207fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola typedef SmallVector<const char*, 1> SectionList; 208fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola SectionList Sections; 209fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola const char *SymtabLoadCmd; 2102173e1839c2d00f7f980450dd537047b7b376e6bRafael Espindola const char *DysymtabLoadCmd; 21154154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby const char *DataInCodeLoadCmd; 212fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola}; 213f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 21454154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby/// DiceRef 21554154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderbyinline DiceRef::DiceRef(DataRefImpl DiceP, const ObjectFile *Owner) 21654154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby : DicePimpl(DiceP) , OwningObject(Owner) {} 21754154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby 21854154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderbyinline bool DiceRef::operator==(const DiceRef &Other) const { 21954154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby return DicePimpl == Other.DicePimpl; 22054154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby} 22154154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby 22254154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderbyinline bool DiceRef::operator<(const DiceRef &Other) const { 22354154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby return DicePimpl < Other.DicePimpl; 22454154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby} 22554154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby 22654154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderbyinline error_code DiceRef::getNext(DiceRef &Result) const { 22754154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby DataRefImpl Rel = DicePimpl; 22854154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby const macho::DataInCodeTableEntry *P = 22954154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby reinterpret_cast<const macho::DataInCodeTableEntry *>(Rel.p); 23054154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby Rel.p = reinterpret_cast<uintptr_t>(P + 1); 23154154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby Result = DiceRef(Rel, OwningObject); 23254154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby return object_error::success; 23354154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby} 23454154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby 23554154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby// Since a Mach-O data in code reference, a DiceRef, can only be created when 23654154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby// the OwningObject ObjectFile is a MachOObjectFile a static_cast<> is used for 23754154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby// the methods that get the values of the fields of the reference. 23854154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby 23954154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderbyinline error_code DiceRef::getOffset(uint32_t &Result) const { 24054154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby const MachOObjectFile *MachOOF = 24154154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby static_cast<const MachOObjectFile *>(OwningObject); 24254154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby macho::DataInCodeTableEntry Dice = MachOOF->getDice(DicePimpl); 24354154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby Result = Dice.Offset; 24454154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby return object_error::success; 24554154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby} 24654154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby 24754154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderbyinline error_code DiceRef::getLength(uint16_t &Result) const { 24854154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby const MachOObjectFile *MachOOF = 24954154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby static_cast<const MachOObjectFile *>(OwningObject); 25054154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby macho::DataInCodeTableEntry Dice = MachOOF->getDice(DicePimpl); 25154154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby Result = Dice.Length; 25254154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby return object_error::success; 25354154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby} 25454154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby 25554154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderbyinline error_code DiceRef::getKind(uint16_t &Result) const { 25654154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby const MachOObjectFile *MachOOF = 25754154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby static_cast<const MachOObjectFile *>(OwningObject); 25854154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby macho::DataInCodeTableEntry Dice = MachOOF->getDice(DicePimpl); 25954154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby Result = Dice.Kind; 26054154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby return object_error::success; 26154154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby} 26254154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby 26354154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderbyinline DataRefImpl DiceRef::getRawDataRefImpl() const { 26454154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby return DicePimpl; 26554154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby} 26654154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby 26754154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderbyinline const ObjectFile *DiceRef::getObjectFile() const { 26854154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby return OwningObject; 26954154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby} 27054154f3bf1ae3d2dfd68cc9474cad061b3338a40Kevin Enderby 271f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson} 272f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson} 273f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson 274f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson#endif 275f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson 276