1 //===- HexagonPLT.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 TARGET_HEXAGON_HEXAGONPLT_H_ 10 #define TARGET_HEXAGON_HEXAGONPLT_H_ 11 12 #include "HexagonGOT.h" 13 #include "HexagonGOTPLT.h" 14 #include "mcld/Target/GOT.h" 15 #include "mcld/Target/PLT.h" 16 #include "mcld/Support/MemoryRegion.h" 17 18 const uint8_t hexagon_plt0[] = { 19 0x00, 0x40, 0x00, 0x00, // { immext (#0) 20 0x1c, 0xc0, 0x49, 0x6a, // r28 = add (pc, ##GOT0@PCREL) } # address of GOT0 // NOLINT 21 0x0e, 0x42, 0x9c, 0xe2, // { r14 -= add (r28, #16) # offset of GOTn from GOTa // NOLINT 22 0x4f, 0x40, 0x9c, 0x91, // r15 = memw (r28 + #8) # object ID at GOT2 23 0x3c, 0xc0, 0x9c, 0x91, // r28 = memw (r28 + #4) } # dynamic link at GOT1 24 0x0e, 0x42, 0x0e, 0x8c, // { r14 = asr (r14, #2) # index of PLTn 25 0x00, 0xc0, 0x9c, 0x52, // jumpr r28 } # call dynamic linker 26 0x00, 0x00, 0x00, 0x00, 27 0x00, 0x00, 0x00, 0x00, 28 0x00, 0x00, 0x00, 0x00, 29 0x00, 0x00, 0x00, 0x00, 30 0x00, 0x00, 0x00, 0x00 31 }; 32 33 const uint8_t hexagon_plt1[] = { 34 0x00, 0x40, 0x00, 0x00, // { immext (#0) 35 0x0e, 0xc0, 0x49, 0x6a, // r14 = add (pc, ##GOTn@PCREL) } # address of GOTn // NOLINT 36 0x1c, 0xc0, 0x8e, 0x91, // r28 = memw (r14) # contents of GOTn // NOLINT 37 0x00, 0xc0, 0x9c, 0x52 // jumpr r28 # call it 38 }; 39 40 namespace mcld { 41 42 class GOTEntry; 43 class HexagonPLT1; 44 class LinkerConfig; 45 46 //===----------------------------------------------------------------------===// 47 // HexagonPLT Entry 48 //===----------------------------------------------------------------------===// 49 class HexagonPLT0 : public PLT::Entry<sizeof(hexagon_plt0)> { 50 public: 51 HexagonPLT0(SectionData& pParent); 52 }; 53 54 //===----------------------------------------------------------------------===// 55 // HexagonPLT 56 //===----------------------------------------------------------------------===// 57 /** \class HexagonPLT 58 * \brief Hexagon Procedure Linkage Table 59 */ 60 class HexagonPLT : public PLT { 61 public: 62 HexagonPLT(LDSection& pSection, 63 HexagonGOTPLT& pGOTPLT, 64 const LinkerConfig& pConfig); 65 ~HexagonPLT(); 66 67 // finalizeSectionSize - set LDSection size 68 void finalizeSectionSize(); 69 70 // hasPLT1 - return if this PLT has any PLT1 entry 71 bool hasPLT1() const; 72 73 HexagonPLT1* create(); 74 75 void applyPLT0(); 76 77 void applyPLT1(); 78 79 uint64_t emit(MemoryRegion& pRegion); 80 81 PLTEntryBase* getPLT0() const; 82 83 private: 84 HexagonGOTPLT& m_GOTPLT; 85 86 const uint8_t* m_PLT0; 87 unsigned int m_PLT0Size; 88 }; 89 90 class HexagonPLT1 : public PLT::Entry<sizeof(hexagon_plt1)> { 91 public: 92 HexagonPLT1(SectionData& pParent); 93 }; 94 95 } // namespace mcld 96 97 #endif // TARGET_HEXAGON_HEXAGONPLT_H_ 98