Home | History | Annotate | Download | only in ARM
      1 //===- ARMPLT.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_ARM_ARMPLT_H
     10 #define TARGET_ARM_ARMPLT_H
     11 
     12 #include <mcld/Target/GOT.h>
     13 #include <mcld/Target/PLT.h>
     14 #include <mcld/Support/MemoryRegion.h>
     15 
     16 namespace {
     17 
     18 const uint32_t arm_plt0[] = {
     19   0xe52de004, // str   lr, [sp, #-4]!
     20   0xe59fe004, // ldr   lr, [pc, #4]
     21   0xe08fe00e, // add   lr, pc, lr
     22   0xe5bef008, // ldr   pc, [lr, #8]!
     23   0x00000000  // &GOT[0] - .
     24 };
     25 
     26 const uint32_t arm_plt1[] = {
     27   0xe28fc600, // add   ip, pc, #0xNN00000
     28   0xe28cca00, // add   ip, ip, #0xNN000
     29   0xe5bcf000  // ldr   pc, [ip, #0xNNN]!
     30 };
     31 
     32 } // anonymous namespace
     33 
     34 namespace mcld {
     35 
     36 class ARMGOT;
     37 
     38 class ARMPLT0 : public PLT::Entry<sizeof(arm_plt0)>
     39 {
     40 public:
     41   ARMPLT0(SectionData& pParent);
     42 };
     43 
     44 class ARMPLT1 : public PLT::Entry<sizeof(arm_plt1)>
     45 {
     46 public:
     47   ARMPLT1(SectionData& pParent);
     48 };
     49 
     50 /** \class ARMPLT
     51  *  \brief ARM Procedure Linkage Table
     52  */
     53 class ARMPLT : public PLT
     54 {
     55 public:
     56   ARMPLT(LDSection& pSection, ARMGOT& pGOTPLT);
     57   ~ARMPLT();
     58 
     59   // finalizeSectionSize - set LDSection size
     60   void finalizeSectionSize();
     61 
     62   // hasPLT1 - return if this plt section has any plt1 entry
     63   bool hasPLT1() const;
     64 
     65   ARMPLT1* create();
     66 
     67   ARMPLT0* getPLT0() const;
     68 
     69   void applyPLT0();
     70 
     71   void applyPLT1();
     72 
     73   uint64_t emit(MemoryRegion& pRegion);
     74 
     75 private:
     76   ARMGOT& m_GOT;
     77 };
     78 
     79 } // namespace of mcld
     80 
     81 #endif
     82 
     83