//===- lib/ReaderWriter/ELF/Mips/MipsDynamicLibraryWriter.h ---------------===// // // The LLVM Linker // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef LLD_READER_WRITER_ELF_MIPS_MIPS_DYNAMIC_LIBRARY_WRITER_H #define LLD_READER_WRITER_ELF_MIPS_MIPS_DYNAMIC_LIBRARY_WRITER_H #include "DynamicLibraryWriter.h" #include "MipsDynamicTable.h" #include "MipsELFWriters.h" #include "MipsLinkingContext.h" #include "MipsSectionChunks.h" namespace lld { namespace elf { template class MipsSymbolTable; template class MipsDynamicSymbolTable; template class MipsTargetLayout; template class MipsDynamicLibraryWriter : public DynamicLibraryWriter { public: MipsDynamicLibraryWriter(MipsLinkingContext &ctx, MipsTargetLayout &layout); protected: // Add any runtime files and their atoms to the output bool createImplicitFiles(std::vector> &) override; void finalizeDefaultAtomValues() override; void createDefaultSections() override; std::error_code setELFHeader() override { DynamicLibraryWriter::setELFHeader(); _writeHelper.setELFHeader(*this->_elfHeader); return std::error_code(); } unique_bump_ptr> createSymbolTable() override; unique_bump_ptr> createDynamicTable() override; unique_bump_ptr> createDynamicSymbolTable() override; private: MipsELFWriter _writeHelper; MipsTargetLayout &_targetLayout; unique_bump_ptr> _reginfo; }; template MipsDynamicLibraryWriter::MipsDynamicLibraryWriter( MipsLinkingContext &ctx, MipsTargetLayout &layout) : DynamicLibraryWriter(ctx, layout), _writeHelper(ctx, layout), _targetLayout(layout) {} template bool MipsDynamicLibraryWriter::createImplicitFiles( std::vector> &result) { DynamicLibraryWriter::createImplicitFiles(result); result.push_back(std::move(_writeHelper.createRuntimeFile())); return true; } template void MipsDynamicLibraryWriter::finalizeDefaultAtomValues() { // Finalize the atom values that are part of the parent. DynamicLibraryWriter::finalizeDefaultAtomValues(); _writeHelper.finalizeMipsRuntimeAtomValues(); } template void MipsDynamicLibraryWriter::createDefaultSections() { DynamicLibraryWriter::createDefaultSections(); const auto &ctx = static_cast(this->_ctx); const auto &mask = ctx.getMergeReginfoMask(); if (!mask.hasValue()) return; if (ELFT::Is64Bits) _reginfo = unique_bump_ptr>( new (this->_alloc) MipsOptionsSection(ctx, _targetLayout, *mask)); else _reginfo = unique_bump_ptr>( new (this->_alloc) MipsReginfoSection(ctx, _targetLayout, *mask)); this->_layout.addSection(_reginfo.get()); } template unique_bump_ptr> MipsDynamicLibraryWriter::createSymbolTable() { return unique_bump_ptr>( new (this->_alloc) MipsSymbolTable(this->_ctx)); } /// \brief create dynamic table template unique_bump_ptr> MipsDynamicLibraryWriter::createDynamicTable() { return unique_bump_ptr>( new (this->_alloc) MipsDynamicTable(this->_ctx, _targetLayout)); } /// \brief create dynamic symbol table template unique_bump_ptr> MipsDynamicLibraryWriter::createDynamicSymbolTable() { return unique_bump_ptr>( new (this->_alloc) MipsDynamicSymbolTable(this->_ctx, _targetLayout)); } } // namespace elf } // namespace lld #endif