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 TARGET_ARM_ARMGOT_H
     10 #define TARGET_ARM_ARMGOT_H
     11 
     12 #include <mcld/Target/GOT.h>
     13 #include <mcld/Support/MemoryRegion.h>
     14 #include <llvm/ADT/DenseMap.h>
     15 #include <vector>
     16 
     17 namespace mcld {
     18 
     19 class LDSection;
     20 
     21 /** \class ARMGOTEntry
     22  *  \brief GOT Entry with size of 4 bytes
     23  */
     24 class ARMGOTEntry : public GOT::Entry<4>
     25 {
     26 public:
     27   ARMGOTEntry(uint64_t pContent, SectionData* pParent)
     28    : GOT::Entry<4>(pContent, pParent)
     29   {}
     30 };
     31 
     32 /** \class ARMGOT
     33  *  \brief ARM Global Offset Table.
     34  *
     35  *  ARM GOT integrates traditional .got.plt and .got sections into one.
     36  *  Traditional .got.plt is placed in the front part of GOT (PLTGOT), and
     37  *  traditional .got is placed in the rear part of GOT (GOT).
     38  *
     39  *  ARM .got
     40  *            +--------------+
     41  *            |    GOT0      |
     42  *            +--------------+
     43  *            |    GOTPLT    |
     44  *            +--------------+
     45  *            |    GOT       |
     46  *            +--------------+
     47  *
     48  */
     49 class ARMGOT : public GOT
     50 {
     51 public:
     52   ARMGOT(LDSection &pSection);
     53 
     54   ~ARMGOT();
     55 
     56   ARMGOTEntry* createGOT();
     57   ARMGOTEntry* createGOTPLT();
     58 
     59   void finalizeSectionSize();
     60 
     61   uint64_t emit(MemoryRegion& pRegion);
     62 
     63   void applyGOT0(uint64_t pAddress);
     64 
     65   void applyGOTPLT(uint64_t pPLTBase);
     66 
     67   bool hasGOT1() const;
     68 
     69 private:
     70   typedef std::vector<ARMGOTEntry*> EntryListType;
     71   typedef EntryListType::iterator entry_iterator;
     72   typedef EntryListType::const_iterator const_entry_iterator;
     73 
     74 private:
     75   ARMGOTEntry* m_pGOTPLTFront;
     76   ARMGOTEntry* m_pGOTFront;
     77 
     78   /// m_GOTPLTEntries - a list of gotplt entries
     79   EntryListType m_GOTPLT;
     80 
     81   /// m_GOTEntris - a list of got entries
     82   EntryListType m_GOT;
     83 };
     84 
     85 } // namespace of mcld
     86 
     87 #endif
     88 
     89