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