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