15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- ARMPLT.h -----------------------------------------------------===// 25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// The MCLinker Project 45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source 65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details. 75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef TARGET_ARM_ARMPLT_H_ 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define TARGET_ARM_ARMPLT_H_ 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Target/GOT.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Target/PLT.h" 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/MemoryRegion.h" 15d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 16d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoconst uint32_t arm_plt0[] = { 1737b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0xe52de004, // str lr, [sp, #-4]! 1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0xe59fe004, // ldr lr, [pc, #4] 1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0xe08fe00e, // add lr, pc, lr 2037b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0xe5bef008, // ldr pc, [lr, #8]! 2137b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0x00000000 // &GOT[0] - . 22d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao}; 23d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 24d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoconst uint32_t arm_plt1[] = { 2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0xe28fc600, // add ip, pc, #0xNN00000 2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0xe28cca00, // add ip, ip, #0xNN000 2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0xe5bcf000 // ldr pc, [ip, #0xNNN]! 28d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao}; 29d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld { 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass ARMGOT; 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass ARMPLT0 : public PLT::Entry<sizeof(arm_plt0)> { 3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ARMPLT0(SectionData& pParent); 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass ARMPLT1 : public PLT::Entry<sizeof(arm_plt1)> { 4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ARMPLT1(SectionData& pParent); 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class ARMPLT 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief ARM Procedure Linkage Table 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 4737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass ARMPLT : public PLT { 4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ARMPLT(LDSection& pSection, ARMGOT& pGOTPLT); 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ~ARMPLT(); 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // finalizeSectionSize - set LDSection size 5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao void finalizeSectionSize(); 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // hasPLT1 - return if this plt section has any plt1 entry 5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool hasPLT1() const; 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 5887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ARMPLT1* create(); 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ARMPLT0* getPLT0() const; 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void applyPLT0(); 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void applyPLT1(); 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t emit(MemoryRegion& pRegion); 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 6837b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ARMGOT& m_GOT; 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 7237b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 7437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif // TARGET_ARM_ARMPLT_H_ 75