16f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===- HexagonPLT.h -------------------------------------------------------===//
26f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
36f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//                     The MCLinker Project
46f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
56f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// This file is distributed under the University of Illinois Open Source
66f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// License. See LICENSE.TXT for details.
76f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
86f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef TARGET_HEXAGON_HEXAGONPLT_H_
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define TARGET_HEXAGON_HEXAGONPLT_H_
116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include "HexagonGOT.h"
13f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include "HexagonGOTPLT.h"
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Target/GOT.h"
1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Target/PLT.h"
1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/MemoryRegion.h"
176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
18f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesconst uint8_t hexagon_plt0[] = {
1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    0x00, 0x40, 0x00, 0x00,  // { immext (#0)
2037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    0x1c, 0xc0, 0x49, 0x6a,  //   r28 = add (pc, ##GOT0@PCREL) } # address of GOT0   // NOLINT
2137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    0x0e, 0x42, 0x9c, 0xe2,  // { r14 -= add (r28, #16)   # offset of GOTn from GOTa // NOLINT
2237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    0x4f, 0x40, 0x9c, 0x91,  //   r15 = memw (r28 + #8)   # object ID at GOT2
2337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    0x3c, 0xc0, 0x9c, 0x91,  //   r28 = memw (r28 + #4) } # dynamic link at GOT1
2437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    0x0e, 0x42, 0x0e, 0x8c,  // { r14 = asr (r14, #2)     # index of PLTn
2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    0x00, 0xc0, 0x9c, 0x52,  //   jumpr r28 }             # call dynamic linker
2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    0x00, 0x00, 0x00, 0x00,
2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    0x00, 0x00, 0x00, 0x00,
2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    0x00, 0x00, 0x00, 0x00,
2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    0x00, 0x00, 0x00, 0x00,
3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    0x00, 0x00, 0x00, 0x00
316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines};
326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
33f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesconst uint8_t hexagon_plt1[] = {
3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    0x00, 0x40, 0x00, 0x00,  // { immext (#0)
3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    0x0e, 0xc0, 0x49, 0x6a,  //   r14 = add (pc, ##GOTn@PCREL) } # address of GOTn  // NOLINT
3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    0x1c, 0xc0, 0x8e, 0x91,  // r28 = memw (r14)                 # contents of GOTn // NOLINT
3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    0x00, 0xc0, 0x9c, 0x52   // jumpr r28                        # call it
386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines};
396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesnamespace mcld {
416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass GOTEntry;
43f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesclass HexagonPLT1;
4437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass LinkerConfig;
456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// HexagonPLT Entry
486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
4937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass HexagonPLT0 : public PLT::Entry<sizeof(hexagon_plt0)> {
5037b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
51f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  HexagonPLT0(SectionData& pParent);
526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines};
536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// HexagonPLT
566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/** \class HexagonPLT
586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines *  \brief Hexagon Procedure Linkage Table
596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines */
6037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass HexagonPLT : public PLT {
6137b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  HexagonPLT(LDSection& pSection,
63f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines             HexagonGOTPLT& pGOTPLT,
646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines             const LinkerConfig& pConfig);
656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ~HexagonPLT();
666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  // finalizeSectionSize - set LDSection size
686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void finalizeSectionSize();
696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
70f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  // hasPLT1 - return if this PLT has any PLT1 entry
71f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  bool hasPLT1() const;
72f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
7387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  HexagonPLT1* create();
74f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
75f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  void applyPLT0();
76f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
77f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  void applyPLT1();
78f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
79f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  uint64_t emit(MemoryRegion& pRegion);
80f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  PLTEntryBase* getPLT0() const;
826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
8337b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
84f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  HexagonGOTPLT& m_GOTPLT;
856f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
8637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const uint8_t* m_PLT0;
876f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  unsigned int m_PLT0Size;
886f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines};
896f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
9037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass HexagonPLT1 : public PLT::Entry<sizeof(hexagon_plt1)> {
9137b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
92f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  HexagonPLT1(SectionData& pParent);
93f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines};
94f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
9537b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
9737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif  // TARGET_HEXAGON_HEXAGONPLT_H_
98