//===- lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp --------------------===// // // The LLVM Linker // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "ELFFile.h" #include "MipsDynamicLibraryWriter.h" #include "MipsExecutableWriter.h" #include "MipsLinkingContext.h" #include "MipsTargetHandler.h" using namespace lld; using namespace elf; typedef llvm::object::ELFType Mips32ElELFType; MipsTargetHandler::MipsTargetHandler(MipsLinkingContext &ctx) : DefaultTargetHandler(ctx), _ctx(ctx), _runtimeFile(new MipsRuntimeFile(ctx)), _targetLayout(new MipsTargetLayout(ctx)), _relocationHandler(new MipsTargetRelocationHandler(*_targetLayout, ctx)) {} std::unique_ptr MipsTargetHandler::getWriter() { switch (_ctx.getOutputELFType()) { case llvm::ELF::ET_EXEC: return std::unique_ptr(new MipsExecutableWriter( _ctx, *_targetLayout, _elfFlagsMerger)); case llvm::ELF::ET_DYN: return std::unique_ptr( new MipsDynamicLibraryWriter(_ctx, *_targetLayout, _elfFlagsMerger)); case llvm::ELF::ET_REL: llvm_unreachable("TODO: support -r mode"); default: llvm_unreachable("unsupported output type"); } } void MipsTargetHandler::registerRelocationNames(Registry ®istry) { registry.addKindTable(Reference::KindNamespace::ELF, Reference::KindArch::Mips, kindStrings); } #define ELF_RELOC(name, value) LLD_KIND_STRING_ENTRY(name), const Registry::KindStrings MipsTargetHandler::kindStrings[] = { #include "llvm/Support/ELFRelocs/Mips.def" LLD_KIND_STRING_ENTRY(LLD_R_MIPS_GLOBAL_GOT), LLD_KIND_STRING_ENTRY(LLD_R_MIPS_32_HI16), LLD_KIND_STRING_ENTRY(LLD_R_MIPS_GLOBAL_26), LLD_KIND_STRING_ENTRY(LLD_R_MIPS_HI16), LLD_KIND_STRING_ENTRY(LLD_R_MIPS_LO16), LLD_KIND_STRING_ENTRY(LLD_R_MIPS_STO_PLT), LLD_KIND_STRING_END }; #undef ELF_RELOC