//===- ARMGOT.h -----------------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef TARGET_ARM_ARMGOT_H_ #define TARGET_ARM_ARMGOT_H_ #include "mcld/Support/MemoryRegion.h" #include "mcld/Target/GOT.h" #include <llvm/ADT/DenseMap.h> #include <vector> namespace mcld { class LDSection; /** \class ARMGOTEntry * \brief GOT Entry with size of 4 bytes */ class ARMGOTEntry : public GOT::Entry<4> { public: ARMGOTEntry(uint64_t pContent, SectionData* pParent) : GOT::Entry<4>(pContent, pParent) {} }; /** \class ARMGOT * \brief ARM Global Offset Table. * * ARM GOT integrates traditional .got.plt and .got sections into one. * Traditional .got.plt is placed in the front part of GOT (PLTGOT), and * traditional .got is placed in the rear part of GOT (GOT). * * ARM .got * +--------------+ * | GOT0 | * +--------------+ * | GOTPLT | * +--------------+ * | GOT | * +--------------+ * */ class ARMGOT : public GOT { public: explicit ARMGOT(LDSection& pSection); ~ARMGOT(); ARMGOTEntry* createGOT(); ARMGOTEntry* createGOTPLT(); void finalizeSectionSize(); uint64_t emit(MemoryRegion& pRegion); void applyGOT0(uint64_t pAddress); void applyGOTPLT(uint64_t pPLTBase); bool hasGOT1() const; private: typedef std::vector<ARMGOTEntry*> EntryListType; typedef EntryListType::iterator entry_iterator; typedef EntryListType::const_iterator const_entry_iterator; private: ARMGOTEntry* m_pGOTPLTFront; ARMGOTEntry* m_pGOTFront; /// m_GOTPLTEntries - a list of gotplt entries EntryListType m_GOTPLT; /// m_GOTEntris - a list of got entries EntryListType m_GOT; }; } // namespace mcld #endif // TARGET_ARM_ARMGOT_H_