PLT.h revision d0fbbb227051be16931a1aa9b4a7722ac039c698
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_PROCEDURE_LINKAGE_TABLE_H
10#define MCLD_PROCEDURE_LINKAGE_TABLE_H
11#ifdef ENABLE_UNITTEST
12#include <gtest.h>
13#endif
14
15#include <mcld/LD/LDSection.h>
16#include <mcld/LD/SectionData.h>
17#include <mcld/Fragment/TargetFragment.h>
18
19namespace mcld {
20
21class LDSection;
22class ResolveInfo;
23
24/** \class PLTEntryDefaultBase
25 *  \brief PLTEntryDefaultBase provides the default interface for PLE Entry
26 */
27class PLTEntryBase : public TargetFragment
28{
29public:
30  PLTEntryBase(SectionData& pParent)
31    : TargetFragment(Fragment::Target, &pParent), m_pValue(NULL)
32  {}
33
34  virtual ~PLTEntryBase()
35  {
36    delete m_pValue;
37  }
38
39  void setValue(unsigned char* pValue)
40  { m_pValue = pValue; }
41
42  const unsigned char* getValue() const
43  { return m_pValue; }
44
45  //Used by llvm::cast<>.
46  static bool classof(const Fragment *O)
47  { return true; }
48
49protected:
50  unsigned char* m_pValue;
51};
52
53/** \class PLT
54 *  \brief Procedure linkage table
55 */
56class PLT
57{
58public:
59  typedef SectionData::iterator iterator;
60  typedef SectionData::const_iterator const_iterator;
61
62  template<size_t SIZE, typename EntryBase = PLTEntryBase>
63  class Entry : public EntryBase
64  {
65  public:
66    enum { EntrySize = SIZE };
67
68  public:
69    Entry(SectionData& pParent)
70      : EntryBase(pParent)
71    {}
72
73    virtual ~Entry() {}
74
75    size_t size() const
76    { return EntrySize; }
77  };
78
79public:
80  PLT(LDSection& pSection);
81
82  virtual ~PLT();
83
84  /// reserveEntry - reseve the number of pNum of empty entries
85  /// The empty entris are reserved for layout to adjust the fragment offset.
86  virtual void reserveEntry(size_t pNum = 1) = 0;
87
88  // finalizeSectionSize - set LDSection size
89  virtual void finalizeSectionSize() = 0;
90
91  uint64_t addr() const { return m_Section.addr(); }
92
93  const_iterator begin() const { return m_SectionData->begin(); }
94  iterator       begin()       { return m_SectionData->begin(); }
95  const_iterator end  () const { return m_SectionData->end();   }
96  iterator       end  ()       { return m_SectionData->end();   }
97
98protected:
99  LDSection& m_Section;
100  SectionData* m_SectionData;
101};
102
103} // namespace of mcld
104
105#endif
106
107