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//===----------------------------------------------------------------------===// 9551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#ifndef TARGET_AARCH64_AARCH64GOT_H 10551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#define TARGET_AARCH64_AARCH64GOT_H 11551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 12551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <mcld/Support/MemoryRegion.h> 13551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen 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 */ 26551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesclass AArch64GOTEntry : public GOT::Entry<8> 27551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 28551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinespublic: 29551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines AArch64GOTEntry(uint64_t pContent, SectionData* pParent) 30551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines : GOT::Entry<8>(pContent, pParent) 31551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines {} 32551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}; 33551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 34551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines/** \class AArch64GOT 35551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * \brief AArch64 Global Offset Table. 36551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * 37551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * AArch64 GOT integrates traditional .got.plt and .got sections into one. 38551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * Traditional .got.plt is placed in the front part of GOT (PLTGOT), and 39551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * traditional .got is placed in the rear part of GOT (GOT). When -z now and 40551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * -z relro are given, the got section layout will be as below. Otherwise, 41551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * there will be two seperated sections, .got and .got.plt. 42551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * 43551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * This class may be used as .got (with no GOTPLT entry), .got.plt (with only 44551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * GOTPLT entries) or .got (with GOTPLT and normal GOT entries) 45551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * 46551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * AArch64 .got 47551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * +--------------+ 48551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * | GOT0 | 49551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * +--------------+ 50551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * | GOTPLT | 51551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * +--------------+ 52551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * | GOT | 53551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * +--------------+ 54551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines * 55551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines */ 56551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesclass AArch64GOT : public GOT 57551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 58551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinespublic: 59551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines AArch64GOT(LDSection &pSection); 60551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 61551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines ~AArch64GOT(); 62551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 63551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines /// createGOT0 - create the defualt GOT0 entries. This function called when 64551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines /// it's a .got section (with GOTPLT entries and normal GOT entry) or it's a 65551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines /// .got.plt section 66551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines void createGOT0(); 67551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 68551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines AArch64GOTEntry* createGOT(); 69551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines AArch64GOTEntry* createGOTPLT(); 70551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 71551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines void finalizeSectionSize(); 72551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 73551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines uint64_t emit(MemoryRegion& pRegion); 74551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 75551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines void applyGOT0(uint64_t pAddress); 76551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 77551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines void applyGOTPLT(uint64_t pPLTBase); 78551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 79551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines bool hasGOT1() const; 80551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 81551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesprivate: 82551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines typedef std::vector<AArch64GOTEntry*> EntryListType; 83551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines typedef EntryListType::iterator entry_iterator; 84551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines typedef EntryListType::const_iterator const_entry_iterator; 85551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 86551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesprivate: 87551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines AArch64GOTEntry* m_pGOTPLTFront; 88551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines AArch64GOTEntry* m_pGOTFront; 89551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 90551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines /// m_GOTPLTEntries - a list of gotplt entries 91551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines EntryListType m_GOTPLT; 92551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 93551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines /// m_GOTEntris - a list of got entries 94551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines EntryListType m_GOT; 95551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}; 96551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 97551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} // namespace of mcld 98551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 99551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#endif 100551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 101