PLT.h revision d0fbbb227051be16931a1aa9b4a7722ac039c698
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//===----------------------------------------------------------------------===// 9cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#ifndef MCLD_PROCEDURE_LINKAGE_TABLE_H 10cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#define MCLD_PROCEDURE_LINKAGE_TABLE_H 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h> 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 15cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/LD/LDSection.h> 1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/SectionData.h> 1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Fragment/TargetFragment.h> 18cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld { 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LDSection; 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass ResolveInfo; 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 24d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao/** \class PLTEntryDefaultBase 25d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao * \brief PLTEntryDefaultBase provides the default interface for PLE Entry 26d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao */ 27d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass PLTEntryBase : public TargetFragment 28d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao{ 29d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaopublic: 30d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao PLTEntryBase(SectionData& pParent) 31d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao : TargetFragment(Fragment::Target, &pParent), m_pValue(NULL) 32d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao {} 33d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 34d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao virtual ~PLTEntryBase() 35d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao { 36d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao delete m_pValue; 37d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao } 38d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 39d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao void setValue(unsigned char* pValue) 40d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao { m_pValue = pValue; } 41d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 42d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao const unsigned char* getValue() const 43d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao { return m_pValue; } 44d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 45d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao //Used by llvm::cast<>. 46d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao static bool classof(const Fragment *O) 47d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao { return true; } 48d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 49d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoprotected: 50d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao unsigned char* m_pValue; 51d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao}; 52d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/** \class PLT 5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao * \brief Procedure linkage table 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass PLT 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef SectionData::iterator iterator; 6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef SectionData::const_iterator const_iterator; 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 62d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao template<size_t SIZE, typename EntryBase = PLTEntryBase> 63d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao class Entry : public EntryBase 6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao { 6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao public: 66d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao enum { EntrySize = SIZE }; 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 68d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao public: 69d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao Entry(SectionData& pParent) 70d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao : EntryBase(pParent) 71d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao {} 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 73d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao virtual ~Entry() {} 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao size_t size() const 76d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao { return EntrySize; } 7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao }; 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic: 8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao PLT(LDSection& pSection); 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao virtual ~PLT(); 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// reserveEntry - reseve the number of pNum of empty entries 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// The empty entris are reserved for layout to adjust the fragment offset. 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao virtual void reserveEntry(size_t pNum = 1) = 0; 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // finalizeSectionSize - set LDSection size 8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao virtual void finalizeSectionSize() = 0; 9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao uint64_t addr() const { return m_Section.addr(); } 9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const_iterator begin() const { return m_SectionData->begin(); } 9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao iterator begin() { return m_SectionData->begin(); } 9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const_iterator end () const { return m_SectionData->end(); } 9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao iterator end () { return m_SectionData->end(); } 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprotected: 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LDSection& m_Section; 10022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SectionData* m_SectionData; 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 107