ARMGOT.h revision 5140768057912f114de11cdeabfbd4a61ce832cf
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 <mcld/Target/GOT.h> 16 17namespace mcld 18{ 19class LDSection; 20class MemoryRegion; 21 22/** \class ARMGOT 23 * \brief ARM Global Offset Table. 24 */ 25class ARMGOT : public GOT 26{ 27 typedef llvm::DenseMap<const ResolveInfo*, GOTEntry*> SymbolIndexMapType; 28 29public: 30 typedef llvm::MCSectionData::iterator iterator; 31 typedef llvm::MCSectionData::const_iterator const_iterator; 32 33 enum { 34 ARMGOT0Num = 3 35 }; 36 37public: 38 ARMGOT(LDSection &pSection, llvm::MCSectionData& pSectionData); 39 40 ~ARMGOT(); 41 42 iterator begin(); 43 44 const_iterator begin() const; 45 46 iterator end(); 47 48 const_iterator end() const; 49 50 uint64_t emit(MemoryRegion& pRegion); 51// For GOT0 52public: 53 void applyGOT0(uint64_t pAddress); 54 55// For normal GOT 56public: 57 // Reserve normal GOT entries. 58 void reserveEntry(size_t pNum = 1); 59 60 GOTEntry* getEntry(const ResolveInfo& pSymbol, bool& pExist); 61 62// For GOTPLT 63public: 64 void reserveGOTPLTEntry(); 65 66 void applyAllGOTPLT(uint64_t pPLTBase); 67 68 GOTEntry*& lookupGOTPLTMap(const ResolveInfo& pSymbol); 69 70 iterator getNextGOTPLTEntry(); 71 72 iterator getGOTPLTBegin(); 73 74 const iterator getGOTPLTEnd(); 75 76private: 77 // For normal GOT entries 78 iterator m_NormalGOTIterator; 79 SymbolIndexMapType m_NormalGOTMap; 80 81 // For GOTPLT entries 82 iterator m_GOTPLTIterator; 83 SymbolIndexMapType m_GOTPLTMap; 84 85 iterator m_GOTPLTBegin; 86 iterator m_GOTPLTEnd; 87}; 88 89} // namespace of mcld 90 91#endif 92