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