Index: lld/ELF/SyntheticSections.h =================================================================== --- lld/ELF/SyntheticSections.h +++ lld/ELF/SyntheticSections.h @@ -707,22 +707,6 @@ size_t ShardOffsets[NumShards]; }; -// .MIPS.abiflags section. -template -class MipsAbiFlagsSection final : public SyntheticSection { - typedef llvm::object::Elf_Mips_ABIFlags Elf_Mips_ABIFlags; - -public: - static MipsAbiFlagsSection *create(); - - MipsAbiFlagsSection(Elf_Mips_ABIFlags Flags); - size_t getSize() const override { return sizeof(Elf_Mips_ABIFlags); } - void writeTo(uint8_t *Buf) override; - -private: - Elf_Mips_ABIFlags Flags; -}; - // .MIPS.options section. template class MipsOptionsSection final : public SyntheticSection { typedef llvm::object::Elf_Mips_Options Elf_Mips_Options; @@ -799,6 +783,7 @@ template void createCommonSections(); InputSection *createInterpSection(); template MergeInputSection *createCommentSection(); +template InputSection *createMipsAbiFlagsSection(); void decompressSections(); void mergeSections(); Index: lld/ELF/SyntheticSections.cpp =================================================================== --- lld/ELF/SyntheticSections.cpp +++ lld/ELF/SyntheticSections.cpp @@ -112,19 +112,9 @@ } // .MIPS.abiflags section. -template -MipsAbiFlagsSection::MipsAbiFlagsSection(Elf_Mips_ABIFlags Flags) - : SyntheticSection(SHF_ALLOC, SHT_MIPS_ABIFLAGS, 8, ".MIPS.abiflags"), - Flags(Flags) { - this->Entsize = sizeof(Elf_Mips_ABIFlags); -} - -template void MipsAbiFlagsSection::writeTo(uint8_t *Buf) { - memcpy(Buf, &Flags, sizeof(Flags)); -} +template InputSection *elf::createMipsAbiFlagsSection() { + typedef llvm::object::Elf_Mips_ABIFlags Elf_Mips_ABIFlags; -template -MipsAbiFlagsSection *MipsAbiFlagsSection::create() { Elf_Mips_ABIFlags Flags = {}; bool Create = false; @@ -165,9 +155,17 @@ Flags.fp_abi = elf::getMipsFpAbiFlag(Flags.fp_abi, S->fp_abi, Filename); }; - if (Create) - return make>(Flags); - return nullptr; + if (!Create) + return nullptr; + + auto *Buf = make>(sizeof(Flags)); + memcpy(Buf->data(), &Flags, sizeof(Flags)); + + auto *Ret = make(SHF_ALLOC, SHT_MIPS_ABIFLAGS, 8, *Buf, + ".MIPS.abiflags"); + Ret->Entsize = sizeof(Flags); + Ret->Live = true; + return Ret; } // .MIPS.options section. @@ -2441,10 +2439,10 @@ template MergeInputSection *elf::createCommentSection(); template MergeInputSection *elf::createCommentSection(); -template class elf::MipsAbiFlagsSection; -template class elf::MipsAbiFlagsSection; -template class elf::MipsAbiFlagsSection; -template class elf::MipsAbiFlagsSection; +template InputSection *elf::createMipsAbiFlagsSection(); +template InputSection *elf::createMipsAbiFlagsSection(); +template InputSection *elf::createMipsAbiFlagsSection(); +template InputSection *elf::createMipsAbiFlagsSection(); template class elf::MipsOptionsSection; template class elf::MipsOptionsSection; Index: lld/ELF/Writer.cpp =================================================================== --- lld/ELF/Writer.cpp +++ lld/ELF/Writer.cpp @@ -295,7 +295,7 @@ InX::MipsRldMap = make(); Add(InX::MipsRldMap); } - if (auto *Sec = MipsAbiFlagsSection::create()) + if (auto *Sec = createMipsAbiFlagsSection()) Add(Sec); if (auto *Sec = MipsOptionsSection::create()) Add(Sec);