ObjectFile.h revision 2c67727046234ad9702ab5acb72700b5ac99a676
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> 2324973c1063bfb7ac353732a4e8eb801830336c5fEli Bendersky#include <vector> 2468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 2568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencernamespace llvm { 2668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencernamespace object { 2768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 2868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerclass ObjectFile; 297acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer 307acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencerunion DataRefImpl { 317acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer struct { 324344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer // ELF needs this for relocations. This entire union should probably be a 334344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer // char[max(8, sizeof(uintptr_t))] and require the impl to cast. 344344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer uint16_t a, b; 354344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer uint32_t c; 364344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer } w; 374344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer struct { 387acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer uint32_t a, b; 397acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer } d; 4025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer uintptr_t p; 417acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer}; 427acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer 434344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencertemplate<class content_type> 444344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerclass content_iterator { 454344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer content_type Current; 464344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerpublic: 474344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer content_iterator(content_type symb) 484344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer : Current(symb) {} 494344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 504344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer const content_type* operator->() const { 514344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer return &Current; 524344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer } 534344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 544344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer const content_type &operator*() const { 554344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer return Current; 564344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer } 574344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 584344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer bool operator==(const content_iterator &other) const { 594344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer return Current == other.Current; 604344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer } 614344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 624344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer bool operator!=(const content_iterator &other) const { 634344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer return !(*this == other); 644344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer } 654344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 664344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer content_iterator& increment(error_code &err) { 674344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer content_type next; 684344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer if (error_code ec = Current.getNext(next)) 694344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer err = ec; 704344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer else 714344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer Current = next; 724344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer return *this; 734344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer } 744344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer}; 754344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 767acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencerstatic bool operator ==(const DataRefImpl &a, const DataRefImpl &b) { 777acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer // Check bitwise identical. This is the only legal way to compare a union w/o 787acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer // knowing which member is in use. 797acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer return std::memcmp(&a, &b, sizeof(DataRefImpl)) == 0; 807acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer} 8168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 823314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencerstatic bool operator <(const DataRefImpl &a, const DataRefImpl &b) { 833314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer // Check bitwise identical. This is the only legal way to compare a union w/o 843314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer // knowing which member is in use. 853314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer return std::memcmp(&a, &b, sizeof(DataRefImpl)) < 0; 863314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer} 873314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer 889b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencerclass SymbolRef; 8968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 900fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer/// RelocationRef - This is a value type class that represents a single 910fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer/// relocation in the list of relocations in the object file. 920fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerclass RelocationRef { 930fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer DataRefImpl RelocationPimpl; 940fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer const ObjectFile *OwningObject; 950fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 960fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerpublic: 970fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer RelocationRef() : OwningObject(NULL) { 980fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer std::memset(&RelocationPimpl, 0, sizeof(RelocationPimpl)); 990fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer } 1000fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 1010fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer RelocationRef(DataRefImpl RelocationP, const ObjectFile *Owner); 1020fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 1030fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer bool operator==(const RelocationRef &Other) const; 1040fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 1050fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer error_code getNext(RelocationRef &Result) const; 1060fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 1070fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer error_code getAddress(uint64_t &Result) const; 108b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev error_code getOffset(uint64_t &Result) const; 1090fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer error_code getSymbol(SymbolRef &Result) const; 1109472b8d220fc746498429f430cb4c4dbfbd38f2aOwen Anderson error_code getType(uint64_t &Result) const; 1114344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 1120685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson /// @brief Indicates whether this relocation should hidden when listing 1130685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson /// relocations, usually because it is the trailing part of a multipart 1140685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson /// relocation that will be printed as part of the leading relocation. 1150685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson error_code getHidden(bool &Result) const; 1160685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson 1174344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer /// @brief Get a string that represents the type of this relocation. 1184344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer /// 1194344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer /// This is for display purposes only. 1204344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer error_code getTypeName(SmallVectorImpl<char> &Result) const; 1210fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer error_code getAdditionalInfo(int64_t &Result) const; 1224344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 1234344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer /// @brief Get a string that represents the calculation of the value of this 1244344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer /// relocation. 1254344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer /// 1264344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer /// This is for display purposes only. 1274344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer error_code getValueString(SmallVectorImpl<char> &Result) const; 1280fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}; 1294344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencertypedef content_iterator<RelocationRef> relocation_iterator; 1300fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 13168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SectionRef - This is a value type class that represents a single section in 13268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// the list of sections in the object file. 13368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerclass SectionRef { 13407ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer friend class SymbolRef; 13568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer DataRefImpl SectionPimpl; 13668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer const ObjectFile *OwningObject; 13768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 13868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic: 139dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer SectionRef() : OwningObject(NULL) { 140dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer std::memset(&SectionPimpl, 0, sizeof(SectionPimpl)); 141dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer } 142dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer 14368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer SectionRef(DataRefImpl SectionP, const ObjectFile *Owner); 14468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 14568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer bool operator==(const SectionRef &Other) const; 1463314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer bool operator <(const SectionRef &Other) const; 14768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 14825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getNext(SectionRef &Result) const; 14968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 15025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getName(StringRef &Result) const; 15125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getAddress(uint64_t &Result) const; 15225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getSize(uint64_t &Result) const; 15325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getContents(StringRef &Result) const; 15468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 155e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer /// @brief Get the alignment of this section as the actual value (not log 2). 156e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer error_code getAlignment(uint64_t &Result) const; 157e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer 15868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // FIXME: Move to the normalization layer when it's created. 15925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code isText(bool &Result) const; 16013afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer error_code isData(bool &Result) const; 16113afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer error_code isBSS(bool &Result) const; 16207ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer 16307ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer error_code containsSymbol(SymbolRef S, bool &Result) const; 1644344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 1654344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer relocation_iterator begin_relocations() const; 1664344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer relocation_iterator end_relocations() const; 16768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}; 1684344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencertypedef content_iterator<SectionRef> section_iterator; 16968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 1709b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer/// SymbolRef - This is a value type class that represents a single symbol in 1719b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer/// the list of symbols in the object file. 1729b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencerclass SymbolRef { 1739b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer friend class SectionRef; 1749b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer DataRefImpl SymbolPimpl; 1759b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer const ObjectFile *OwningObject; 1769b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer 1779b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencerpublic: 1789b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer SymbolRef() : OwningObject(NULL) { 1799b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer std::memset(&SymbolPimpl, 0, sizeof(SymbolPimpl)); 1809b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer } 1819b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer 1829b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer enum Type { 1832c67727046234ad9702ab5acb72700b5ac99a676David Meyer ST_Unknown, // Type not specified 1849b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer ST_Data, 185206d17cf605293f1c12d8bfa8cf72826a29b253fMichael J. Spencer ST_Debug, 186206d17cf605293f1c12d8bfa8cf72826a29b253fMichael J. Spencer ST_File, 187206d17cf605293f1c12d8bfa8cf72826a29b253fMichael J. Spencer ST_Function, 1889b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer ST_Other 1899b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer }; 1909b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer 191c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer enum Flags { 192c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer SF_None = 0, 1932c67727046234ad9702ab5acb72700b5ac99a676David Meyer SF_Undefined = 1U << 0, // Symbol is defined in another object file 1942c67727046234ad9702ab5acb72700b5ac99a676David Meyer SF_Global = 1U << 1, // Global symbol 1952c67727046234ad9702ab5acb72700b5ac99a676David Meyer SF_Weak = 1U << 2, // Weak symbol 1962c67727046234ad9702ab5acb72700b5ac99a676David Meyer SF_Absolute = 1U << 3, // Absolute symbol 1972c67727046234ad9702ab5acb72700b5ac99a676David Meyer SF_ThreadLocal = 1U << 4, // Thread local symbol 1982c67727046234ad9702ab5acb72700b5ac99a676David Meyer SF_Common = 1U << 5, // Symbol has common linkage 1992c67727046234ad9702ab5acb72700b5ac99a676David Meyer SF_FormatSpecific = 1U << 31 // Specific to the object file format 2002c67727046234ad9702ab5acb72700b5ac99a676David Meyer // (e.g. section symbols) 201c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer }; 202c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer 2039b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer SymbolRef(DataRefImpl SymbolP, const ObjectFile *Owner); 2049b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer 2059b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer bool operator==(const SymbolRef &Other) const; 2063314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer bool operator <(const SymbolRef &Other) const; 2079b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer 2089b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer error_code getNext(SymbolRef &Result) const; 2099b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer 2109b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer error_code getName(StringRef &Result) const; 2119b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer error_code getAddress(uint64_t &Result) const; 212b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev error_code getFileOffset(uint64_t &Result) const; 2139b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer error_code getSize(uint64_t &Result) const; 2149b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer error_code getType(SymbolRef::Type &Result) const; 2159b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer 2169b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer /// Returns the ascii char that should be displayed in a symbol table dump via 2179b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer /// nm for this symbol. 2189b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer error_code getNMTypeChar(char &Result) const; 2199b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer 220c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer /// Get symbol flags (bitwise OR of SymbolRef::Flags) 221c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer error_code getFlags(uint32_t &Result) const; 2229b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer 2239b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer /// @brief Get section this symbol is defined in reference to. Result is 2249b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer /// end_sections() if it is undefined or is an absolute symbol. 2259b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer error_code getSection(section_iterator &Result) const; 2269b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer 2279b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer DataRefImpl getRawDataRefImpl() const; 2289b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer}; 2299b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencertypedef content_iterator<SymbolRef> symbol_iterator; 2309b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer 23168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerconst uint64_t UnknownAddressOrSize = ~0ULL; 23268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 23368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// ObjectFile - This class is the base class for all object file types. 23468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// Concrete instances of this object are created by createObjectFile, which 23568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// figure out which type to create. 236001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerclass ObjectFile : public Binary { 2372d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 23868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer ObjectFile(); // = delete 23968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer ObjectFile(const ObjectFile &other); // = delete 24068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 24168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerprotected: 242001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer ObjectFile(unsigned int Type, MemoryBuffer *source, error_code &ec); 24368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 244001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer const uint8_t *base() const { 245001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer return reinterpret_cast<const uint8_t *>(Data->getBufferStart()); 246001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer } 24768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 24868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // These functions are for SymbolRef to call internally. The main goal of 24968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // this is to allow SymbolRef::SymbolPimpl to point directly to the symbol 25068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // entry in the memory mapped object file. SymbolPimpl cannot contain any 25168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // virtual functions because then it could not point into the memory mapped 25268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // file. 25325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer // 25425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer // Implementations assume that the DataRefImpl is valid and has not been 25525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer // modified externally. It's UB otherwise. 25668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer friend class SymbolRef; 25725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const = 0; 25825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const = 0; 25925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const =0; 260b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev virtual error_code getSymbolFileOffset(DataRefImpl Symb, uint64_t &Res) const =0; 26125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const = 0; 2622c10ecbe4c800bd8a2e1b3e05c4eedf75658b565Michael J. Spencer virtual error_code getSymbolType(DataRefImpl Symb, 2632c10ecbe4c800bd8a2e1b3e05c4eedf75658b565Michael J. Spencer SymbolRef::Type &Res) const = 0; 26425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSymbolNMTypeChar(DataRefImpl Symb, char &Res) const = 0; 265c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer virtual error_code getSymbolFlags(DataRefImpl Symb, 266c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer uint32_t &Res) const = 0; 2679b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer virtual error_code getSymbolSection(DataRefImpl Symb, 2689b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer section_iterator &Res) const = 0; 26968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 27068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer // Same as above for SectionRef. 27168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer friend class SectionRef; 27225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSectionNext(DataRefImpl Sec, SectionRef &Res) const = 0; 27325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSectionName(DataRefImpl Sec, StringRef &Res) const = 0; 27425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSectionAddress(DataRefImpl Sec, uint64_t &Res) const =0; 27525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const = 0; 27625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSectionContents(DataRefImpl Sec, StringRef &Res)const=0; 277e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer virtual error_code getSectionAlignment(DataRefImpl Sec, uint64_t &Res)const=0; 27825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const = 0; 27913afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer virtual error_code isSectionData(DataRefImpl Sec, bool &Res) const = 0; 28013afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer virtual error_code isSectionBSS(DataRefImpl Sec, bool &Res) const = 0; 28107ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb, 28207ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer bool &Result) const = 0; 2834344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer virtual relocation_iterator getSectionRelBegin(DataRefImpl Sec) const = 0; 2844344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer virtual relocation_iterator getSectionRelEnd(DataRefImpl Sec) const = 0; 28568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 28668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 2870fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer // Same as above for RelocationRef. 2880fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer friend class RelocationRef; 2890fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer virtual error_code getRelocationNext(DataRefImpl Rel, 2900fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer RelocationRef &Res) const = 0; 2910fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer virtual error_code getRelocationAddress(DataRefImpl Rel, 2920fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer uint64_t &Res) const =0; 293b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev virtual error_code getRelocationOffset(DataRefImpl Rel, 294b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev uint64_t &Res) const =0; 2950fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer virtual error_code getRelocationSymbol(DataRefImpl Rel, 2960fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer SymbolRef &Res) const = 0; 2970fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer virtual error_code getRelocationType(DataRefImpl Rel, 2989472b8d220fc746498429f430cb4c4dbfbd38f2aOwen Anderson uint64_t &Res) const = 0; 2994344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer virtual error_code getRelocationTypeName(DataRefImpl Rel, 3004344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer SmallVectorImpl<char> &Result) const = 0; 3010fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer virtual error_code getRelocationAdditionalInfo(DataRefImpl Rel, 3020fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer int64_t &Res) const = 0; 3034344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer virtual error_code getRelocationValueString(DataRefImpl Rel, 3044344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer SmallVectorImpl<char> &Result) const = 0; 3050685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson virtual error_code getRelocationHidden(DataRefImpl Rel, bool &Result) const { 3060685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson Result = false; 3070685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson return object_error::success; 3080685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson } 3090fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 31068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic: 31168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 31268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer virtual symbol_iterator begin_symbols() const = 0; 31368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer virtual symbol_iterator end_symbols() const = 0; 31468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 315dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer virtual symbol_iterator begin_dynamic_symbols() const = 0; 316dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer virtual symbol_iterator end_dynamic_symbols() const = 0; 317dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer 31868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer virtual section_iterator begin_sections() const = 0; 31968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer virtual section_iterator end_sections() const = 0; 32068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 32168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// @brief The number of bytes used to represent an address in this object 32268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// file format. 32368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer virtual uint8_t getBytesInAddress() const = 0; 32468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 32568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer virtual StringRef getFileFormatName() const = 0; 32688af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencer virtual /* Triple::ArchType */ unsigned getArch() const = 0; 32768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 32868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// @returns Pointer to ObjectFile subclass to handle this type of object. 32968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// @param ObjectPath The path to the object file. ObjectPath.isObject must 33068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// return true. 33168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer /// @brief Create ObjectFile from path. 33288af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencer static ObjectFile *createObjectFile(StringRef ObjectPath); 33368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer static ObjectFile *createObjectFile(MemoryBuffer *Object); 33468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 335001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer static inline bool classof(const Binary *v) { 336001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer return v->getType() >= isObject && 337001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer v->getType() < lastObject; 338001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer } 339001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer static inline bool classof(const ObjectFile *v) { return true; } 340001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 341001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerpublic: 34268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer static ObjectFile *createCOFFObjectFile(MemoryBuffer *Object); 343f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky static ObjectFile *createELFObjectFile(MemoryBuffer *Object); 34468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer static ObjectFile *createMachOObjectFile(MemoryBuffer *Object); 34568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}; 34668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 34768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer// Inline function definitions. 34868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline SymbolRef::SymbolRef(DataRefImpl SymbolP, const ObjectFile *Owner) 34968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer : SymbolPimpl(SymbolP) 35068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer , OwningObject(Owner) {} 35168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 35268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline bool SymbolRef::operator==(const SymbolRef &Other) const { 35368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer return SymbolPimpl == Other.SymbolPimpl; 35468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 35568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 3563314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencerinline bool SymbolRef::operator <(const SymbolRef &Other) const { 3573314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer return SymbolPimpl < Other.SymbolPimpl; 3583314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer} 3593314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer 36025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getNext(SymbolRef &Result) const { 36125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSymbolNext(SymbolPimpl, Result); 36268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 36368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 36425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getName(StringRef &Result) const { 36525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSymbolName(SymbolPimpl, Result); 36668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 36768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 36825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getAddress(uint64_t &Result) const { 36925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSymbolAddress(SymbolPimpl, Result); 37068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 37168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 372b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshevinline error_code SymbolRef::getFileOffset(uint64_t &Result) const { 373b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev return OwningObject->getSymbolFileOffset(SymbolPimpl, Result); 374ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer} 375ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer 37625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getSize(uint64_t &Result) const { 37725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSymbolSize(SymbolPimpl, Result); 37868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 37968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 38025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getNMTypeChar(char &Result) const { 38125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSymbolNMTypeChar(SymbolPimpl, Result); 38268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 38368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 384c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyerinline error_code SymbolRef::getFlags(uint32_t &Result) const { 385c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer return OwningObject->getSymbolFlags(SymbolPimpl, Result); 3869b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer} 3879b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer 3889b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencerinline error_code SymbolRef::getSection(section_iterator &Result) const { 3899b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer return OwningObject->getSymbolSection(SymbolPimpl, Result); 3909b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer} 3919b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer 3921130a799ab2fd7042625163a2506518960394884Michael J. Spencerinline error_code SymbolRef::getType(SymbolRef::Type &Result) const { 393ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer return OwningObject->getSymbolType(SymbolPimpl, Result); 394ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer} 395ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer 39615c3f727aeff6a80e3f9e7e6b1284748e5f3322aNick Lewyckyinline DataRefImpl SymbolRef::getRawDataRefImpl() const { 39715c3f727aeff6a80e3f9e7e6b1284748e5f3322aNick Lewycky return SymbolPimpl; 39815c3f727aeff6a80e3f9e7e6b1284748e5f3322aNick Lewycky} 39915c3f727aeff6a80e3f9e7e6b1284748e5f3322aNick Lewycky 40068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 40168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SectionRef 40268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline SectionRef::SectionRef(DataRefImpl SectionP, 40368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer const ObjectFile *Owner) 40468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer : SectionPimpl(SectionP) 40568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer , OwningObject(Owner) {} 40668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 40768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline bool SectionRef::operator==(const SectionRef &Other) const { 40868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer return SectionPimpl == Other.SectionPimpl; 40968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 41068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 4113314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencerinline bool SectionRef::operator <(const SectionRef &Other) const { 4123314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer return SectionPimpl < Other.SectionPimpl; 4133314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer} 4143314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer 41525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getNext(SectionRef &Result) const { 41625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSectionNext(SectionPimpl, Result); 41768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 41868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 41925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getName(StringRef &Result) const { 42025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSectionName(SectionPimpl, Result); 42168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 42268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 42325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getAddress(uint64_t &Result) const { 42425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSectionAddress(SectionPimpl, Result); 42568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 42668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 42725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getSize(uint64_t &Result) const { 42825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSectionSize(SectionPimpl, Result); 42968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 43068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 43125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getContents(StringRef &Result) const { 43225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->getSectionContents(SectionPimpl, Result); 43368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 43468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 435e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencerinline error_code SectionRef::getAlignment(uint64_t &Result) const { 436e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer return OwningObject->getSectionAlignment(SectionPimpl, Result); 437e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer} 438e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer 43925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::isText(bool &Result) const { 44025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return OwningObject->isSectionText(SectionPimpl, Result); 44168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} 44268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 44313afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencerinline error_code SectionRef::isData(bool &Result) const { 44413afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer return OwningObject->isSectionData(SectionPimpl, Result); 44513afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer} 44613afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer 44713afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencerinline error_code SectionRef::isBSS(bool &Result) const { 44813afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer return OwningObject->isSectionBSS(SectionPimpl, Result); 44913afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer} 45013afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer 45107ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramerinline error_code SectionRef::containsSymbol(SymbolRef S, bool &Result) const { 45207ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer return OwningObject->sectionContainsSymbol(SectionPimpl, S.SymbolPimpl, 45307ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer Result); 45407ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer} 45507ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer 4564344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerinline relocation_iterator SectionRef::begin_relocations() const { 4574344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer return OwningObject->getSectionRelBegin(SectionPimpl); 4584344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer} 4594344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 4604344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerinline relocation_iterator SectionRef::end_relocations() const { 4614344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer return OwningObject->getSectionRelEnd(SectionPimpl); 4624344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer} 4634344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 4640fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 4650fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer/// RelocationRef 4660fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline RelocationRef::RelocationRef(DataRefImpl RelocationP, 4670fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer const ObjectFile *Owner) 4680fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer : RelocationPimpl(RelocationP) 4690fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer , OwningObject(Owner) {} 4700fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 4710fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline bool RelocationRef::operator==(const RelocationRef &Other) const { 4720fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer return RelocationPimpl == Other.RelocationPimpl; 4730fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer} 4740fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 4750fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getNext(RelocationRef &Result) const { 4760fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer return OwningObject->getRelocationNext(RelocationPimpl, Result); 4770fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer} 4780fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 4790fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getAddress(uint64_t &Result) const { 4800fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer return OwningObject->getRelocationAddress(RelocationPimpl, Result); 4810fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer} 4820fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 483b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshevinline error_code RelocationRef::getOffset(uint64_t &Result) const { 484b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev return OwningObject->getRelocationOffset(RelocationPimpl, Result); 485b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev} 486b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev 4870fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getSymbol(SymbolRef &Result) const { 4880fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer return OwningObject->getRelocationSymbol(RelocationPimpl, Result); 4890fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer} 4900fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 4919472b8d220fc746498429f430cb4c4dbfbd38f2aOwen Andersoninline error_code RelocationRef::getType(uint64_t &Result) const { 4920fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer return OwningObject->getRelocationType(RelocationPimpl, Result); 4930fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer} 4940fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 4954344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerinline error_code RelocationRef::getTypeName(SmallVectorImpl<char> &Result) 4964344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer const { 4974344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer return OwningObject->getRelocationTypeName(RelocationPimpl, Result); 4984344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer} 4994344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 5000fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getAdditionalInfo(int64_t &Result) const { 5010fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer return OwningObject->getRelocationAdditionalInfo(RelocationPimpl, Result); 5020fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer} 5030fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 5044344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerinline error_code RelocationRef::getValueString(SmallVectorImpl<char> &Result) 5054344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer const { 5064344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer return OwningObject->getRelocationValueString(RelocationPimpl, Result); 5074344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer} 5084344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 5090685e94895f26f96aa1032696e3150dd00aad1f3Owen Andersoninline error_code RelocationRef::getHidden(bool &Result) const { 5100685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson return OwningObject->getRelocationHidden(RelocationPimpl, Result); 5110685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson} 5120685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson 51368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} // end namespace object 51468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} // end namespace llvm 51568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer 51668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer#endif 517