1//===- ARMPLT.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_ARM_PLT_H
10#define MCLD_ARM_PLT_H
11
12#include <mcld/Target/GOT.h>
13#include <mcld/Target/PLT.h>
14
15namespace {
16
17const uint32_t arm_plt0[] = {
18  0xe52de004, // str   lr, [sp, #-4]!
19  0xe59fe004, // ldr   lr, [pc, #4]
20  0xe08fe00e, // add   lr, pc, lr
21  0xe5bef008, // ldr   pc, [lr, #8]!
22  0x00000000, // &GOT[0] - .
23};
24
25const uint32_t arm_plt1[] = {
26  0xe28fc600, // add   ip, pc, #0xNN00000
27  0xe28cca00, // add   ip, ip, #0xNN000
28  0xe5bcf000, // ldr   pc, [ip, #0xNNN]!
29};
30
31} // anonymous namespace
32
33namespace mcld {
34
35class ARMGOT;
36class MemoryRegion;
37
38class ARMPLT0 : public PLT::Entry<sizeof(arm_plt0)>
39{
40public:
41  ARMPLT0(SectionData& pParent);
42};
43
44class ARMPLT1 : public PLT::Entry<sizeof(arm_plt1)>
45{
46public:
47  ARMPLT1(SectionData& pParent);
48};
49
50/** \class ARMPLT
51 *  \brief ARM Procedure Linkage Table
52 */
53class ARMPLT : public PLT
54{
55public:
56  ARMPLT(LDSection& pSection, ARMGOT& pGOTPLT);
57  ~ARMPLT();
58
59  // finalizeSectionSize - set LDSection size
60  void finalizeSectionSize();
61
62  // hasPLT1 - return if this plt section has any plt1 entry
63  bool hasPLT1() const;
64
65  void reserveEntry(size_t pNum = 1) ;
66
67  ARMPLT1* consume();
68
69  ARMPLT0* getPLT0() const;
70
71  void applyPLT0();
72
73  void applyPLT1();
74
75  uint64_t emit(MemoryRegion& pRegion);
76
77private:
78  ARMGOT& m_GOT;
79
80  // Used by getEntry() for mapping a ResolveInfo instance to a PLT1 Entry.
81  iterator m_PLTEntryIterator;
82};
83
84} // namespace of mcld
85
86#endif
87
88