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