15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- PLT.h --------------------------------------------------------------===// 25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// The MCLinker Project 45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source 65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details. 75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_TARGET_PLT_H_ 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_TARGET_PLT_H_ 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Fragment/TargetFragment.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDSection.h" 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/SectionData.h" 15cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld { 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LDSection; 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass ResolveInfo; 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 21d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao/** \class PLTEntryDefaultBase 2287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief PLTEntryDefaultBase provides the default interface for PLT Entry 23d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao */ 2437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass PLTEntryBase : public TargetFragment { 2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines explicit PLTEntryBase(SectionData& pParent) 2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines : TargetFragment(Fragment::Target, &pParent), m_pValue(NULL) {} 28d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines virtual ~PLTEntryBase() { free(m_pValue); } 30d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setValue(unsigned char* pValue) { m_pValue = pValue; } 32d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 3337b74a387bb3993387029859c2d9d051c41c724eStephen Hines const unsigned char* getValue() const { return m_pValue; } 34d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines // Used by llvm::cast<>. 3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines static bool classof(const Fragment* O) { return true; } 37d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines protected: 39d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao unsigned char* m_pValue; 40d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao}; 41d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/** \class PLT 4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao * \brief Procedure linkage table 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 4537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass PLT { 4637b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef SectionData::iterator iterator; 4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef SectionData::const_iterator const_iterator; 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 5037b74a387bb3993387029859c2d9d051c41c724eStephen Hines template <size_t SIZE, typename EntryBase = PLTEntryBase> 5137b74a387bb3993387029859c2d9d051c41c724eStephen Hines class Entry : public EntryBase { 5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 53d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao enum { EntrySize = SIZE }; 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines explicit Entry(SectionData& pParent) : EntryBase(pParent) {} 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 58d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao virtual ~Entry() {} 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines size_t size() const { return EntrySize; } 6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao }; 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 6337b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines explicit PLT(LDSection& pSection); 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao virtual ~PLT(); 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // finalizeSectionSize - set LDSection size 6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao virtual void finalizeSectionSize() = 0; 7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao uint64_t addr() const { return m_Section.addr(); } 7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 73551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines const_iterator begin() const { return m_pSectionData->begin(); } 7437b74a387bb3993387029859c2d9d051c41c724eStephen Hines iterator begin() { return m_pSectionData->begin(); } 7537b74a387bb3993387029859c2d9d051c41c724eStephen Hines const_iterator end() const { return m_pSectionData->end(); } 7637b74a387bb3993387029859c2d9d051c41c724eStephen Hines iterator end() { return m_pSectionData->end(); } 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 7837b74a387bb3993387029859c2d9d051c41c724eStephen Hines protected: 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LDSection& m_Section; 80551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines SectionData* m_pSectionData; 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 8337b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 8537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif // MCLD_TARGET_PLT_H_ 86