ObjectFile.h revision 6c1202c459ffa6d693ad92fa84e43902bc780bca
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
14674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#ifndef LLVM_OBJECT_OBJECTFILE_H
15674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#define LLVM_OBJECT_OBJECTFILE_H
1668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
1788af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencer#include "llvm/ADT/StringRef.h"
18255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/Object/Binary.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 {
317486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola  // This entire union should probably be a
327486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola  // char[max(8, sizeof(uintptr_t))] and require the impl to cast.
334344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  struct {
347acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer    uint32_t a, b;
357acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer  } d;
3625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  uintptr_t p;
373fd9b8422328a60664a5c631ec9519b58017fcbcDanil Malyshev  DataRefImpl() {
383fd9b8422328a60664a5c631ec9519b58017fcbcDanil Malyshev    std::memset(this, 0, sizeof(DataRefImpl));
393fd9b8422328a60664a5c631ec9519b58017fcbcDanil Malyshev  }
407acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer};
417acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer
424344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencertemplate<class content_type>
434344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerclass content_iterator {
444344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  content_type Current;
454344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerpublic:
464344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  content_iterator(content_type symb)
474344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer    : Current(symb) {}
484344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
494344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  const content_type* operator->() const {
504344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer    return &Current;
514344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  }
524344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
534344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  const content_type &operator*() const {
544344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer    return Current;
554344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  }
564344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
574344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  bool operator==(const content_iterator &other) const {
584344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer    return Current == other.Current;
594344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  }
604344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
614344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  bool operator!=(const content_iterator &other) const {
624344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer    return !(*this == other);
634344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  }
644344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
654344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  content_iterator& increment(error_code &err) {
664344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer    content_type next;
674344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer    if (error_code ec = Current.getNext(next))
684344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer      err = ec;
694344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer    else
704344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer      Current = next;
714344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer    return *this;
724344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  }
734344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer};
744344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
755b957e6fd9853f938b8b33cfeb03d80595a9c2f8Eric Christopherinline bool operator==(const DataRefImpl &a, const DataRefImpl &b) {
767acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer  // Check bitwise identical. This is the only legal way to compare a union w/o
777acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer  // knowing which member is in use.
787acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer  return std::memcmp(&a, &b, sizeof(DataRefImpl)) == 0;
797acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer}
8068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
815b957e6fd9853f938b8b33cfeb03d80595a9c2f8Eric Christopherinline bool operator<(const DataRefImpl &a, const DataRefImpl &b) {
823314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer  // Check bitwise identical. This is the only legal way to compare a union w/o
833314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer  // knowing which member is in use.
843314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer  return std::memcmp(&a, &b, sizeof(DataRefImpl)) < 0;
853314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer}
863314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer
879b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencerclass SymbolRef;
886c1202c459ffa6d693ad92fa84e43902bc780bcaRafael Espindolatypedef content_iterator<SymbolRef> symbol_iterator;
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:
973fd9b8422328a60664a5c631ec9519b58017fcbcDanil Malyshev  RelocationRef() : OwningObject(NULL) { }
980fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
990fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  RelocationRef(DataRefImpl RelocationP, const ObjectFile *Owner);
1000fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
1010fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  bool operator==(const RelocationRef &Other) const;
1020fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
1030fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  error_code getNext(RelocationRef &Result) const;
1040fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
1050fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  error_code getAddress(uint64_t &Result) const;
106b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev  error_code getOffset(uint64_t &Result) const;
1076c1202c459ffa6d693ad92fa84e43902bc780bcaRafael Espindola  symbol_iterator getSymbol() const;
1089472b8d220fc746498429f430cb4c4dbfbd38f2aOwen Anderson  error_code getType(uint64_t &Result) const;
1094344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
1100685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson  /// @brief Indicates whether this relocation should hidden when listing
1110685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson  /// relocations, usually because it is the trailing part of a multipart
1120685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson  /// relocation that will be printed as part of the leading relocation.
1130685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson  error_code getHidden(bool &Result) const;
1140685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson
1154344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  /// @brief Get a string that represents the type of this relocation.
1164344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  ///
1174344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  /// This is for display purposes only.
1184344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  error_code getTypeName(SmallVectorImpl<char> &Result) const;
1194344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
1204344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  /// @brief Get a string that represents the calculation of the value of this
1214344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  ///        relocation.
1224344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  ///
1234344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  /// This is for display purposes only.
1244344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  error_code getValueString(SmallVectorImpl<char> &Result) const;
1259ac0f1d7255d7941c331b0a62a830a3b033358fdMarshall Clow
1269ac0f1d7255d7941c331b0a62a830a3b033358fdMarshall Clow  DataRefImpl getRawDataRefImpl() const;
127167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola  const ObjectFile *getObjectFile() 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.
1337486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindolaclass SectionRef;
1347486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindolatypedef content_iterator<SectionRef> section_iterator;
13568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerclass SectionRef {
13607ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer  friend class SymbolRef;
13768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  DataRefImpl SectionPimpl;
13868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  const ObjectFile *OwningObject;
13968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
14068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic:
1413fd9b8422328a60664a5c631ec9519b58017fcbcDanil Malyshev  SectionRef() : OwningObject(NULL) { }
142dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer
14368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  SectionRef(DataRefImpl SectionP, const ObjectFile *Owner);
14468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
14568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  bool operator==(const SectionRef &Other) const;
1465b957e6fd9853f938b8b33cfeb03d80595a9c2f8Eric Christopher  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;
162c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  error_code isRequiredForExecution(bool &Result) const;
163c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  error_code isVirtual(bool &Result) const;
164c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  error_code isZeroInit(bool &Result) const;
1653a129c85920404e7ccdb7e655c89fa60a0309cfdAndrew Kaylor  error_code isReadOnlyData(bool &Result) const;
16607ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer
16707ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer  error_code containsSymbol(SymbolRef S, bool &Result) const;
1684344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
1694344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  relocation_iterator begin_relocations() const;
1704344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  relocation_iterator end_relocations() const;
1717486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola  section_iterator getRelocatedSection() const;
172c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd
173c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  DataRefImpl getRawDataRefImpl() const;
17468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer};
17568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
1769b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer/// SymbolRef - This is a value type class that represents a single symbol in
1779b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer/// the list of symbols in the object file.
1789b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencerclass SymbolRef {
1799b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  friend class SectionRef;
1809b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  DataRefImpl SymbolPimpl;
1819b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  const ObjectFile *OwningObject;
1829b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
1839b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencerpublic:
1843fd9b8422328a60664a5c631ec9519b58017fcbcDanil Malyshev  SymbolRef() : OwningObject(NULL) { }
1859b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
1869b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  enum Type {
1872c67727046234ad9702ab5acb72700b5ac99a676David Meyer    ST_Unknown, // Type not specified
1889b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer    ST_Data,
189206d17cf605293f1c12d8bfa8cf72826a29b253fMichael J. Spencer    ST_Debug,
190206d17cf605293f1c12d8bfa8cf72826a29b253fMichael J. Spencer    ST_File,
191206d17cf605293f1c12d8bfa8cf72826a29b253fMichael J. Spencer    ST_Function,
1929b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer    ST_Other
1939b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  };
1949b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
195c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer  enum Flags {
196c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer    SF_None            = 0,
1972c67727046234ad9702ab5acb72700b5ac99a676David Meyer    SF_Undefined       = 1U << 0,  // Symbol is defined in another object file
1982c67727046234ad9702ab5acb72700b5ac99a676David Meyer    SF_Global          = 1U << 1,  // Global symbol
1992c67727046234ad9702ab5acb72700b5ac99a676David Meyer    SF_Weak            = 1U << 2,  // Weak symbol
2002c67727046234ad9702ab5acb72700b5ac99a676David Meyer    SF_Absolute        = 1U << 3,  // Absolute symbol
2012c67727046234ad9702ab5acb72700b5ac99a676David Meyer    SF_ThreadLocal     = 1U << 4,  // Thread local symbol
2022c67727046234ad9702ab5acb72700b5ac99a676David Meyer    SF_Common          = 1U << 5,  // Symbol has common linkage
2032c67727046234ad9702ab5acb72700b5ac99a676David Meyer    SF_FormatSpecific  = 1U << 31  // Specific to the object file format
2042c67727046234ad9702ab5acb72700b5ac99a676David Meyer                                   // (e.g. section symbols)
205c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer  };
206c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer
2079b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  SymbolRef(DataRefImpl SymbolP, const ObjectFile *Owner);
2089b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
2099b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  bool operator==(const SymbolRef &Other) const;
2105b957e6fd9853f938b8b33cfeb03d80595a9c2f8Eric Christopher  bool operator<(const SymbolRef &Other) const;
2119b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
2129b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  error_code getNext(SymbolRef &Result) const;
2139b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
2149b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  error_code getName(StringRef &Result) const;
21501fa41a106ed0ff86c3b9ffe0843679211bf487cAlexey Samsonov  /// Returns the symbol virtual address (i.e. address at which it will be
21601fa41a106ed0ff86c3b9ffe0843679211bf487cAlexey Samsonov  /// mapped).
2179b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  error_code getAddress(uint64_t &Result) const;
218b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev  error_code getFileOffset(uint64_t &Result) const;
21959a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindola  /// @brief Get the alignment of this symbol as the actual value (not log 2).
22059a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindola  error_code getAlignment(uint32_t &Result) const;
2219b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  error_code getSize(uint64_t &Result) const;
2229b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  error_code getType(SymbolRef::Type &Result) const;
2239b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
2249b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  /// Returns the ascii char that should be displayed in a symbol table dump via
2259b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  /// nm for this symbol.
2269b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  error_code getNMTypeChar(char &Result) const;
2279b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
228c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer  /// Get symbol flags (bitwise OR of SymbolRef::Flags)
229c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer  error_code getFlags(uint32_t &Result) const;
2309b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
2319b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  /// @brief Get section this symbol is defined in reference to. Result is
2329b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  /// end_sections() if it is undefined or is an absolute symbol.
2339b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  error_code getSection(section_iterator &Result) const;
2349b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
235a41dce3c642e50775352cce49e3a3d0cd004d393Tim Northover  /// @brief Get value of the symbol in the symbol table.
236a41dce3c642e50775352cce49e3a3d0cd004d393Tim Northover  error_code getValue(uint64_t &Val) const;
237a41dce3c642e50775352cce49e3a3d0cd004d393Tim Northover
2389b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  DataRefImpl getRawDataRefImpl() const;
2399b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer};
2409b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
2415c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer/// LibraryRef - This is a value type class that represents a single library in
2425c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer/// the list of libraries needed by a shared or dynamic object.
2435c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyerclass LibraryRef {
2445c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  friend class SectionRef;
2455c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  DataRefImpl LibraryPimpl;
2465c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  const ObjectFile *OwningObject;
2475c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
2485c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyerpublic:
2493fd9b8422328a60664a5c631ec9519b58017fcbcDanil Malyshev  LibraryRef() : OwningObject(NULL) { }
2505c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
2515c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  LibraryRef(DataRefImpl LibraryP, const ObjectFile *Owner);
2525c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
2535c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  bool operator==(const LibraryRef &Other) const;
2545b957e6fd9853f938b8b33cfeb03d80595a9c2f8Eric Christopher  bool operator<(const LibraryRef &Other) const;
2555c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
2565c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  error_code getNext(LibraryRef &Result) const;
2575c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
2585c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  // Get the path to this library, as stored in the object file.
2595c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  error_code getPath(StringRef &Result) const;
2605c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
2615c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  DataRefImpl getRawDataRefImpl() const;
2625c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer};
2635c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyertypedef content_iterator<LibraryRef> library_iterator;
2645c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
26568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerconst uint64_t UnknownAddressOrSize = ~0ULL;
26668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
26768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// ObjectFile - This class is the base class for all object file types.
26868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// Concrete instances of this object are created by createObjectFile, which
26960f0819cb583799029fa11179576dd7f01d8002aEric Christopher/// figures out which type to create.
270001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerclass ObjectFile : public Binary {
2712d24e2a396a1d211baaeedf32148a3b657240170David Blaikie  virtual void anchor();
2729f9ce61972871efcf794bdc6125835c2c32cd863Craig Topper  ObjectFile() LLVM_DELETED_FUNCTION;
2739f9ce61972871efcf794bdc6125835c2c32cd863Craig Topper  ObjectFile(const ObjectFile &other) LLVM_DELETED_FUNCTION;
27468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
27568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerprotected:
2762c6f997290f589b80da903e33718175666557dd7Rafael Espindola  ObjectFile(unsigned int Type, MemoryBuffer *source);
27768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
278001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  const uint8_t *base() const {
279001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer    return reinterpret_cast<const uint8_t *>(Data->getBufferStart());
280001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  }
28168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
28268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // These functions are for SymbolRef to call internally. The main goal of
28368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // this is to allow SymbolRef::SymbolPimpl to point directly to the symbol
28468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // entry in the memory mapped object file. SymbolPimpl cannot contain any
28568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // virtual functions because then it could not point into the memory mapped
28668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // file.
28725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  //
28825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  // Implementations assume that the DataRefImpl is valid and has not been
28925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  // modified externally. It's UB otherwise.
29068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  friend class SymbolRef;
29125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const = 0;
29225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const = 0;
2935b957e6fd9853f938b8b33cfeb03d80595a9c2f8Eric Christopher  virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const = 0;
2945b957e6fd9853f938b8b33cfeb03d80595a9c2f8Eric Christopher  virtual error_code getSymbolFileOffset(DataRefImpl Symb, uint64_t &Res)const=0;
29559a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindola  virtual error_code getSymbolAlignment(DataRefImpl Symb, uint32_t &Res) const;
29625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const = 0;
2972c10ecbe4c800bd8a2e1b3e05c4eedf75658b565Michael J. Spencer  virtual error_code getSymbolType(DataRefImpl Symb,
2982c10ecbe4c800bd8a2e1b3e05c4eedf75658b565Michael J. Spencer                                   SymbolRef::Type &Res) const = 0;
29925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolNMTypeChar(DataRefImpl Symb, char &Res) const = 0;
300c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer  virtual error_code getSymbolFlags(DataRefImpl Symb,
301c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer                                    uint32_t &Res) const = 0;
3029b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  virtual error_code getSymbolSection(DataRefImpl Symb,
3039b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer                                      section_iterator &Res) const = 0;
304a41dce3c642e50775352cce49e3a3d0cd004d393Tim Northover  virtual error_code getSymbolValue(DataRefImpl Symb, uint64_t &Val) const = 0;
30568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
30668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // Same as above for SectionRef.
30768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  friend class SectionRef;
30825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionNext(DataRefImpl Sec, SectionRef &Res) const = 0;
30925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionName(DataRefImpl Sec, StringRef &Res) const = 0;
31025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionAddress(DataRefImpl Sec, uint64_t &Res) const =0;
31125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const = 0;
31225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionContents(DataRefImpl Sec, StringRef &Res)const=0;
313e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer  virtual error_code getSectionAlignment(DataRefImpl Sec, uint64_t &Res)const=0;
31425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const = 0;
31513afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer  virtual error_code isSectionData(DataRefImpl Sec, bool &Res) const = 0;
31613afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer  virtual error_code isSectionBSS(DataRefImpl Sec, bool &Res) const = 0;
317c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  virtual error_code isSectionRequiredForExecution(DataRefImpl Sec,
318c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd                                                   bool &Res) const = 0;
319c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  // A section is 'virtual' if its contents aren't present in the object image.
320c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  virtual error_code isSectionVirtual(DataRefImpl Sec, bool &Res) const = 0;
321c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  virtual error_code isSectionZeroInit(DataRefImpl Sec, bool &Res) const = 0;
3225b957e6fd9853f938b8b33cfeb03d80595a9c2f8Eric Christopher  virtual error_code isSectionReadOnlyData(DataRefImpl Sec, bool &Res) const =0;
32307ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer  virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb,
32407ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer                                           bool &Result) const = 0;
3254344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  virtual relocation_iterator getSectionRelBegin(DataRefImpl Sec) const = 0;
3264344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  virtual relocation_iterator getSectionRelEnd(DataRefImpl Sec) const = 0;
3277486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola  virtual section_iterator getRelocatedSection(DataRefImpl Sec) const;
32868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
3290fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  // Same as above for RelocationRef.
3300fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  friend class RelocationRef;
3310fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  virtual error_code getRelocationNext(DataRefImpl Rel,
3320fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer                                       RelocationRef &Res) const = 0;
3330fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  virtual error_code getRelocationAddress(DataRefImpl Rel,
3340fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer                                          uint64_t &Res) const =0;
335b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev  virtual error_code getRelocationOffset(DataRefImpl Rel,
336b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev                                         uint64_t &Res) const =0;
3376c1202c459ffa6d693ad92fa84e43902bc780bcaRafael Espindola  virtual symbol_iterator getRelocationSymbol(DataRefImpl Rel) const = 0;
3380fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  virtual error_code getRelocationType(DataRefImpl Rel,
3399472b8d220fc746498429f430cb4c4dbfbd38f2aOwen Anderson                                       uint64_t &Res) const = 0;
3404344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  virtual error_code getRelocationTypeName(DataRefImpl Rel,
3414344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer                                       SmallVectorImpl<char> &Result) const = 0;
3424344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  virtual error_code getRelocationValueString(DataRefImpl Rel,
3434344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer                                       SmallVectorImpl<char> &Result) const = 0;
3440685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson  virtual error_code getRelocationHidden(DataRefImpl Rel, bool &Result) const {
3450685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson    Result = false;
3460685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson    return object_error::success;
3470685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson  }
3480fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
3495c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  // Same for LibraryRef
3505c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  friend class LibraryRef;
3515c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  virtual error_code getLibraryNext(DataRefImpl Lib, LibraryRef &Res) const = 0;
3525c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  virtual error_code getLibraryPath(DataRefImpl Lib, StringRef &Res) const = 0;
3535c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
35468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic:
35568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
35668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual symbol_iterator begin_symbols() const = 0;
35768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual symbol_iterator end_symbols() const = 0;
35868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
359dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer  virtual symbol_iterator begin_dynamic_symbols() const = 0;
360dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer  virtual symbol_iterator end_dynamic_symbols() const = 0;
361dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer
36268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual section_iterator begin_sections() const = 0;
36368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual section_iterator end_sections() const = 0;
36468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
3655c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  virtual library_iterator begin_libraries_needed() const = 0;
3665c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  virtual library_iterator end_libraries_needed() const = 0;
3675c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
36868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @brief The number of bytes used to represent an address in this object
36968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  ///        file format.
37068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual uint8_t getBytesInAddress() const = 0;
37168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
37268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual StringRef getFileFormatName() const = 0;
37388af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencer  virtual /* Triple::ArchType */ unsigned getArch() const = 0;
37468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
37597f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer  /// For shared objects, returns the name which this object should be
37697f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer  /// loaded from at runtime. This corresponds to DT_SONAME on ELF and
37797f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer  /// LC_ID_DYLIB (install name) on MachO.
37897f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer  virtual StringRef getLoadName() const = 0;
37997f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer
38068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @returns Pointer to ObjectFile subclass to handle this type of object.
38168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @param ObjectPath The path to the object file. ObjectPath.isObject must
38268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  ///        return true.
38368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @brief Create ObjectFile from path.
38488af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencer  static ObjectFile *createObjectFile(StringRef ObjectPath);
38568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  static ObjectFile *createObjectFile(MemoryBuffer *Object);
38668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
387001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  static inline bool classof(const Binary *v) {
3886f9489a86f33624f9ff5388411d12359ce9cef20David Meyer    return v->isObject();
389001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  }
390001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer
391001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerpublic:
39268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  static ObjectFile *createCOFFObjectFile(MemoryBuffer *Object);
393f4eff4baeb44f9dee988e9293d029dcaa359420dEli Bendersky  static ObjectFile *createELFObjectFile(MemoryBuffer *Object);
39468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  static ObjectFile *createMachOObjectFile(MemoryBuffer *Object);
39568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer};
39668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
39768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer// Inline function definitions.
39868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline SymbolRef::SymbolRef(DataRefImpl SymbolP, const ObjectFile *Owner)
39968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  : SymbolPimpl(SymbolP)
40068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  , OwningObject(Owner) {}
40168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
40268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline bool SymbolRef::operator==(const SymbolRef &Other) const {
40368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  return SymbolPimpl == Other.SymbolPimpl;
40468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
40568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
4065b957e6fd9853f938b8b33cfeb03d80595a9c2f8Eric Christopherinline bool SymbolRef::operator<(const SymbolRef &Other) const {
4073314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer  return SymbolPimpl < Other.SymbolPimpl;
4083314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer}
4093314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer
41025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getNext(SymbolRef &Result) const {
41125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSymbolNext(SymbolPimpl, Result);
41268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
41368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
41425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getName(StringRef &Result) const {
41525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSymbolName(SymbolPimpl, Result);
41668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
41768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
41825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getAddress(uint64_t &Result) const {
41925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSymbolAddress(SymbolPimpl, Result);
42068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
42168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
422b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshevinline error_code SymbolRef::getFileOffset(uint64_t &Result) const {
423b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev  return OwningObject->getSymbolFileOffset(SymbolPimpl, Result);
424ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer}
425ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer
42659a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindolainline error_code SymbolRef::getAlignment(uint32_t &Result) const {
42759a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindola  return OwningObject->getSymbolAlignment(SymbolPimpl, Result);
42859a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindola}
42959a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindola
43025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getSize(uint64_t &Result) const {
43125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSymbolSize(SymbolPimpl, Result);
43268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
43368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
43425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getNMTypeChar(char &Result) const {
43525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSymbolNMTypeChar(SymbolPimpl, Result);
43668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
43768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
438c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyerinline error_code SymbolRef::getFlags(uint32_t &Result) const {
439c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer  return OwningObject->getSymbolFlags(SymbolPimpl, Result);
4409b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer}
4419b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
4429b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencerinline error_code SymbolRef::getSection(section_iterator &Result) const {
4439b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  return OwningObject->getSymbolSection(SymbolPimpl, Result);
4449b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer}
4459b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
4461130a799ab2fd7042625163a2506518960394884Michael J. Spencerinline error_code SymbolRef::getType(SymbolRef::Type &Result) const {
447ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer  return OwningObject->getSymbolType(SymbolPimpl, Result);
448ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer}
449ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer
450a41dce3c642e50775352cce49e3a3d0cd004d393Tim Northoverinline error_code SymbolRef::getValue(uint64_t &Val) const {
451a41dce3c642e50775352cce49e3a3d0cd004d393Tim Northover  return OwningObject->getSymbolValue(SymbolPimpl, Val);
452a41dce3c642e50775352cce49e3a3d0cd004d393Tim Northover}
453a41dce3c642e50775352cce49e3a3d0cd004d393Tim Northover
45415c3f727aeff6a80e3f9e7e6b1284748e5f3322aNick Lewyckyinline DataRefImpl SymbolRef::getRawDataRefImpl() const {
45515c3f727aeff6a80e3f9e7e6b1284748e5f3322aNick Lewycky  return SymbolPimpl;
45615c3f727aeff6a80e3f9e7e6b1284748e5f3322aNick Lewycky}
45715c3f727aeff6a80e3f9e7e6b1284748e5f3322aNick Lewycky
45868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
45968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SectionRef
46068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline SectionRef::SectionRef(DataRefImpl SectionP,
46168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer                              const ObjectFile *Owner)
46268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  : SectionPimpl(SectionP)
46368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  , OwningObject(Owner) {}
46468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
46568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline bool SectionRef::operator==(const SectionRef &Other) const {
46668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  return SectionPimpl == Other.SectionPimpl;
46768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
46868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
4695b957e6fd9853f938b8b33cfeb03d80595a9c2f8Eric Christopherinline bool SectionRef::operator<(const SectionRef &Other) const {
4703314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer  return SectionPimpl < Other.SectionPimpl;
4713314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer}
4723314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer
47325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getNext(SectionRef &Result) const {
47425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionNext(SectionPimpl, Result);
47568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
47668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
47725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getName(StringRef &Result) const {
47825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionName(SectionPimpl, Result);
47968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
48068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
48125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getAddress(uint64_t &Result) const {
48225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionAddress(SectionPimpl, Result);
48368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
48468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
48525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getSize(uint64_t &Result) const {
48625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionSize(SectionPimpl, Result);
48768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
48868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
48925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getContents(StringRef &Result) const {
49025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionContents(SectionPimpl, Result);
49168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
49268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
493e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencerinline error_code SectionRef::getAlignment(uint64_t &Result) const {
494e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer  return OwningObject->getSectionAlignment(SectionPimpl, Result);
495e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer}
496e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer
49725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::isText(bool &Result) const {
49825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->isSectionText(SectionPimpl, Result);
49968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
50068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
50113afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencerinline error_code SectionRef::isData(bool &Result) const {
50213afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer  return OwningObject->isSectionData(SectionPimpl, Result);
50313afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer}
50413afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer
50513afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencerinline error_code SectionRef::isBSS(bool &Result) const {
50613afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer  return OwningObject->isSectionBSS(SectionPimpl, Result);
50713afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer}
50813afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer
509c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurdinline error_code SectionRef::isRequiredForExecution(bool &Result) const {
510c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  return OwningObject->isSectionRequiredForExecution(SectionPimpl, Result);
511c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd}
512c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd
513c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurdinline error_code SectionRef::isVirtual(bool &Result) const {
514c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  return OwningObject->isSectionVirtual(SectionPimpl, Result);
515c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd}
516c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd
517c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurdinline error_code SectionRef::isZeroInit(bool &Result) const {
518c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  return OwningObject->isSectionZeroInit(SectionPimpl, Result);
519c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd}
520c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd
5213a129c85920404e7ccdb7e655c89fa60a0309cfdAndrew Kaylorinline error_code SectionRef::isReadOnlyData(bool &Result) const {
5223a129c85920404e7ccdb7e655c89fa60a0309cfdAndrew Kaylor  return OwningObject->isSectionReadOnlyData(SectionPimpl, Result);
5233a129c85920404e7ccdb7e655c89fa60a0309cfdAndrew Kaylor}
5243a129c85920404e7ccdb7e655c89fa60a0309cfdAndrew Kaylor
52507ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramerinline error_code SectionRef::containsSymbol(SymbolRef S, bool &Result) const {
52607ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer  return OwningObject->sectionContainsSymbol(SectionPimpl, S.SymbolPimpl,
52707ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer                                             Result);
52807ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer}
52907ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer
5304344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerinline relocation_iterator SectionRef::begin_relocations() const {
5314344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  return OwningObject->getSectionRelBegin(SectionPimpl);
5324344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer}
5334344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
5344344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerinline relocation_iterator SectionRef::end_relocations() const {
5354344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  return OwningObject->getSectionRelEnd(SectionPimpl);
5364344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer}
5374344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
5387486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindolainline section_iterator SectionRef::getRelocatedSection() const {
5397486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola  return OwningObject->getRelocatedSection(SectionPimpl);
5407486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola}
5417486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola
542c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurdinline DataRefImpl SectionRef::getRawDataRefImpl() const {
543c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  return SectionPimpl;
544c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd}
5450fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
5460fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer/// RelocationRef
5470fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline RelocationRef::RelocationRef(DataRefImpl RelocationP,
5480fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer                              const ObjectFile *Owner)
5490fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  : RelocationPimpl(RelocationP)
5500fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  , OwningObject(Owner) {}
5510fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
5520fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline bool RelocationRef::operator==(const RelocationRef &Other) const {
5530fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  return RelocationPimpl == Other.RelocationPimpl;
5540fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
5550fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
5560fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getNext(RelocationRef &Result) const {
5570fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  return OwningObject->getRelocationNext(RelocationPimpl, Result);
5580fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
5590fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
5600fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getAddress(uint64_t &Result) const {
5610fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  return OwningObject->getRelocationAddress(RelocationPimpl, Result);
5620fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
5630fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
564b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshevinline error_code RelocationRef::getOffset(uint64_t &Result) const {
565b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev  return OwningObject->getRelocationOffset(RelocationPimpl, Result);
566b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev}
567b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev
5686c1202c459ffa6d693ad92fa84e43902bc780bcaRafael Espindolainline symbol_iterator RelocationRef::getSymbol() const {
5696c1202c459ffa6d693ad92fa84e43902bc780bcaRafael Espindola  return OwningObject->getRelocationSymbol(RelocationPimpl);
5700fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
5710fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
5729472b8d220fc746498429f430cb4c4dbfbd38f2aOwen Andersoninline error_code RelocationRef::getType(uint64_t &Result) const {
5730fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  return OwningObject->getRelocationType(RelocationPimpl, Result);
5740fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
5750fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
5764344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerinline error_code RelocationRef::getTypeName(SmallVectorImpl<char> &Result)
5774344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  const {
5784344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  return OwningObject->getRelocationTypeName(RelocationPimpl, Result);
5794344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer}
5804344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
5814344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerinline error_code RelocationRef::getValueString(SmallVectorImpl<char> &Result)
5824344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  const {
5834344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  return OwningObject->getRelocationValueString(RelocationPimpl, Result);
5844344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer}
5854344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
5860685e94895f26f96aa1032696e3150dd00aad1f3Owen Andersoninline error_code RelocationRef::getHidden(bool &Result) const {
5870685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson  return OwningObject->getRelocationHidden(RelocationPimpl, Result);
5880685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson}
5899ac0f1d7255d7941c331b0a62a830a3b033358fdMarshall Clow
5909ac0f1d7255d7941c331b0a62a830a3b033358fdMarshall Clowinline DataRefImpl RelocationRef::getRawDataRefImpl() const {
5919ac0f1d7255d7941c331b0a62a830a3b033358fdMarshall Clow  return RelocationPimpl;
5929ac0f1d7255d7941c331b0a62a830a3b033358fdMarshall Clow}
5939ac0f1d7255d7941c331b0a62a830a3b033358fdMarshall Clow
594167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindolainline const ObjectFile *RelocationRef::getObjectFile() const {
595167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola  return OwningObject;
596167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola}
597167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola
5985c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer// Inline function definitions.
5995c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyerinline LibraryRef::LibraryRef(DataRefImpl LibraryP, const ObjectFile *Owner)
6005c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  : LibraryPimpl(LibraryP)
6015c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  , OwningObject(Owner) {}
6025c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
6035c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyerinline bool LibraryRef::operator==(const LibraryRef &Other) const {
6045c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  return LibraryPimpl == Other.LibraryPimpl;
6055c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer}
6065c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
6075b957e6fd9853f938b8b33cfeb03d80595a9c2f8Eric Christopherinline bool LibraryRef::operator<(const LibraryRef &Other) const {
6085c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  return LibraryPimpl < Other.LibraryPimpl;
6095c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer}
6105c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
6115c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyerinline error_code LibraryRef::getNext(LibraryRef &Result) const {
6125c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  return OwningObject->getLibraryNext(LibraryPimpl, Result);
6135c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer}
6145c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
6155c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyerinline error_code LibraryRef::getPath(StringRef &Result) const {
6165c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  return OwningObject->getLibraryPath(LibraryPimpl, Result);
6175c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer}
6180685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson
61968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} // end namespace object
62068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} // end namespace llvm
62168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
62268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer#endif
623