Index: lib/ReaderWriter/ELF/AArch64/AArch64DynamicLibraryWriter.h =================================================================== --- lib/ReaderWriter/ELF/AArch64/AArch64DynamicLibraryWriter.h +++ lib/ReaderWriter/ELF/AArch64/AArch64DynamicLibraryWriter.h @@ -30,10 +30,6 @@ return DynamicLibraryWriter::finalizeDefaultAtomValues(); } - void addDefaultAtoms() override { - return DynamicLibraryWriter::addDefaultAtoms(); - } - private: class GOTFile : public SimpleFile { public: Index: lib/ReaderWriter/ELF/AArch64/AArch64ExecutableWriter.h =================================================================== --- lib/ReaderWriter/ELF/AArch64/AArch64ExecutableWriter.h +++ lib/ReaderWriter/ELF/AArch64/AArch64ExecutableWriter.h @@ -29,10 +29,6 @@ return ExecutableWriter::finalizeDefaultAtomValues(); } - void addDefaultAtoms() override{ - return ExecutableWriter::addDefaultAtoms(); - } - private: class GOTFile : public SimpleFile { public: Index: lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h =================================================================== --- lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h +++ lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h @@ -33,10 +33,6 @@ void finalizeDefaultAtomValues() override; - void addDefaultAtoms() override { - ExecutableWriter::addDefaultAtoms(); - } - /// \brief Create symbol table. unique_bump_ptr> createSymbolTable() override; Index: lib/ReaderWriter/ELF/DynamicLibraryWriter.h =================================================================== --- lib/ReaderWriter/ELF/DynamicLibraryWriter.h +++ lib/ReaderWriter/ELF/DynamicLibraryWriter.h @@ -23,17 +23,12 @@ class DynamicLibraryWriter : public OutputELFWriter { public: DynamicLibraryWriter(ELFLinkingContext &ctx, TargetLayout &layout) - : OutputELFWriter(ctx, layout), - _runtimeFile(new RuntimeFile(ctx, "C runtime")) {} + : OutputELFWriter(ctx, layout) {} protected: void buildDynamicSymbolTable(const File &file) override; - void addDefaultAtoms() override; void createImplicitFiles(std::vector> &) override; void finalizeDefaultAtomValues() override; - -protected: - std::unique_ptr > _runtimeFile; }; //===----------------------------------------------------------------------===// @@ -59,19 +54,15 @@ OutputELFWriter::buildDynamicSymbolTable(file); } -template void DynamicLibraryWriter::addDefaultAtoms() { - OutputELFWriter::addDefaultAtoms(); - _runtimeFile->addAbsoluteAtom("_end"); -} - /// \brief Hook in lld to add CRuntime file template void DynamicLibraryWriter::createImplicitFiles( std::vector > &result) { - // Add the default atoms as defined by executables - DynamicLibraryWriter::addDefaultAtoms(); OutputELFWriter::createImplicitFiles(result); - result.push_back(std::move(_runtimeFile)); + // Add the default atoms as defined by executables + auto file = llvm::make_unique>(this->_ctx, "C runtime"); + file->addAbsoluteAtom("_end"); + result.push_back(std::move(file)); } template Index: lib/ReaderWriter/ELF/ExecutableWriter.h =================================================================== --- lib/ReaderWriter/ELF/ExecutableWriter.h +++ lib/ReaderWriter/ELF/ExecutableWriter.h @@ -23,12 +23,10 @@ class ExecutableWriter : public OutputELFWriter { public: ExecutableWriter(ELFLinkingContext &ctx, TargetLayout &layout) - : OutputELFWriter(ctx, layout), - _runtimeFile(new RuntimeFile(ctx, "C runtime")) {} + : OutputELFWriter(ctx, layout) {} protected: void buildDynamicSymbolTable(const File &file) override; - void addDefaultAtoms() override; void createImplicitFiles(std::vector> &) override; void finalizeDefaultAtomValues() override; void createDefaultSections() override; @@ -38,7 +36,9 @@ } unique_bump_ptr> _interpSection; - std::unique_ptr > _runtimeFile; + +private: + std::unique_ptr> createRuntimeFile(); }; //===----------------------------------------------------------------------===// @@ -73,39 +73,36 @@ OutputELFWriter::buildDynamicSymbolTable(file); } -/// \brief Add absolute symbols by default. These are linker added -/// absolute symbols template -void ExecutableWriter::addDefaultAtoms() { - OutputELFWriter::addDefaultAtoms(); - _runtimeFile->addUndefinedAtom(this->_ctx.entrySymbolName()); - _runtimeFile->addAbsoluteAtom("__bss_start"); - _runtimeFile->addAbsoluteAtom("__bss_end"); - _runtimeFile->addAbsoluteAtom("_end"); - _runtimeFile->addAbsoluteAtom("end"); - _runtimeFile->addAbsoluteAtom("__preinit_array_start"); - _runtimeFile->addAbsoluteAtom("__preinit_array_end"); - _runtimeFile->addAbsoluteAtom("__init_array_start"); - _runtimeFile->addAbsoluteAtom("__init_array_end"); +std::unique_ptr> ExecutableWriter::createRuntimeFile() { + auto file = llvm::make_unique>(this->_ctx, "C runtime"); + file->addUndefinedAtom(this->_ctx.entrySymbolName()); + file->addAbsoluteAtom("__bss_start"); + file->addAbsoluteAtom("__bss_end"); + file->addAbsoluteAtom("_end"); + file->addAbsoluteAtom("end"); + file->addAbsoluteAtom("__preinit_array_start"); + file->addAbsoluteAtom("__preinit_array_end"); + file->addAbsoluteAtom("__init_array_start"); + file->addAbsoluteAtom("__init_array_end"); if (this->_ctx.isRelaOutputFormat()) { - _runtimeFile->addAbsoluteAtom("__rela_iplt_start"); - _runtimeFile->addAbsoluteAtom("__rela_iplt_end"); + file->addAbsoluteAtom("__rela_iplt_start"); + file->addAbsoluteAtom("__rela_iplt_end"); } else { - _runtimeFile->addAbsoluteAtom("__rel_iplt_start"); - _runtimeFile->addAbsoluteAtom("__rel_iplt_end"); + file->addAbsoluteAtom("__rel_iplt_start"); + file->addAbsoluteAtom("__rel_iplt_end"); } - _runtimeFile->addAbsoluteAtom("__fini_array_start"); - _runtimeFile->addAbsoluteAtom("__fini_array_end"); + file->addAbsoluteAtom("__fini_array_start"); + file->addAbsoluteAtom("__fini_array_end"); + return file; } /// \brief Hook in lld to add CRuntime file template void ExecutableWriter::createImplicitFiles( std::vector > &result) { - // Add the default atoms as defined by executables - ExecutableWriter::addDefaultAtoms(); OutputELFWriter::createImplicitFiles(result); - result.push_back(std::move(_runtimeFile)); + result.push_back(createRuntimeFile()); } template void ExecutableWriter::createDefaultSections() { Index: lib/ReaderWriter/ELF/Hexagon/HexagonDynamicLibraryWriter.h =================================================================== --- lib/ReaderWriter/ELF/Hexagon/HexagonDynamicLibraryWriter.h +++ lib/ReaderWriter/ELF/Hexagon/HexagonDynamicLibraryWriter.h @@ -37,29 +37,25 @@ } private: - void addDefaultAtoms() override { - _runtimeFile->addAbsoluteAtom("_GLOBAL_OFFSET_TABLE_"); - _runtimeFile->addAbsoluteAtom("_DYNAMIC"); - } - HexagonLinkingContext &_ctx; HexagonTargetLayout &_targetLayout; - std::unique_ptr> _runtimeFile; }; template HexagonDynamicLibraryWriter::HexagonDynamicLibraryWriter( HexagonLinkingContext &ctx, HexagonTargetLayout &layout) - : DynamicLibraryWriter(ctx, layout), _ctx(ctx), _targetLayout(layout), - _runtimeFile(new HexagonRuntimeFile(ctx)) {} + : DynamicLibraryWriter(ctx, layout), _ctx(ctx), + _targetLayout(layout) {} template void HexagonDynamicLibraryWriter::createImplicitFiles( std::vector> &result) { DynamicLibraryWriter::createImplicitFiles(result); // Add the default atoms as defined for hexagon - addDefaultAtoms(); - result.push_back(std::move(_runtimeFile)); + auto file = llvm::make_unique>(_ctx); + file->addAbsoluteAtom("_GLOBAL_OFFSET_TABLE_"); + file->addAbsoluteAtom("_DYNAMIC"); + result.push_back(std::move(file)); } template Index: lib/ReaderWriter/ELF/Hexagon/HexagonExecutableWriter.h =================================================================== --- lib/ReaderWriter/ELF/Hexagon/HexagonExecutableWriter.h +++ lib/ReaderWriter/ELF/Hexagon/HexagonExecutableWriter.h @@ -37,32 +37,27 @@ } private: - void addDefaultAtoms() override { - _runtimeFile->addAbsoluteAtom("_SDA_BASE_"); - if (this->_ctx.isDynamic()) { - _runtimeFile->addAbsoluteAtom("_GLOBAL_OFFSET_TABLE_"); - _runtimeFile->addAbsoluteAtom("_DYNAMIC"); - } - } - HexagonLinkingContext &_ctx; HexagonTargetLayout &_targetLayout; - std::unique_ptr> _runtimeFile; }; template HexagonExecutableWriter::HexagonExecutableWriter( HexagonLinkingContext &ctx, HexagonTargetLayout &layout) - : ExecutableWriter(ctx, layout), _ctx(ctx), _targetLayout(layout), - _runtimeFile(new HexagonRuntimeFile(ctx)) {} + : ExecutableWriter(ctx, layout), _ctx(ctx), _targetLayout(layout) {} template void HexagonExecutableWriter::createImplicitFiles( std::vector> &result) { ExecutableWriter::createImplicitFiles(result); // Add the default atoms as defined for hexagon - addDefaultAtoms(); - result.push_back(std::move(_runtimeFile)); + auto file = llvm::make_unique>(_ctx); + file->addAbsoluteAtom("_SDA_BASE_"); + if (this->_ctx.isDynamic()) { + file->addAbsoluteAtom("_GLOBAL_OFFSET_TABLE_"); + file->addAbsoluteAtom("_DYNAMIC"); + } + result.push_back(std::move(file)); } template Index: lib/ReaderWriter/ELF/OutputELFWriter.h =================================================================== --- lib/ReaderWriter/ELF/OutputELFWriter.h +++ lib/ReaderWriter/ELF/OutputELFWriter.h @@ -129,9 +129,6 @@ // section header table, string table etc virtual void assignSectionsWithNoSegments(); - // Add default atoms that need to be present in the output file - virtual void addDefaultAtoms(); - // Add any runtime files and their atoms to the output void createImplicitFiles(std::vector> &) override; @@ -194,7 +191,6 @@ unique_bump_ptr> _hashTable; llvm::StringSet<> _soNeeded; /// @} - std::unique_ptr> _scriptFile; private: static StringRef maybeGetSOName(Node *node); @@ -206,8 +202,7 @@ template OutputELFWriter::OutputELFWriter(ELFLinkingContext &ctx, TargetLayout &layout) - : _ctx(ctx), _targetHandler(ctx.getTargetHandler()), _layout(layout), - _scriptFile(new RuntimeFile(ctx, "Linker script runtime")) {} + : _ctx(ctx), _targetHandler(ctx.getTargetHandler()), _layout(layout) {} template void OutputELFWriter::buildChunks(const File &file) { @@ -355,13 +350,6 @@ _shdrtab->updateSection(section); } -template void OutputELFWriter::addDefaultAtoms() { - const llvm::StringSet<> &symbols = - _ctx.linkerScriptSema().getScriptDefinedSymbols(); - for (auto &sym : symbols) - _scriptFile->addAbsoluteAtom(sym.getKey()); -} - template void OutputELFWriter::createImplicitFiles( std::vector> &result) { @@ -373,7 +361,11 @@ _ctx.setUndefinesResolver( llvm::make_unique>(_ctx, std::move(callback))); // Add script defined symbols - result.push_back(std::move(_scriptFile)); + auto file = + llvm::make_unique>(_ctx, "Linker script runtime"); + for (auto &sym : this->_ctx.linkerScriptSema().getScriptDefinedSymbols()) + file->addAbsoluteAtom(sym.getKey()); + result.push_back(std::move(file)); } template Index: lib/ReaderWriter/ELF/X86/X86DynamicLibraryWriter.h =================================================================== --- lib/ReaderWriter/ELF/X86/X86DynamicLibraryWriter.h +++ lib/ReaderWriter/ELF/X86/X86DynamicLibraryWriter.h @@ -28,10 +28,6 @@ return DynamicLibraryWriter::finalizeDefaultAtomValues(); } - void addDefaultAtoms() override { - return DynamicLibraryWriter::addDefaultAtoms(); - } - private: class GOTFile : public SimpleFile { public: Index: lib/ReaderWriter/ELF/X86/X86ExecutableWriter.h =================================================================== --- lib/ReaderWriter/ELF/X86/X86ExecutableWriter.h +++ lib/ReaderWriter/ELF/X86/X86ExecutableWriter.h @@ -28,10 +28,6 @@ return ExecutableWriter::finalizeDefaultAtomValues(); } - void addDefaultAtoms() override { - return ExecutableWriter::addDefaultAtoms(); - } - private: X86LinkingContext &_ctx; TargetLayout &_layout; Index: lib/ReaderWriter/ELF/X86_64/X86_64DynamicLibraryWriter.h =================================================================== --- lib/ReaderWriter/ELF/X86_64/X86_64DynamicLibraryWriter.h +++ lib/ReaderWriter/ELF/X86_64/X86_64DynamicLibraryWriter.h @@ -30,10 +30,6 @@ return DynamicLibraryWriter::finalizeDefaultAtomValues(); } - void addDefaultAtoms() override { - return DynamicLibraryWriter::addDefaultAtoms(); - } - private: class GOTFile : public SimpleFile { public: Index: lib/ReaderWriter/ELF/X86_64/X86_64ExecutableWriter.h =================================================================== --- lib/ReaderWriter/ELF/X86_64/X86_64ExecutableWriter.h +++ lib/ReaderWriter/ELF/X86_64/X86_64ExecutableWriter.h @@ -37,10 +37,6 @@ return ExecutableWriter::finalizeDefaultAtomValues(); } - void addDefaultAtoms() override { - return ExecutableWriter::addDefaultAtoms(); - } - private: class GOTFile : public SimpleFile { public: