| //===- X86GOT.h -----------------------------------------------------------===// |
| // |
| // The MCLinker Project |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| #ifndef MCLD_X86_GOT_H |
| #define MCLD_X86_GOT_H |
| #ifdef ENABLE_UNITTEST |
| #include <gtest.h> |
| #endif |
| |
| #include "X86PLT.h" |
| #include <mcld/Target/GOT.h> |
| |
| namespace mcld |
| { |
| class LDSection; |
| |
| /** \class X86GOT |
| * \brief X86 Global Offset Table. |
| */ |
| |
| const unsigned int X86GOT0Num = 3; |
| |
| class X86GOT : public GOT |
| { |
| friend void mcld::X86PLT::reserveEntry(size_t pNum); |
| |
| friend mcld::PLTEntry* mcld::X86PLT::getPLTEntry( |
| const mcld::ResolveInfo& pSymbol,bool& pExist); |
| |
| friend mcld::GOTEntry* mcld::X86PLT::getGOTPLTEntry( |
| const mcld::ResolveInfo& pSymbol,bool& pExist); |
| |
| typedef llvm::DenseMap<const ResolveInfo*, GOTEntry*> SymbolIndexMapType; |
| |
| public: |
| typedef llvm::MCSectionData::iterator iterator; |
| typedef llvm::MCSectionData::const_iterator const_iterator; |
| |
| public: |
| X86GOT(LDSection& pSection, llvm::MCSectionData& pSectionData); |
| |
| ~X86GOT(); |
| |
| //Reserve general GOT entries. |
| void reserveEntry(size_t pNum = 1); |
| |
| GOTEntry* getEntry(const ResolveInfo& pSymbol, bool& pExist); |
| |
| void applyGOT0(uint64_t pAddress); |
| |
| iterator begin(); |
| |
| const_iterator begin() const; |
| |
| iterator end(); |
| |
| const_iterator end() const; |
| |
| unsigned int getGOTPLTNum() const; |
| |
| iterator getLastGOT0(); |
| |
| const iterator getLastGOT0() const; |
| |
| private: |
| |
| unsigned int m_GeneralGOTNum; |
| unsigned int m_GOTPLTNum; |
| |
| // Used by getGeneralGOTEntry() |
| iterator m_GeneralGOTIterator; |
| |
| // Used by getGOTPLTEntry() |
| iterator m_GOTPLTIterator; |
| |
| // The last GOT0 entry |
| iterator m_LastGOT0; |
| |
| SymbolIndexMapType m_GOTPLTMap; |
| SymbolIndexMapType m_GeneralGOTMap; |
| }; |
| |
| } // namespace of mcld |
| |
| #endif |