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