ARMGOT.h revision f33f6de54db174aa679a4b6d1e040d37e95541c0
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//===- ARMGOT.h -----------------------------------------------------------===// 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// The MCLinker Project 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// This file is distributed under the University of Illinois Open Source 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// License. See LICENSE.TXT for details. 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//===----------------------------------------------------------------------===// 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#ifndef MCLD_ARM_GOT_H 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#define MCLD_ARM_GOT_H 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#ifdef ENABLE_UNITTEST 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include <gtest.h> 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#endif 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include <mcld/Target/GOT.h> 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include <mcld/Support/MemoryRegion.h> 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include <llvm/ADT/DenseMap.h> 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include <vector> 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughesnamespace mcld { 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectclass LDSection; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** \class ARMGOTEntry 2578e3320540c8bdcbefba5ae1222ee18f6679ab33Elliott Hughes * \brief GOT Entry with size of 4 bytes 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectclass ARMGOTEntry : public GOT::Entry<4> 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project{ 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic: 30c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz ARMGOTEntry(uint64_t pContent, SectionData* pParent) 31c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz : GOT::Entry<4>(pContent, pParent) 32c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz {} 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}; 34c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** \class ARMGOT 36c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz * \brief ARM Global Offset Table. 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ARM GOT integrates traditional .got.plt and .got sections into one. 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Traditional .got.plt is placed in the front part of GOT (PLTGOT), and 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * traditional .got is placed in the rear part of GOT (GOT). 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ARM .got 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * +--------------+ 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * | GOT0 | 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * +--------------+ 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * | GOTPLT | 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * +--------------+ 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * | GOT | 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * +--------------+ 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 51c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz */ 52c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewiczclass ARMGOT : public GOT 53c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz{ 54c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewiczpublic: 55c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz ARMGOT(LDSection &pSection); 56c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz 57c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz ~ARMGOT(); 58c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz 59c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz ARMGOTEntry* createGOT(); 60c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz ARMGOTEntry* createGOTPLT(); 61c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz 62c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz void finalizeSectionSize(); 63c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz 64c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz uint64_t emit(MemoryRegion& pRegion); 65c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz 66c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz void applyGOT0(uint64_t pAddress); 67c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz 68c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz void applyGOTPLT(uint64_t pPLTBase); 69c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz 70c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz bool hasGOT1() const; 71c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz 72c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewiczprivate: 73c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz typedef std::vector<ARMGOTEntry*> EntryListType; 74c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz typedef EntryListType::iterator entry_iterator; 75c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz typedef EntryListType::const_iterator const_entry_iterator; 76c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz 77c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewiczprivate: 78c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz ARMGOTEntry* m_pGOTPLTFront; 79c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz ARMGOTEntry* m_pGOTFront; 80c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz 81c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz /// m_GOTPLTEntries - a list of gotplt entries 82c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz EntryListType m_GOTPLT; 83c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz 84c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz /// m_GOTEntris - a list of got entries 85c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz EntryListType m_GOT; 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}; 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} // namespace of mcld 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#endif 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project