1551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===- AArch64GOT.h -------------------------------------------------------===// 2551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// 3551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// The MCLinker Project 4551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// 5551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// This file is distributed under the University of Illinois Open Source 6551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// License. See LICENSE.TXT for details. 7551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// 8551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef TARGET_AARCH64_AARCH64GOT_H_ 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define TARGET_AARCH64_AARCH64GOT_H_ 11551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/MemoryRegion.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Target/GOT.h" 14551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 15551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <llvm/ADT/DenseMap.h> 16551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 17551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <vector> 18551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 19551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesnamespace mcld { 20551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 21551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesclass LDSection; 22551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 23551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines/** \class AArch64GOTEntry 24551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * \brief GOT Entry with size of 8 bytes 25551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines */ 2637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass AArch64GOTEntry : public GOT::Entry<8> { 2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 28551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines AArch64GOTEntry(uint64_t pContent, SectionData* pParent) 2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines : GOT::Entry<8>(pContent, pParent) {} 30551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}; 31551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 32551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines/** \class AArch64GOT 33551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * \brief AArch64 Global Offset Table. 34551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * 35551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * AArch64 GOT integrates traditional .got.plt and .got sections into one. 36551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * Traditional .got.plt is placed in the front part of GOT (PLTGOT), and 37551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * traditional .got is placed in the rear part of GOT (GOT). When -z now and 38551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * -z relro are given, the got section layout will be as below. Otherwise, 39551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * there will be two seperated sections, .got and .got.plt. 40551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * 41551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * This class may be used as .got (with no GOTPLT entry), .got.plt (with only 42551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * GOTPLT entries) or .got (with GOTPLT and normal GOT entries) 43551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * 44551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * AArch64 .got 45551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * +--------------+ 46551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * | GOT0 | 47551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * +--------------+ 48551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * | GOTPLT | 49551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * +--------------+ 50551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * | GOT | 51551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * +--------------+ 52551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * 53551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines */ 5437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass AArch64GOT : public GOT { 5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines explicit AArch64GOT(LDSection& pSection); 57551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 58551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines ~AArch64GOT(); 59551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 60551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines /// createGOT0 - create the defualt GOT0 entries. This function called when 61551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines /// it's a .got section (with GOTPLT entries and normal GOT entry) or it's a 62551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines /// .got.plt section 63551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines void createGOT0(); 64551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 65551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines AArch64GOTEntry* createGOT(); 66551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines AArch64GOTEntry* createGOTPLT(); 67551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 68551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines void finalizeSectionSize(); 69551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 70551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines uint64_t emit(MemoryRegion& pRegion); 71551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 72551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines void applyGOT0(uint64_t pAddress); 73551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 74551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines void applyGOTPLT(uint64_t pPLTBase); 75551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 76551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines bool hasGOT1() const; 77551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 7837b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 79551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines typedef std::vector<AArch64GOTEntry*> EntryListType; 80551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines typedef EntryListType::iterator entry_iterator; 81551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines typedef EntryListType::const_iterator const_entry_iterator; 82551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 8337b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 84551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines AArch64GOTEntry* m_pGOTPLTFront; 85551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines AArch64GOTEntry* m_pGOTFront; 86551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 87551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines /// m_GOTPLTEntries - a list of gotplt entries 88551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines EntryListType m_GOTPLT; 89551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 90551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines /// m_GOTEntris - a list of got entries 91551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines EntryListType m_GOT; 92551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}; 93551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 9437b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 95551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 9637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif // TARGET_AARCH64_AARCH64GOT_H_ 97