ObjectFile.h revision 88af6b9217f9ff8b4592f38ac5175de697275f49
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
1788af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencer#include "llvm/ADT/StringRef.h"
1888af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencer#include "llvm/System/DataTypes.h"
1968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
2068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencernamespace llvm {
2168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
2268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerclass MemoryBuffer;
2388af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencerclass StringRef;
2468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
2568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencernamespace object {
2668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
2768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerclass ObjectFile;
2868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencertypedef uint64_t DataRefImpl;
2968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
3068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SymbolRef - This is a value type class that represents a single symbol in
3168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// the list of symbols in the object file.
3268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerclass SymbolRef {
3368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  DataRefImpl SymbolPimpl;
3468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  const ObjectFile *OwningObject;
3568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
3668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic:
3768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  SymbolRef(DataRefImpl SymbolP, const ObjectFile *Owner);
3868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
3968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  bool operator==(const SymbolRef &Other) const;
4068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
4168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  SymbolRef getNext() const;
4268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
4368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  StringRef getName() const;
4468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  uint64_t  getAddress() const;
4568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  uint64_t  getSize() const;
4668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
4768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// Returns the ascii char that should be displayed in a symbol table dump via
4868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// nm for this symbol.
4968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  char      getNMTypeChar() const;
5068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
5168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// Returns true for symbols that are internal to the object file format such
5268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// as section symbols.
5368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  bool      isInternal() const;
5468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer};
5568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
5668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SectionRef - This is a value type class that represents a single section in
5768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// the list of sections in the object file.
5868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerclass SectionRef {
5968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  DataRefImpl SectionPimpl;
6068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  const ObjectFile *OwningObject;
6168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
6268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic:
6368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  SectionRef(DataRefImpl SectionP, const ObjectFile *Owner);
6468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
6568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  bool operator==(const SectionRef &Other) const;
6668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
6768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  SectionRef getNext() const;
6868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
6968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  StringRef getName() const;
7068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  uint64_t  getAddress() const;
7168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  uint64_t  getSize() const;
7268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  StringRef getContents() const;
7368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
7468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // FIXME: Move to the normalization layer when it's created.
7568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  bool      isText() const;
7668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer};
7768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
7868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerconst uint64_t UnknownAddressOrSize = ~0ULL;
7968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
8068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// ObjectFile - This class is the base class for all object file types.
8168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// Concrete instances of this object are created by createObjectFile, which
8268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// figure out which type to create.
8368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerclass ObjectFile {
8468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerprivate:
8568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  ObjectFile(); // = delete
8668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  ObjectFile(const ObjectFile &other); // = delete
8768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
8868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerprotected:
8968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  MemoryBuffer *MapFile;
9068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  const uint8_t *base;
9168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
9268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  ObjectFile(MemoryBuffer *Object);
9368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
9468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // These functions are for SymbolRef to call internally. The main goal of
9568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // this is to allow SymbolRef::SymbolPimpl to point directly to the symbol
9668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // entry in the memory mapped object file. SymbolPimpl cannot contain any
9768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // virtual functions because then it could not point into the memory mapped
9868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // file.
9968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  friend class SymbolRef;
10068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual SymbolRef getSymbolNext(DataRefImpl Symb) const = 0;
10168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual StringRef getSymbolName(DataRefImpl Symb) const = 0;
10268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual uint64_t  getSymbolAddress(DataRefImpl Symb) const = 0;
10368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual uint64_t  getSymbolSize(DataRefImpl Symb) const = 0;
10468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual char      getSymbolNMTypeChar(DataRefImpl Symb) const = 0;
10568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual bool      isSymbolInternal(DataRefImpl Symb) const = 0;
10668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
10768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // Same as above for SectionRef.
10868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  friend class SectionRef;
10968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual SectionRef getSectionNext(DataRefImpl Sec) const = 0;
11068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual StringRef  getSectionName(DataRefImpl Sec) const = 0;
11168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual uint64_t   getSectionAddress(DataRefImpl Sec) const = 0;
11268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual uint64_t   getSectionSize(DataRefImpl Sec) const = 0;
11368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual StringRef  getSectionContents(DataRefImpl Sec) const = 0;
11468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual bool       isSectionText(DataRefImpl Sec) const = 0;
11568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
11668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
11768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic:
11868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  template<class content_type>
11968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  class content_iterator {
12068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    content_type Current;
12168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  public:
12268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    content_iterator(content_type symb)
12368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer      : Current(symb) {}
12468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
12568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    const content_type* operator->() const {
12668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer      return &Current;
12768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    }
12868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
12968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    bool operator==(const content_iterator &other) const {
13068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer      return Current == other.Current;
13168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    }
13268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
13368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    bool operator!=(const content_iterator &other) const {
13468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer      return !(*this == other);
13568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    }
13668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
13768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    content_iterator& operator++() {  // Preincrement
13868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer      Current = Current.getNext();
13968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer      return *this;
14068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    }
14168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  };
14268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
14368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  typedef content_iterator<SymbolRef> symbol_iterator;
14468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  typedef content_iterator<SectionRef> section_iterator;
14568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
14668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual ~ObjectFile();
14768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
14868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual symbol_iterator begin_symbols() const = 0;
14968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual symbol_iterator end_symbols() const = 0;
15068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
15168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual section_iterator begin_sections() const = 0;
15268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual section_iterator end_sections() const = 0;
15368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
15468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @brief The number of bytes used to represent an address in this object
15568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  ///        file format.
15668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual uint8_t getBytesInAddress() const = 0;
15768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
15868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual StringRef getFileFormatName() const = 0;
15988af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencer  virtual /* Triple::ArchType */ unsigned getArch() const = 0;
16068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
16168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  StringRef getFilename() const;
16268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
16368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @returns Pointer to ObjectFile subclass to handle this type of object.
16468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @param ObjectPath The path to the object file. ObjectPath.isObject must
16568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  ///        return true.
16668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @brief Create ObjectFile from path.
16788af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencer  static ObjectFile *createObjectFile(StringRef ObjectPath);
16868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  static ObjectFile *createObjectFile(MemoryBuffer *Object);
16968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
17068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerprivate:
17168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  static ObjectFile *createCOFFObjectFile(MemoryBuffer *Object);
17268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  static ObjectFile *createELFObjectFile(MemoryBuffer *Object);
17368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  static ObjectFile *createMachOObjectFile(MemoryBuffer *Object);
17468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  static ObjectFile *createArchiveObjectFile(MemoryBuffer *Object);
17568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  static ObjectFile *createLibObjectFile(MemoryBuffer *Object);
17668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer};
17768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
17868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer// Inline function definitions.
17968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline SymbolRef::SymbolRef(DataRefImpl SymbolP, const ObjectFile *Owner)
18068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  : SymbolPimpl(SymbolP)
18168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  , OwningObject(Owner) {}
18268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
18368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline bool SymbolRef::operator==(const SymbolRef &Other) const {
18468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  return SymbolPimpl == Other.SymbolPimpl;
18568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
18668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
18768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline SymbolRef SymbolRef::getNext() const {
18868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  return OwningObject->getSymbolNext(SymbolPimpl);
18968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
19068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
19168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline StringRef SymbolRef::getName() const {
19268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  return OwningObject->getSymbolName(SymbolPimpl);
19368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
19468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
19568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline uint64_t SymbolRef::getAddress() const {
19668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  return OwningObject->getSymbolAddress(SymbolPimpl);
19768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
19868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
19968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline uint64_t SymbolRef::getSize() const {
20068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  return OwningObject->getSymbolSize(SymbolPimpl);
20168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
20268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
20368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline char SymbolRef::getNMTypeChar() const {
20468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  return OwningObject->getSymbolNMTypeChar(SymbolPimpl);
20568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
20668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
20768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline bool SymbolRef::isInternal() const {
20868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  return OwningObject->isSymbolInternal(SymbolPimpl);
20968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
21068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
21168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
21268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SectionRef
21368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline SectionRef::SectionRef(DataRefImpl SectionP,
21468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer                              const ObjectFile *Owner)
21568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  : SectionPimpl(SectionP)
21668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  , OwningObject(Owner) {}
21768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
21868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline bool SectionRef::operator==(const SectionRef &Other) const {
21968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  return SectionPimpl == Other.SectionPimpl;
22068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
22168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
22268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline SectionRef SectionRef::getNext() const {
22368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  return OwningObject->getSectionNext(SectionPimpl);
22468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
22568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
22668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline StringRef SectionRef::getName() const {
22768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  return OwningObject->getSectionName(SectionPimpl);
22868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
22968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
23068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline uint64_t SectionRef::getAddress() const {
23168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  return OwningObject->getSectionAddress(SectionPimpl);
23268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
23368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
23468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline uint64_t SectionRef::getSize() const {
23568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  return OwningObject->getSectionSize(SectionPimpl);
23668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
23768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
23868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline StringRef SectionRef::getContents() const {
23968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  return OwningObject->getSectionContents(SectionPimpl);
24068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
24168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
24268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline bool SectionRef::isText() const {
24368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  return OwningObject->isSectionText(SectionPimpl);
24468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
24568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
24668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} // end namespace object
24768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} // end namespace llvm
24868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
24968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer#endif
250