ObjectFile.h revision 25b15777df42d5d608810f6881b6c98107481d69
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 4225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerclass RelocationRef { 4325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer DataRefImpl RelocationPimpl; 4425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer const ObjectFile *OwningObject; 4525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer 4625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerpublic: 4725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer RelocationRef() : OwningObject(NULL) { std::memset(&RelocationPimpl, 0, sizeof(RelocationPimpl)); } 4825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer RelocationRef(DataRefImpl RelocationP, const ObjectFile *Owner); 4925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer 5025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer bool operator==(const RelocationRef &Other) const; 5125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer 5225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getNext(RelocationRef &Result); 5325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer}; 5425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer 5568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SymbolRef - This is a value type class that represents a single symbol in 5668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// the list of symbols in the object file. 5768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerclass SymbolRef { 5868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer DataRefImpl SymbolPimpl; 5968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer const ObjectFile *OwningObject; 6068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 6168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic: 6225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer SymbolRef() : OwningObject(NULL) { std::memset(&SymbolPimpl, 0, sizeof(SymbolPimpl)); } 6368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer SymbolRef(DataRefImpl SymbolP, const ObjectFile *Owner); 6468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 6568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer bool operator==(const SymbolRef &Other) const; 6668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 6725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getNext(SymbolRef &Result) const; 6868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 6925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getName(StringRef &Result) const; 7025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getAddress(uint64_t &Result) const; 7125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getSize(uint64_t &Result) const; 7268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 7368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// Returns the ascii char that should be displayed in a symbol table dump via 7468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// nm for this symbol. 7525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getNMTypeChar(char &Result) const; 7668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 7768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// Returns true for symbols that are internal to the object file format such 7868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// as section symbols. 7925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code isInternal(bool &Result) const; 8068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}; 8168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 8268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SectionRef - This is a value type class that represents a single section in 8368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// the list of sections in the object file. 8468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerclass SectionRef { 8568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer DataRefImpl SectionPimpl; 8668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer const ObjectFile *OwningObject; 8768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 8868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic: 8925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer SectionRef() : OwningObject(NULL) { std::memset(&SectionPimpl, 0, sizeof(SectionPimpl)); } 9068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer SectionRef(DataRefImpl SectionP, const ObjectFile *Owner); 9168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 9268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer bool operator==(const SectionRef &Other) const; 9368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 9425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getNext(SectionRef &Result) const; 9568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 9625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getName(StringRef &Result) const; 9725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getAddress(uint64_t &Result) const; 9825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getSize(uint64_t &Result) const; 9925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getContents(StringRef &Result) const; 10068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 10168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // FIXME: Move to the normalization layer when it's created. 10225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code isText(bool &Result) const; 10368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}; 10468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 10568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerconst uint64_t UnknownAddressOrSize = ~0ULL; 10668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 10768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// ObjectFile - This class is the base class for all object file types. 10868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// Concrete instances of this object are created by createObjectFile, which 10968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// figure out which type to create. 110001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerclass ObjectFile : public Binary { 11168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerprivate: 11268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer ObjectFile(); // = delete 11368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer ObjectFile(const ObjectFile &other); // = delete 11468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 11568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerprotected: 116001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer ObjectFile(unsigned int Type, MemoryBuffer *source, error_code &ec); 11768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 118001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer const uint8_t *base() const { 119001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer return reinterpret_cast<const uint8_t *>(Data->getBufferStart()); 120001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer } 12168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 12268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // These functions are for SymbolRef to call internally. The main goal of 12368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // this is to allow SymbolRef::SymbolPimpl to point directly to the symbol 12468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // entry in the memory mapped object file. SymbolPimpl cannot contain any 12568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // virtual functions because then it could not point into the memory mapped 12668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // file. 12725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer // 12825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer // Implementations assume that the DataRefImpl is valid and has not been 12925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer // modified externally. It's UB otherwise. 13068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer friend class SymbolRef; 13125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const = 0; 13225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const = 0; 13325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const =0; 13425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const = 0; 13525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSymbolNMTypeChar(DataRefImpl Symb, char &Res) const = 0; 13625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code isSymbolInternal(DataRefImpl Symb, bool &Res) const = 0; 13768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 13868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // Same as above for SectionRef. 13968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer friend class SectionRef; 14025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSectionNext(DataRefImpl Sec, SectionRef &Res) const = 0; 14125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSectionName(DataRefImpl Sec, StringRef &Res) const = 0; 14225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSectionAddress(DataRefImpl Sec, uint64_t &Res) const =0; 14325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const = 0; 14425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSectionContents(DataRefImpl Sec, StringRef &Res)const=0; 14525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const = 0; 14668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 14768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 14868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic: 14968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer template<class content_type> 15068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer class content_iterator { 15168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer content_type Current; 15268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer public: 15368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer content_iterator(content_type symb) 15468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer : Current(symb) {} 15568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 15668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer const content_type* operator->() const { 15768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer return &Current; 15868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer } 15968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 16068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer bool operator==(const content_iterator &other) const { 16168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer return Current == other.Current; 16268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer } 16368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 16468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer bool operator!=(const content_iterator &other) const { 16568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer return !(*this == other); 16668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer } 16768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 16825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer content_iterator& increment(error_code &err) { 16925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer content_type next; 17025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer if (error_code ec = Current.getNext(next)) 17125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer err = ec; 17225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer else 17325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer Current = next; 17468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer return *this; 17568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer } 17668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer }; 17768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 17868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer typedef content_iterator<SymbolRef> symbol_iterator; 17968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer typedef content_iterator<SectionRef> section_iterator; 18068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 18168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer virtual symbol_iterator begin_symbols() const = 0; 18268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer virtual symbol_iterator end_symbols() const = 0; 18368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 18468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer virtual section_iterator begin_sections() const = 0; 18568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer virtual section_iterator end_sections() const = 0; 18668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 18768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// @brief The number of bytes used to represent an address in this object 18868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// file format. 18968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer virtual uint8_t getBytesInAddress() const = 0; 19068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 19168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer virtual StringRef getFileFormatName() const = 0; 19288af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencer virtual /* Triple::ArchType */ unsigned getArch() const = 0; 19368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 19468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// @returns Pointer to ObjectFile subclass to handle this type of object. 19568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// @param ObjectPath The path to the object file. ObjectPath.isObject must 19668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// return true. 19768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// @brief Create ObjectFile from path. 19888af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencer static ObjectFile *createObjectFile(StringRef ObjectPath); 19968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer static ObjectFile *createObjectFile(MemoryBuffer *Object); 20068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 201001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer static inline bool classof(const Binary *v) { 202001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer return v->getType() >= isObject && 203001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer v->getType() < lastObject; 204001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer } 205001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer static inline bool classof(const ObjectFile *v) { return true; } 206001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 207001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerpublic: 20868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer static ObjectFile *createCOFFObjectFile(MemoryBuffer *Object); 20968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer static ObjectFile *createELFObjectFile(MemoryBuffer *Object); 21068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer static ObjectFile *createMachOObjectFile(MemoryBuffer *Object); 21168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}; 21268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 21368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer// Inline function definitions. 21468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline SymbolRef::SymbolRef(DataRefImpl SymbolP, const ObjectFile *Owner) 21568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer : SymbolPimpl(SymbolP) 21668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer , OwningObject(Owner) {} 21768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 21868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline bool SymbolRef::operator==(const SymbolRef &Other) const { 21968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer return SymbolPimpl == Other.SymbolPimpl; 22068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 22168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 22225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getNext(SymbolRef &Result) const { 22325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSymbolNext(SymbolPimpl, Result); 22468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 22568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 22625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getName(StringRef &Result) const { 22725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSymbolName(SymbolPimpl, Result); 22868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 22968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 23025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getAddress(uint64_t &Result) const { 23125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSymbolAddress(SymbolPimpl, Result); 23268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 23368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 23425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getSize(uint64_t &Result) const { 23525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSymbolSize(SymbolPimpl, Result); 23668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 23768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 23825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getNMTypeChar(char &Result) const { 23925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSymbolNMTypeChar(SymbolPimpl, Result); 24068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 24168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 24225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::isInternal(bool &Result) const { 24325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->isSymbolInternal(SymbolPimpl, Result); 24468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 24568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 24668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 24768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SectionRef 24868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline SectionRef::SectionRef(DataRefImpl SectionP, 24968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer const ObjectFile *Owner) 25068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer : SectionPimpl(SectionP) 25168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer , OwningObject(Owner) {} 25268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 25368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline bool SectionRef::operator==(const SectionRef &Other) const { 25468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer return SectionPimpl == Other.SectionPimpl; 25568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 25668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 25725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getNext(SectionRef &Result) const { 25825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSectionNext(SectionPimpl, Result); 25968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 26068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 26125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getName(StringRef &Result) const { 26225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSectionName(SectionPimpl, Result); 26368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 26468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 26525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getAddress(uint64_t &Result) const { 26625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSectionAddress(SectionPimpl, Result); 26768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 26868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 26925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getSize(uint64_t &Result) const { 27025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSectionSize(SectionPimpl, Result); 27168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 27268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 27325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getContents(StringRef &Result) const { 27425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSectionContents(SectionPimpl, Result); 27568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 27668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 27725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::isText(bool &Result) const { 27825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->isSectionText(SectionPimpl, Result); 27968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 28068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 28168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} // end namespace object 28268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} // end namespace llvm 28368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 28468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer#endif 285