Home | History | Annotate | Download | only in Hexagon
      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