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