ObjectFile.h revision 0fcab076f0358890e2f1b213f4303c780e05d99d
168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer//===- ObjectFile.h - File format independent object file -------*- C++ -*-===// 268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer// 368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer// The LLVM Compiler Infrastructure 468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer// 568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer// This file is distributed under the University of Illinois Open Source 668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer// License. See LICENSE.TXT for details. 768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer// 868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer//===----------------------------------------------------------------------===// 968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer// 1068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer// This file declares a file format independent ObjectFile class. 1168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer// 1268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer//===----------------------------------------------------------------------===// 1368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 1468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer#ifndef LLVM_OBJECT_OBJECT_FILE_H 1568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer#define LLVM_OBJECT_OBJECT_FILE_H 1668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 17001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer#include "llvm/Object/Binary.h" 1888af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencer#include "llvm/ADT/StringRef.h" 191f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/DataTypes.h" 2025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer#include "llvm/Support/ErrorHandling.h" 21001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer#include "llvm/Support/MemoryBuffer.h" 227acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer#include <cstring> 2368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 2468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencernamespace llvm { 2568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencernamespace object { 2668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 2768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerclass ObjectFile; 287acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer 297acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencerunion DataRefImpl { 307acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer struct { 317acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer uint32_t a, b; 327acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer } d; 3325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer uintptr_t p; 347acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer}; 357acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer 367acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencerstatic bool operator ==(const DataRefImpl &a, const DataRefImpl &b) { 377acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer // Check bitwise identical. This is the only legal way to compare a union w/o 387acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer // knowing which member is in use. 397acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer return std::memcmp(&a, &b, sizeof(DataRefImpl)) == 0; 407acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer} 4168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 4268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SymbolRef - This is a value type class that represents a single symbol in 4368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// the list of symbols in the object file. 4468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerclass SymbolRef { 4507ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer friend class SectionRef; 4668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer DataRefImpl SymbolPimpl; 4768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer const ObjectFile *OwningObject; 4868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 4968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic: 50dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer SymbolRef() : OwningObject(NULL) { 51dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer std::memset(&SymbolPimpl, 0, sizeof(SymbolPimpl)); 52dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer } 53dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer 5468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer SymbolRef(DataRefImpl SymbolP, const ObjectFile *Owner); 5568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 5668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer bool operator==(const SymbolRef &Other) const; 5768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 5825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getNext(SymbolRef &Result) const; 5968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 6025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getName(StringRef &Result) const; 6125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getAddress(uint64_t &Result) const; 6225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getSize(uint64_t &Result) const; 6368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 6468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// Returns the ascii char that should be displayed in a symbol table dump via 6568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// nm for this symbol. 6625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getNMTypeChar(char &Result) const; 6768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 6868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// Returns true for symbols that are internal to the object file format such 6968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// as section symbols. 7025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code isInternal(bool &Result) const; 7168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}; 7268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 730fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer/// RelocationRef - This is a value type class that represents a single 740fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer/// relocation in the list of relocations in the object file. 750fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerclass RelocationRef { 760fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer DataRefImpl RelocationPimpl; 770fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer const ObjectFile *OwningObject; 780fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 790fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerpublic: 800fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer RelocationRef() : OwningObject(NULL) { 810fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer std::memset(&RelocationPimpl, 0, sizeof(RelocationPimpl)); 820fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer } 830fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 840fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer RelocationRef(DataRefImpl RelocationP, const ObjectFile *Owner); 850fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 860fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer bool operator==(const RelocationRef &Other) const; 870fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 880fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer error_code getNext(RelocationRef &Result) const; 890fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 900fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer error_code getAddress(uint64_t &Result) const; 910fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer error_code getSymbol(SymbolRef &Result) const; 920fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer error_code getType(uint32_t &Result) const; 930fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer error_code getAdditionalInfo(int64_t &Result) const; 940fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}; 950fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 9668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SectionRef - This is a value type class that represents a single section in 9768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// the list of sections in the object file. 9868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerclass SectionRef { 9907ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer friend class SymbolRef; 10068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer DataRefImpl SectionPimpl; 10168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer const ObjectFile *OwningObject; 10268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 10368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic: 104dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer SectionRef() : OwningObject(NULL) { 105dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer std::memset(&SectionPimpl, 0, sizeof(SectionPimpl)); 106dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer } 107dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer 10868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer SectionRef(DataRefImpl SectionP, const ObjectFile *Owner); 10968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 11068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer bool operator==(const SectionRef &Other) const; 11168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 11225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getNext(SectionRef &Result) const; 11368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 11425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getName(StringRef &Result) const; 11525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getAddress(uint64_t &Result) const; 11625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getSize(uint64_t &Result) const; 11725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getContents(StringRef &Result) const; 11868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 11968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // FIXME: Move to the normalization layer when it's created. 12025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code isText(bool &Result) const; 12107ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer 12207ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer error_code containsSymbol(SymbolRef S, bool &Result) const; 12368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}; 12468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 12568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerconst uint64_t UnknownAddressOrSize = ~0ULL; 12668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 12768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// ObjectFile - This class is the base class for all object file types. 12868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// Concrete instances of this object are created by createObjectFile, which 12968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// figure out which type to create. 130001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerclass ObjectFile : public Binary { 13168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerprivate: 13268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer ObjectFile(); // = delete 13368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer ObjectFile(const ObjectFile &other); // = delete 13468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 13568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerprotected: 136001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer ObjectFile(unsigned int Type, MemoryBuffer *source, error_code &ec); 13768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 138001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer const uint8_t *base() const { 139001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer return reinterpret_cast<const uint8_t *>(Data->getBufferStart()); 140001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer } 14168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 14268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // These functions are for SymbolRef to call internally. The main goal of 14368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // this is to allow SymbolRef::SymbolPimpl to point directly to the symbol 14468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // entry in the memory mapped object file. SymbolPimpl cannot contain any 14568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // virtual functions because then it could not point into the memory mapped 14668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // file. 14725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer // 14825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer // Implementations assume that the DataRefImpl is valid and has not been 14925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer // modified externally. It's UB otherwise. 15068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer friend class SymbolRef; 15125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const = 0; 15225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const = 0; 15325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const =0; 15425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const = 0; 15525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSymbolNMTypeChar(DataRefImpl Symb, char &Res) const = 0; 15625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code isSymbolInternal(DataRefImpl Symb, bool &Res) const = 0; 15768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 15868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // Same as above for SectionRef. 15968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer friend class SectionRef; 16025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSectionNext(DataRefImpl Sec, SectionRef &Res) const = 0; 16125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSectionName(DataRefImpl Sec, StringRef &Res) const = 0; 16225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSectionAddress(DataRefImpl Sec, uint64_t &Res) const =0; 16325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const = 0; 16425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSectionContents(DataRefImpl Sec, StringRef &Res)const=0; 16525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const = 0; 16607ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb, 16707ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer bool &Result) const = 0; 16868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 16968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 1700fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer // Same as above for RelocationRef. 1710fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer friend class RelocationRef; 1720fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer virtual error_code getRelocationNext(DataRefImpl Rel, 1730fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer RelocationRef &Res) const = 0; 1740fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer virtual error_code getRelocationAddress(DataRefImpl Rel, 1750fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer uint64_t &Res) const =0; 1760fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer virtual error_code getRelocationSymbol(DataRefImpl Rel, 1770fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer SymbolRef &Res) const = 0; 1780fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer virtual error_code getRelocationType(DataRefImpl Rel, 1790fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer uint32_t &Res) const = 0; 1800fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer virtual error_code getRelocationAdditionalInfo(DataRefImpl Rel, 1810fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer int64_t &Res) const = 0; 1820fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 18368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic: 18468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer template<class content_type> 18568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer class content_iterator { 18668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer content_type Current; 18768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer public: 18868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer content_iterator(content_type symb) 18968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer : Current(symb) {} 19068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 19168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer const content_type* operator->() const { 19268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer return &Current; 19368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer } 19468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 195739b65bf85cf7221b8a615e83dee11ec729e2649Benjamin Kramer const content_type &operator*() const { 196739b65bf85cf7221b8a615e83dee11ec729e2649Benjamin Kramer return Current; 197739b65bf85cf7221b8a615e83dee11ec729e2649Benjamin Kramer } 198739b65bf85cf7221b8a615e83dee11ec729e2649Benjamin Kramer 19968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer bool operator==(const content_iterator &other) const { 20068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer return Current == other.Current; 20168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer } 20268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 20368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer bool operator!=(const content_iterator &other) const { 20468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer return !(*this == other); 20568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer } 20668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 20725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer content_iterator& increment(error_code &err) { 20825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer content_type next; 20925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer if (error_code ec = Current.getNext(next)) 21025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer err = ec; 21125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer else 21225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer Current = next; 21368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer return *this; 21468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer } 21568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer }; 21668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 21768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer typedef content_iterator<SymbolRef> symbol_iterator; 21868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer typedef content_iterator<SectionRef> section_iterator; 2190fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer typedef content_iterator<RelocationRef> relocation_iterator; 22068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 22168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer virtual symbol_iterator begin_symbols() const = 0; 22268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer virtual symbol_iterator end_symbols() const = 0; 22368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 22468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer virtual section_iterator begin_sections() const = 0; 22568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer virtual section_iterator end_sections() const = 0; 22668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 2270fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer virtual relocation_iterator begin_relocations() const = 0; 2280fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer virtual relocation_iterator end_relocations() const = 0; 2290fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 23068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// @brief The number of bytes used to represent an address in this object 23168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// file format. 23268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer virtual uint8_t getBytesInAddress() const = 0; 23368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 23468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer virtual StringRef getFileFormatName() const = 0; 23588af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencer virtual /* Triple::ArchType */ unsigned getArch() const = 0; 23668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 23768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// @returns Pointer to ObjectFile subclass to handle this type of object. 23868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// @param ObjectPath The path to the object file. ObjectPath.isObject must 23968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// return true. 24068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// @brief Create ObjectFile from path. 24188af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencer static ObjectFile *createObjectFile(StringRef ObjectPath); 24268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer static ObjectFile *createObjectFile(MemoryBuffer *Object); 24368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 244001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer static inline bool classof(const Binary *v) { 245001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer return v->getType() >= isObject && 246001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer v->getType() < lastObject; 247001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer } 248001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer static inline bool classof(const ObjectFile *v) { return true; } 249001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 250001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerpublic: 25168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer static ObjectFile *createCOFFObjectFile(MemoryBuffer *Object); 25268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer static ObjectFile *createELFObjectFile(MemoryBuffer *Object); 25368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer static ObjectFile *createMachOObjectFile(MemoryBuffer *Object); 25468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}; 25568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 25668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer// Inline function definitions. 25768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline SymbolRef::SymbolRef(DataRefImpl SymbolP, const ObjectFile *Owner) 25868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer : SymbolPimpl(SymbolP) 25968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer , OwningObject(Owner) {} 26068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 26168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline bool SymbolRef::operator==(const SymbolRef &Other) const { 26268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer return SymbolPimpl == Other.SymbolPimpl; 26368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 26468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 26525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getNext(SymbolRef &Result) const { 26625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSymbolNext(SymbolPimpl, Result); 26768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 26868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 26925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getName(StringRef &Result) const { 27025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSymbolName(SymbolPimpl, Result); 27168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 27268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 27325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getAddress(uint64_t &Result) const { 27425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSymbolAddress(SymbolPimpl, Result); 27568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 27668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 27725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getSize(uint64_t &Result) const { 27825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSymbolSize(SymbolPimpl, Result); 27968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 28068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 28125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getNMTypeChar(char &Result) const { 28225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSymbolNMTypeChar(SymbolPimpl, Result); 28368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 28468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 28525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::isInternal(bool &Result) const { 28625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->isSymbolInternal(SymbolPimpl, Result); 28768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 28868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 28968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 29068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SectionRef 29168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline SectionRef::SectionRef(DataRefImpl SectionP, 29268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer const ObjectFile *Owner) 29368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer : SectionPimpl(SectionP) 29468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer , OwningObject(Owner) {} 29568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 29668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline bool SectionRef::operator==(const SectionRef &Other) const { 29768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer return SectionPimpl == Other.SectionPimpl; 29868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 29968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 30025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getNext(SectionRef &Result) const { 30125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSectionNext(SectionPimpl, Result); 30268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 30368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 30425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getName(StringRef &Result) const { 30525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSectionName(SectionPimpl, Result); 30668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 30768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 30825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getAddress(uint64_t &Result) const { 30925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSectionAddress(SectionPimpl, Result); 31068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 31168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 31225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getSize(uint64_t &Result) const { 31325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSectionSize(SectionPimpl, Result); 31468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 31568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 31625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getContents(StringRef &Result) const { 31725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSectionContents(SectionPimpl, Result); 31868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 31968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 32025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::isText(bool &Result) const { 32125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->isSectionText(SectionPimpl, Result); 32268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 32368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 32407ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramerinline error_code SectionRef::containsSymbol(SymbolRef S, bool &Result) const { 32507ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer return OwningObject->sectionContainsSymbol(SectionPimpl, S.SymbolPimpl, 32607ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer Result); 32707ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer} 32807ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer 3290fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 3300fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer/// RelocationRef 3310fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline RelocationRef::RelocationRef(DataRefImpl RelocationP, 3320fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer const ObjectFile *Owner) 3330fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer : RelocationPimpl(RelocationP) 3340fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer , OwningObject(Owner) {} 3350fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 3360fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline bool RelocationRef::operator==(const RelocationRef &Other) const { 3370fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer return RelocationPimpl == Other.RelocationPimpl; 3380fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer} 3390fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 3400fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getNext(RelocationRef &Result) const { 3410fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer return OwningObject->getRelocationNext(RelocationPimpl, Result); 3420fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer} 3430fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 3440fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getAddress(uint64_t &Result) const { 3450fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer return OwningObject->getRelocationAddress(RelocationPimpl, Result); 3460fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer} 3470fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 3480fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getSymbol(SymbolRef &Result) const { 3490fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer return OwningObject->getRelocationSymbol(RelocationPimpl, Result); 3500fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer} 3510fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 3520fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getType(uint32_t &Result) const { 3530fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer return OwningObject->getRelocationType(RelocationPimpl, Result); 3540fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer} 3550fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 3560fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getAdditionalInfo(int64_t &Result) const { 3570fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer return OwningObject->getRelocationAdditionalInfo(RelocationPimpl, Result); 3580fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer} 3590fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 36068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} // end namespace object 36168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} // end namespace llvm 36268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 36368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer#endif 364