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