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 PROCEDURE_LINKAGE_TABLE_H
10#define PROCEDURE_LINKAGE_TABLE_H
11#ifdef ENABLE_UNITTEST
12#include <gtest.h>
13#endif
14
15#include <mcld/LD/LDSection.h>
16#include <mcld/MC/MCTargetFragment.h>
17#include <llvm/ADT/ilist.h>
18
19namespace mcld
20{
21
22class ResolveInfo;
23
24/** \class PLTEntry
25 */
26class PLTEntry : public MCTargetFragment
27{
28public:
29  PLTEntry(size_t pSize, llvm::MCSectionData* pParent);
30  virtual ~PLTEntry();
31
32  size_t getEntrySize() const
33  { return m_EntrySize; }
34
35  void setContent(unsigned char* pContent)
36  { m_pContent = pContent; }
37
38  const unsigned char* getContent() const
39  { return m_pContent; }
40
41  //Used by llvm::cast<>.
42  static bool classof(const MCFragment *O)
43  { return true; }
44
45  size_t getSize() const
46  { return m_EntrySize; }
47
48protected:
49  size_t m_EntrySize;
50  unsigned char* m_pContent;
51};
52
53/** \class PLT
54 *  \brief Procedure linkage table
55 */
56class PLT
57{
58public:
59  PLT(LDSection& pSection, llvm::MCSectionData& pSectionData);
60  virtual ~PLT();
61
62  const LDSection& getSection() const
63  { return m_Section; }
64
65  const llvm::MCSectionData& getSectionData() const
66  { return m_SectionData; }
67
68public:
69  /// reserveEntry - reseve the number of pNum of empty entries
70  /// The empty entris are reserved for layout to adjust the fragment offset.
71  virtual void reserveEntry(size_t pNum = 1) = 0;
72
73  /// getPLTEntry - get an empty entry or an exitsted filled entry with pSymbol.
74  /// @param pSymbol - the target symbol
75  /// @param pExist - ture if the a filled entry with pSymbol existed, otherwise false.
76  virtual PLTEntry* getPLTEntry(const ResolveInfo& pSymbol, bool& pExist) = 0;
77
78protected:
79  LDSection& m_Section;
80  llvm::MCSectionData& m_SectionData;
81};
82
83} // namespace of mcld
84
85#endif
86
87