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