ObjectFile.h revision 25b15777df42d5d608810f6881b6c98107481d69
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 {
317acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer    uint32_t a, b;
327acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer  } d;
3325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  uintptr_t p;
347acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer};
357acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer
367acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencerstatic bool operator ==(const DataRefImpl &a, const DataRefImpl &b) {
377acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer  // Check bitwise identical. This is the only legal way to compare a union w/o
387acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer  // knowing which member is in use.
397acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer  return std::memcmp(&a, &b, sizeof(DataRefImpl)) == 0;
407acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer}
4168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
4225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerclass RelocationRef {
4325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  DataRefImpl RelocationPimpl;
4425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  const ObjectFile *OwningObject;
4525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer
4625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerpublic:
4725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  RelocationRef() : OwningObject(NULL) { std::memset(&RelocationPimpl, 0, sizeof(RelocationPimpl)); }
4825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  RelocationRef(DataRefImpl RelocationP, const ObjectFile *Owner);
4925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer
5025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  bool operator==(const RelocationRef &Other) const;
5125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer
5225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getNext(RelocationRef &Result);
5325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer};
5425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer
5568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SymbolRef - This is a value type class that represents a single symbol in
5668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// the list of symbols in the object file.
5768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerclass SymbolRef {
5868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  DataRefImpl SymbolPimpl;
5968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  const ObjectFile *OwningObject;
6068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
6168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic:
6225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  SymbolRef() : OwningObject(NULL) { std::memset(&SymbolPimpl, 0, sizeof(SymbolPimpl)); }
6368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  SymbolRef(DataRefImpl SymbolP, const ObjectFile *Owner);
6468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
6568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  bool operator==(const SymbolRef &Other) const;
6668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
6725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getNext(SymbolRef &Result) const;
6868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
6925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getName(StringRef &Result) const;
7025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getAddress(uint64_t &Result) const;
7125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getSize(uint64_t &Result) const;
7268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
7368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// Returns the ascii char that should be displayed in a symbol table dump via
7468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// nm for this symbol.
7525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getNMTypeChar(char &Result) const;
7668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
7768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// Returns true for symbols that are internal to the object file format such
7868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// as section symbols.
7925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code isInternal(bool &Result) const;
8068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer};
8168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
8268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SectionRef - This is a value type class that represents a single section in
8368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// the list of sections in the object file.
8468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerclass SectionRef {
8568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  DataRefImpl SectionPimpl;
8668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  const ObjectFile *OwningObject;
8768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
8868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic:
8925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  SectionRef() : OwningObject(NULL) { std::memset(&SectionPimpl, 0, sizeof(SectionPimpl)); }
9068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  SectionRef(DataRefImpl SectionP, const ObjectFile *Owner);
9168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
9268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  bool operator==(const SectionRef &Other) const;
9368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
9425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getNext(SectionRef &Result) const;
9568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
9625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getName(StringRef &Result) const;
9725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getAddress(uint64_t &Result) const;
9825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getSize(uint64_t &Result) const;
9925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getContents(StringRef &Result) const;
10068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
10168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // FIXME: Move to the normalization layer when it's created.
10225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code isText(bool &Result) const;
10368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer};
10468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
10568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerconst uint64_t UnknownAddressOrSize = ~0ULL;
10668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
10768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// ObjectFile - This class is the base class for all object file types.
10868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// Concrete instances of this object are created by createObjectFile, which
10968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// figure out which type to create.
110001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerclass ObjectFile : public Binary {
11168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerprivate:
11268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  ObjectFile(); // = delete
11368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  ObjectFile(const ObjectFile &other); // = delete
11468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
11568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerprotected:
116001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  ObjectFile(unsigned int Type, MemoryBuffer *source, error_code &ec);
11768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
118001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  const uint8_t *base() const {
119001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer    return reinterpret_cast<const uint8_t *>(Data->getBufferStart());
120001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  }
12168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
12268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // These functions are for SymbolRef to call internally. The main goal of
12368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // this is to allow SymbolRef::SymbolPimpl to point directly to the symbol
12468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // entry in the memory mapped object file. SymbolPimpl cannot contain any
12568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // virtual functions because then it could not point into the memory mapped
12668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // file.
12725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  //
12825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  // Implementations assume that the DataRefImpl is valid and has not been
12925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  // modified externally. It's UB otherwise.
13068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  friend class SymbolRef;
13125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const = 0;
13225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const = 0;
13325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const =0;
13425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const = 0;
13525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolNMTypeChar(DataRefImpl Symb, char &Res) const = 0;
13625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code isSymbolInternal(DataRefImpl Symb, bool &Res) const = 0;
13768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
13868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // Same as above for SectionRef.
13968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  friend class SectionRef;
14025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionNext(DataRefImpl Sec, SectionRef &Res) const = 0;
14125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionName(DataRefImpl Sec, StringRef &Res) const = 0;
14225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionAddress(DataRefImpl Sec, uint64_t &Res) const =0;
14325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const = 0;
14425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionContents(DataRefImpl Sec, StringRef &Res)const=0;
14525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const = 0;
14668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
14768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
14868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic:
14968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  template<class content_type>
15068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  class content_iterator {
15168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    content_type Current;
15268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  public:
15368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    content_iterator(content_type symb)
15468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer      : Current(symb) {}
15568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
15668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    const content_type* operator->() const {
15768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer      return &Current;
15868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    }
15968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
16068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    bool operator==(const content_iterator &other) const {
16168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer      return Current == other.Current;
16268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    }
16368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
16468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    bool operator!=(const content_iterator &other) const {
16568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer      return !(*this == other);
16668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    }
16768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
16825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer    content_iterator& increment(error_code &err) {
16925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer      content_type next;
17025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer      if (error_code ec = Current.getNext(next))
17125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer        err = ec;
17225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer      else
17325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer        Current = next;
17468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer      return *this;
17568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    }
17668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  };
17768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
17868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  typedef content_iterator<SymbolRef> symbol_iterator;
17968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  typedef content_iterator<SectionRef> section_iterator;
18068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
18168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual symbol_iterator begin_symbols() const = 0;
18268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual symbol_iterator end_symbols() const = 0;
18368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
18468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual section_iterator begin_sections() const = 0;
18568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual section_iterator end_sections() const = 0;
18668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
18768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @brief The number of bytes used to represent an address in this object
18868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  ///        file format.
18968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual uint8_t getBytesInAddress() const = 0;
19068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
19168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual StringRef getFileFormatName() const = 0;
19288af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencer  virtual /* Triple::ArchType */ unsigned getArch() const = 0;
19368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
19468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @returns Pointer to ObjectFile subclass to handle this type of object.
19568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @param ObjectPath The path to the object file. ObjectPath.isObject must
19668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  ///        return true.
19768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @brief Create ObjectFile from path.
19888af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencer  static ObjectFile *createObjectFile(StringRef ObjectPath);
19968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  static ObjectFile *createObjectFile(MemoryBuffer *Object);
20068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
201001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  static inline bool classof(const Binary *v) {
202001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer    return v->getType() >= isObject &&
203001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer           v->getType() < lastObject;
204001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  }
205001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  static inline bool classof(const ObjectFile *v) { return true; }
206001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer
207001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerpublic:
20868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  static ObjectFile *createCOFFObjectFile(MemoryBuffer *Object);
20968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  static ObjectFile *createELFObjectFile(MemoryBuffer *Object);
21068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  static ObjectFile *createMachOObjectFile(MemoryBuffer *Object);
21168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer};
21268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
21368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer// Inline function definitions.
21468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline SymbolRef::SymbolRef(DataRefImpl SymbolP, const ObjectFile *Owner)
21568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  : SymbolPimpl(SymbolP)
21668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  , OwningObject(Owner) {}
21768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
21868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline bool SymbolRef::operator==(const SymbolRef &Other) const {
21968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  return SymbolPimpl == Other.SymbolPimpl;
22068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
22168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
22225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getNext(SymbolRef &Result) const {
22325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSymbolNext(SymbolPimpl, Result);
22468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
22568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
22625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getName(StringRef &Result) const {
22725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSymbolName(SymbolPimpl, Result);
22868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
22968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
23025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getAddress(uint64_t &Result) const {
23125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSymbolAddress(SymbolPimpl, Result);
23268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
23368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
23425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getSize(uint64_t &Result) const {
23525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSymbolSize(SymbolPimpl, Result);
23668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
23768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
23825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getNMTypeChar(char &Result) const {
23925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSymbolNMTypeChar(SymbolPimpl, Result);
24068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
24168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
24225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::isInternal(bool &Result) const {
24325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->isSymbolInternal(SymbolPimpl, Result);
24468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
24568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
24668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
24768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SectionRef
24868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline SectionRef::SectionRef(DataRefImpl SectionP,
24968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer                              const ObjectFile *Owner)
25068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  : SectionPimpl(SectionP)
25168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  , OwningObject(Owner) {}
25268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
25368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline bool SectionRef::operator==(const SectionRef &Other) const {
25468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  return SectionPimpl == Other.SectionPimpl;
25568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
25668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
25725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getNext(SectionRef &Result) const {
25825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionNext(SectionPimpl, Result);
25968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
26068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
26125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getName(StringRef &Result) const {
26225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionName(SectionPimpl, Result);
26368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
26468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
26525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getAddress(uint64_t &Result) const {
26625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionAddress(SectionPimpl, Result);
26768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
26868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
26925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getSize(uint64_t &Result) const {
27025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionSize(SectionPimpl, Result);
27168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
27268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
27325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getContents(StringRef &Result) const {
27425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionContents(SectionPimpl, Result);
27568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
27668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
27725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::isText(bool &Result) const {
27825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->isSectionText(SectionPimpl, Result);
27968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
28068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
28168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} // end namespace object
28268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} // end namespace llvm
28368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
28468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer#endif
285