1//===- PLT.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_TARGET_PLT_H_ 10#define MCLD_TARGET_PLT_H_ 11 12#include "mcld/Fragment/TargetFragment.h" 13#include "mcld/LD/LDSection.h" 14#include "mcld/LD/SectionData.h" 15 16namespace mcld { 17 18class LDSection; 19class ResolveInfo; 20 21/** \class PLTEntryDefaultBase 22 * \brief PLTEntryDefaultBase provides the default interface for PLT Entry 23 */ 24class PLTEntryBase : public TargetFragment { 25 public: 26 explicit PLTEntryBase(SectionData& pParent) 27 : TargetFragment(Fragment::Target, &pParent), m_pValue(NULL) {} 28 29 virtual ~PLTEntryBase() { free(m_pValue); } 30 31 void setValue(unsigned char* pValue) { m_pValue = pValue; } 32 33 const unsigned char* getValue() const { return m_pValue; } 34 35 // Used by llvm::cast<>. 36 static bool classof(const Fragment* O) { return true; } 37 38 protected: 39 unsigned char* m_pValue; 40}; 41 42/** \class PLT 43 * \brief Procedure linkage table 44 */ 45class PLT { 46 public: 47 typedef SectionData::iterator iterator; 48 typedef SectionData::const_iterator const_iterator; 49 50 template <size_t SIZE, typename EntryBase = PLTEntryBase> 51 class Entry : public EntryBase { 52 public: 53 enum { EntrySize = SIZE }; 54 55 public: 56 explicit Entry(SectionData& pParent) : EntryBase(pParent) {} 57 58 virtual ~Entry() {} 59 60 size_t size() const { return EntrySize; } 61 }; 62 63 public: 64 explicit PLT(LDSection& pSection); 65 66 virtual ~PLT(); 67 68 // finalizeSectionSize - set LDSection size 69 virtual void finalizeSectionSize() = 0; 70 71 uint64_t addr() const { return m_Section.addr(); } 72 73 const_iterator begin() const { return m_pSectionData->begin(); } 74 iterator begin() { return m_pSectionData->begin(); } 75 const_iterator end() const { return m_pSectionData->end(); } 76 iterator end() { return m_pSectionData->end(); } 77 78 protected: 79 LDSection& m_Section; 80 SectionData* m_pSectionData; 81}; 82 83} // namespace mcld 84 85#endif // MCLD_TARGET_PLT_H_ 86