ObjectFile.h revision 2c10ecbe4c800bd8a2e1b3e05c4eedf75658b565
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 { 314344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer // ELF needs this for relocations. This entire union should probably be a 324344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer // char[max(8, sizeof(uintptr_t))] and require the impl to cast. 334344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer uint16_t a, b; 344344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer uint32_t c; 354344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer } w; 364344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer struct { 377acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer uint32_t a, b; 387acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer } d; 3925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer uintptr_t p; 407acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer}; 417acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer 424344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencertemplate<class content_type> 434344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerclass content_iterator { 444344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer content_type Current; 454344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerpublic: 464344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer content_iterator(content_type symb) 474344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer : Current(symb) {} 484344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 494344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer const content_type* operator->() const { 504344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer return &Current; 514344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer } 524344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 534344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer const content_type &operator*() const { 544344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer return Current; 554344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer } 564344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 574344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer bool operator==(const content_iterator &other) const { 584344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer return Current == other.Current; 594344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer } 604344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 614344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer bool operator!=(const content_iterator &other) const { 624344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer return !(*this == other); 634344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer } 644344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 654344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer content_iterator& increment(error_code &err) { 664344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer content_type next; 674344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer if (error_code ec = Current.getNext(next)) 684344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer err = ec; 694344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer else 704344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer Current = next; 714344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer return *this; 724344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer } 734344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer}; 744344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 757acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencerstatic bool operator ==(const DataRefImpl &a, const DataRefImpl &b) { 767acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer // Check bitwise identical. This is the only legal way to compare a union w/o 777acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer // knowing which member is in use. 787acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer return std::memcmp(&a, &b, sizeof(DataRefImpl)) == 0; 797acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer} 8068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 8168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SymbolRef - This is a value type class that represents a single symbol in 8268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// the list of symbols in the object file. 8368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerclass SymbolRef { 8407ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer friend class SectionRef; 8568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer DataRefImpl SymbolPimpl; 8668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer const ObjectFile *OwningObject; 8768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 8868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic: 89dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer SymbolRef() : OwningObject(NULL) { 90dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer std::memset(&SymbolPimpl, 0, sizeof(SymbolPimpl)); 91dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer } 92dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer 931130a799ab2fd7042625163a2506518960394884Michael J. Spencer enum Type { 94ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer ST_Function, 95ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer ST_Data, 96ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer ST_External, // Defined in another object file 97ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer ST_Other 98ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer }; 99ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer 10068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer SymbolRef(DataRefImpl SymbolP, const ObjectFile *Owner); 10168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 10268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer bool operator==(const SymbolRef &Other) const; 10368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 10425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getNext(SymbolRef &Result) const; 10568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 10625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getName(StringRef &Result) const; 10725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getAddress(uint64_t &Result) const; 108ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer error_code getOffset(uint64_t &Result) const; 10925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getSize(uint64_t &Result) const; 1101130a799ab2fd7042625163a2506518960394884Michael J. Spencer error_code getType(SymbolRef::Type &Result) const; 11168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 11268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// Returns the ascii char that should be displayed in a symbol table dump via 11368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// nm for this symbol. 11425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getNMTypeChar(char &Result) const; 11568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 11668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// Returns true for symbols that are internal to the object file format such 11768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// as section symbols. 11825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code isInternal(bool &Result) const; 119ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer 120ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer /// Returns true for symbols that can be used in another objects, 121ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer /// such as library functions 122ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer error_code isGlobal(bool &Result) const; 12315c3f727aeff6a80e3f9e7e6b1284748e5f3322aNick Lewycky 12415c3f727aeff6a80e3f9e7e6b1284748e5f3322aNick Lewycky DataRefImpl getRawDataRefImpl() const; 12568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}; 1264344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencertypedef content_iterator<SymbolRef> symbol_iterator; 12768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 1280fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer/// RelocationRef - This is a value type class that represents a single 1290fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer/// relocation in the list of relocations in the object file. 1300fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerclass RelocationRef { 1310fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer DataRefImpl RelocationPimpl; 1320fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer const ObjectFile *OwningObject; 1330fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 1340fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerpublic: 1350fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer RelocationRef() : OwningObject(NULL) { 1360fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer std::memset(&RelocationPimpl, 0, sizeof(RelocationPimpl)); 1370fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer } 1380fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 1390fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer RelocationRef(DataRefImpl RelocationP, const ObjectFile *Owner); 1400fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 1410fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer bool operator==(const RelocationRef &Other) const; 1420fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 1430fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer error_code getNext(RelocationRef &Result) const; 1440fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 1450fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer error_code getAddress(uint64_t &Result) const; 1460fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer error_code getSymbol(SymbolRef &Result) const; 1470fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer error_code getType(uint32_t &Result) const; 1484344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 1494344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer /// @brief Get a string that represents the type of this relocation. 1504344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer /// 1514344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer /// This is for display purposes only. 1524344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer error_code getTypeName(SmallVectorImpl<char> &Result) const; 1530fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer error_code getAdditionalInfo(int64_t &Result) const; 1544344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 1554344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer /// @brief Get a string that represents the calculation of the value of this 1564344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer /// relocation. 1574344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer /// 1584344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer /// This is for display purposes only. 1594344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer error_code getValueString(SmallVectorImpl<char> &Result) const; 1600fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}; 1614344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencertypedef content_iterator<RelocationRef> relocation_iterator; 1620fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 16368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SectionRef - This is a value type class that represents a single section in 16468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// the list of sections in the object file. 16568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerclass SectionRef { 16607ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer friend class SymbolRef; 16768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer DataRefImpl SectionPimpl; 16868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer const ObjectFile *OwningObject; 16968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 17068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic: 171dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer SectionRef() : OwningObject(NULL) { 172dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer std::memset(&SectionPimpl, 0, sizeof(SectionPimpl)); 173dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer } 174dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer 17568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer SectionRef(DataRefImpl SectionP, const ObjectFile *Owner); 17668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 17768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer bool operator==(const SectionRef &Other) const; 17868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 17925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getNext(SectionRef &Result) const; 18068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 18125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getName(StringRef &Result) const; 18225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getAddress(uint64_t &Result) const; 18325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getSize(uint64_t &Result) const; 18425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getContents(StringRef &Result) const; 18568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 186e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer /// @brief Get the alignment of this section as the actual value (not log 2). 187e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer error_code getAlignment(uint64_t &Result) const; 188e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer 18968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // FIXME: Move to the normalization layer when it's created. 19025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code isText(bool &Result) const; 19113afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer error_code isData(bool &Result) const; 19213afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer error_code isBSS(bool &Result) const; 19307ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer 19407ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer error_code containsSymbol(SymbolRef S, bool &Result) const; 1954344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 1964344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer relocation_iterator begin_relocations() const; 1974344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer relocation_iterator end_relocations() const; 19868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}; 1994344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencertypedef content_iterator<SectionRef> section_iterator; 20068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 20168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerconst uint64_t UnknownAddressOrSize = ~0ULL; 20268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 20368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// ObjectFile - This class is the base class for all object file types. 20468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// Concrete instances of this object are created by createObjectFile, which 20568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// figure out which type to create. 206001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerclass ObjectFile : public Binary { 20768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerprivate: 20868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer ObjectFile(); // = delete 20968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer ObjectFile(const ObjectFile &other); // = delete 21068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 21168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerprotected: 212001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer ObjectFile(unsigned int Type, MemoryBuffer *source, error_code &ec); 21368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 214001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer const uint8_t *base() const { 215001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer return reinterpret_cast<const uint8_t *>(Data->getBufferStart()); 216001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer } 21768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 21868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // These functions are for SymbolRef to call internally. The main goal of 21968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // this is to allow SymbolRef::SymbolPimpl to point directly to the symbol 22068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // entry in the memory mapped object file. SymbolPimpl cannot contain any 22168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // virtual functions because then it could not point into the memory mapped 22268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // file. 22325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer // 22425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer // Implementations assume that the DataRefImpl is valid and has not been 22525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer // modified externally. It's UB otherwise. 22668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer friend class SymbolRef; 22725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const = 0; 22825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const = 0; 22925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const =0; 230ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer virtual error_code getSymbolOffset(DataRefImpl Symb, uint64_t &Res) const =0; 23125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const = 0; 2322c10ecbe4c800bd8a2e1b3e05c4eedf75658b565Michael J. Spencer virtual error_code getSymbolType(DataRefImpl Symb, 2332c10ecbe4c800bd8a2e1b3e05c4eedf75658b565Michael J. Spencer SymbolRef::Type &Res) const = 0; 23425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSymbolNMTypeChar(DataRefImpl Symb, char &Res) const = 0; 23525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code isSymbolInternal(DataRefImpl Symb, bool &Res) const = 0; 236ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer virtual error_code isSymbolGlobal(DataRefImpl Symb, bool &Res) const = 0; 2372c10ecbe4c800bd8a2e1b3e05c4eedf75658b565Michael J. Spencer 23868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 23968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // Same as above for SectionRef. 24068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer friend class SectionRef; 24125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSectionNext(DataRefImpl Sec, SectionRef &Res) const = 0; 24225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSectionName(DataRefImpl Sec, StringRef &Res) const = 0; 24325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSectionAddress(DataRefImpl Sec, uint64_t &Res) const =0; 24425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const = 0; 24525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSectionContents(DataRefImpl Sec, StringRef &Res)const=0; 246e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer virtual error_code getSectionAlignment(DataRefImpl Sec, uint64_t &Res)const=0; 24725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const = 0; 24813afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer virtual error_code isSectionData(DataRefImpl Sec, bool &Res) const = 0; 24913afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer virtual error_code isSectionBSS(DataRefImpl Sec, bool &Res) const = 0; 25007ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb, 25107ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer bool &Result) const = 0; 2524344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer virtual relocation_iterator getSectionRelBegin(DataRefImpl Sec) const = 0; 2534344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer virtual relocation_iterator getSectionRelEnd(DataRefImpl Sec) const = 0; 25468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 25568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 2560fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer // Same as above for RelocationRef. 2570fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer friend class RelocationRef; 2580fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer virtual error_code getRelocationNext(DataRefImpl Rel, 2590fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer RelocationRef &Res) const = 0; 2600fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer virtual error_code getRelocationAddress(DataRefImpl Rel, 2610fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer uint64_t &Res) const =0; 2620fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer virtual error_code getRelocationSymbol(DataRefImpl Rel, 2630fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer SymbolRef &Res) const = 0; 2640fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer virtual error_code getRelocationType(DataRefImpl Rel, 2650fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer uint32_t &Res) const = 0; 2664344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer virtual error_code getRelocationTypeName(DataRefImpl Rel, 2674344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer SmallVectorImpl<char> &Result) const = 0; 2680fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer virtual error_code getRelocationAdditionalInfo(DataRefImpl Rel, 2690fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer int64_t &Res) const = 0; 2704344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer virtual error_code getRelocationValueString(DataRefImpl Rel, 2714344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer SmallVectorImpl<char> &Result) const = 0; 2720fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 27368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic: 27468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 27568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer virtual symbol_iterator begin_symbols() const = 0; 27668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer virtual symbol_iterator end_symbols() const = 0; 27768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 27868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer virtual section_iterator begin_sections() const = 0; 27968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer virtual section_iterator end_sections() const = 0; 28068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 28168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// @brief The number of bytes used to represent an address in this object 28268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// file format. 28368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer virtual uint8_t getBytesInAddress() const = 0; 28468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 28568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer virtual StringRef getFileFormatName() const = 0; 28688af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencer virtual /* Triple::ArchType */ unsigned getArch() const = 0; 28768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 28868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// @returns Pointer to ObjectFile subclass to handle this type of object. 28968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// @param ObjectPath The path to the object file. ObjectPath.isObject must 29068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// return true. 29168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// @brief Create ObjectFile from path. 29288af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencer static ObjectFile *createObjectFile(StringRef ObjectPath); 29368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer static ObjectFile *createObjectFile(MemoryBuffer *Object); 29468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 295001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer static inline bool classof(const Binary *v) { 296001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer return v->getType() >= isObject && 297001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer v->getType() < lastObject; 298001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer } 299001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer static inline bool classof(const ObjectFile *v) { return true; } 300001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 301001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerpublic: 30268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer static ObjectFile *createCOFFObjectFile(MemoryBuffer *Object); 30368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer static ObjectFile *createELFObjectFile(MemoryBuffer *Object); 30468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer static ObjectFile *createMachOObjectFile(MemoryBuffer *Object); 30568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}; 30668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 30768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer// Inline function definitions. 30868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline SymbolRef::SymbolRef(DataRefImpl SymbolP, const ObjectFile *Owner) 30968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer : SymbolPimpl(SymbolP) 31068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer , OwningObject(Owner) {} 31168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 31268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline bool SymbolRef::operator==(const SymbolRef &Other) const { 31368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer return SymbolPimpl == Other.SymbolPimpl; 31468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 31568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 31625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getNext(SymbolRef &Result) const { 31725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSymbolNext(SymbolPimpl, Result); 31868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 31968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 32025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getName(StringRef &Result) const { 32125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSymbolName(SymbolPimpl, Result); 32268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 32368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 32425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getAddress(uint64_t &Result) const { 32525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSymbolAddress(SymbolPimpl, Result); 32668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 32768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 328ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramerinline error_code SymbolRef::getOffset(uint64_t &Result) const { 329ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer return OwningObject->getSymbolOffset(SymbolPimpl, Result); 330ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer} 331ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer 33225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getSize(uint64_t &Result) const { 33325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSymbolSize(SymbolPimpl, Result); 33468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 33568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 33625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getNMTypeChar(char &Result) const { 33725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSymbolNMTypeChar(SymbolPimpl, Result); 33868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 33968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 34025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::isInternal(bool &Result) const { 34125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->isSymbolInternal(SymbolPimpl, Result); 34268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 34368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 344ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramerinline error_code SymbolRef::isGlobal(bool &Result) const { 345ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer return OwningObject->isSymbolGlobal(SymbolPimpl, Result); 346ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer} 347ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer 3481130a799ab2fd7042625163a2506518960394884Michael J. Spencerinline error_code SymbolRef::getType(SymbolRef::Type &Result) const { 349ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer return OwningObject->getSymbolType(SymbolPimpl, Result); 350ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer} 351ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer 35215c3f727aeff6a80e3f9e7e6b1284748e5f3322aNick Lewyckyinline DataRefImpl SymbolRef::getRawDataRefImpl() const { 35315c3f727aeff6a80e3f9e7e6b1284748e5f3322aNick Lewycky return SymbolPimpl; 35415c3f727aeff6a80e3f9e7e6b1284748e5f3322aNick Lewycky} 35515c3f727aeff6a80e3f9e7e6b1284748e5f3322aNick Lewycky 35668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 35768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SectionRef 35868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline SectionRef::SectionRef(DataRefImpl SectionP, 35968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer const ObjectFile *Owner) 36068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer : SectionPimpl(SectionP) 36168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer , OwningObject(Owner) {} 36268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 36368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline bool SectionRef::operator==(const SectionRef &Other) const { 36468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer return SectionPimpl == Other.SectionPimpl; 36568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 36668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 36725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getNext(SectionRef &Result) const { 36825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSectionNext(SectionPimpl, Result); 36968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 37068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 37125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getName(StringRef &Result) const { 37225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSectionName(SectionPimpl, Result); 37368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 37468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 37525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getAddress(uint64_t &Result) const { 37625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSectionAddress(SectionPimpl, Result); 37768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 37868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 37925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getSize(uint64_t &Result) const { 38025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSectionSize(SectionPimpl, Result); 38168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 38268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 38325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getContents(StringRef &Result) const { 38425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSectionContents(SectionPimpl, Result); 38568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 38668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 387e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencerinline error_code SectionRef::getAlignment(uint64_t &Result) const { 388e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer return OwningObject->getSectionAlignment(SectionPimpl, Result); 389e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer} 390e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer 39125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::isText(bool &Result) const { 39225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->isSectionText(SectionPimpl, Result); 39368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 39468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 39513afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencerinline error_code SectionRef::isData(bool &Result) const { 39613afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer return OwningObject->isSectionData(SectionPimpl, Result); 39713afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer} 39813afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer 39913afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencerinline error_code SectionRef::isBSS(bool &Result) const { 40013afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer return OwningObject->isSectionBSS(SectionPimpl, Result); 40113afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer} 40213afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer 40307ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramerinline error_code SectionRef::containsSymbol(SymbolRef S, bool &Result) const { 40407ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer return OwningObject->sectionContainsSymbol(SectionPimpl, S.SymbolPimpl, 40507ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer Result); 40607ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer} 40707ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer 4084344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerinline relocation_iterator SectionRef::begin_relocations() const { 4094344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer return OwningObject->getSectionRelBegin(SectionPimpl); 4104344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer} 4114344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 4124344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerinline relocation_iterator SectionRef::end_relocations() const { 4134344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer return OwningObject->getSectionRelEnd(SectionPimpl); 4144344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer} 4154344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 4160fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 4170fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer/// RelocationRef 4180fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline RelocationRef::RelocationRef(DataRefImpl RelocationP, 4190fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer const ObjectFile *Owner) 4200fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer : RelocationPimpl(RelocationP) 4210fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer , OwningObject(Owner) {} 4220fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 4230fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline bool RelocationRef::operator==(const RelocationRef &Other) const { 4240fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer return RelocationPimpl == Other.RelocationPimpl; 4250fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer} 4260fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 4270fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getNext(RelocationRef &Result) const { 4280fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer return OwningObject->getRelocationNext(RelocationPimpl, Result); 4290fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer} 4300fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 4310fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getAddress(uint64_t &Result) const { 4320fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer return OwningObject->getRelocationAddress(RelocationPimpl, Result); 4330fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer} 4340fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 4350fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getSymbol(SymbolRef &Result) const { 4360fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer return OwningObject->getRelocationSymbol(RelocationPimpl, Result); 4370fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer} 4380fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 4390fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getType(uint32_t &Result) const { 4400fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer return OwningObject->getRelocationType(RelocationPimpl, Result); 4410fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer} 4420fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 4434344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerinline error_code RelocationRef::getTypeName(SmallVectorImpl<char> &Result) 4444344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer const { 4454344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer return OwningObject->getRelocationTypeName(RelocationPimpl, Result); 4464344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer} 4474344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 4480fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getAdditionalInfo(int64_t &Result) const { 4490fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer return OwningObject->getRelocationAdditionalInfo(RelocationPimpl, Result); 4500fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer} 4510fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 4524344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerinline error_code RelocationRef::getValueString(SmallVectorImpl<char> &Result) 4534344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer const { 4544344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer return OwningObject->getRelocationValueString(RelocationPimpl, Result); 4554344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer} 4564344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 45768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} // end namespace object 45868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} // end namespace llvm 45968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 46068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer#endif 461