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