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/LD/LDSection.h>
13#include <mcld/LD/SectionData.h>
14#include <mcld/Fragment/TargetFragment.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{
26public:
27  PLTEntryBase(SectionData& pParent)
28    : TargetFragment(Fragment::Target, &pParent), m_pValue(NULL)
29  {}
30
31  virtual ~PLTEntryBase()
32  {
33    free(m_pValue);
34  }
35
36  void setValue(unsigned char* pValue)
37  { m_pValue = pValue; }
38
39  const unsigned char* getValue() const
40  { return m_pValue; }
41
42  //Used by llvm::cast<>.
43  static bool classof(const Fragment *O)
44  { return true; }
45
46protected:
47  unsigned char* m_pValue;
48};
49
50/** \class PLT
51 *  \brief Procedure linkage table
52 */
53class PLT
54{
55public:
56  typedef SectionData::iterator iterator;
57  typedef SectionData::const_iterator const_iterator;
58
59  template<size_t SIZE, typename EntryBase = PLTEntryBase>
60  class Entry : public EntryBase
61  {
62  public:
63    enum { EntrySize = SIZE };
64
65  public:
66    Entry(SectionData& pParent)
67      : EntryBase(pParent)
68    {}
69
70    virtual ~Entry() {}
71
72    size_t size() const
73    { return EntrySize; }
74  };
75
76public:
77  PLT(LDSection& pSection);
78
79  virtual ~PLT();
80
81  // finalizeSectionSize - set LDSection size
82  virtual void finalizeSectionSize() = 0;
83
84  uint64_t addr() const { return m_Section.addr(); }
85
86  const_iterator begin() const { return m_pSectionData->begin(); }
87  iterator       begin()       { return m_pSectionData->begin(); }
88  const_iterator end  () const { return m_pSectionData->end();   }
89  iterator       end  ()       { return m_pSectionData->end();   }
90
91protected:
92  LDSection& m_Section;
93  SectionData* m_pSectionData;
94};
95
96} // namespace of mcld
97
98#endif
99
100