ObjectFile.h revision 0fcab076f0358890e2f1b213f4303c780e05d99d
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
4268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SymbolRef - This is a value type class that represents a single symbol in
4368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// the list of symbols in the object file.
4468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerclass SymbolRef {
4507ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer  friend class SectionRef;
4668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  DataRefImpl SymbolPimpl;
4768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  const ObjectFile *OwningObject;
4868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
4968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic:
50dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer  SymbolRef() : OwningObject(NULL) {
51dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer    std::memset(&SymbolPimpl, 0, sizeof(SymbolPimpl));
52dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer  }
53dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer
5468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  SymbolRef(DataRefImpl SymbolP, const ObjectFile *Owner);
5568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
5668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  bool operator==(const SymbolRef &Other) const;
5768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
5825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getNext(SymbolRef &Result) const;
5968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
6025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getName(StringRef &Result) const;
6125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getAddress(uint64_t &Result) const;
6225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getSize(uint64_t &Result) const;
6368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
6468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// Returns the ascii char that should be displayed in a symbol table dump via
6568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// nm for this symbol.
6625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getNMTypeChar(char &Result) const;
6768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
6868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// Returns true for symbols that are internal to the object file format such
6968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// as section symbols.
7025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code isInternal(bool &Result) const;
7168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer};
7268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
730fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer/// RelocationRef - This is a value type class that represents a single
740fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer/// relocation in the list of relocations in the object file.
750fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerclass RelocationRef {
760fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  DataRefImpl RelocationPimpl;
770fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  const ObjectFile *OwningObject;
780fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
790fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerpublic:
800fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  RelocationRef() : OwningObject(NULL) {
810fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer    std::memset(&RelocationPimpl, 0, sizeof(RelocationPimpl));
820fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  }
830fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
840fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  RelocationRef(DataRefImpl RelocationP, const ObjectFile *Owner);
850fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
860fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  bool operator==(const RelocationRef &Other) const;
870fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
880fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  error_code getNext(RelocationRef &Result) const;
890fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
900fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  error_code getAddress(uint64_t &Result) const;
910fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  error_code getSymbol(SymbolRef &Result) const;
920fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  error_code getType(uint32_t &Result) const;
930fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  error_code getAdditionalInfo(int64_t &Result) const;
940fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer};
950fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
9668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SectionRef - This is a value type class that represents a single section in
9768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// the list of sections in the object file.
9868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerclass SectionRef {
9907ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer  friend class SymbolRef;
10068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  DataRefImpl SectionPimpl;
10168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  const ObjectFile *OwningObject;
10268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
10368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic:
104dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer  SectionRef() : OwningObject(NULL) {
105dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer    std::memset(&SectionPimpl, 0, sizeof(SectionPimpl));
106dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer  }
107dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer
10868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  SectionRef(DataRefImpl SectionP, const ObjectFile *Owner);
10968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
11068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  bool operator==(const SectionRef &Other) const;
11168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
11225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getNext(SectionRef &Result) const;
11368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
11425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getName(StringRef &Result) const;
11525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getAddress(uint64_t &Result) const;
11625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getSize(uint64_t &Result) const;
11725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getContents(StringRef &Result) const;
11868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
11968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // FIXME: Move to the normalization layer when it's created.
12025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code isText(bool &Result) const;
12107ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer
12207ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer  error_code containsSymbol(SymbolRef S, bool &Result) const;
12368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer};
12468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
12568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerconst uint64_t UnknownAddressOrSize = ~0ULL;
12668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
12768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// ObjectFile - This class is the base class for all object file types.
12868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// Concrete instances of this object are created by createObjectFile, which
12968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// figure out which type to create.
130001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerclass ObjectFile : public Binary {
13168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerprivate:
13268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  ObjectFile(); // = delete
13368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  ObjectFile(const ObjectFile &other); // = delete
13468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
13568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerprotected:
136001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  ObjectFile(unsigned int Type, MemoryBuffer *source, error_code &ec);
13768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
138001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  const uint8_t *base() const {
139001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer    return reinterpret_cast<const uint8_t *>(Data->getBufferStart());
140001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  }
14168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
14268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // These functions are for SymbolRef to call internally. The main goal of
14368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // this is to allow SymbolRef::SymbolPimpl to point directly to the symbol
14468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // entry in the memory mapped object file. SymbolPimpl cannot contain any
14568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // virtual functions because then it could not point into the memory mapped
14668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // file.
14725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  //
14825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  // Implementations assume that the DataRefImpl is valid and has not been
14925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  // modified externally. It's UB otherwise.
15068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  friend class SymbolRef;
15125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const = 0;
15225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const = 0;
15325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const =0;
15425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const = 0;
15525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolNMTypeChar(DataRefImpl Symb, char &Res) const = 0;
15625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code isSymbolInternal(DataRefImpl Symb, bool &Res) const = 0;
15768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
15868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // Same as above for SectionRef.
15968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  friend class SectionRef;
16025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionNext(DataRefImpl Sec, SectionRef &Res) const = 0;
16125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionName(DataRefImpl Sec, StringRef &Res) const = 0;
16225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionAddress(DataRefImpl Sec, uint64_t &Res) const =0;
16325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const = 0;
16425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionContents(DataRefImpl Sec, StringRef &Res)const=0;
16525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const = 0;
16607ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer  virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb,
16707ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer                                           bool &Result) const = 0;
16868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
16968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
1700fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  // Same as above for RelocationRef.
1710fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  friend class RelocationRef;
1720fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  virtual error_code getRelocationNext(DataRefImpl Rel,
1730fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer                                       RelocationRef &Res) const = 0;
1740fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  virtual error_code getRelocationAddress(DataRefImpl Rel,
1750fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer                                          uint64_t &Res) const =0;
1760fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  virtual error_code getRelocationSymbol(DataRefImpl Rel,
1770fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer                                         SymbolRef &Res) const = 0;
1780fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  virtual error_code getRelocationType(DataRefImpl Rel,
1790fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer                                       uint32_t &Res) const = 0;
1800fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  virtual error_code getRelocationAdditionalInfo(DataRefImpl Rel,
1810fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer                                                 int64_t &Res) const = 0;
1820fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
18368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic:
18468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  template<class content_type>
18568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  class content_iterator {
18668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    content_type Current;
18768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  public:
18868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    content_iterator(content_type symb)
18968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer      : Current(symb) {}
19068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
19168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    const content_type* operator->() const {
19268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer      return &Current;
19368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    }
19468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
195739b65bf85cf7221b8a615e83dee11ec729e2649Benjamin Kramer    const content_type &operator*() const {
196739b65bf85cf7221b8a615e83dee11ec729e2649Benjamin Kramer      return Current;
197739b65bf85cf7221b8a615e83dee11ec729e2649Benjamin Kramer    }
198739b65bf85cf7221b8a615e83dee11ec729e2649Benjamin Kramer
19968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    bool operator==(const content_iterator &other) const {
20068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer      return Current == other.Current;
20168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    }
20268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
20368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    bool operator!=(const content_iterator &other) const {
20468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer      return !(*this == other);
20568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    }
20668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
20725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer    content_iterator& increment(error_code &err) {
20825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer      content_type next;
20925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer      if (error_code ec = Current.getNext(next))
21025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer        err = ec;
21125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer      else
21225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer        Current = next;
21368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer      return *this;
21468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer    }
21568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  };
21668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
21768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  typedef content_iterator<SymbolRef> symbol_iterator;
21868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  typedef content_iterator<SectionRef> section_iterator;
2190fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  typedef content_iterator<RelocationRef> relocation_iterator;
22068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
22168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual symbol_iterator begin_symbols() const = 0;
22268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual symbol_iterator end_symbols() const = 0;
22368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
22468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual section_iterator begin_sections() const = 0;
22568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual section_iterator end_sections() const = 0;
22668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
2270fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  virtual relocation_iterator begin_relocations() const = 0;
2280fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  virtual relocation_iterator end_relocations() const = 0;
2290fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
23068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @brief The number of bytes used to represent an address in this object
23168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  ///        file format.
23268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual uint8_t getBytesInAddress() const = 0;
23368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
23468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual StringRef getFileFormatName() const = 0;
23588af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencer  virtual /* Triple::ArchType */ unsigned getArch() const = 0;
23668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
23768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @returns Pointer to ObjectFile subclass to handle this type of object.
23868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @param ObjectPath The path to the object file. ObjectPath.isObject must
23968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  ///        return true.
24068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @brief Create ObjectFile from path.
24188af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencer  static ObjectFile *createObjectFile(StringRef ObjectPath);
24268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  static ObjectFile *createObjectFile(MemoryBuffer *Object);
24368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
244001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  static inline bool classof(const Binary *v) {
245001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer    return v->getType() >= isObject &&
246001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer           v->getType() < lastObject;
247001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  }
248001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  static inline bool classof(const ObjectFile *v) { return true; }
249001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer
250001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerpublic:
25168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  static ObjectFile *createCOFFObjectFile(MemoryBuffer *Object);
25268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  static ObjectFile *createELFObjectFile(MemoryBuffer *Object);
25368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  static ObjectFile *createMachOObjectFile(MemoryBuffer *Object);
25468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer};
25568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
25668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer// Inline function definitions.
25768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline SymbolRef::SymbolRef(DataRefImpl SymbolP, const ObjectFile *Owner)
25868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  : SymbolPimpl(SymbolP)
25968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  , OwningObject(Owner) {}
26068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
26168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline bool SymbolRef::operator==(const SymbolRef &Other) const {
26268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  return SymbolPimpl == Other.SymbolPimpl;
26368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
26468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
26525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getNext(SymbolRef &Result) const {
26625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSymbolNext(SymbolPimpl, Result);
26768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
26868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
26925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getName(StringRef &Result) const {
27025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSymbolName(SymbolPimpl, Result);
27168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
27268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
27325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getAddress(uint64_t &Result) const {
27425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSymbolAddress(SymbolPimpl, Result);
27568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
27668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
27725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getSize(uint64_t &Result) const {
27825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSymbolSize(SymbolPimpl, Result);
27968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
28068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
28125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getNMTypeChar(char &Result) const {
28225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSymbolNMTypeChar(SymbolPimpl, Result);
28368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
28468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
28525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::isInternal(bool &Result) const {
28625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->isSymbolInternal(SymbolPimpl, Result);
28768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
28868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
28968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
29068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SectionRef
29168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline SectionRef::SectionRef(DataRefImpl SectionP,
29268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer                              const ObjectFile *Owner)
29368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  : SectionPimpl(SectionP)
29468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  , OwningObject(Owner) {}
29568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
29668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline bool SectionRef::operator==(const SectionRef &Other) const {
29768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  return SectionPimpl == Other.SectionPimpl;
29868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
29968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
30025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getNext(SectionRef &Result) const {
30125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionNext(SectionPimpl, Result);
30268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
30368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
30425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getName(StringRef &Result) const {
30525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionName(SectionPimpl, Result);
30668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
30768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
30825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getAddress(uint64_t &Result) const {
30925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionAddress(SectionPimpl, Result);
31068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
31168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
31225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getSize(uint64_t &Result) const {
31325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionSize(SectionPimpl, Result);
31468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
31568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
31625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getContents(StringRef &Result) const {
31725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionContents(SectionPimpl, Result);
31868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
31968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
32025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::isText(bool &Result) const {
32125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->isSectionText(SectionPimpl, Result);
32268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
32368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
32407ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramerinline error_code SectionRef::containsSymbol(SymbolRef S, bool &Result) const {
32507ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer  return OwningObject->sectionContainsSymbol(SectionPimpl, S.SymbolPimpl,
32607ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer                                             Result);
32707ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer}
32807ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer
3290fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
3300fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer/// RelocationRef
3310fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline RelocationRef::RelocationRef(DataRefImpl RelocationP,
3320fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer                              const ObjectFile *Owner)
3330fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  : RelocationPimpl(RelocationP)
3340fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  , OwningObject(Owner) {}
3350fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
3360fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline bool RelocationRef::operator==(const RelocationRef &Other) const {
3370fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  return RelocationPimpl == Other.RelocationPimpl;
3380fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
3390fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
3400fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getNext(RelocationRef &Result) const {
3410fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  return OwningObject->getRelocationNext(RelocationPimpl, Result);
3420fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
3430fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
3440fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getAddress(uint64_t &Result) const {
3450fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  return OwningObject->getRelocationAddress(RelocationPimpl, Result);
3460fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
3470fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
3480fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getSymbol(SymbolRef &Result) const {
3490fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  return OwningObject->getRelocationSymbol(RelocationPimpl, Result);
3500fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
3510fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
3520fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getType(uint32_t &Result) const {
3530fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  return OwningObject->getRelocationType(RelocationPimpl, Result);
3540fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
3550fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
3560fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getAdditionalInfo(int64_t &Result) const {
3570fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  return OwningObject->getRelocationAdditionalInfo(RelocationPimpl, Result);
3580fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
3590fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
36068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} // end namespace object
36168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} // end namespace llvm
36268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
36368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer#endif
364