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