ObjectFile.h revision 206d17cf605293f1c12d8bfa8cf72826a29b253f
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
819b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencerclass SymbolRef;
8268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
830fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer/// RelocationRef - This is a value type class that represents a single
840fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer/// relocation in the list of relocations in the object file.
850fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerclass RelocationRef {
860fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  DataRefImpl RelocationPimpl;
870fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  const ObjectFile *OwningObject;
880fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
890fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerpublic:
900fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  RelocationRef() : OwningObject(NULL) {
910fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer    std::memset(&RelocationPimpl, 0, sizeof(RelocationPimpl));
920fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  }
930fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
940fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  RelocationRef(DataRefImpl RelocationP, const ObjectFile *Owner);
950fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
960fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  bool operator==(const RelocationRef &Other) const;
970fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
980fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  error_code getNext(RelocationRef &Result) const;
990fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
1000fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  error_code getAddress(uint64_t &Result) const;
1010fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  error_code getSymbol(SymbolRef &Result) const;
1020fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  error_code getType(uint32_t &Result) const;
1034344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
1044344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  /// @brief Get a string that represents the type of this relocation.
1054344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  ///
1064344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  /// This is for display purposes only.
1074344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  error_code getTypeName(SmallVectorImpl<char> &Result) const;
1080fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  error_code getAdditionalInfo(int64_t &Result) const;
1094344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
1104344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  /// @brief Get a string that represents the calculation of the value of this
1114344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  ///        relocation.
1124344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  ///
1134344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  /// This is for display purposes only.
1144344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  error_code getValueString(SmallVectorImpl<char> &Result) const;
1150fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer};
1164344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencertypedef content_iterator<RelocationRef> relocation_iterator;
1170fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
11868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SectionRef - This is a value type class that represents a single section in
11968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// the list of sections in the object file.
12068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerclass SectionRef {
12107ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer  friend class SymbolRef;
12268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  DataRefImpl SectionPimpl;
12368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  const ObjectFile *OwningObject;
12468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
12568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic:
126dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer  SectionRef() : OwningObject(NULL) {
127dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer    std::memset(&SectionPimpl, 0, sizeof(SectionPimpl));
128dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer  }
129dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer
13068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  SectionRef(DataRefImpl SectionP, const ObjectFile *Owner);
13168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
13268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  bool operator==(const SectionRef &Other) const;
13368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
13425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getNext(SectionRef &Result) const;
13568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
13625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getName(StringRef &Result) const;
13725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getAddress(uint64_t &Result) const;
13825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getSize(uint64_t &Result) const;
13925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getContents(StringRef &Result) const;
14068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
141e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer  /// @brief Get the alignment of this section as the actual value (not log 2).
142e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer  error_code getAlignment(uint64_t &Result) const;
143e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer
14468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // FIXME: Move to the normalization layer when it's created.
14525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code isText(bool &Result) const;
14613afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer  error_code isData(bool &Result) const;
14713afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer  error_code isBSS(bool &Result) const;
14807ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer
14907ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer  error_code containsSymbol(SymbolRef S, bool &Result) const;
1504344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
1514344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  relocation_iterator begin_relocations() const;
1524344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  relocation_iterator end_relocations() const;
15368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer};
1544344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencertypedef content_iterator<SectionRef> section_iterator;
15568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
1569b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer/// SymbolRef - This is a value type class that represents a single symbol in
1579b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer/// the list of symbols in the object file.
1589b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencerclass SymbolRef {
1599b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  friend class SectionRef;
1609b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  DataRefImpl SymbolPimpl;
1619b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  const ObjectFile *OwningObject;
1629b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
1639b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencerpublic:
1649b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  SymbolRef() : OwningObject(NULL) {
1659b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer    std::memset(&SymbolPimpl, 0, sizeof(SymbolPimpl));
1669b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  }
1679b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
1689b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  enum Type {
1699b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer    ST_Data,
170206d17cf605293f1c12d8bfa8cf72826a29b253fMichael J. Spencer    ST_Debug,
1719b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer    ST_External,    // Defined in another object file
172206d17cf605293f1c12d8bfa8cf72826a29b253fMichael J. Spencer    ST_File,
173206d17cf605293f1c12d8bfa8cf72826a29b253fMichael J. Spencer    ST_Function,
1749b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer    ST_Other
1759b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  };
1769b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
1779b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  SymbolRef(DataRefImpl SymbolP, const ObjectFile *Owner);
1789b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
1799b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  bool operator==(const SymbolRef &Other) const;
1809b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
1819b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  error_code getNext(SymbolRef &Result) const;
1829b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
1839b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  error_code getName(StringRef &Result) const;
1849b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  error_code getAddress(uint64_t &Result) const;
1859b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  error_code getOffset(uint64_t &Result) const;
1869b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  error_code getSize(uint64_t &Result) const;
1879b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  error_code getType(SymbolRef::Type &Result) const;
1889b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
1899b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  /// Returns the ascii char that should be displayed in a symbol table dump via
1909b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  /// nm for this symbol.
1919b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  error_code getNMTypeChar(char &Result) const;
1929b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
1939b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  /// Returns true for symbols that are internal to the object file format such
1949b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  /// as section symbols.
1959b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  error_code isInternal(bool &Result) const;
1969b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
1979b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  /// Returns true for symbols that can be used in another objects,
1989b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  /// such as library functions
1999b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  error_code isGlobal(bool &Result) const;
2009b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
2019b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  /// Returns true for weak symbols.
2029b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  error_code isWeak(bool &Result) const;
2039b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
2049b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  /// @brief Return true for absolute symbols.
2059b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  error_code isAbsolute(bool &Result) const;
2069b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
2079b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  /// @brief Get section this symbol is defined in reference to. Result is
2089b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  /// end_sections() if it is undefined or is an absolute symbol.
2099b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  error_code getSection(section_iterator &Result) const;
2109b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
2119b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  DataRefImpl getRawDataRefImpl() const;
2129b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer};
2139b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencertypedef content_iterator<SymbolRef> symbol_iterator;
2149b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
21568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerconst uint64_t UnknownAddressOrSize = ~0ULL;
21668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
21768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// ObjectFile - This class is the base class for all object file types.
21868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// Concrete instances of this object are created by createObjectFile, which
21968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// figure out which type to create.
220001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerclass ObjectFile : public Binary {
22168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerprivate:
22268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  ObjectFile(); // = delete
22368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  ObjectFile(const ObjectFile &other); // = delete
22468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
22568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerprotected:
226001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  ObjectFile(unsigned int Type, MemoryBuffer *source, error_code &ec);
22768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
228001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  const uint8_t *base() const {
229001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer    return reinterpret_cast<const uint8_t *>(Data->getBufferStart());
230001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  }
23168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
23268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // These functions are for SymbolRef to call internally. The main goal of
23368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // this is to allow SymbolRef::SymbolPimpl to point directly to the symbol
23468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // entry in the memory mapped object file. SymbolPimpl cannot contain any
23568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // virtual functions because then it could not point into the memory mapped
23668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // file.
23725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  //
23825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  // Implementations assume that the DataRefImpl is valid and has not been
23925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  // modified externally. It's UB otherwise.
24068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  friend class SymbolRef;
24125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const = 0;
24225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const = 0;
24325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const =0;
244ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer  virtual error_code getSymbolOffset(DataRefImpl Symb, uint64_t &Res) const =0;
24525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const = 0;
2462c10ecbe4c800bd8a2e1b3e05c4eedf75658b565Michael J. Spencer  virtual error_code getSymbolType(DataRefImpl Symb,
2472c10ecbe4c800bd8a2e1b3e05c4eedf75658b565Michael J. Spencer                                   SymbolRef::Type &Res) const = 0;
24825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolNMTypeChar(DataRefImpl Symb, char &Res) const = 0;
24925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code isSymbolInternal(DataRefImpl Symb, bool &Res) const = 0;
250ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer  virtual error_code isSymbolGlobal(DataRefImpl Symb, bool &Res) const = 0;
251c38c36a8c44bd32bdfc2e48ab3e447f6dc1547bdMichael J. Spencer  virtual error_code isSymbolWeak(DataRefImpl Symb, bool &Res) const = 0;
2529b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  virtual error_code isSymbolAbsolute(DataRefImpl Symb, bool &Res) const = 0;
2539b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  virtual error_code getSymbolSection(DataRefImpl Symb,
2549b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer                                      section_iterator &Res) const = 0;
25568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
25668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // Same as above for SectionRef.
25768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  friend class SectionRef;
25825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionNext(DataRefImpl Sec, SectionRef &Res) const = 0;
25925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionName(DataRefImpl Sec, StringRef &Res) const = 0;
26025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionAddress(DataRefImpl Sec, uint64_t &Res) const =0;
26125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const = 0;
26225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionContents(DataRefImpl Sec, StringRef &Res)const=0;
263e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer  virtual error_code getSectionAlignment(DataRefImpl Sec, uint64_t &Res)const=0;
26425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const = 0;
26513afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer  virtual error_code isSectionData(DataRefImpl Sec, bool &Res) const = 0;
26613afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer  virtual error_code isSectionBSS(DataRefImpl Sec, bool &Res) const = 0;
26707ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer  virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb,
26807ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer                                           bool &Result) const = 0;
2694344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  virtual relocation_iterator getSectionRelBegin(DataRefImpl Sec) const = 0;
2704344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  virtual relocation_iterator getSectionRelEnd(DataRefImpl Sec) const = 0;
27168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
27268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
2730fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  // Same as above for RelocationRef.
2740fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  friend class RelocationRef;
2750fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  virtual error_code getRelocationNext(DataRefImpl Rel,
2760fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer                                       RelocationRef &Res) const = 0;
2770fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  virtual error_code getRelocationAddress(DataRefImpl Rel,
2780fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer                                          uint64_t &Res) const =0;
2790fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  virtual error_code getRelocationSymbol(DataRefImpl Rel,
2800fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer                                         SymbolRef &Res) const = 0;
2810fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  virtual error_code getRelocationType(DataRefImpl Rel,
2820fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer                                       uint32_t &Res) const = 0;
2834344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  virtual error_code getRelocationTypeName(DataRefImpl Rel,
2844344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer                                       SmallVectorImpl<char> &Result) const = 0;
2850fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  virtual error_code getRelocationAdditionalInfo(DataRefImpl Rel,
2860fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer                                                 int64_t &Res) const = 0;
2874344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  virtual error_code getRelocationValueString(DataRefImpl Rel,
2884344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer                                       SmallVectorImpl<char> &Result) const = 0;
2890fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
29068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic:
29168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
29268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual symbol_iterator begin_symbols() const = 0;
29368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual symbol_iterator end_symbols() const = 0;
29468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
29568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual section_iterator begin_sections() const = 0;
29668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual section_iterator end_sections() const = 0;
29768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
29868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @brief The number of bytes used to represent an address in this object
29968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  ///        file format.
30068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual uint8_t getBytesInAddress() const = 0;
30168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
30268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual StringRef getFileFormatName() const = 0;
30388af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencer  virtual /* Triple::ArchType */ unsigned getArch() const = 0;
30468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
30568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @returns Pointer to ObjectFile subclass to handle this type of object.
30668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @param ObjectPath The path to the object file. ObjectPath.isObject must
30768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  ///        return true.
30868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @brief Create ObjectFile from path.
30988af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencer  static ObjectFile *createObjectFile(StringRef ObjectPath);
31068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  static ObjectFile *createObjectFile(MemoryBuffer *Object);
31168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
312001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  static inline bool classof(const Binary *v) {
313001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer    return v->getType() >= isObject &&
314001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer           v->getType() < lastObject;
315001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  }
316001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  static inline bool classof(const ObjectFile *v) { return true; }
317001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer
318001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerpublic:
31968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  static ObjectFile *createCOFFObjectFile(MemoryBuffer *Object);
32068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  static ObjectFile *createELFObjectFile(MemoryBuffer *Object);
32168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  static ObjectFile *createMachOObjectFile(MemoryBuffer *Object);
32268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer};
32368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
32468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer// Inline function definitions.
32568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline SymbolRef::SymbolRef(DataRefImpl SymbolP, const ObjectFile *Owner)
32668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  : SymbolPimpl(SymbolP)
32768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  , OwningObject(Owner) {}
32868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
32968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline bool SymbolRef::operator==(const SymbolRef &Other) const {
33068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  return SymbolPimpl == Other.SymbolPimpl;
33168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
33268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
33325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getNext(SymbolRef &Result) const {
33425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSymbolNext(SymbolPimpl, Result);
33568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
33668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
33725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getName(StringRef &Result) const {
33825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSymbolName(SymbolPimpl, Result);
33968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
34068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
34125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getAddress(uint64_t &Result) const {
34225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSymbolAddress(SymbolPimpl, Result);
34368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
34468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
345ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramerinline error_code SymbolRef::getOffset(uint64_t &Result) const {
346ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer  return OwningObject->getSymbolOffset(SymbolPimpl, Result);
347ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer}
348ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer
34925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getSize(uint64_t &Result) const {
35025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSymbolSize(SymbolPimpl, Result);
35168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
35268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
35325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getNMTypeChar(char &Result) const {
35425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSymbolNMTypeChar(SymbolPimpl, Result);
35568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
35668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
35725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::isInternal(bool &Result) const {
35825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->isSymbolInternal(SymbolPimpl, Result);
35968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
36068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
361ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramerinline error_code SymbolRef::isGlobal(bool &Result) const {
362ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer  return OwningObject->isSymbolGlobal(SymbolPimpl, Result);
363ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer}
364ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer
365c38c36a8c44bd32bdfc2e48ab3e447f6dc1547bdMichael J. Spencerinline error_code SymbolRef::isWeak(bool &Result) const {
366c38c36a8c44bd32bdfc2e48ab3e447f6dc1547bdMichael J. Spencer  return OwningObject->isSymbolWeak(SymbolPimpl, Result);
367c38c36a8c44bd32bdfc2e48ab3e447f6dc1547bdMichael J. Spencer}
368c38c36a8c44bd32bdfc2e48ab3e447f6dc1547bdMichael J. Spencer
3699b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencerinline error_code SymbolRef::isAbsolute(bool &Result) const {
3709b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  return OwningObject->isSymbolAbsolute(SymbolPimpl, Result);
3719b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer}
3729b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
3739b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencerinline error_code SymbolRef::getSection(section_iterator &Result) const {
3749b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  return OwningObject->getSymbolSection(SymbolPimpl, Result);
3759b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer}
3769b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
3771130a799ab2fd7042625163a2506518960394884Michael J. Spencerinline error_code SymbolRef::getType(SymbolRef::Type &Result) const {
378ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer  return OwningObject->getSymbolType(SymbolPimpl, Result);
379ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer}
380ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer
38115c3f727aeff6a80e3f9e7e6b1284748e5f3322aNick Lewyckyinline DataRefImpl SymbolRef::getRawDataRefImpl() const {
38215c3f727aeff6a80e3f9e7e6b1284748e5f3322aNick Lewycky  return SymbolPimpl;
38315c3f727aeff6a80e3f9e7e6b1284748e5f3322aNick Lewycky}
38415c3f727aeff6a80e3f9e7e6b1284748e5f3322aNick Lewycky
38568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
38668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SectionRef
38768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline SectionRef::SectionRef(DataRefImpl SectionP,
38868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer                              const ObjectFile *Owner)
38968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  : SectionPimpl(SectionP)
39068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  , OwningObject(Owner) {}
39168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
39268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline bool SectionRef::operator==(const SectionRef &Other) const {
39368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  return SectionPimpl == Other.SectionPimpl;
39468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
39568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
39625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getNext(SectionRef &Result) const {
39725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionNext(SectionPimpl, Result);
39868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
39968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
40025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getName(StringRef &Result) const {
40125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionName(SectionPimpl, Result);
40268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
40368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
40425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getAddress(uint64_t &Result) const {
40525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionAddress(SectionPimpl, Result);
40668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
40768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
40825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getSize(uint64_t &Result) const {
40925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionSize(SectionPimpl, Result);
41068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
41168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
41225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getContents(StringRef &Result) const {
41325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionContents(SectionPimpl, Result);
41468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
41568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
416e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencerinline error_code SectionRef::getAlignment(uint64_t &Result) const {
417e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer  return OwningObject->getSectionAlignment(SectionPimpl, Result);
418e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer}
419e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer
42025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::isText(bool &Result) const {
42125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->isSectionText(SectionPimpl, Result);
42268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
42368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
42413afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencerinline error_code SectionRef::isData(bool &Result) const {
42513afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer  return OwningObject->isSectionData(SectionPimpl, Result);
42613afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer}
42713afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer
42813afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencerinline error_code SectionRef::isBSS(bool &Result) const {
42913afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer  return OwningObject->isSectionBSS(SectionPimpl, Result);
43013afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer}
43113afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer
43207ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramerinline error_code SectionRef::containsSymbol(SymbolRef S, bool &Result) const {
43307ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer  return OwningObject->sectionContainsSymbol(SectionPimpl, S.SymbolPimpl,
43407ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer                                             Result);
43507ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer}
43607ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer
4374344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerinline relocation_iterator SectionRef::begin_relocations() const {
4384344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  return OwningObject->getSectionRelBegin(SectionPimpl);
4394344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer}
4404344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
4414344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerinline relocation_iterator SectionRef::end_relocations() const {
4424344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  return OwningObject->getSectionRelEnd(SectionPimpl);
4434344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer}
4444344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
4450fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
4460fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer/// RelocationRef
4470fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline RelocationRef::RelocationRef(DataRefImpl RelocationP,
4480fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer                              const ObjectFile *Owner)
4490fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  : RelocationPimpl(RelocationP)
4500fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  , OwningObject(Owner) {}
4510fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
4520fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline bool RelocationRef::operator==(const RelocationRef &Other) const {
4530fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  return RelocationPimpl == Other.RelocationPimpl;
4540fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
4550fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
4560fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getNext(RelocationRef &Result) const {
4570fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  return OwningObject->getRelocationNext(RelocationPimpl, Result);
4580fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
4590fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
4600fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getAddress(uint64_t &Result) const {
4610fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  return OwningObject->getRelocationAddress(RelocationPimpl, Result);
4620fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
4630fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
4640fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getSymbol(SymbolRef &Result) const {
4650fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  return OwningObject->getRelocationSymbol(RelocationPimpl, Result);
4660fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
4670fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
4680fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getType(uint32_t &Result) const {
4690fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  return OwningObject->getRelocationType(RelocationPimpl, Result);
4700fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
4710fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
4724344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerinline error_code RelocationRef::getTypeName(SmallVectorImpl<char> &Result)
4734344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  const {
4744344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  return OwningObject->getRelocationTypeName(RelocationPimpl, Result);
4754344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer}
4764344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
4770fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getAdditionalInfo(int64_t &Result) const {
4780fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  return OwningObject->getRelocationAdditionalInfo(RelocationPimpl, Result);
4790fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
4800fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
4814344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerinline error_code RelocationRef::getValueString(SmallVectorImpl<char> &Result)
4824344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  const {
4834344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  return OwningObject->getRelocationValueString(RelocationPimpl, Result);
4844344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer}
4854344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
48668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} // end namespace object
48768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} // end namespace llvm
48868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
48968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer#endif
490