From f7a8da33845880bfcfed4e7d9afcd993b9cb988e Mon Sep 17 00:00:00 2001 From: Shankar Easwaran Date: Thu, 12 Feb 2015 05:02:41 +0000 Subject: [PATCH] [ELF] Add LinkingContext to the ELFReader. This adds the LinkingContext parameter to the ELFReader. Previously the flags in that were needed in the Context was passed to the ELFReader, this made it very hard to access data structures in the LinkingContext when reading an ELF file. This change makes the ELFReader more flexible so that required parameters can be grabbed directly from the LinkingContext. Future patches make use of the changes. There is no change in functionality though. llvm-svn: 228905 --- lld/include/lld/Core/Reader.h | 5 ++-- lld/include/lld/ReaderWriter/ELFLinkingContext.h | 4 ++-- lld/lib/Driver/GnuLdDriver.cpp | 7 ++---- lld/lib/ReaderWriter/ELF/AArch64/AArch64ELFFile.h | 8 +++---- .../ReaderWriter/ELF/AArch64/AArch64ELFReader.h | 28 +++++++++++----------- .../ELF/AArch64/AArch64TargetHandler.h | 8 +++---- lld/lib/ReaderWriter/ELF/ARM/ARMELFFile.h | 8 +++---- lld/lib/ReaderWriter/ELF/ARM/ARMELFReader.h | 26 ++++++++++---------- lld/lib/ReaderWriter/ELF/ARM/ARMTargetHandler.h | 8 +++---- lld/lib/ReaderWriter/ELF/DefaultTargetHandler.h | 4 ++-- lld/lib/ReaderWriter/ELF/DynamicFile.h | 14 +++++------ lld/lib/ReaderWriter/ELF/DynamicLibraryWriter.h | 3 +-- lld/lib/ReaderWriter/ELF/ELFFile.h | 24 +++++++++++-------- lld/lib/ReaderWriter/ELF/ELFReader.h | 20 ++++++++-------- lld/lib/ReaderWriter/ELF/ExecutableWriter.h | 2 +- lld/lib/ReaderWriter/ELF/Hexagon/HexagonELFFile.h | 8 +++---- .../ReaderWriter/ELF/Hexagon/HexagonELFReader.h | 28 +++++++++++----------- .../ELF/Hexagon/HexagonExecutableAtoms.h | 2 +- .../ELF/Hexagon/HexagonTargetHandler.h | 10 ++++---- lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.h | 8 +++---- lld/lib/ReaderWriter/ELF/Mips/MipsELFReader.h | 28 ++++++++++++---------- lld/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h | 12 ++++------ lld/lib/ReaderWriter/ELF/Reader.cpp | 12 ++++------ lld/lib/ReaderWriter/ELF/TargetHandler.h | 4 ++-- lld/lib/ReaderWriter/ELF/X86/X86ELFFile.h | 8 +++---- lld/lib/ReaderWriter/ELF/X86/X86ELFReader.h | 26 ++++++++++---------- lld/lib/ReaderWriter/ELF/X86/X86TargetHandler.h | 8 +++---- lld/lib/ReaderWriter/ELF/X86_64/X86_64ELFFile.h | 8 +++---- lld/lib/ReaderWriter/ELF/X86_64/X86_64ELFReader.h | 27 +++++++++++---------- .../ReaderWriter/ELF/X86_64/X86_64TargetHandler.h | 8 +++---- 30 files changed, 186 insertions(+), 180 deletions(-) diff --git a/lld/include/lld/Core/Reader.h b/lld/include/lld/Core/Reader.h index 0b9ee3f..ac90c5a 100644 --- a/lld/include/lld/Core/Reader.h +++ b/lld/include/lld/Core/Reader.h @@ -122,9 +122,8 @@ public: void addSupportCOFFObjects(PECOFFLinkingContext &); void addSupportCOFFImportLibraries(PECOFFLinkingContext &); void addSupportMachOObjects(MachOLinkingContext &); - void addSupportELFObjects(bool atomizeStrings, TargetHandlerBase *handler); - void addSupportELFDynamicSharedObjects(bool useShlibUndefines, - TargetHandlerBase *handler); + void addSupportELFObjects(ELFLinkingContext &); + void addSupportELFDynamicSharedObjects(ELFLinkingContext &); /// To convert between kind values and names, the registry walks the list /// of registered kind tables. Each table is a zero terminated array of diff --git a/lld/include/lld/ReaderWriter/ELFLinkingContext.h b/lld/include/lld/ReaderWriter/ELFLinkingContext.h index 61edb26..331330b 100644 --- a/lld/include/lld/ReaderWriter/ELFLinkingContext.h +++ b/lld/include/lld/ReaderWriter/ELFLinkingContext.h @@ -38,9 +38,9 @@ public: virtual ~TargetHandlerBase() {} virtual void registerRelocationNames(Registry &) = 0; - virtual std::unique_ptr getObjReader(bool) = 0; + virtual std::unique_ptr getObjReader() = 0; - virtual std::unique_ptr getDSOReader(bool) = 0; + virtual std::unique_ptr getDSOReader() = 0; virtual std::unique_ptr getWriter() = 0; }; diff --git a/lld/lib/Driver/GnuLdDriver.cpp b/lld/lib/Driver/GnuLdDriver.cpp index ebc1bf2..3220241 100644 --- a/lld/lib/Driver/GnuLdDriver.cpp +++ b/lld/lib/Driver/GnuLdDriver.cpp @@ -587,15 +587,12 @@ bool GnuLdDriver::parse(int argc, const char *argv[], } // Register possible input file parsers. - ctx->registry().addSupportELFObjects( - ctx->mergeCommonStrings(), - ctx->targetHandler()); + ctx->registry().addSupportELFObjects(*ctx); ctx->registry().addSupportArchives(ctx->logInputFiles()); ctx->registry().addSupportYamlFiles(); ctx->registry().addSupportNativeObjects(); if (ctx->allowLinkWithDynamicLibraries()) - ctx->registry().addSupportELFDynamicSharedObjects( - ctx->useShlibUndefines(), ctx->targetHandler()); + ctx->registry().addSupportELFDynamicSharedObjects(*ctx); std::stack groupStack; int numfiles = 0; diff --git a/lld/lib/ReaderWriter/ELF/AArch64/AArch64ELFFile.h b/lld/lib/ReaderWriter/ELF/AArch64/AArch64ELFFile.h index 2f099dc..9d5207c 100644 --- a/lld/lib/ReaderWriter/ELF/AArch64/AArch64ELFFile.h +++ b/lld/lib/ReaderWriter/ELF/AArch64/AArch64ELFFile.h @@ -19,13 +19,13 @@ class AArch64LinkingContext; template class AArch64ELFFile : public ELFFile { public: - AArch64ELFFile(std::unique_ptr mb, bool atomizeStrings) - : ELFFile(std::move(mb), atomizeStrings) {} + AArch64ELFFile(std::unique_ptr mb, AArch64LinkingContext &ctx) + : ELFFile(std::move(mb), ctx) {} static ErrorOr> - create(std::unique_ptr mb, bool atomizeStrings) { + create(std::unique_ptr mb, AArch64LinkingContext &ctx) { return std::unique_ptr>( - new AArch64ELFFile(std::move(mb), atomizeStrings)); + new AArch64ELFFile(std::move(mb), ctx)); } }; diff --git a/lld/lib/ReaderWriter/ELF/AArch64/AArch64ELFReader.h b/lld/lib/ReaderWriter/ELF/AArch64/AArch64ELFReader.h index 1487981..05f312d 100644 --- a/lld/lib/ReaderWriter/ELF/AArch64/AArch64ELFReader.h +++ b/lld/lib/ReaderWriter/ELF/AArch64/AArch64ELFReader.h @@ -23,9 +23,8 @@ struct AArch64DynamicFileCreateELFTraits { template static result_type create(std::unique_ptr mb, - bool useUndefines) { - return lld::elf::AArch64DynamicFile::create(std::move(mb), - useUndefines); + AArch64LinkingContext &ctx) { + return lld::elf::AArch64DynamicFile::create(std::move(mb), ctx); } }; @@ -34,26 +33,27 @@ struct AArch64ELFFileCreateELFTraits { template static result_type create(std::unique_ptr mb, - bool atomizeStrings) { - return lld::elf::AArch64ELFFile::create(std::move(mb), - atomizeStrings); + AArch64LinkingContext &ctx) { + return lld::elf::AArch64ELFFile::create(std::move(mb), ctx); } }; class AArch64ELFObjectReader - : public ELFObjectReader { + : public ELFObjectReader { public: - AArch64ELFObjectReader(bool atomizeStrings) - : ELFObjectReader( - atomizeStrings, llvm::ELF::EM_AARCH64) {} + AArch64ELFObjectReader(AArch64LinkingContext &ctx) + : ELFObjectReader(ctx, llvm::ELF::EM_AARCH64) {} }; class AArch64ELFDSOReader - : public ELFDSOReader { + : public ELFDSOReader { public: - AArch64ELFDSOReader(bool useUndefines) - : ELFDSOReader( - useUndefines, llvm::ELF::EM_AARCH64) {} + AArch64ELFDSOReader(AArch64LinkingContext &ctx) + : ELFDSOReader(ctx, llvm::ELF::EM_AARCH64) {} }; } // namespace elf diff --git a/lld/lib/ReaderWriter/ELF/AArch64/AArch64TargetHandler.h b/lld/lib/ReaderWriter/ELF/AArch64/AArch64TargetHandler.h index 85afefb..4eb6786 100644 --- a/lld/lib/ReaderWriter/ELF/AArch64/AArch64TargetHandler.h +++ b/lld/lib/ReaderWriter/ELF/AArch64/AArch64TargetHandler.h @@ -41,12 +41,12 @@ public: return *(_AArch64RelocationHandler.get()); } - std::unique_ptr getObjReader(bool atomizeStrings) override { - return std::unique_ptr(new AArch64ELFObjectReader(atomizeStrings)); + std::unique_ptr getObjReader() override { + return std::unique_ptr(new AArch64ELFObjectReader(_context)); } - std::unique_ptr getDSOReader(bool useShlibUndefines) override { - return std::unique_ptr(new AArch64ELFDSOReader(useShlibUndefines)); + std::unique_ptr getDSOReader() override { + return std::unique_ptr(new AArch64ELFDSOReader(_context)); } std::unique_ptr getWriter() override; diff --git a/lld/lib/ReaderWriter/ELF/ARM/ARMELFFile.h b/lld/lib/ReaderWriter/ELF/ARM/ARMELFFile.h index 7197cb8..bc5ee35 100644 --- a/lld/lib/ReaderWriter/ELF/ARM/ARMELFFile.h +++ b/lld/lib/ReaderWriter/ELF/ARM/ARMELFFile.h @@ -52,13 +52,13 @@ public: template class ARMELFFile : public ELFFile { public: - ARMELFFile(std::unique_ptr mb, bool atomizeStrings) - : ELFFile(std::move(mb), atomizeStrings) {} + ARMELFFile(std::unique_ptr mb, ARMLinkingContext &ctx) + : ELFFile(std::move(mb), ctx) {} static ErrorOr> - create(std::unique_ptr mb, bool atomizeStrings) { + create(std::unique_ptr mb, ARMLinkingContext &ctx) { return std::unique_ptr>( - new ARMELFFile(std::move(mb), atomizeStrings)); + new ARMELFFile(std::move(mb), ctx)); } private: diff --git a/lld/lib/ReaderWriter/ELF/ARM/ARMELFReader.h b/lld/lib/ReaderWriter/ELF/ARM/ARMELFReader.h index 9adff8f..31af531 100644 --- a/lld/lib/ReaderWriter/ELF/ARM/ARMELFReader.h +++ b/lld/lib/ReaderWriter/ELF/ARM/ARMELFReader.h @@ -23,8 +23,8 @@ struct ARMDynamicFileCreateELFTraits { template static result_type create(std::unique_ptr mb, - bool useUndefines) { - return lld::elf::ARMDynamicFile::create(std::move(mb), useUndefines); + ARMLinkingContext &ctx) { + return lld::elf::ARMDynamicFile::create(std::move(mb), ctx); } }; @@ -33,25 +33,27 @@ struct ARMELFFileCreateELFTraits { template static result_type create(std::unique_ptr mb, - bool atomizeStrings) { - return lld::elf::ARMELFFile::create(std::move(mb), atomizeStrings); + ARMLinkingContext &ctx) { + return lld::elf::ARMELFFile::create(std::move(mb), ctx); } }; class ARMELFObjectReader - : public ELFObjectReader { + : public ELFObjectReader { public: - ARMELFObjectReader(bool atomizeStrings) - : ELFObjectReader( - atomizeStrings, llvm::ELF::EM_ARM) {} + ARMELFObjectReader(ARMLinkingContext &ctx) + : ELFObjectReader(ctx, llvm::ELF::EM_ARM) {} }; class ARMELFDSOReader - : public ELFDSOReader { + : public ELFDSOReader { public: - ARMELFDSOReader(bool useUndefines) - : ELFDSOReader( - useUndefines, llvm::ELF::EM_ARM) {} + ARMELFDSOReader(ARMLinkingContext &ctx) + : ELFDSOReader(ctx, llvm::ELF::EM_ARM) {} }; } // namespace elf diff --git a/lld/lib/ReaderWriter/ELF/ARM/ARMTargetHandler.h b/lld/lib/ReaderWriter/ELF/ARM/ARMTargetHandler.h index 02b00b0..223f27d 100644 --- a/lld/lib/ReaderWriter/ELF/ARM/ARMTargetHandler.h +++ b/lld/lib/ReaderWriter/ELF/ARM/ARMTargetHandler.h @@ -45,12 +45,12 @@ public: return *(_armRelocationHandler.get()); } - std::unique_ptr getObjReader(bool atomizeStrings) override { - return std::unique_ptr(new ARMELFObjectReader(atomizeStrings)); + std::unique_ptr getObjReader() override { + return std::unique_ptr(new ARMELFObjectReader(_context)); } - std::unique_ptr getDSOReader(bool useShlibUndefines) override { - return std::unique_ptr(new ARMELFDSOReader(useShlibUndefines)); + std::unique_ptr getDSOReader() override { + return std::unique_ptr(new ARMELFDSOReader(_context)); } std::unique_ptr getWriter() override; diff --git a/lld/lib/ReaderWriter/ELF/DefaultTargetHandler.h b/lld/lib/ReaderWriter/ELF/DefaultTargetHandler.h index 1135d1c..16668f2 100644 --- a/lld/lib/ReaderWriter/ELF/DefaultTargetHandler.h +++ b/lld/lib/ReaderWriter/ELF/DefaultTargetHandler.h @@ -26,9 +26,9 @@ class DefaultTargetHandler : public TargetHandler { public: const TargetRelocationHandler &getRelocationHandler() const = 0; - virtual std::unique_ptr getObjReader(bool atomizeStrings) = 0; + virtual std::unique_ptr getObjReader() = 0; - virtual std::unique_ptr getDSOReader(bool useShlibUndefines) = 0; + virtual std::unique_ptr getDSOReader() = 0; virtual std::unique_ptr getWriter() = 0; }; diff --git a/lld/lib/ReaderWriter/ELF/DynamicFile.h b/lld/lib/ReaderWriter/ELF/DynamicFile.h index a82c46b..8a30d9fd 100644 --- a/lld/lib/ReaderWriter/ELF/DynamicFile.h +++ b/lld/lib/ReaderWriter/ELF/DynamicFile.h @@ -22,7 +22,7 @@ namespace elf { template class DynamicFile : public SharedLibraryFile { public: static ErrorOr> - create(std::unique_ptr mb, bool useShlibUndefines); + create(std::unique_ptr mb, ELFLinkingContext &ctx); const SharedLibraryAtom *exports(StringRef name, bool dataSymbolOnly) const override { @@ -84,9 +84,9 @@ protected: } private: - DynamicFile(std::unique_ptr mb, bool useShlibUndefines) - : SharedLibraryFile(mb->getBufferIdentifier()), - _mb(std::move(mb)), _useShlibUndefines(useShlibUndefines) {} + DynamicFile(std::unique_ptr mb, ELFLinkingContext &ctx) + : SharedLibraryFile(mb->getBufferIdentifier()), _mb(std::move(mb)), + _ctx(ctx), _useShlibUndefines(ctx.useShlibUndefines()) {} mutable llvm::BumpPtrAllocator _alloc; std::unique_ptr> _objFile; @@ -100,6 +100,7 @@ private: }; std::unique_ptr _mb; + ELFLinkingContext &_ctx; bool _useShlibUndefines; mutable std::unordered_map _nameToSym; }; @@ -107,9 +108,8 @@ private: template ErrorOr>> DynamicFile::create(std::unique_ptr mb, - bool useShlibUndefines) { - return std::unique_ptr( - new DynamicFile(std::move(mb), useShlibUndefines)); + ELFLinkingContext &ctx) { + return std::unique_ptr(new DynamicFile(std::move(mb), ctx)); } } // end namespace elf diff --git a/lld/lib/ReaderWriter/ELF/DynamicLibraryWriter.h b/lld/lib/ReaderWriter/ELF/DynamicLibraryWriter.h index 84d6ac4..62fa6a7 100644 --- a/lld/lib/ReaderWriter/ELF/DynamicLibraryWriter.h +++ b/lld/lib/ReaderWriter/ELF/DynamicLibraryWriter.h @@ -25,8 +25,7 @@ class DynamicLibraryWriter; template class DynamicLibraryWriter : public OutputELFWriter { public: - DynamicLibraryWriter(const ELFLinkingContext &context, - TargetLayout &layout) + DynamicLibraryWriter(ELFLinkingContext &context, TargetLayout &layout) : OutputELFWriter(context, layout), _runtimeFile(new CRuntimeFile(context)) {} diff --git a/lld/lib/ReaderWriter/ELF/ELFFile.h b/lld/lib/ReaderWriter/ELF/ELFFile.h index aca1fd5..7265efb 100644 --- a/lld/lib/ReaderWriter/ELF/ELFFile.h +++ b/lld/lib/ReaderWriter/ELF/ELFFile.h @@ -115,17 +115,18 @@ template class ELFFile : public File { typedef typename MergedSectionMapT::iterator MergedSectionMapIterT; public: - ELFFile(StringRef name) - : File(name, kindObject), _ordinal(0), _doStringsMerge(false) { + ELFFile(StringRef name, ELFLinkingContext &ctx) + : File(name, kindObject), _ordinal(0), + _doStringsMerge(ctx.mergeCommonStrings()), _ctx(ctx) { setLastError(std::error_code()); } - ELFFile(std::unique_ptr mb, bool atomizeStrings = false) + ELFFile(std::unique_ptr mb, ELFLinkingContext &ctx) : File(mb->getBufferIdentifier(), kindObject), _mb(std::move(mb)), - _ordinal(0), _doStringsMerge(atomizeStrings) {} + _ordinal(0), _doStringsMerge(ctx.mergeCommonStrings()), _ctx(ctx) {} static ErrorOr> - create(std::unique_ptr mb, bool atomizeStrings); + create(std::unique_ptr mb, ELFLinkingContext &ctx); virtual Reference::KindArch kindArch(); @@ -360,6 +361,9 @@ protected: /// \brief the cached options relevant while reading the ELF File bool _doStringsMerge; + + /// \brief The LinkingContext. + ELFLinkingContext &_ctx; }; /// \brief All atoms are owned by a File. To add linker specific atoms @@ -370,8 +374,8 @@ protected: template class CRuntimeFile : public ELFFile { public: typedef llvm::object::Elf_Sym_Impl Elf_Sym; - CRuntimeFile(const ELFLinkingContext &context, StringRef name = "C runtime") - : ELFFile(name) {} + CRuntimeFile(ELFLinkingContext &context, StringRef name = "C runtime") + : ELFFile(name, context) {} /// \brief add a global absolute atom virtual Atom *addAbsoluteAtom(StringRef symbolName) { @@ -411,9 +415,9 @@ public: template ErrorOr>> -ELFFile::create(std::unique_ptr mb, bool atomizeStrings) { - std::unique_ptr> file( - new ELFFile(std::move(mb), atomizeStrings)); +ELFFile::create(std::unique_ptr mb, + ELFLinkingContext &ctx) { + std::unique_ptr> file(new ELFFile(std::move(mb), ctx)); return std::move(file); } diff --git a/lld/lib/ReaderWriter/ELF/ELFReader.h b/lld/lib/ReaderWriter/ELF/ELFReader.h index 58e2bcc..43f2181 100644 --- a/lld/lib/ReaderWriter/ELF/ELFReader.h +++ b/lld/lib/ReaderWriter/ELF/ELFReader.h @@ -18,13 +18,13 @@ namespace lld { namespace elf { -template +template class ELFObjectReader : public Reader { public: typedef llvm::object::Elf_Ehdr_Impl Elf_Ehdr; - ELFObjectReader(bool atomizeStrings, uint64_t machine) - : _atomizeStrings(atomizeStrings), _machine(machine) {} + ELFObjectReader(ContextT &ctx, uint64_t machine) + : _ctx(ctx), _machine(machine) {} bool canParse(file_magic magic, StringRef, const MemoryBuffer &buf) const override { @@ -39,7 +39,7 @@ public: 1ULL << llvm::countTrailingZeros(uintptr_t(mb->getBufferStart())); auto f = createELF(llvm::object::getElfArchType(mb->getBuffer()), - maxAlignment, std::move(mb), _atomizeStrings); + maxAlignment, std::move(mb), _ctx); if (std::error_code ec = f.getError()) return ec; result.push_back(std::move(*f)); @@ -53,17 +53,17 @@ public: } protected: - bool _atomizeStrings; + ContextT &_ctx; uint64_t _machine; }; -template +template class ELFDSOReader : public Reader { public: typedef llvm::object::Elf_Ehdr_Impl Elf_Ehdr; - ELFDSOReader(bool useUndefines, uint64_t machine) - : _useUndefines(useUndefines), _machine(machine) {} + ELFDSOReader(ContextT &ctx, uint64_t machine) + : _ctx(ctx), _machine(machine) {} bool canParse(file_magic magic, StringRef, const MemoryBuffer &buf) const override { @@ -78,7 +78,7 @@ public: 1ULL << llvm::countTrailingZeros(uintptr_t(mb->getBufferStart())); auto f = createELF(llvm::object::getElfArchType(mb->getBuffer()), - maxAlignment, std::move(mb), _useUndefines); + maxAlignment, std::move(mb), _ctx); if (std::error_code ec = f.getError()) return ec; result.push_back(std::move(*f)); @@ -92,7 +92,7 @@ public: } protected: - bool _useUndefines; + ContextT &_ctx; uint64_t _machine; }; diff --git a/lld/lib/ReaderWriter/ELF/ExecutableWriter.h b/lld/lib/ReaderWriter/ELF/ExecutableWriter.h index caec738..6b3b46a 100644 --- a/lld/lib/ReaderWriter/ELF/ExecutableWriter.h +++ b/lld/lib/ReaderWriter/ELF/ExecutableWriter.h @@ -25,7 +25,7 @@ class ExecutableWriter; template class ExecutableWriter : public OutputELFWriter { public: - ExecutableWriter(const ELFLinkingContext &context, TargetLayout &layout) + ExecutableWriter(ELFLinkingContext &context, TargetLayout &layout) : OutputELFWriter(context, layout), _runtimeFile(new CRuntimeFile(context)) {} diff --git a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonELFFile.h b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonELFFile.h index 2bea795..ab0b9b4 100644 --- a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonELFFile.h +++ b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonELFFile.h @@ -114,13 +114,13 @@ template class HexagonELFFile : public ELFFile { typedef llvm::object::Elf_Shdr_Impl Elf_Shdr; public: - HexagonELFFile(std::unique_ptr mb, bool atomizeStrings) - : ELFFile(std::move(mb), atomizeStrings) {} + HexagonELFFile(std::unique_ptr mb, HexagonLinkingContext &ctx) + : ELFFile(std::move(mb), ctx) {} static ErrorOr> - create(std::unique_ptr mb, bool atomizeStrings) { + create(std::unique_ptr mb, HexagonLinkingContext &ctx) { return std::unique_ptr>( - new HexagonELFFile(std::move(mb), atomizeStrings)); + new HexagonELFFile(std::move(mb), ctx)); } bool isCommonSymbol(const Elf_Sym *symbol) const override { diff --git a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonELFReader.h b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonELFReader.h index 3b98328..1a4f891 100644 --- a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonELFReader.h +++ b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonELFReader.h @@ -23,9 +23,8 @@ struct HexagonDynamicFileCreateELFTraits { template static result_type create(std::unique_ptr mb, - bool useUndefines) { - return lld::elf::HexagonDynamicFile::create(std::move(mb), - useUndefines); + HexagonLinkingContext &ctx) { + return lld::elf::HexagonDynamicFile::create(std::move(mb), ctx); } }; @@ -34,26 +33,27 @@ struct HexagonELFFileCreateELFTraits { template static result_type create(std::unique_ptr mb, - bool atomizeStrings) { - return lld::elf::HexagonELFFile::create(std::move(mb), - atomizeStrings); + HexagonLinkingContext &ctx) { + return lld::elf::HexagonELFFile::create(std::move(mb), ctx); } }; class HexagonELFObjectReader - : public ELFObjectReader { + : public ELFObjectReader { public: - HexagonELFObjectReader(bool atomizeStrings) - : ELFObjectReader( - atomizeStrings, llvm::ELF::EM_HEXAGON) {} + HexagonELFObjectReader(HexagonLinkingContext &ctx) + : ELFObjectReader(ctx, llvm::ELF::EM_HEXAGON) {} }; class HexagonELFDSOReader - : public ELFDSOReader { + : public ELFDSOReader { public: - HexagonELFDSOReader(bool useUndefines) - : ELFDSOReader( - useUndefines, llvm::ELF::EM_HEXAGON) {} + HexagonELFDSOReader(HexagonLinkingContext &ctx) + : ELFDSOReader(ctx, llvm::ELF::EM_HEXAGON) {} }; } // namespace elf diff --git a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonExecutableAtoms.h b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonExecutableAtoms.h index b3b20ed..47a0996 100644 --- a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonExecutableAtoms.h +++ b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonExecutableAtoms.h @@ -20,7 +20,7 @@ class HexagonLinkingContext; template class HexagonRuntimeFile : public CRuntimeFile { public: - HexagonRuntimeFile(const HexagonLinkingContext &context) + HexagonRuntimeFile(HexagonLinkingContext &context) : CRuntimeFile(context, "Hexagon runtime file") {} }; } // elf diff --git a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h index 8d53614..7c6a9c5 100644 --- a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h +++ b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h @@ -117,12 +117,14 @@ public: return *(_hexagonTargetLayout.get()); } - std::unique_ptr getObjReader(bool atomizeStrings) override { - return std::unique_ptr(new HexagonELFObjectReader(atomizeStrings)); + std::unique_ptr getObjReader() override { + return std::unique_ptr( + new HexagonELFObjectReader(_hexagonLinkingContext)); } - std::unique_ptr getDSOReader(bool useShlibUndefines) override { - return std::unique_ptr(new HexagonELFDSOReader(useShlibUndefines)); + std::unique_ptr getDSOReader() override { + return std::unique_ptr( + new HexagonELFDSOReader(_hexagonLinkingContext)); } std::unique_ptr getWriter() override; diff --git a/lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.h b/lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.h index 010493a..9a8ace1 100644 --- a/lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.h +++ b/lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.h @@ -80,13 +80,13 @@ public: template class MipsELFFile : public ELFFile { public: - MipsELFFile(std::unique_ptr mb, bool atomizeStrings) - : ELFFile(std::move(mb), atomizeStrings) {} + MipsELFFile(std::unique_ptr mb, MipsLinkingContext &ctx) + : ELFFile(std::move(mb), ctx) {} static ErrorOr> - create(std::unique_ptr mb, bool atomizeStrings) { + create(std::unique_ptr mb, MipsLinkingContext &ctx) { return std::unique_ptr>( - new MipsELFFile(std::move(mb), atomizeStrings)); + new MipsELFFile(std::move(mb), ctx)); } bool isPIC() const { diff --git a/lld/lib/ReaderWriter/ELF/Mips/MipsELFReader.h b/lld/lib/ReaderWriter/ELF/Mips/MipsELFReader.h index bd3b548..8b325b3 100644 --- a/lld/lib/ReaderWriter/ELF/Mips/MipsELFReader.h +++ b/lld/lib/ReaderWriter/ELF/Mips/MipsELFReader.h @@ -22,8 +22,8 @@ struct MipsELFFileCreateTraits { template static result_type create(std::unique_ptr mb, - bool atomizeStrings) { - return lld::elf::MipsELFFile::create(std::move(mb), atomizeStrings); + MipsLinkingContext &ctx) { + return lld::elf::MipsELFFile::create(std::move(mb), ctx); } }; @@ -32,19 +32,21 @@ struct MipsDynamicFileCreateELFTraits { template static result_type create(std::unique_ptr mb, - bool useUndefines) { - return lld::elf::MipsDynamicFile::create(std::move(mb), useUndefines); + MipsLinkingContext &ctx) { + return lld::elf::MipsDynamicFile::create(std::move(mb), ctx); } }; template class MipsELFObjectReader - : public ELFObjectReader { - typedef ELFObjectReader BaseReaderType; + : public ELFObjectReader { + typedef ELFObjectReader + BaseReaderType; public: - MipsELFObjectReader(MipsLinkingContext &ctx, bool atomizeStrings) - : BaseReaderType(atomizeStrings, llvm::ELF::EM_MIPS), + MipsELFObjectReader(MipsLinkingContext &ctx) + : BaseReaderType(ctx, llvm::ELF::EM_MIPS), _flagMerger(ctx.getELFFlagsMerger()) {} std::error_code @@ -62,12 +64,14 @@ private: template class MipsELFDSOReader - : public ELFDSOReader { - typedef ELFDSOReader BaseReaderType; + : public ELFDSOReader { + typedef ELFDSOReader + BaseReaderType; public: - MipsELFDSOReader(MipsLinkingContext &ctx, bool useUndefines) - : BaseReaderType(useUndefines, llvm::ELF::EM_MIPS), + MipsELFDSOReader(MipsLinkingContext &ctx) + : BaseReaderType(ctx, llvm::ELF::EM_MIPS), _flagMerger(ctx.getELFFlagsMerger()) {} std::error_code diff --git a/lld/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h b/lld/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h index 056f418..b3ed6ee 100644 --- a/lld/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h +++ b/lld/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h @@ -79,7 +79,7 @@ private: template class MipsRuntimeFile final : public CRuntimeFile { public: - MipsRuntimeFile(const MipsLinkingContext &ctx) + MipsRuntimeFile(MipsLinkingContext &ctx) : CRuntimeFile(ctx, "Mips runtime file") {} }; @@ -102,14 +102,12 @@ public: MipsTargetLayout &getTargetLayout() override { return *_targetLayout; } - std::unique_ptr getObjReader(bool atomizeStrings) override { - return std::unique_ptr( - new MipsELFObjectReader(_ctx, atomizeStrings)); + std::unique_ptr getObjReader() override { + return std::unique_ptr(new MipsELFObjectReader(_ctx)); } - std::unique_ptr getDSOReader(bool useShlibUndefines) override { - return std::unique_ptr( - new MipsELFDSOReader(_ctx, useShlibUndefines)); + std::unique_ptr getDSOReader() override { + return std::unique_ptr(new MipsELFDSOReader(_ctx)); } const TargetRelocationHandler &getRelocationHandler() const override { diff --git a/lld/lib/ReaderWriter/ELF/Reader.cpp b/lld/lib/ReaderWriter/ELF/Reader.cpp index 4952161..fc113d4 100644 --- a/lld/lib/ReaderWriter/ELF/Reader.cpp +++ b/lld/lib/ReaderWriter/ELF/Reader.cpp @@ -26,20 +26,18 @@ namespace lld { // architectures to be pulled into the linker. If we want to support making a // linker that only supports one ELF architecture, we'd need to change this // to have a different registration method for each architecture. -void Registry::addSupportELFObjects(bool atomizeStrings, - TargetHandlerBase *handler) { +void Registry::addSupportELFObjects(ELFLinkingContext &ctx) { // Tell registry about the ELF object file parser. - add(std::move(handler->getObjReader(atomizeStrings))); + add(std::move(ctx.targetHandler()->getObjReader())); // Tell registry about the relocation name to number mapping for this arch. - handler->registerRelocationNames(*this); + ctx.targetHandler()->registerRelocationNames(*this); } -void Registry::addSupportELFDynamicSharedObjects(bool useShlibUndefines, - TargetHandlerBase *handler) { +void Registry::addSupportELFDynamicSharedObjects(ELFLinkingContext &ctx) { // Tell registry about the ELF dynamic shared library file parser. - add(handler->getDSOReader(useShlibUndefines)); + add(ctx.targetHandler()->getDSOReader()); } } // end namespace lld diff --git a/lld/lib/ReaderWriter/ELF/TargetHandler.h b/lld/lib/ReaderWriter/ELF/TargetHandler.h index 21655d3..ca7a442 100644 --- a/lld/lib/ReaderWriter/ELF/TargetHandler.h +++ b/lld/lib/ReaderWriter/ELF/TargetHandler.h @@ -63,10 +63,10 @@ public: virtual const TargetRelocationHandler &getRelocationHandler() const = 0; /// How does the target deal with reading input files. - virtual std::unique_ptr getObjReader(bool) = 0; + virtual std::unique_ptr getObjReader() = 0; /// How does the target deal with reading dynamic libraries. - virtual std::unique_ptr getDSOReader(bool) = 0; + virtual std::unique_ptr getDSOReader() = 0; /// How does the target deal with writing ELF output. virtual std::unique_ptr getWriter() = 0; diff --git a/lld/lib/ReaderWriter/ELF/X86/X86ELFFile.h b/lld/lib/ReaderWriter/ELF/X86/X86ELFFile.h index cee2509..621c38c 100644 --- a/lld/lib/ReaderWriter/ELF/X86/X86ELFFile.h +++ b/lld/lib/ReaderWriter/ELF/X86/X86ELFFile.h @@ -19,13 +19,13 @@ class X86LinkingContext; template class X86ELFFile : public ELFFile { public: - X86ELFFile(std::unique_ptr mb, bool atomizeStrings) - : ELFFile(std::move(mb), atomizeStrings) {} + X86ELFFile(std::unique_ptr mb, X86LinkingContext &ctx) + : ELFFile(std::move(mb), ctx) {} static ErrorOr> - create(std::unique_ptr mb, bool atomizeStrings) { + create(std::unique_ptr mb, X86LinkingContext &ctx) { return std::unique_ptr>( - new X86ELFFile(std::move(mb), atomizeStrings)); + new X86ELFFile(std::move(mb), ctx)); } }; diff --git a/lld/lib/ReaderWriter/ELF/X86/X86ELFReader.h b/lld/lib/ReaderWriter/ELF/X86/X86ELFReader.h index dcea77f..96186c5 100644 --- a/lld/lib/ReaderWriter/ELF/X86/X86ELFReader.h +++ b/lld/lib/ReaderWriter/ELF/X86/X86ELFReader.h @@ -23,8 +23,8 @@ struct X86DynamicFileCreateELFTraits { template static result_type create(std::unique_ptr mb, - bool useUndefines) { - return lld::elf::X86DynamicFile::create(std::move(mb), useUndefines); + X86LinkingContext &ctx) { + return lld::elf::X86DynamicFile::create(std::move(mb), ctx); } }; @@ -33,25 +33,27 @@ struct X86ELFFileCreateELFTraits { template static result_type create(std::unique_ptr mb, - bool atomizeStrings) { - return lld::elf::X86ELFFile::create(std::move(mb), atomizeStrings); + X86LinkingContext &ctx) { + return lld::elf::X86ELFFile::create(std::move(mb), ctx); } }; class X86ELFObjectReader - : public ELFObjectReader { + : public ELFObjectReader { public: - X86ELFObjectReader(bool atomizeStrings) - : ELFObjectReader( - atomizeStrings, llvm::ELF::EM_386) {} + X86ELFObjectReader(X86LinkingContext &ctx) + : ELFObjectReader(ctx, llvm::ELF::EM_386) {} }; class X86ELFDSOReader - : public ELFDSOReader { + : public ELFDSOReader { public: - X86ELFDSOReader(bool useUndefines) - : ELFDSOReader( - useUndefines, llvm::ELF::EM_386) {} + X86ELFDSOReader(X86LinkingContext &ctx) + : ELFDSOReader(ctx, llvm::ELF::EM_386) {} }; } // namespace elf diff --git a/lld/lib/ReaderWriter/ELF/X86/X86TargetHandler.h b/lld/lib/ReaderWriter/ELF/X86/X86TargetHandler.h index e5866e1c..6c40267 100644 --- a/lld/lib/ReaderWriter/ELF/X86/X86TargetHandler.h +++ b/lld/lib/ReaderWriter/ELF/X86/X86TargetHandler.h @@ -41,12 +41,12 @@ public: return *(_x86RelocationHandler.get()); } - std::unique_ptr getObjReader(bool atomizeStrings) override { - return std::unique_ptr(new X86ELFObjectReader(atomizeStrings)); + std::unique_ptr getObjReader() override { + return std::unique_ptr(new X86ELFObjectReader(_x86LinkingContext)); } - std::unique_ptr getDSOReader(bool useShlibUndefines) override { - return std::unique_ptr(new X86ELFDSOReader(useShlibUndefines)); + std::unique_ptr getDSOReader() override { + return std::unique_ptr(new X86ELFDSOReader(_x86LinkingContext)); } std::unique_ptr getWriter() override; diff --git a/lld/lib/ReaderWriter/ELF/X86_64/X86_64ELFFile.h b/lld/lib/ReaderWriter/ELF/X86_64/X86_64ELFFile.h index bf1721c..d43840a 100644 --- a/lld/lib/ReaderWriter/ELF/X86_64/X86_64ELFFile.h +++ b/lld/lib/ReaderWriter/ELF/X86_64/X86_64ELFFile.h @@ -19,13 +19,13 @@ class X86_64LinkingContext; template class X86_64ELFFile : public ELFFile { public: - X86_64ELFFile(std::unique_ptr mb, bool atomizeStrings) - : ELFFile(std::move(mb), atomizeStrings) {} + X86_64ELFFile(std::unique_ptr mb, X86_64LinkingContext &ctx) + : ELFFile(std::move(mb), ctx) {} static ErrorOr> - create(std::unique_ptr mb, bool atomizeStrings) { + create(std::unique_ptr mb, X86_64LinkingContext &ctx) { return std::unique_ptr>( - new X86_64ELFFile(std::move(mb), atomizeStrings)); + new X86_64ELFFile(std::move(mb), ctx)); } }; diff --git a/lld/lib/ReaderWriter/ELF/X86_64/X86_64ELFReader.h b/lld/lib/ReaderWriter/ELF/X86_64/X86_64ELFReader.h index 7877545..9b1284c 100644 --- a/lld/lib/ReaderWriter/ELF/X86_64/X86_64ELFReader.h +++ b/lld/lib/ReaderWriter/ELF/X86_64/X86_64ELFReader.h @@ -23,9 +23,8 @@ struct X86_64DynamicFileCreateELFTraits { template static result_type create(std::unique_ptr mb, - bool useUndefines) { - return lld::elf::X86_64DynamicFile::create(std::move(mb), - useUndefines); + X86_64LinkingContext &ctx) { + return lld::elf::X86_64DynamicFile::create(std::move(mb), ctx); } }; @@ -34,25 +33,27 @@ struct X86_64ELFFileCreateELFTraits { template static result_type create(std::unique_ptr mb, - bool atomizeStrings) { - return lld::elf::X86_64ELFFile::create(std::move(mb), atomizeStrings); + X86_64LinkingContext &ctx) { + return lld::elf::X86_64ELFFile::create(std::move(mb), ctx); } }; class X86_64ELFObjectReader - : public ELFObjectReader { + : public ELFObjectReader { public: - X86_64ELFObjectReader(bool atomizeStrings) - : ELFObjectReader( - atomizeStrings, llvm::ELF::EM_X86_64) {} + X86_64ELFObjectReader(X86_64LinkingContext &ctx) + : ELFObjectReader(ctx, llvm::ELF::EM_X86_64) {} }; class X86_64ELFDSOReader - : public ELFDSOReader { + : public ELFDSOReader { public: - X86_64ELFDSOReader(bool useUndefines) - : ELFDSOReader( - useUndefines, llvm::ELF::EM_X86_64) {} + X86_64ELFDSOReader(X86_64LinkingContext &ctx) + : ELFDSOReader(ctx, llvm::ELF::EM_X86_64) {} }; } // namespace elf diff --git a/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h b/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h index fdbf17d..a8ab3a5 100644 --- a/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h +++ b/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h @@ -42,12 +42,12 @@ public: return *(_x86_64RelocationHandler.get()); } - std::unique_ptr getObjReader(bool atomizeStrings) override { - return std::unique_ptr(new X86_64ELFObjectReader(atomizeStrings)); + std::unique_ptr getObjReader() override { + return std::unique_ptr(new X86_64ELFObjectReader(_context)); } - std::unique_ptr getDSOReader(bool useShlibUndefines) override { - return std::unique_ptr(new X86_64ELFDSOReader(useShlibUndefines)); + std::unique_ptr getDSOReader() override { + return std::unique_ptr(new X86_64ELFDSOReader(_context)); } std::unique_ptr getWriter() override; -- 2.7.4