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