ObjectFile.h revision 4344b1ef9b3721a5ebc2e024f753772a1e4ddd92
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
93ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer  enum SymbolType {
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;
110ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer  error_code getSymbolType(SymbolRef::SymbolType &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;
12368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer};
1244344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencertypedef content_iterator<SymbolRef> symbol_iterator;
12568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
1260fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer/// RelocationRef - This is a value type class that represents a single
1270fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer/// relocation in the list of relocations in the object file.
1280fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerclass RelocationRef {
1290fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  DataRefImpl RelocationPimpl;
1300fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  const ObjectFile *OwningObject;
1310fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
1320fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerpublic:
1330fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  RelocationRef() : OwningObject(NULL) {
1340fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer    std::memset(&RelocationPimpl, 0, sizeof(RelocationPimpl));
1350fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  }
1360fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
1370fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  RelocationRef(DataRefImpl RelocationP, const ObjectFile *Owner);
1380fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
1390fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  bool operator==(const RelocationRef &Other) const;
1400fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
1410fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  error_code getNext(RelocationRef &Result) const;
1420fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
1430fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  error_code getAddress(uint64_t &Result) const;
1440fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  error_code getSymbol(SymbolRef &Result) const;
1450fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  error_code getType(uint32_t &Result) const;
1464344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
1474344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  /// @brief Get a string that represents the type of this relocation.
1484344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  ///
1494344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  /// This is for display purposes only.
1504344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  error_code getTypeName(SmallVectorImpl<char> &Result) const;
1510fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  error_code getAdditionalInfo(int64_t &Result) const;
1524344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
1534344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  /// @brief Get a string that represents the calculation of the value of this
1544344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  ///        relocation.
1554344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  ///
1564344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  /// This is for display purposes only.
1574344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  error_code getValueString(SmallVectorImpl<char> &Result) const;
1580fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer};
1594344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencertypedef content_iterator<RelocationRef> relocation_iterator;
1600fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
16168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SectionRef - This is a value type class that represents a single section in
16268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// the list of sections in the object file.
16368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerclass SectionRef {
16407ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer  friend class SymbolRef;
16568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  DataRefImpl SectionPimpl;
16668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  const ObjectFile *OwningObject;
16768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
16868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic:
169dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer  SectionRef() : OwningObject(NULL) {
170dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer    std::memset(&SectionPimpl, 0, sizeof(SectionPimpl));
171dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer  }
172dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer
17368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  SectionRef(DataRefImpl SectionP, const ObjectFile *Owner);
17468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
17568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  bool operator==(const SectionRef &Other) const;
17668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
17725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getNext(SectionRef &Result) const;
17868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
17925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getName(StringRef &Result) const;
18025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getAddress(uint64_t &Result) const;
18125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getSize(uint64_t &Result) const;
18225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getContents(StringRef &Result) const;
18368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
18468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // FIXME: Move to the normalization layer when it's created.
18525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code isText(bool &Result) const;
18613afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer  error_code isData(bool &Result) const;
18713afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer  error_code isBSS(bool &Result) const;
18807ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer
18907ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer  error_code containsSymbol(SymbolRef S, bool &Result) const;
1904344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
1914344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  relocation_iterator begin_relocations() const;
1924344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  relocation_iterator end_relocations() const;
19368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer};
1944344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencertypedef content_iterator<SectionRef> section_iterator;
19568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
19668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerconst uint64_t UnknownAddressOrSize = ~0ULL;
19768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
19868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// ObjectFile - This class is the base class for all object file types.
19968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// Concrete instances of this object are created by createObjectFile, which
20068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// figure out which type to create.
201001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerclass ObjectFile : public Binary {
20268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerprivate:
20368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  ObjectFile(); // = delete
20468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  ObjectFile(const ObjectFile &other); // = delete
20568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
20668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerprotected:
207001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  ObjectFile(unsigned int Type, MemoryBuffer *source, error_code &ec);
20868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
209001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  const uint8_t *base() const {
210001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer    return reinterpret_cast<const uint8_t *>(Data->getBufferStart());
211001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  }
21268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
21368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // These functions are for SymbolRef to call internally. The main goal of
21468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // this is to allow SymbolRef::SymbolPimpl to point directly to the symbol
21568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // entry in the memory mapped object file. SymbolPimpl cannot contain any
21668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // virtual functions because then it could not point into the memory mapped
21768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // file.
21825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  //
21925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  // Implementations assume that the DataRefImpl is valid and has not been
22025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  // modified externally. It's UB otherwise.
22168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  friend class SymbolRef;
22225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const = 0;
22325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const = 0;
22425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const =0;
225ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer  virtual error_code getSymbolOffset(DataRefImpl Symb, uint64_t &Res) const =0;
22625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const = 0;
22725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolNMTypeChar(DataRefImpl Symb, char &Res) const = 0;
22825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code isSymbolInternal(DataRefImpl Symb, bool &Res) const = 0;
229ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer  virtual error_code isSymbolGlobal(DataRefImpl Symb, bool &Res) const = 0;
230ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer  virtual error_code getSymbolType(DataRefImpl Symb, SymbolRef::SymbolType &Res) const = 0;
23168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
23268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // Same as above for SectionRef.
23368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  friend class SectionRef;
23425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionNext(DataRefImpl Sec, SectionRef &Res) const = 0;
23525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionName(DataRefImpl Sec, StringRef &Res) const = 0;
23625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionAddress(DataRefImpl Sec, uint64_t &Res) const =0;
23725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const = 0;
23825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionContents(DataRefImpl Sec, StringRef &Res)const=0;
23925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const = 0;
24013afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer  virtual error_code isSectionData(DataRefImpl Sec, bool &Res) const = 0;
24113afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer  virtual error_code isSectionBSS(DataRefImpl Sec, bool &Res) const = 0;
24207ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer  virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb,
24307ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer                                           bool &Result) const = 0;
2444344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  virtual relocation_iterator getSectionRelBegin(DataRefImpl Sec) const = 0;
2454344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  virtual relocation_iterator getSectionRelEnd(DataRefImpl Sec) const = 0;
24668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
24768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
2480fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  // Same as above for RelocationRef.
2490fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  friend class RelocationRef;
2500fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  virtual error_code getRelocationNext(DataRefImpl Rel,
2510fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer                                       RelocationRef &Res) const = 0;
2520fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  virtual error_code getRelocationAddress(DataRefImpl Rel,
2530fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer                                          uint64_t &Res) const =0;
2540fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  virtual error_code getRelocationSymbol(DataRefImpl Rel,
2550fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer                                         SymbolRef &Res) const = 0;
2560fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  virtual error_code getRelocationType(DataRefImpl Rel,
2570fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer                                       uint32_t &Res) const = 0;
2584344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  virtual error_code getRelocationTypeName(DataRefImpl Rel,
2594344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer                                       SmallVectorImpl<char> &Result) const = 0;
2600fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  virtual error_code getRelocationAdditionalInfo(DataRefImpl Rel,
2610fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer                                                 int64_t &Res) const = 0;
2624344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  virtual error_code getRelocationValueString(DataRefImpl Rel,
2634344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer                                       SmallVectorImpl<char> &Result) const = 0;
2640fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
26568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic:
26668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
26768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual symbol_iterator begin_symbols() const = 0;
26868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual symbol_iterator end_symbols() const = 0;
26968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
27068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual section_iterator begin_sections() const = 0;
27168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual section_iterator end_sections() const = 0;
27268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
27368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @brief The number of bytes used to represent an address in this object
27468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  ///        file format.
27568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual uint8_t getBytesInAddress() const = 0;
27668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
27768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual StringRef getFileFormatName() const = 0;
27888af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencer  virtual /* Triple::ArchType */ unsigned getArch() const = 0;
27968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
28068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @returns Pointer to ObjectFile subclass to handle this type of object.
28168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @param ObjectPath The path to the object file. ObjectPath.isObject must
28268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  ///        return true.
28368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @brief Create ObjectFile from path.
28488af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencer  static ObjectFile *createObjectFile(StringRef ObjectPath);
28568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  static ObjectFile *createObjectFile(MemoryBuffer *Object);
28668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
287001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  static inline bool classof(const Binary *v) {
288001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer    return v->getType() >= isObject &&
289001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer           v->getType() < lastObject;
290001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  }
291001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  static inline bool classof(const ObjectFile *v) { return true; }
292001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer
293001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerpublic:
29468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  static ObjectFile *createCOFFObjectFile(MemoryBuffer *Object);
29568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  static ObjectFile *createELFObjectFile(MemoryBuffer *Object);
29668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  static ObjectFile *createMachOObjectFile(MemoryBuffer *Object);
29768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer};
29868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
29968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer// Inline function definitions.
30068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline SymbolRef::SymbolRef(DataRefImpl SymbolP, const ObjectFile *Owner)
30168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  : SymbolPimpl(SymbolP)
30268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  , OwningObject(Owner) {}
30368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
30468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline bool SymbolRef::operator==(const SymbolRef &Other) const {
30568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  return SymbolPimpl == Other.SymbolPimpl;
30668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
30768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
30825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getNext(SymbolRef &Result) const {
30925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSymbolNext(SymbolPimpl, Result);
31068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
31168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
31225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getName(StringRef &Result) const {
31325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSymbolName(SymbolPimpl, Result);
31468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
31568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
31625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getAddress(uint64_t &Result) const {
31725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSymbolAddress(SymbolPimpl, Result);
31868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
31968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
320ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramerinline error_code SymbolRef::getOffset(uint64_t &Result) const {
321ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer  return OwningObject->getSymbolOffset(SymbolPimpl, Result);
322ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer}
323ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer
32425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getSize(uint64_t &Result) const {
32525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSymbolSize(SymbolPimpl, Result);
32668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
32768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
32825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getNMTypeChar(char &Result) const {
32925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSymbolNMTypeChar(SymbolPimpl, Result);
33068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
33168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
33225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::isInternal(bool &Result) const {
33325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->isSymbolInternal(SymbolPimpl, Result);
33468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
33568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
336ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramerinline error_code SymbolRef::isGlobal(bool &Result) const {
337ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer  return OwningObject->isSymbolGlobal(SymbolPimpl, Result);
338ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer}
339ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer
340ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramerinline error_code SymbolRef::getSymbolType(SymbolRef::SymbolType &Result) const {
341ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer  return OwningObject->getSymbolType(SymbolPimpl, Result);
342ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer}
343ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer
34468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
34568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SectionRef
34668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline SectionRef::SectionRef(DataRefImpl SectionP,
34768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer                              const ObjectFile *Owner)
34868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  : SectionPimpl(SectionP)
34968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  , OwningObject(Owner) {}
35068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
35168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline bool SectionRef::operator==(const SectionRef &Other) const {
35268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  return SectionPimpl == Other.SectionPimpl;
35368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
35468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
35525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getNext(SectionRef &Result) const {
35625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionNext(SectionPimpl, Result);
35768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
35868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
35925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getName(StringRef &Result) const {
36025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionName(SectionPimpl, Result);
36168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
36268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
36325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getAddress(uint64_t &Result) const {
36425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionAddress(SectionPimpl, Result);
36568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
36668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
36725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getSize(uint64_t &Result) const {
36825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionSize(SectionPimpl, Result);
36968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
37068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
37125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getContents(StringRef &Result) const {
37225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionContents(SectionPimpl, Result);
37368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
37468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
37525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::isText(bool &Result) const {
37625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->isSectionText(SectionPimpl, Result);
37768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
37868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
37913afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencerinline error_code SectionRef::isData(bool &Result) const {
38013afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer  return OwningObject->isSectionData(SectionPimpl, Result);
38113afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer}
38213afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer
38313afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencerinline error_code SectionRef::isBSS(bool &Result) const {
38413afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer  return OwningObject->isSectionBSS(SectionPimpl, Result);
38513afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer}
38613afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer
38707ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramerinline error_code SectionRef::containsSymbol(SymbolRef S, bool &Result) const {
38807ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer  return OwningObject->sectionContainsSymbol(SectionPimpl, S.SymbolPimpl,
38907ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer                                             Result);
39007ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer}
39107ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer
3924344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerinline relocation_iterator SectionRef::begin_relocations() const {
3934344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  return OwningObject->getSectionRelBegin(SectionPimpl);
3944344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer}
3954344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
3964344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerinline relocation_iterator SectionRef::end_relocations() const {
3974344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  return OwningObject->getSectionRelEnd(SectionPimpl);
3984344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer}
3994344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
4000fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
4010fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer/// RelocationRef
4020fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline RelocationRef::RelocationRef(DataRefImpl RelocationP,
4030fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer                              const ObjectFile *Owner)
4040fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  : RelocationPimpl(RelocationP)
4050fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  , OwningObject(Owner) {}
4060fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
4070fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline bool RelocationRef::operator==(const RelocationRef &Other) const {
4080fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  return RelocationPimpl == Other.RelocationPimpl;
4090fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
4100fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
4110fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getNext(RelocationRef &Result) const {
4120fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  return OwningObject->getRelocationNext(RelocationPimpl, Result);
4130fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
4140fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
4150fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getAddress(uint64_t &Result) const {
4160fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  return OwningObject->getRelocationAddress(RelocationPimpl, Result);
4170fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
4180fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
4190fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getSymbol(SymbolRef &Result) const {
4200fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  return OwningObject->getRelocationSymbol(RelocationPimpl, Result);
4210fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
4220fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
4230fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getType(uint32_t &Result) const {
4240fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  return OwningObject->getRelocationType(RelocationPimpl, Result);
4250fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
4260fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
4274344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerinline error_code RelocationRef::getTypeName(SmallVectorImpl<char> &Result)
4284344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  const {
4294344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  return OwningObject->getRelocationTypeName(RelocationPimpl, Result);
4304344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer}
4314344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
4320fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getAdditionalInfo(int64_t &Result) const {
4330fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  return OwningObject->getRelocationAdditionalInfo(RelocationPimpl, Result);
4340fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
4350fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
4364344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerinline error_code RelocationRef::getValueString(SmallVectorImpl<char> &Result)
4374344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  const {
4384344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  return OwningObject->getRelocationValueString(RelocationPimpl, Result);
4394344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer}
4404344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
44168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} // end namespace object
44268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} // end namespace llvm
44368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
44468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer#endif
445