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