diff options
Diffstat (limited to 'lib/ReaderWriter/ELF/AArch64/AArch64TargetHandler.cpp')
| -rw-r--r-- | lib/ReaderWriter/ELF/AArch64/AArch64TargetHandler.cpp | 43 |
1 files changed, 21 insertions, 22 deletions
diff --git a/lib/ReaderWriter/ELF/AArch64/AArch64TargetHandler.cpp b/lib/ReaderWriter/ELF/AArch64/AArch64TargetHandler.cpp index 607f767f8b8a..083b492c1607 100644 --- a/lib/ReaderWriter/ELF/AArch64/AArch64TargetHandler.cpp +++ b/lib/ReaderWriter/ELF/AArch64/AArch64TargetHandler.cpp @@ -12,41 +12,40 @@ #include "AArch64ExecutableWriter.h" #include "AArch64LinkingContext.h" #include "AArch64TargetHandler.h" +#include "AArch64SectionChunks.h" using namespace lld; using namespace elf; -AArch64TargetHandler::AArch64TargetHandler(AArch64LinkingContext &context) - : _context(context), - _AArch64TargetLayout(new AArch64TargetLayout<AArch64ELFType>(context)), - _AArch64RelocationHandler(new AArch64TargetRelocationHandler()) {} +AArch64TargetLayout::AArch64TargetLayout(ELFLinkingContext &ctx) : + TargetLayout(ctx) {} -void AArch64TargetHandler::registerRelocationNames(Registry ®istry) { - registry.addKindTable(Reference::KindNamespace::ELF, - Reference::KindArch::AArch64, kindStrings); +AtomSection<ELF64LE> *AArch64TargetLayout::createSection( + StringRef name, int32_t type, DefinedAtom::ContentPermissions permissions, + TargetLayout<ELF64LE>::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<ELF64LE>::createSection(name, type, permissions, order); } + +AArch64TargetHandler::AArch64TargetHandler(AArch64LinkingContext &ctx) + : _ctx(ctx), _targetLayout(new AArch64TargetLayout(ctx)), + _relocationHandler(new AArch64TargetRelocationHandler(*_targetLayout)) {} + std::unique_ptr<Writer> AArch64TargetHandler::getWriter() { - switch (this->_context.getOutputELFType()) { + switch (this->_ctx.getOutputELFType()) { case llvm::ELF::ET_EXEC: - return std::unique_ptr<Writer>(new AArch64ExecutableWriter<AArch64ELFType>( - _context, *_AArch64TargetLayout.get())); + return llvm::make_unique<AArch64ExecutableWriter>(_ctx, *_targetLayout); case llvm::ELF::ET_DYN: - return std::unique_ptr<Writer>( - new AArch64DynamicLibraryWriter<AArch64ELFType>( - _context, *_AArch64TargetLayout.get())); + return llvm::make_unique<AArch64DynamicLibraryWriter>(_ctx, *_targetLayout); case llvm::ELF::ET_REL: llvm_unreachable("TODO: support -r mode"); default: llvm_unreachable("unsupported output type"); } } - -#define ELF_RELOC(name, value) LLD_KIND_STRING_ENTRY(name), - -const Registry::KindStrings AArch64TargetHandler::kindStrings[] = { -#include "llvm/Support/ELFRelocs/AArch64.def" - LLD_KIND_STRING_END -}; - -#undef ELF_RELOC |
