1 //===- GOT.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_GOT_H 10 #define MCLD_GOT_H 11 #ifdef ENABLE_UNITTEST 12 #include <gtest.h> 13 #endif 14 15 #include <mcld/LD/LDSection.h> 16 #include <mcld/MC/MCTargetFragment.h> 17 18 namespace mcld 19 { 20 21 class GOT; 22 class ResolveInfo; 23 24 /** \class GOTEntry 25 * \brief The entry of Global Offset Table 26 */ 27 class GOTEntry : public MCTargetFragment 28 { 29 public: 30 explicit GOTEntry(uint64_t pContent, size_t pEntrySize, 31 llvm::MCSectionData* pParent); 32 33 virtual ~GOTEntry(); 34 getContent()35 uint64_t& getContent() 36 { return f_Content; } 37 getContent()38 uint64_t getContent() const 39 { return f_Content; } 40 setContent(uint64_t pValue)41 void setContent(uint64_t pValue) 42 { f_Content = pValue; } 43 classof(const MCFragment * pFrag)44 static bool classof(const MCFragment *pFrag) 45 { return pFrag->getKind() == llvm::MCFragment::FT_Target; } 46 classof(const GOTEntry * pFrag)47 static bool classof(const GOTEntry* pFrag) 48 { return true; } 49 50 // Override pure virtual function getSize()51 size_t getSize() const 52 { return m_EntrySize; } 53 54 protected: 55 uint64_t f_Content; 56 size_t m_EntrySize; 57 }; 58 59 /** \class GOT 60 * \brief The Global Offset Table 61 */ 62 class GOT 63 { 64 protected: 65 GOT(LDSection& pSection, 66 llvm::MCSectionData& pSectionData, 67 size_t pEntrySize); 68 69 public: 70 virtual ~GOT(); 71 72 /// entrySize - the number of bytes per entry 73 size_t getEntrySize() const; 74 getSection()75 const LDSection& getSection() const 76 { return m_Section; } 77 getSectionData()78 llvm::MCSectionData& getSectionData() 79 { return m_SectionData; } 80 getSectionData()81 const llvm::MCSectionData& getSectionData() const 82 { return m_SectionData; } 83 84 public: 85 /// reserveEntry - reseve number of pNum of empty entries 86 /// Before layout, we scan all relocations to determine if GOT entries are 87 /// needed. If an entry is needed, the empty entry is reserved for layout 88 /// to adjust the fragment offset. After that, we fill up the entries when 89 /// applying relocations. 90 virtual void reserveEntry(size_t pNum = 1) = 0; 91 92 /// getEntry - get an empty entry or an exitsted filled entry with pSymbol. 93 /// @param pSymbol - the target symbol 94 /// @param pExist - ture if a filled entry with pSymbol existed, otherwise false. 95 virtual GOTEntry* getEntry(const ResolveInfo& pSymbol, bool& pExist) = 0; 96 97 protected: 98 LDSection& m_Section; 99 llvm::MCSectionData& m_SectionData; 100 size_t f_EntrySize; 101 }; 102 103 } // namespace of mcld 104 105 #endif 106 107