//===- lib/ReaderWriter/ELF/AArch64/AArch64TargetHandler.cpp --------------===// // // The LLVM Linker // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "Atoms.h" #include "AArch64ExecutableWriter.h" #include "AArch64DynamicLibraryWriter.h" #include "AArch64TargetHandler.h" #include "AArch64LinkingContext.h" using namespace lld; using namespace elf; AArch64TargetHandler::AArch64TargetHandler(AArch64LinkingContext &context) : DefaultTargetHandler(context), _context(context), _AArch64TargetLayout(new AArch64TargetLayout(context)), _AArch64RelocationHandler( new AArch64TargetRelocationHandler()) {} void AArch64TargetHandler::registerRelocationNames(Registry ®istry) { registry.addKindTable(Reference::KindNamespace::ELF, Reference::KindArch::AArch64, kindStrings); } std::unique_ptr AArch64TargetHandler::getWriter() { switch (this->_context.getOutputELFType()) { case llvm::ELF::ET_EXEC: return std::unique_ptr(new AArch64ExecutableWriter( _context, *_AArch64TargetLayout.get())); case llvm::ELF::ET_DYN: return std::unique_ptr( new AArch64DynamicLibraryWriter( _context, *_AArch64TargetLayout.get())); case llvm::ELF::ET_REL: llvm_unreachable("TODO: support -r mode"); default: llvm_unreachable("unsupported output type"); } } const Registry::KindStrings AArch64TargetHandler::kindStrings[] = { LLD_KIND_STRING_ENTRY(R_AARCH64_NONE), LLD_KIND_STRING_ENTRY(R_AARCH64_ABS64), LLD_KIND_STRING_ENTRY(R_AARCH64_ABS32), LLD_KIND_STRING_ENTRY(R_AARCH64_ABS16), LLD_KIND_STRING_ENTRY(R_AARCH64_PREL64), LLD_KIND_STRING_ENTRY(R_AARCH64_PREL32), LLD_KIND_STRING_ENTRY(R_AARCH64_PREL16), LLD_KIND_STRING_ENTRY(R_AARCH64_MOVW_UABS_G0), LLD_KIND_STRING_ENTRY(R_AARCH64_MOVW_UABS_G0_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_MOVW_UABS_G1), LLD_KIND_STRING_ENTRY(R_AARCH64_MOVW_UABS_G1_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_MOVW_UABS_G2), LLD_KIND_STRING_ENTRY(R_AARCH64_MOVW_UABS_G2_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_MOVW_UABS_G3), LLD_KIND_STRING_ENTRY(R_AARCH64_MOVW_SABS_G0), LLD_KIND_STRING_ENTRY(R_AARCH64_MOVW_SABS_G1), LLD_KIND_STRING_ENTRY(R_AARCH64_MOVW_SABS_G2), LLD_KIND_STRING_ENTRY(R_AARCH64_LD_PREL_LO19), LLD_KIND_STRING_ENTRY(R_AARCH64_ADR_PREL_LO21), LLD_KIND_STRING_ENTRY(R_AARCH64_ADR_PREL_PG_HI21), LLD_KIND_STRING_ENTRY(R_AARCH64_ADD_ABS_LO12_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_LDST8_ABS_LO12_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_TSTBR14), LLD_KIND_STRING_ENTRY(R_AARCH64_CONDBR19), LLD_KIND_STRING_ENTRY(R_AARCH64_JUMP26), LLD_KIND_STRING_ENTRY(R_AARCH64_CALL26), LLD_KIND_STRING_ENTRY(R_AARCH64_LDST16_ABS_LO12_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_LDST32_ABS_LO12_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_LDST64_ABS_LO12_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_LDST128_ABS_LO12_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_ADR_GOT_PAGE), LLD_KIND_STRING_ENTRY(R_AARCH64_LD64_GOT_LO12_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLD_MOVW_DTPREL_G2), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLD_MOVW_DTPREL_G1), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLD_MOVW_DTPREL_G0), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLD_ADD_DTPREL_HI12), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLD_ADD_DTPREL_LO12), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLD_LDST8_DTPREL_LO12), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLD_LDST16_DTPREL_LO12), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLD_LDST32_DTPREL_LO12), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLD_LDST64_DTPREL_LO12), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSIE_MOVW_GOTTPREL_G1), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSIE_LD_GOTTPREL_PREL19), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLE_MOVW_TPREL_G2), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLE_MOVW_TPREL_G1), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLE_MOVW_TPREL_G1_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLE_MOVW_TPREL_G0), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLE_MOVW_TPREL_G0_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLE_ADD_TPREL_HI12), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLE_ADD_TPREL_LO12), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLE_ADD_TPREL_LO12_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLE_LDST8_TPREL_LO12), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLE_LDST16_TPREL_LO12), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLE_LDST32_TPREL_LO12), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLE_LDST64_TPREL_LO12), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSDESC_ADR_PAGE), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSDESC_LD64_LO12_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSDESC_ADD_LO12_NC), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSDESC_CALL), LLD_KIND_STRING_ENTRY(R_AARCH64_COPY), LLD_KIND_STRING_ENTRY(R_AARCH64_GLOB_DAT), LLD_KIND_STRING_ENTRY(R_AARCH64_JUMP_SLOT), LLD_KIND_STRING_ENTRY(R_AARCH64_RELATIVE), LLD_KIND_STRING_ENTRY(R_AARCH64_TLS_DTPREL64), LLD_KIND_STRING_ENTRY(R_AARCH64_TLS_DTPMOD64), LLD_KIND_STRING_ENTRY(R_AARCH64_TLS_TPREL64), LLD_KIND_STRING_ENTRY(R_AARCH64_TLSDESC), LLD_KIND_STRING_ENTRY(R_AARCH64_IRELATIVE), LLD_KIND_STRING_END};