//===- PLT.h --------------------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef MCLD_PROCEDURE_LINKAGE_TABLE_H #define MCLD_PROCEDURE_LINKAGE_TABLE_H #ifdef ENABLE_UNITTEST #include <gtest.h> #endif #include <llvm/ADT/ilist.h> #include <mcld/LD/LDSection.h> #include <mcld/LD/TargetFragment.h> namespace mcld { class SectionData; class ResolveInfo; /** \class PLTEntry */ class PLTEntry : public TargetFragment { public: PLTEntry(size_t pSize, SectionData* pParent); virtual ~PLTEntry(); size_t getEntrySize() const { return m_EntrySize; } void setContent(unsigned char* pContent) { m_pContent = pContent; } const unsigned char* getContent() const { return m_pContent; } //Used by llvm::cast<>. static bool classof(const Fragment *O) { return true; } size_t getSize() const { return m_EntrySize; } protected: size_t m_EntrySize; unsigned char* m_pContent; }; /** \class PLT * \brief Procedure linkage table */ class PLT { public: PLT(LDSection& pSection, SectionData& pSectionData); virtual ~PLT(); const LDSection& getSection() const { return m_Section; } const SectionData& getSectionData() const { return m_SectionData; } public: /// reserveEntry - reseve the number of pNum of empty entries /// The empty entris are reserved for layout to adjust the fragment offset. virtual void reserveEntry(size_t pNum = 1) = 0; /// getPLTEntry - get an empty entry or an exitsted filled entry with pSymbol. /// @param pSymbol - the target symbol /// @param pExist - ture if the a filled entry with pSymbol existed, otherwise false. virtual PLTEntry* getPLTEntry(const ResolveInfo& pSymbol, bool& pExist) = 0; protected: LDSection& m_Section; SectionData& m_SectionData; }; } // namespace of mcld #endif