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