1 //===- MipsGOT.h ----------------------------------------------------------===// 2 // 3 // The MCLinker Project 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 #ifndef MCLD_MIPS_GOT_H 10 #define MCLD_MIPS_GOT_H 11 #ifdef ENABLE_UNITTEST 12 #include <gtest.h> 13 #endif 14 15 #include <llvm/ADT/DenseMap.h> 16 17 #include <mcld/Target/GOT.h> 18 19 namespace mcld 20 { 21 class LDSection; 22 class MemoryRegion; 23 24 /** \class MipsGOTEntry 25 * \brief GOT Entry with size of 4 bytes 26 */ 27 class MipsGOTEntry : public GOT::Entry<4> 28 { 29 public: 30 MipsGOTEntry(uint64_t pContent, SectionData* pParent) 31 : GOT::Entry<4>(pContent, pParent) 32 {} 33 }; 34 35 /** \class MipsGOT 36 * \brief Mips Global Offset Table. 37 */ 38 class MipsGOT : public GOT 39 { 40 public: 41 MipsGOT(LDSection& pSection); 42 43 uint64_t emit(MemoryRegion& pRegion); 44 45 void reserve(size_t pNum = 1); 46 void reserveLocalEntry(); 47 void reserveGlobalEntry(); 48 49 size_t getTotalNum() const; 50 size_t getLocalNum() const; 51 52 MipsGOTEntry* consume(); 53 MipsGOTEntry* consumeLocal(); 54 MipsGOTEntry* consumeGlobal(); 55 56 void setLocal(const ResolveInfo* pInfo) { 57 m_GOTTypeMap[pInfo] = false; 58 } 59 60 void setGlobal(const ResolveInfo* pInfo) { 61 m_GOTTypeMap[pInfo] = true; 62 } 63 64 bool isLocal(const ResolveInfo* pInfo) { 65 return m_GOTTypeMap[pInfo] == false; 66 } 67 68 bool isGlobal(const ResolveInfo* pInfo) { 69 return m_GOTTypeMap[pInfo] == true; 70 } 71 72 /// hasGOT1 - return if this got section has any GOT1 entry 73 bool hasGOT1() const; 74 75 private: 76 typedef llvm::DenseMap<const ResolveInfo*, bool> SymbolTypeMapType; 77 78 private: 79 SymbolTypeMapType m_GOTTypeMap; 80 81 iterator m_LocalGOTIterator; // last local GOT entries 82 iterator m_GlobalGOTIterator; // last global GOT entries 83 size_t m_pLocalNum; 84 85 MipsGOTEntry* m_pLast; ///< the last consumed entry 86 }; 87 88 } // namespace of mcld 89 90 #endif 91 92