ObjectFile.h revision 36b56886974eae4f9c5ebc96befd3e7bfe5de338
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
14674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#ifndef LLVM_OBJECT_OBJECTFILE_H
15674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#define LLVM_OBJECT_OBJECTFILE_H
1668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
1788af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencer#include "llvm/ADT/StringRef.h"
1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Object/SymbolicFile.h"
191f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/DataTypes.h"
2025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer#include "llvm/Support/ErrorHandling.h"
2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/FileSystem.h"
22001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer#include "llvm/Support/MemoryBuffer.h"
237acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer#include <cstring>
2424973c1063bfb7ac353732a4e8eb801830336c5fEli Bendersky#include <vector>
2568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
2668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencernamespace llvm {
2768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencernamespace object {
2868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
2968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerclass ObjectFile;
307acdb4d237181976b04e72f6a6c329c3b2604440Michael J. Spencer
319b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencerclass SymbolRef;
3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass symbol_iterator;
3368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
340fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer/// RelocationRef - This is a value type class that represents a single
350fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer/// relocation in the list of relocations in the object file.
360fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerclass RelocationRef {
370fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  DataRefImpl RelocationPimpl;
380fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  const ObjectFile *OwningObject;
390fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
400fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerpublic:
413fd9b8422328a60664a5c631ec9519b58017fcbcDanil Malyshev  RelocationRef() : OwningObject(NULL) { }
420fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
430fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  RelocationRef(DataRefImpl RelocationP, const ObjectFile *Owner);
440fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
450fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  bool operator==(const RelocationRef &Other) const;
460fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void moveNext();
480fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
490fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  error_code getAddress(uint64_t &Result) const;
50b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev  error_code getOffset(uint64_t &Result) const;
516c1202c459ffa6d693ad92fa84e43902bc780bcaRafael Espindola  symbol_iterator getSymbol() const;
529472b8d220fc746498429f430cb4c4dbfbd38f2aOwen Anderson  error_code getType(uint64_t &Result) const;
534344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
540685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson  /// @brief Indicates whether this relocation should hidden when listing
550685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson  /// relocations, usually because it is the trailing part of a multipart
560685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson  /// relocation that will be printed as part of the leading relocation.
570685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson  error_code getHidden(bool &Result) const;
580685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson
594344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  /// @brief Get a string that represents the type of this relocation.
604344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  ///
614344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  /// This is for display purposes only.
624344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  error_code getTypeName(SmallVectorImpl<char> &Result) const;
634344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
644344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  /// @brief Get a string that represents the calculation of the value of this
654344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  ///        relocation.
664344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  ///
674344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  /// This is for display purposes only.
684344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  error_code getValueString(SmallVectorImpl<char> &Result) const;
699ac0f1d7255d7941c331b0a62a830a3b033358fdMarshall Clow
709ac0f1d7255d7941c331b0a62a830a3b033358fdMarshall Clow  DataRefImpl getRawDataRefImpl() const;
71167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola  const ObjectFile *getObjectFile() const;
720fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer};
734344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencertypedef content_iterator<RelocationRef> relocation_iterator;
740fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
7568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SectionRef - This is a value type class that represents a single section in
7668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// the list of sections in the object file.
777486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindolaclass SectionRef;
787486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindolatypedef content_iterator<SectionRef> section_iterator;
7968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerclass SectionRef {
8007ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer  friend class SymbolRef;
8168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  DataRefImpl SectionPimpl;
8268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  const ObjectFile *OwningObject;
8368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
8468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic:
853fd9b8422328a60664a5c631ec9519b58017fcbcDanil Malyshev  SectionRef() : OwningObject(NULL) { }
86dedd6ee135f886e219035b2cf5957ce492f90ed1Michael J. Spencer
8768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  SectionRef(DataRefImpl SectionP, const ObjectFile *Owner);
8868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
8968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  bool operator==(const SectionRef &Other) const;
9036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool operator!=(const SectionRef &Other) const;
915b957e6fd9853f938b8b33cfeb03d80595a9c2f8Eric Christopher  bool operator<(const SectionRef &Other) const;
9268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void moveNext();
9468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
9525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getName(StringRef &Result) const;
9625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getAddress(uint64_t &Result) const;
9725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getSize(uint64_t &Result) const;
9825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code getContents(StringRef &Result) const;
9968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
100e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer  /// @brief Get the alignment of this section as the actual value (not log 2).
101e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer  error_code getAlignment(uint64_t &Result) const;
102e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer
10368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // FIXME: Move to the normalization layer when it's created.
10425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code isText(bool &Result) const;
10513afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer  error_code isData(bool &Result) const;
10613afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer  error_code isBSS(bool &Result) const;
107c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  error_code isRequiredForExecution(bool &Result) const;
108c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  error_code isVirtual(bool &Result) const;
109c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  error_code isZeroInit(bool &Result) const;
1103a129c85920404e7ccdb7e655c89fa60a0309cfdAndrew Kaylor  error_code isReadOnlyData(bool &Result) const;
11107ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer
11207ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer  error_code containsSymbol(SymbolRef S, bool &Result) const;
1134344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
11436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  relocation_iterator relocation_begin() const;
11536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  relocation_iterator relocation_end() const;
11636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  typedef iterator_range<relocation_iterator> relocation_iterator_range;
11736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  relocation_iterator_range relocations() const {
11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return relocation_iterator_range(relocation_begin(), relocation_end());
11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool relocation_empty() const;
1217486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola  section_iterator getRelocatedSection() const;
122c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd
123c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  DataRefImpl getRawDataRefImpl() const;
12468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer};
12568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
1269b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer/// SymbolRef - This is a value type class that represents a single symbol in
1279b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer/// the list of symbols in the object file.
12836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass SymbolRef : public BasicSymbolRef {
1299b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  friend class SectionRef;
1309b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
1319b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencerpublic:
13236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  SymbolRef() : BasicSymbolRef() {}
1339b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
1349b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  enum Type {
1352c67727046234ad9702ab5acb72700b5ac99a676David Meyer    ST_Unknown, // Type not specified
1369b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer    ST_Data,
137206d17cf605293f1c12d8bfa8cf72826a29b253fMichael J. Spencer    ST_Debug,
138206d17cf605293f1c12d8bfa8cf72826a29b253fMichael J. Spencer    ST_File,
139206d17cf605293f1c12d8bfa8cf72826a29b253fMichael J. Spencer    ST_Function,
1409b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer    ST_Other
1419b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  };
1429b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
1439b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  SymbolRef(DataRefImpl SymbolP, const ObjectFile *Owner);
1449b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
1459b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  error_code getName(StringRef &Result) const;
14601fa41a106ed0ff86c3b9ffe0843679211bf487cAlexey Samsonov  /// Returns the symbol virtual address (i.e. address at which it will be
14701fa41a106ed0ff86c3b9ffe0843679211bf487cAlexey Samsonov  /// mapped).
1489b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  error_code getAddress(uint64_t &Result) const;
149b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev  error_code getFileOffset(uint64_t &Result) const;
15059a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindola  /// @brief Get the alignment of this symbol as the actual value (not log 2).
15159a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindola  error_code getAlignment(uint32_t &Result) const;
1529b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  error_code getSize(uint64_t &Result) const;
1539b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  error_code getType(SymbolRef::Type &Result) const;
1549b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
1559b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  /// @brief Get section this symbol is defined in reference to. Result is
1569b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  /// end_sections() if it is undefined or is an absolute symbol.
1579b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  error_code getSection(section_iterator &Result) const;
1589b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
15936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const ObjectFile *getObject() const;
16036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
161a41dce3c642e50775352cce49e3a3d0cd004d393Tim Northover
16236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass symbol_iterator : public basic_symbol_iterator {
16336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic:
16436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  symbol_iterator(SymbolRef Sym) : basic_symbol_iterator(Sym) {}
16536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  symbol_iterator(const basic_symbol_iterator &B)
16636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      : basic_symbol_iterator(SymbolRef(B->getRawDataRefImpl(),
16736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                        cast<ObjectFile>(B->getObject()))) {}
16836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
16936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const SymbolRef *operator->() const {
17036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    const BasicSymbolRef &P = basic_symbol_iterator::operator *();
17136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return static_cast<const SymbolRef*>(&P);
17236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
17336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
17436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const SymbolRef &operator*() const {
17536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    const BasicSymbolRef &P = basic_symbol_iterator::operator *();
17636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return static_cast<const SymbolRef&>(P);
17736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
1789b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer};
1799b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
1805c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer/// LibraryRef - This is a value type class that represents a single library in
1815c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer/// the list of libraries needed by a shared or dynamic object.
1825c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyerclass LibraryRef {
1835c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  friend class SectionRef;
1845c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  DataRefImpl LibraryPimpl;
1855c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  const ObjectFile *OwningObject;
1865c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
1875c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyerpublic:
1883fd9b8422328a60664a5c631ec9519b58017fcbcDanil Malyshev  LibraryRef() : OwningObject(NULL) { }
1895c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
1905c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  LibraryRef(DataRefImpl LibraryP, const ObjectFile *Owner);
1915c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
1925c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  bool operator==(const LibraryRef &Other) const;
1935b957e6fd9853f938b8b33cfeb03d80595a9c2f8Eric Christopher  bool operator<(const LibraryRef &Other) const;
1945c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
1955c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  error_code getNext(LibraryRef &Result) const;
1965c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
1975c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  // Get the path to this library, as stored in the object file.
1985c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  error_code getPath(StringRef &Result) const;
1995c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
2005c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  DataRefImpl getRawDataRefImpl() const;
2015c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer};
2025c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyertypedef content_iterator<LibraryRef> library_iterator;
2035c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
20468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// ObjectFile - This class is the base class for all object file types.
20568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// Concrete instances of this object are created by createObjectFile, which
20660f0819cb583799029fa11179576dd7f01d8002aEric Christopher/// figures out which type to create.
20736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass ObjectFile : public SymbolicFile {
2082d24e2a396a1d211baaeedf32148a3b657240170David Blaikie  virtual void anchor();
2099f9ce61972871efcf794bdc6125835c2c32cd863Craig Topper  ObjectFile() LLVM_DELETED_FUNCTION;
2109f9ce61972871efcf794bdc6125835c2c32cd863Craig Topper  ObjectFile(const ObjectFile &other) LLVM_DELETED_FUNCTION;
21168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
21268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerprotected:
21336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ObjectFile(unsigned int Type, MemoryBuffer *Source, bool BufferOwned = true);
21468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
215001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  const uint8_t *base() const {
216001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer    return reinterpret_cast<const uint8_t *>(Data->getBufferStart());
217001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  }
21868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
21968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // These functions are for SymbolRef to call internally. The main goal of
22068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // this is to allow SymbolRef::SymbolPimpl to point directly to the symbol
22168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // entry in the memory mapped object file. SymbolPimpl cannot contain any
22268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // virtual functions because then it could not point into the memory mapped
22368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // file.
22425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  //
22525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  // Implementations assume that the DataRefImpl is valid and has not been
22625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  // modified externally. It's UB otherwise.
22768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  friend class SymbolRef;
22825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const = 0;
22936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  error_code printSymbolName(raw_ostream &OS, DataRefImpl Symb) const override;
2305b957e6fd9853f938b8b33cfeb03d80595a9c2f8Eric Christopher  virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const = 0;
23159a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindola  virtual error_code getSymbolAlignment(DataRefImpl Symb, uint32_t &Res) const;
23225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const = 0;
2332c10ecbe4c800bd8a2e1b3e05c4eedf75658b565Michael J. Spencer  virtual error_code getSymbolType(DataRefImpl Symb,
2342c10ecbe4c800bd8a2e1b3e05c4eedf75658b565Michael J. Spencer                                   SymbolRef::Type &Res) const = 0;
2359b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer  virtual error_code getSymbolSection(DataRefImpl Symb,
2369b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer                                      section_iterator &Res) const = 0;
23768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
23868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  // Same as above for SectionRef.
23968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  friend class SectionRef;
24036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual void moveSectionNext(DataRefImpl &Sec) const = 0;
24125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionName(DataRefImpl Sec, StringRef &Res) const = 0;
24225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionAddress(DataRefImpl Sec, uint64_t &Res) const =0;
24325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const = 0;
24425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code getSectionContents(DataRefImpl Sec, StringRef &Res)const=0;
245e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer  virtual error_code getSectionAlignment(DataRefImpl Sec, uint64_t &Res)const=0;
24625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const = 0;
24713afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer  virtual error_code isSectionData(DataRefImpl Sec, bool &Res) const = 0;
24813afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer  virtual error_code isSectionBSS(DataRefImpl Sec, bool &Res) const = 0;
249c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  virtual error_code isSectionRequiredForExecution(DataRefImpl Sec,
250c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd                                                   bool &Res) const = 0;
251c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  // A section is 'virtual' if its contents aren't present in the object image.
252c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  virtual error_code isSectionVirtual(DataRefImpl Sec, bool &Res) const = 0;
253c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  virtual error_code isSectionZeroInit(DataRefImpl Sec, bool &Res) const = 0;
2545b957e6fd9853f938b8b33cfeb03d80595a9c2f8Eric Christopher  virtual error_code isSectionReadOnlyData(DataRefImpl Sec, bool &Res) const =0;
25507ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer  virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb,
25607ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer                                           bool &Result) const = 0;
25729552222c2e7cbeb37fcd15d247597467f7b8544Rui Ueyama  virtual relocation_iterator section_rel_begin(DataRefImpl Sec) const = 0;
25829552222c2e7cbeb37fcd15d247597467f7b8544Rui Ueyama  virtual relocation_iterator section_rel_end(DataRefImpl Sec) const = 0;
25936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual bool section_rel_empty(DataRefImpl Sec) const = 0;
2607486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola  virtual section_iterator getRelocatedSection(DataRefImpl Sec) const;
26168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
2620fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  // Same as above for RelocationRef.
2630fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  friend class RelocationRef;
26436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual void moveRelocationNext(DataRefImpl &Rel) const = 0;
2650fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  virtual error_code getRelocationAddress(DataRefImpl Rel,
2660fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer                                          uint64_t &Res) const =0;
267b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev  virtual error_code getRelocationOffset(DataRefImpl Rel,
268b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev                                         uint64_t &Res) const =0;
2696c1202c459ffa6d693ad92fa84e43902bc780bcaRafael Espindola  virtual symbol_iterator getRelocationSymbol(DataRefImpl Rel) const = 0;
2700fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  virtual error_code getRelocationType(DataRefImpl Rel,
2719472b8d220fc746498429f430cb4c4dbfbd38f2aOwen Anderson                                       uint64_t &Res) const = 0;
2724344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  virtual error_code getRelocationTypeName(DataRefImpl Rel,
2734344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer                                       SmallVectorImpl<char> &Result) const = 0;
2744344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  virtual error_code getRelocationValueString(DataRefImpl Rel,
2754344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer                                       SmallVectorImpl<char> &Result) const = 0;
2760685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson  virtual error_code getRelocationHidden(DataRefImpl Rel, bool &Result) const {
2770685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson    Result = false;
2780685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson    return object_error::success;
2790685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson  }
2800fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
2815c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  // Same for LibraryRef
2825c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  friend class LibraryRef;
2835c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  virtual error_code getLibraryNext(DataRefImpl Lib, LibraryRef &Res) const = 0;
2845c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  virtual error_code getLibraryPath(DataRefImpl Lib, StringRef &Res) const = 0;
2855c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
28668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerpublic:
28736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  typedef iterator_range<symbol_iterator> symbol_iterator_range;
28836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  symbol_iterator_range symbols() const {
28936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return symbol_iterator_range(symbol_begin(), symbol_end());
29036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
29168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
29236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual section_iterator section_begin() const = 0;
29336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual section_iterator section_end() const = 0;
294dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer
29536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  typedef iterator_range<section_iterator> section_iterator_range;
29636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  section_iterator_range sections() const {
29736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return section_iterator_range(section_begin(), section_end());
29836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
29968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
30036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual library_iterator needed_library_begin() const = 0;
30136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual library_iterator needed_library_end() const = 0;
3025c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
30368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @brief The number of bytes used to represent an address in this object
30468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  ///        file format.
30568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual uint8_t getBytesInAddress() const = 0;
30668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
30768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  virtual StringRef getFileFormatName() const = 0;
30888af6b9217f9ff8b4592f38ac5175de697275f49Michael J. Spencer  virtual /* Triple::ArchType */ unsigned getArch() const = 0;
30968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
31097f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer  /// For shared objects, returns the name which this object should be
31197f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer  /// loaded from at runtime. This corresponds to DT_SONAME on ELF and
31297f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer  /// LC_ID_DYLIB (install name) on MachO.
31397f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer  virtual StringRef getLoadName() const = 0;
31497f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer
31568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @returns Pointer to ObjectFile subclass to handle this type of object.
31668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @param ObjectPath The path to the object file. ObjectPath.isObject must
31768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  ///        return true.
31868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  /// @brief Create ObjectFile from path.
31936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static ErrorOr<ObjectFile *> createObjectFile(StringRef ObjectPath);
32036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static ErrorOr<ObjectFile *> createObjectFile(MemoryBuffer *Object,
32136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                                bool BufferOwned,
32236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                                sys::fs::file_magic Type);
32336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static ErrorOr<ObjectFile *> createObjectFile(MemoryBuffer *Object) {
32436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return createObjectFile(Object, true, sys::fs::file_magic::unknown);
32536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
32636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
32768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
328001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  static inline bool classof(const Binary *v) {
3296f9489a86f33624f9ff5388411d12359ce9cef20David Meyer    return v->isObject();
330001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  }
331001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer
332001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerpublic:
33336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static ErrorOr<ObjectFile *> createCOFFObjectFile(MemoryBuffer *Object,
33436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                                    bool BufferOwned = true);
33536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static ErrorOr<ObjectFile *> createELFObjectFile(MemoryBuffer *Object,
33636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                                   bool BufferOwned = true);
33736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static ErrorOr<ObjectFile *> createMachOObjectFile(MemoryBuffer *Object,
33836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                                     bool BufferOwned = true);
33968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer};
34068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
34168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer// Inline function definitions.
34268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline SymbolRef::SymbolRef(DataRefImpl SymbolP, const ObjectFile *Owner)
34336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    : BasicSymbolRef(SymbolP, Owner) {}
34468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
34525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getName(StringRef &Result) const {
34636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return getObject()->getSymbolName(getRawDataRefImpl(), Result);
34768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
34868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
34925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getAddress(uint64_t &Result) const {
35036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return getObject()->getSymbolAddress(getRawDataRefImpl(), Result);
35168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
35268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
353b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshevinline error_code SymbolRef::getFileOffset(uint64_t &Result) const {
35436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint64_t Address;
35536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (error_code EC = getAddress(Address))
35636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return EC;
35736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (Address == UnknownAddressOrSize) {
35836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Result = UnknownAddressOrSize;
35936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return object_error::success;
36036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
36136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
36236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const ObjectFile *Obj = getObject();
36336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  section_iterator SecI(Obj->section_begin());
36436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (error_code EC = getSection(SecI))
36536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return EC;
36636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
36736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (SecI == Obj->section_end()) {
36836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Result = UnknownAddressOrSize;
36936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return object_error::success;
37036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
37136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
37236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint64_t SectionAddress;
37336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (error_code EC = SecI->getAddress(SectionAddress))
37436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return EC;
37536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
37636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint64_t OffsetInSection = Address - SectionAddress;
37736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
37836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  StringRef SecContents;
37936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (error_code EC = SecI->getContents(SecContents))
38036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return EC;
38136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
38236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // FIXME: this is a hack.
38336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint64_t SectionOffset = (uint64_t)SecContents.data() - (uint64_t)Obj->base();
38436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
38536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Result = SectionOffset + OffsetInSection;
38636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return object_error::success;
387ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer}
388ac241fe9f0d73c6f632e4f7f89e06b698d39da54Benjamin Kramer
38959a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindolainline error_code SymbolRef::getAlignment(uint32_t &Result) const {
39036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return getObject()->getSymbolAlignment(getRawDataRefImpl(), Result);
39159a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindola}
39259a0e79631ed851d98cf9c2ba6fa5f9aafdfdc93Rafael Espindola
39325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SymbolRef::getSize(uint64_t &Result) const {
39436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return getObject()->getSymbolSize(getRawDataRefImpl(), Result);
3959b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer}
3969b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
3979b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencerinline error_code SymbolRef::getSection(section_iterator &Result) const {
39836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return getObject()->getSymbolSection(getRawDataRefImpl(), Result);
3999b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer}
4009b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer
4011130a799ab2fd7042625163a2506518960394884Michael J. Spencerinline error_code SymbolRef::getType(SymbolRef::Type &Result) const {
40236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return getObject()->getSymbolType(getRawDataRefImpl(), Result);
403a41dce3c642e50775352cce49e3a3d0cd004d393Tim Northover}
404a41dce3c642e50775352cce49e3a3d0cd004d393Tim Northover
40536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesinline const ObjectFile *SymbolRef::getObject() const {
40636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const SymbolicFile *O = BasicSymbolRef::getObject();
40736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return cast<ObjectFile>(O);
40815c3f727aeff6a80e3f9e7e6b1284748e5f3322aNick Lewycky}
40915c3f727aeff6a80e3f9e7e6b1284748e5f3322aNick Lewycky
41068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
41168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer/// SectionRef
41268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline SectionRef::SectionRef(DataRefImpl SectionP,
41368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer                              const ObjectFile *Owner)
41468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  : SectionPimpl(SectionP)
41568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  , OwningObject(Owner) {}
41668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
41768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencerinline bool SectionRef::operator==(const SectionRef &Other) const {
41868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer  return SectionPimpl == Other.SectionPimpl;
41968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
42068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
42136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesinline bool SectionRef::operator!=(const SectionRef &Other) const {
42236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return SectionPimpl != Other.SectionPimpl;
42336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
42436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
4255b957e6fd9853f938b8b33cfeb03d80595a9c2f8Eric Christopherinline bool SectionRef::operator<(const SectionRef &Other) const {
4263314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer  return SectionPimpl < Other.SectionPimpl;
4273314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer}
4283314c26475b5561abbfe0785e0a64d189d5b4060Michael J. Spencer
42936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesinline void SectionRef::moveNext() {
43036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return OwningObject->moveSectionNext(SectionPimpl);
43168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
43268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
43325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getName(StringRef &Result) const {
43425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionName(SectionPimpl, Result);
43568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
43668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
43725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getAddress(uint64_t &Result) const {
43825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionAddress(SectionPimpl, Result);
43968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
44068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
44125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getSize(uint64_t &Result) const {
44225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionSize(SectionPimpl, Result);
44368b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
44468b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
44525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::getContents(StringRef &Result) const {
44625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->getSectionContents(SectionPimpl, Result);
44768b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
44868b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
449e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencerinline error_code SectionRef::getAlignment(uint64_t &Result) const {
450e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer  return OwningObject->getSectionAlignment(SectionPimpl, Result);
451e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer}
452e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer
45325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencerinline error_code SectionRef::isText(bool &Result) const {
45425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  return OwningObject->isSectionText(SectionPimpl, Result);
45568b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer}
45668b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
45713afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencerinline error_code SectionRef::isData(bool &Result) const {
45813afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer  return OwningObject->isSectionData(SectionPimpl, Result);
45913afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer}
46013afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer
46113afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencerinline error_code SectionRef::isBSS(bool &Result) const {
46213afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer  return OwningObject->isSectionBSS(SectionPimpl, Result);
46313afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer}
46413afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer
465c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurdinline error_code SectionRef::isRequiredForExecution(bool &Result) const {
466c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  return OwningObject->isSectionRequiredForExecution(SectionPimpl, Result);
467c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd}
468c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd
469c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurdinline error_code SectionRef::isVirtual(bool &Result) const {
470c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  return OwningObject->isSectionVirtual(SectionPimpl, Result);
471c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd}
472c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd
473c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurdinline error_code SectionRef::isZeroInit(bool &Result) const {
474c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  return OwningObject->isSectionZeroInit(SectionPimpl, Result);
475c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd}
476c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd
4773a129c85920404e7ccdb7e655c89fa60a0309cfdAndrew Kaylorinline error_code SectionRef::isReadOnlyData(bool &Result) const {
4783a129c85920404e7ccdb7e655c89fa60a0309cfdAndrew Kaylor  return OwningObject->isSectionReadOnlyData(SectionPimpl, Result);
4793a129c85920404e7ccdb7e655c89fa60a0309cfdAndrew Kaylor}
4803a129c85920404e7ccdb7e655c89fa60a0309cfdAndrew Kaylor
48107ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramerinline error_code SectionRef::containsSymbol(SymbolRef S, bool &Result) const {
48236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return OwningObject->sectionContainsSymbol(SectionPimpl,
48336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                             S.getRawDataRefImpl(), Result);
48407ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer}
48507ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer
48636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesinline relocation_iterator SectionRef::relocation_begin() const {
48729552222c2e7cbeb37fcd15d247597467f7b8544Rui Ueyama  return OwningObject->section_rel_begin(SectionPimpl);
4884344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer}
4894344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
49036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesinline relocation_iterator SectionRef::relocation_end() const {
49129552222c2e7cbeb37fcd15d247597467f7b8544Rui Ueyama  return OwningObject->section_rel_end(SectionPimpl);
4924344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer}
4934344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
49436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesinline bool SectionRef::relocation_empty() const {
49536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return OwningObject->section_rel_empty(SectionPimpl);
49636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
49736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
4987486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindolainline section_iterator SectionRef::getRelocatedSection() const {
4997486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola  return OwningObject->getRelocatedSection(SectionPimpl);
5007486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola}
5017486d92a6c949a193bb75c0ffa0170eeb2fabb80Rafael Espindola
502c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurdinline DataRefImpl SectionRef::getRawDataRefImpl() const {
503c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd  return SectionPimpl;
504c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd}
5050fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
5060fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer/// RelocationRef
5070fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline RelocationRef::RelocationRef(DataRefImpl RelocationP,
5080fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer                              const ObjectFile *Owner)
5090fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  : RelocationPimpl(RelocationP)
5100fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  , OwningObject(Owner) {}
5110fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
5120fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline bool RelocationRef::operator==(const RelocationRef &Other) const {
5130fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  return RelocationPimpl == Other.RelocationPimpl;
5140fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
5150fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
51636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesinline void RelocationRef::moveNext() {
51736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return OwningObject->moveRelocationNext(RelocationPimpl);
5180fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
5190fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
5200fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerinline error_code RelocationRef::getAddress(uint64_t &Result) const {
5210fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  return OwningObject->getRelocationAddress(RelocationPimpl, Result);
5220fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
5230fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
524b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshevinline error_code RelocationRef::getOffset(uint64_t &Result) const {
525b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev  return OwningObject->getRelocationOffset(RelocationPimpl, Result);
526b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev}
527b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev
5286c1202c459ffa6d693ad92fa84e43902bc780bcaRafael Espindolainline symbol_iterator RelocationRef::getSymbol() const {
5296c1202c459ffa6d693ad92fa84e43902bc780bcaRafael Espindola  return OwningObject->getRelocationSymbol(RelocationPimpl);
5300fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
5310fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
5329472b8d220fc746498429f430cb4c4dbfbd38f2aOwen Andersoninline error_code RelocationRef::getType(uint64_t &Result) const {
5330fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer  return OwningObject->getRelocationType(RelocationPimpl, Result);
5340fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}
5350fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer
5364344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerinline error_code RelocationRef::getTypeName(SmallVectorImpl<char> &Result)
5374344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  const {
5384344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  return OwningObject->getRelocationTypeName(RelocationPimpl, Result);
5394344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer}
5404344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
5414344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencerinline error_code RelocationRef::getValueString(SmallVectorImpl<char> &Result)
5424344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  const {
5434344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer  return OwningObject->getRelocationValueString(RelocationPimpl, Result);
5444344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer}
5454344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer
5460685e94895f26f96aa1032696e3150dd00aad1f3Owen Andersoninline error_code RelocationRef::getHidden(bool &Result) const {
5470685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson  return OwningObject->getRelocationHidden(RelocationPimpl, Result);
5480685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson}
5499ac0f1d7255d7941c331b0a62a830a3b033358fdMarshall Clow
5509ac0f1d7255d7941c331b0a62a830a3b033358fdMarshall Clowinline DataRefImpl RelocationRef::getRawDataRefImpl() const {
5519ac0f1d7255d7941c331b0a62a830a3b033358fdMarshall Clow  return RelocationPimpl;
5529ac0f1d7255d7941c331b0a62a830a3b033358fdMarshall Clow}
5539ac0f1d7255d7941c331b0a62a830a3b033358fdMarshall Clow
554167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindolainline const ObjectFile *RelocationRef::getObjectFile() const {
555167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola  return OwningObject;
556167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola}
557167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola
5585c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer// Inline function definitions.
5595c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyerinline LibraryRef::LibraryRef(DataRefImpl LibraryP, const ObjectFile *Owner)
5605c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  : LibraryPimpl(LibraryP)
5615c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  , OwningObject(Owner) {}
5625c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
5635c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyerinline bool LibraryRef::operator==(const LibraryRef &Other) const {
5645c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  return LibraryPimpl == Other.LibraryPimpl;
5655c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer}
5665c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
5675b957e6fd9853f938b8b33cfeb03d80595a9c2f8Eric Christopherinline bool LibraryRef::operator<(const LibraryRef &Other) const {
5685c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  return LibraryPimpl < Other.LibraryPimpl;
5695c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer}
5705c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
5715c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyerinline error_code LibraryRef::getNext(LibraryRef &Result) const {
5725c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  return OwningObject->getLibraryNext(LibraryPimpl, Result);
5735c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer}
5745c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer
5755c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyerinline error_code LibraryRef::getPath(StringRef &Result) const {
5765c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer  return OwningObject->getLibraryPath(LibraryPimpl, Result);
5775c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer}
5780685e94895f26f96aa1032696e3150dd00aad1f3Owen Anderson
57968b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} // end namespace object
58068b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer} // end namespace llvm
58168b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer
58268b3f0c40e29e461dbbc85370078692df4336b42Michael J. Spencer#endif
583