15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- MipsGOT.h ----------------------------------------------------------===// 25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// The MCLinker Project 45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source 65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details. 75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef TARGET_MIPS_MIPSGOT_H_ 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define TARGET_MIPS_MIPSGOT_H_ 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/ADT/SizeTraits.h" 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Fragment/Relocation.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/MemoryRegion.h" 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Target/GOT.h" 15f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 16cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <llvm/ADT/DenseMap.h> 17f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <llvm/ADT/DenseSet.h> 1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines 1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include <map> 2087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <set> 2137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include <vector> 22cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 2387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesnamespace mcld { 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 25f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesclass Input; 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass LDSection; 27f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesclass LDSymbol; 28f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesclass OutputRelocSection; 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class MipsGOT 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief Mips Global Offset Table. 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 3337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass MipsGOT : public GOT { 3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines explicit MipsGOT(LDSection& pSection); 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// Assign value to the GOT entry. 3887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual void setEntryValue(Fragment* entry, uint64_t pValue) = 0; 3987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// Emit the global offset table. 4187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual uint64_t emit(MemoryRegion& pRegion) = 0; 42f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// Address of _gp_disp symbol. 4487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint64_t getGPDispAddress() const; 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 46f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void initializeScan(const Input& pInput); 47f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void finalizeScan(const Input& pInput); 48f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 4937b74a387bb3993387029859c2d9d051c41c724eStephen Hines bool reserveLocalEntry(ResolveInfo& pInfo, 5037b74a387bb3993387029859c2d9d051c41c724eStephen Hines int reloc, 5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Relocation::DWord pAddend); 52f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines bool reserveGlobalEntry(ResolveInfo& pInfo); 53f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 54f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines size_t getLocalNum() const; ///< number of local symbols in primary GOT 55f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines size_t getGlobalNum() const; ///< total number of global symbols 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 57f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines bool isPrimaryGOTConsumed(); 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Fragment* consumeLocal(); 6087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Fragment* consumeGlobal(); 6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint64_t getGPAddr(const Input& pInput) const; 6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint64_t getGPRelOffset(const Input& pInput, const Fragment& pEntry) const; 64f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void recordGlobalEntry(const ResolveInfo* pInfo, Fragment* pEntry); 6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Fragment* lookupGlobalEntry(const ResolveInfo* pInfo); 67f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void recordLocalEntry(const ResolveInfo* pInfo, 6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Relocation::DWord pAddend, 7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Fragment* pEntry); 7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Fragment* lookupLocalEntry(const ResolveInfo* pInfo, 7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Relocation::DWord pAddend); 73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// hasGOT1 - return if this got section has any GOT1 entry 7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool hasGOT1() const; 7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 77f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines bool hasMultipleGOT() const; 78f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 79551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines /// Create GOT entries and reserve dynrel entries. 80f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void finalizeScanning(OutputRelocSection& pRelDyn); 81f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 82f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// Compare two symbols to define order in the .dynsym. 83f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines bool dynSymOrderCompare(const LDSymbol* pX, const LDSymbol* pY) const; 84f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 8537b74a387bb3993387029859c2d9d051c41c724eStephen Hines protected: 8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// Create GOT entry. 8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual Fragment* createEntry(uint64_t pValue, SectionData* pParent) = 0; 8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// Size of GOT entry. 9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual size_t getEntrySize() const = 0; 9187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// Reserve GOT header entries. 9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual void reserveHeader() = 0; 9487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9537b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 96f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /** \class GOTMultipart 97f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * \brief GOTMultipart counts local and global entries in the GOT. 98f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines */ 9937b74a387bb3993387029859c2d9d051c41c724eStephen Hines struct GOTMultipart { 10037b74a387bb3993387029859c2d9d051c41c724eStephen Hines explicit GOTMultipart(size_t local = 0, size_t global = 0); 101f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 102f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines typedef llvm::DenseSet<const Input*> InputSetType; 103f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 10437b74a387bb3993387029859c2d9d051c41c724eStephen Hines size_t m_LocalNum; ///< number of reserved local entries 10537b74a387bb3993387029859c2d9d051c41c724eStephen Hines size_t m_GlobalNum; ///< number of reserved global entries 106f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 10737b74a387bb3993387029859c2d9d051c41c724eStephen Hines size_t m_ConsumedLocal; ///< consumed local entries 10837b74a387bb3993387029859c2d9d051c41c724eStephen Hines size_t m_ConsumedGlobal; ///< consumed global entries 109f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 11087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Fragment* m_pLastLocal; ///< the last consumed local entry 11187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Fragment* m_pLastGlobal; ///< the last consumed global entry 112f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 113f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines InputSetType m_Inputs; 114f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 115f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines bool isConsumed() const; 116f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 117f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void consumeLocal(); 118f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void consumeGlobal(); 119f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines }; 120f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 12187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /** \class LocalEntry 12287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief LocalEntry local GOT entry descriptor. 12387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 12437b74a387bb3993387029859c2d9d051c41c724eStephen Hines struct LocalEntry { 12587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const ResolveInfo* m_pInfo; 12637b74a387bb3993387029859c2d9d051c41c724eStephen Hines Relocation::DWord m_Addend; 12737b74a387bb3993387029859c2d9d051c41c724eStephen Hines bool m_IsGot16; 12887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 12987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LocalEntry(const ResolveInfo* pInfo, 13037b74a387bb3993387029859c2d9d051c41c724eStephen Hines Relocation::DWord addend, 13137b74a387bb3993387029859c2d9d051c41c724eStephen Hines bool isGot16); 13287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 13337b74a387bb3993387029859c2d9d051c41c724eStephen Hines bool operator<(const LocalEntry& O) const; 13487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines }; 13587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 136f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines typedef std::vector<GOTMultipart> MultipartListType; 137f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 13887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // Set of global symbols. 139f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines typedef llvm::DenseSet<const ResolveInfo*> SymbolSetType; 14087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // Map of symbols. If value is true, the symbol is referenced 14187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // in the current input only. If value is false, the symbol 14287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // is referenced in the other modules merged to the current GOT. 143f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines typedef llvm::DenseMap<const ResolveInfo*, bool> SymbolUniqueMapType; 144f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 14587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // Set of local symbols. 14687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::set<LocalEntry> LocalSymbolSetType; 14787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 148f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines MultipartListType m_MultipartList; ///< list of GOT's descriptors 149f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const Input* m_pInput; ///< current input 15087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 15187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // Global symbols merged to the current GOT 15287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // except symbols from the current input. 15387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SymbolSetType m_MergedGlobalSymbols; 15487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // Global symbols from the current input. 15587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SymbolUniqueMapType m_InputGlobalSymbols; 15687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // Local symbols merged to the current GOT 15787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // except symbols from the current input. 15887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LocalSymbolSetType m_MergedLocalSymbols; 15987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // Local symbols from the current input. 16087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LocalSymbolSetType m_InputLocalSymbols; 161f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 162f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines size_t m_CurrentGOTPart; 163f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 164f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines typedef llvm::DenseMap<const LDSymbol*, unsigned> SymbolOrderMapType; 165f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SymbolOrderMapType m_SymbolOrderMap; 166f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 167f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void initGOTList(); 16887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 169f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void changeInput(); 170f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines bool isGOTFull() const; 171f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void split(); 172f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void reserve(size_t pNum); 17322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 17437b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 17537b74a387bb3993387029859c2d9d051c41c724eStephen Hines struct GotEntryKey { 176f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines size_t m_GOTPage; 177f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const ResolveInfo* m_pInfo; 17887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Relocation::DWord m_Addend; 179f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 18037b74a387bb3993387029859c2d9d051c41c724eStephen Hines bool operator<(const GotEntryKey& key) const { 18187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (m_GOTPage != key.m_GOTPage) 182f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return m_GOTPage < key.m_GOTPage; 18387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 18487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (m_pInfo != key.m_pInfo) 18587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return m_pInfo < key.m_pInfo; 18687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 18787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return m_Addend < key.m_Addend; 188f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 189f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines }; 190f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 19187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::map<GotEntryKey, Fragment*> GotEntryMapType; 19287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines GotEntryMapType m_GotLocalEntriesMap; 19387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines GotEntryMapType m_GotGlobalEntriesMap; 19487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}; 19587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 19687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class Mips32GOT 19787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief Mips 32-bit Global Offset Table. 19887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 19937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass Mips32GOT : public MipsGOT { 20037b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 20137b74a387bb3993387029859c2d9d051c41c724eStephen Hines explicit Mips32GOT(LDSection& pSection); 20287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 20337b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 20487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef GOT::Entry<4> Mips32GOTEntry; 20587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 20687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // MipsGOT 20787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual void setEntryValue(Fragment* entry, uint64_t pValue); 20887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual uint64_t emit(MemoryRegion& pRegion); 20987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual Fragment* createEntry(uint64_t pValue, SectionData* pParent); 21087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual size_t getEntrySize() const; 21187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual void reserveHeader(); 21287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}; 21387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 21487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class Mips64GOT 21587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief Mips 64-bit Global Offset Table. 21687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 21737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass Mips64GOT : public MipsGOT { 21837b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 21937b74a387bb3993387029859c2d9d051c41c724eStephen Hines explicit Mips64GOT(LDSection& pSection); 22087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 22137b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 22287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef GOT::Entry<8> Mips64GOTEntry; 22387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 22487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // MipsGOT 22587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual void setEntryValue(Fragment* entry, uint64_t pValue); 22687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual uint64_t emit(MemoryRegion& pRegion); 22787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual Fragment* createEntry(uint64_t pValue, SectionData* pParent); 22887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual size_t getEntrySize() const; 22987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual void reserveHeader(); 2305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 2315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 23237b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 233affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 23437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif // TARGET_MIPS_MIPSGOT_H_ 235