Home | History | Annotate | Download | only in ARM
      1 //===- ARMGOT.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 MCLD_ARM_GOT_H
     10 #define MCLD_ARM_GOT_H
     11 #ifdef ENABLE_UNITTEST
     12 #include <gtest.h>
     13 #endif
     14 
     15 #include <llvm/ADT/DenseMap.h>
     16 
     17 #include <mcld/Target/GOT.h>
     18 
     19 namespace mcld {
     20 
     21 class LDSection;
     22 class MemoryRegion;
     23 
     24 /** \class ARMGOTEntry
     25  *  \brief GOT Entry with size of 4 bytes
     26  */
     27 class ARMGOTEntry : public GOT::Entry<4>
     28 {
     29 public:
     30   ARMGOTEntry(uint64_t pContent, SectionData* pParent)
     31    : GOT::Entry<4>(pContent, pParent)
     32   {}
     33 };
     34 
     35 /** \class ARMGOT
     36  *  \brief ARM Global Offset Table.
     37  *
     38  *  ARM GOT integrates traditional .got.plt and .got sections into one.
     39  *  Traditional .got.plt is placed in the front part of GOT (PLTGOT), and
     40  *  traditional .got is placed in the rear part of GOT (GOT).
     41  *
     42  *  ARM .got
     43  *            +--------------+
     44  *            |    GOT0      |
     45  *            +--------------+
     46  *            |    GOTPLT    |
     47  *            +--------------+
     48  *            |    GOT       |
     49  *            +--------------+
     50  *
     51  */
     52 class ARMGOT : public GOT
     53 {
     54 public:
     55   ARMGOT(LDSection &pSection);
     56 
     57   ~ARMGOT();
     58 
     59   void reserve(size_t pNum = 1);
     60 
     61   void reserveGOTPLT();
     62 
     63   void reserveGOT();
     64 
     65   ARMGOTEntry* consume();
     66 
     67   ARMGOTEntry* consumeGOT();
     68 
     69   ARMGOTEntry* consumeGOTPLT();
     70 
     71   uint64_t emit(MemoryRegion& pRegion);
     72 
     73   void applyGOT0(uint64_t pAddress);
     74 
     75   void applyGOTPLT(uint64_t pPLTBase);
     76 
     77   bool hasGOT1() const;
     78 
     79 private:
     80   struct Part {
     81   public:
     82     Part() : front(NULL), last_used(NULL) { }
     83 
     84   public:
     85     ARMGOTEntry* front;
     86     ARMGOTEntry* last_used;
     87   };
     88 
     89 private:
     90   Part m_GOTPLT;
     91   Part m_GOT;
     92 
     93   ARMGOTEntry* m_pLast; ///< the last consumed entry
     94 };
     95 
     96 } // namespace of mcld
     97 
     98 #endif
     99 
    100