//===- 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 "AArch64DynamicLibraryWriter.h" #include "AArch64ExecutableWriter.h" #include "AArch64LinkingContext.h" #include "AArch64TargetHandler.h" #include "AArch64SectionChunks.h" using namespace lld; using namespace elf; AArch64TargetLayout::AArch64TargetLayout(ELFLinkingContext &ctx) : TargetLayout(ctx) {} AtomSection *AArch64TargetLayout::createSection( StringRef name, int32_t type, DefinedAtom::ContentPermissions permissions, TargetLayout::SectionOrder order) { if (type == DefinedAtom::typeGOT && (name == ".got" || name == ".got.plt")) { auto section = new (this->_allocator) AArch64GOTSection(this->_ctx, name, order); _gotSections.push_back(section); return section; } return TargetLayout::createSection(name, type, permissions, order); } AArch64TargetHandler::AArch64TargetHandler(AArch64LinkingContext &ctx) : _ctx(ctx), _targetLayout(new AArch64TargetLayout(ctx)), _relocationHandler(new AArch64TargetRelocationHandler(*_targetLayout)) {} std::unique_ptr AArch64TargetHandler::getWriter() { switch (this->_ctx.getOutputELFType()) { case llvm::ELF::ET_EXEC: return llvm::make_unique(_ctx, *_targetLayout); case llvm::ELF::ET_DYN: return llvm::make_unique(_ctx, *_targetLayout); case llvm::ELF::ET_REL: llvm_unreachable("TODO: support -r mode"); default: llvm_unreachable("unsupported output type"); } }