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//===----------------------------------------------------------------------===//
9551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#ifndef TARGET_HEXAGON_HEXAGONPLT_H
10551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#define TARGET_HEXAGON_HEXAGONPLT_H
116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include "HexagonGOT.h"
13f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include "HexagonGOTPLT.h"
14f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <mcld/Target/GOT.h>
156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Target/PLT.h>
1687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Support/MemoryRegion.h>
176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesnamespace {
196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
20f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesconst uint8_t hexagon_plt0[] = {
21f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 0x00, 0x40, 0x00, 0x00,  // { immext (#0)
22f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 0x1c, 0xc0, 0x49, 0x6a,  //   r28 = add (pc, ##GOT0@PCREL) } # address of GOT0
23f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 0x0e, 0x42, 0x9c, 0xe2,  // { r14 -= add (r28, #16)  # offset of GOTn from GOTa
24f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 0x4f, 0x40, 0x9c, 0x91,  //   r15 = memw (r28 + #8)  # object ID at GOT2
25f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 0x3c, 0xc0, 0x9c, 0x91,  //   r28 = memw (r28 + #4) }# dynamic link at GOT1
26f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 0x0e, 0x42, 0x0e, 0x8c,  // { r14 = asr (r14, #2)    # index of PLTn
27f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 0x00, 0xc0, 0x9c, 0x52,  //   jumpr r28 }            # call dynamic linker
28f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 0x00, 0x00, 0x00, 0x00,
29f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 0x00, 0x00, 0x00, 0x00,
30f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 0x00, 0x00, 0x00, 0x00,
31f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 0x00, 0x00, 0x00, 0x00,
32551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 0x00, 0x00, 0x00, 0x00
336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines};
346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
35f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesconst uint8_t hexagon_plt1[] = {
36f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  0x00, 0x40, 0x00, 0x00, // { immext (#0)
37f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  0x0e, 0xc0, 0x49, 0x6a, //   r14 = add (pc, ##GOTn@PCREL) } # address of GOTn
38f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  0x1c, 0xc0, 0x8e, 0x91, // r28 = memw (r14)                 # contents of GOTn
39551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  0x00, 0xc0, 0x9c, 0x52  // jumpr r28                        # call it
406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines};
416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} // anonymous namespace
436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesnamespace mcld {
456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass GOTEntry;
476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass LinkerConfig;
48f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesclass HexagonPLT1;
496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// HexagonPLT Entry
526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
53f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesclass HexagonPLT0 : public PLT::Entry<sizeof(hexagon_plt0)>
546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{
556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic:
56f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  HexagonPLT0(SectionData& pParent);
576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines};
586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// HexagonPLT
616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/** \class HexagonPLT
636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines *  \brief Hexagon Procedure Linkage Table
646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines */
656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass HexagonPLT : public PLT
666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{
676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic:
686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  HexagonPLT(LDSection& pSection,
69f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines             HexagonGOTPLT& pGOTPLT,
706f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines             const LinkerConfig& pConfig);
716f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ~HexagonPLT();
726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  // finalizeSectionSize - set LDSection size
746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void finalizeSectionSize();
756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
76f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  // hasPLT1 - return if this PLT has any PLT1 entry
77f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  bool hasPLT1() const;
78f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
7987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  HexagonPLT1* create();
80f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
81f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  void applyPLT0();
82f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
83f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  void applyPLT1();
84f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
85f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  uint64_t emit(MemoryRegion& pRegion);
86f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
876f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  PLTEntryBase* getPLT0() const;
886f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
896f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate:
90f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  HexagonGOTPLT& m_GOTPLT;
916f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
926f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const uint8_t *m_PLT0;
936f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  unsigned int m_PLT0Size;
946f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
956f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const LinkerConfig& m_Config;
966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines};
976f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
98f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesclass HexagonPLT1 : public PLT::Entry<sizeof(hexagon_plt1)>
99f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{
100f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinespublic:
101f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  HexagonPLT1(SectionData& pParent);
102f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines};
103f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
1046f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} // namespace of mcld
1056f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1066f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#endif
1076f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
108