1b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines//===- AArch64LongBranchStub.h --------------------------------------------===// 2b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines// 3b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines// The MCLinker Project 4b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines// 5b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines// This file is distributed under the University of Illinois Open Source 6b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines// License. See LICENSE.TXT for details. 7b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines// 8b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines//===----------------------------------------------------------------------===// 9b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines#ifndef TARGET_AARCH64_AARCH64LONGBRANCHSTUB_H_ 10b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines#define TARGET_AARCH64_AARCH64LONGBRANCHSTUB_H_ 11b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines 12b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines#include "mcld/Fragment/Stub.h" 13b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines#include "mcld/Support/Compiler.h" 14b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines#include <llvm/Support/DataTypes.h> 15b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines#include <string> 16b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines#include <vector> 17b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines 18b0d0eb206527b43c771933602e147bbd7b471082Stephen Hinesnamespace mcld { 19b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines 20b0d0eb206527b43c771933602e147bbd7b471082Stephen Hinesclass BranchIsland; 21b0d0eb206527b43c771933602e147bbd7b471082Stephen Hinesclass IRBuilder; 22b0d0eb206527b43c771933602e147bbd7b471082Stephen Hinesclass Relocation; 23b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines 24b0d0eb206527b43c771933602e147bbd7b471082Stephen Hinesclass AArch64LongBranchStub : public Stub { 25b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines public: 26b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines explicit AArch64LongBranchStub(bool pIsOutputPIC); 27b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines 28b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines ~AArch64LongBranchStub(); 29b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines 30b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines bool isMyDuty(const Relocation& pReloc, 31b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines uint64_t pSource, 32b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines uint64_t pTargetSymValue) const; 33b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines 34b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines void applyFixup(Relocation& pSrcReloc, 35b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines IRBuilder& pBuilder, 36b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines BranchIsland& pIsland); 37b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines 38b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines const std::string& name() const; 39b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines 40b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines const uint8_t* getContent() const; 41b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines 42b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines size_t size() const; 43b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines 44b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines size_t alignment() const; 45b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines 46b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines private: 47b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines /// for doClone 48b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines AArch64LongBranchStub(const uint32_t* pData, 49b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines size_t pSize, 50b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines const_fixup_iterator pBegin, 51b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines const_fixup_iterator pEnd); 52b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines 53b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines /// doClone 54b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines Stub* doClone(); 55b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines 56b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines private: 57b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines static const uint32_t PIC_TEMPLATE[]; 58b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines static const uint32_t TEMPLATE[]; 59b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines static const uint32_t ADRP_TEMPLATE[]; 60b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines const uint32_t* m_pData; 61b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines std::string m_Name; 62b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines size_t m_Size; 63b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines 64b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines private: 65b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines DISALLOW_IMPLICIT_CONSTRUCTORS(AArch64LongBranchStub); 66b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines}; 67b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines 68b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines} // namespace mcld 69b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines 70b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines#endif // TARGET_AARCH64_AARCH64LONGBRANCHSTUB_H_ 71