//===- X86GOTPLT.h --------------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef MCLD_X86_GOTPLT_H #define MCLD_X86_GOTPLT_H #ifdef ENABLE_UNITTEST #include <gtest.h> #endif #include <llvm/ADT/DenseMap.h> #include <mcld/Target/GOT.h> #include <mcld/LD/SectionData.h> namespace mcld { class LDSection; const unsigned int X86GOTPLT0Num = 3; /** \class X86GOTPLT * \brief X86 .got.plt section. */ class X86GOTPLT : public GOT { typedef llvm::DenseMap<const ResolveInfo*, GOTEntry*> SymbolIndexMapType; public: typedef SectionData::iterator iterator; typedef SectionData::const_iterator const_iterator; public: X86GOTPLT(LDSection &pSection, SectionData& pSectionData); ~X86GOTPLT(); iterator begin(); const_iterator begin() const; iterator end(); const_iterator end() const; // For GOT0 public: void applyGOT0(uint64_t pAddress); // For GOTPLT public: void reserveEntry(size_t pNum = 1); GOTEntry* getEntry(const ResolveInfo& pSymbol, bool& pExist); void applyAllGOTPLT(uint64_t pPLTBase, unsigned int pPLT0Size, unsigned int pPLT1Size); GOTEntry*& lookupGOTPLTMap(const ResolveInfo& pSymbol); private: iterator m_GOTPLTIterator; SymbolIndexMapType m_GOTPLTMap; }; } // namespace of mcld #endif