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//===----------------------------------------------------------------------===// 95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifndef MCLD_ARM_PLT_H 105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define MCLD_ARM_PLT_H 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Target/GOT.h> 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Target/PLT.h> 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 15d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaonamespace { 16d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 17d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoconst uint32_t arm_plt0[] = { 18d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 0xe52de004, // str lr, [sp, #-4]! 19d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 0xe59fe004, // ldr lr, [pc, #4] 20d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 0xe08fe00e, // add lr, pc, lr 21d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 0xe5bef008, // ldr pc, [lr, #8]! 22d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 0x00000000, // &GOT[0] - . 23d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao}; 24d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 25d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoconst uint32_t arm_plt1[] = { 26d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 0xe28fc600, // add ip, pc, #0xNN00000 27d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 0xe28cca00, // add ip, ip, #0xNN000 28d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 0xe5bcf000, // ldr pc, [ip, #0xNNN]! 29d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao}; 30d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 31d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao} // anonymous namespace 32d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld { 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass ARMGOT; 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass MemoryRegion; 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 38d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass ARMPLT0 : public PLT::Entry<sizeof(arm_plt0)> 39d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao{ 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ARMPLT0(SectionData& pParent); 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 44d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass ARMPLT1 : public PLT::Entry<sizeof(arm_plt1)> 45d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao{ 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ARMPLT1(SectionData& pParent); 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class ARMPLT 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief ARM Procedure Linkage Table 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass ARMPLT : public PLT 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ARMPLT(LDSection& pSection, ARMGOT& pGOTPLT); 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ~ARMPLT(); 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // finalizeSectionSize - set LDSection size 6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao void finalizeSectionSize(); 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // hasPLT1 - return if this plt section has any plt1 entry 6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool hasPLT1() const; 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao void reserveEntry(size_t pNum = 1) ; 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ARMPLT1* consume(); 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ARMPLT0* getPLT0() const; 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void applyPLT0(); 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void applyPLT1(); 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t emit(MemoryRegion& pRegion); 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ARMGOT& m_GOT; 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // Used by getEntry() for mapping a ResolveInfo instance to a PLT1 Entry. 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iterator m_PLTEntryIterator; 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 88