//===- lib/ReaderWriter/ELF/TargetHandler.h -------------------------------===// // // The LLVM Linker // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// /// /// \file /// \brief These interfaces provide target specific hooks to change the linker's /// behaivor. /// //===----------------------------------------------------------------------===// #ifndef LLD_READER_WRITER_ELF_TARGET_HANDLER_H #define LLD_READER_WRITER_ELF_TARGET_HANDLER_H #include "Layout.h" #include "lld/Core/InputFiles.h" #include "lld/Core/LLVM.h" #include "lld/Core/LinkingContext.h" #include "lld/ReaderWriter/ELFLinkingContext.h" #include "llvm/ADT/Hashing.h" #include "llvm/Support/FileOutputBuffer.h" #include #include namespace lld { namespace elf { template class ELFDefinedAtom; template class ELFReference; class ELFWriter; template class Header; template class Section; template class TargetLayout; /// \brief The target registers a set of handlers for overriding target specific /// attributes for a DefinedAtom. The Reader uses this class to query for the /// type of atom and its permissions template class TargetAtomHandler { public: typedef llvm::object::Elf_Shdr_Impl Elf_Shdr; typedef llvm::object::Elf_Sym_Impl Elf_Sym; virtual DefinedAtom::ContentType contentType(const ELFDefinedAtom *atom) const { return atom->contentType(); } virtual DefinedAtom::ContentType contentType(const Elf_Shdr *shdr, const Elf_Sym *sym) const { return DefinedAtom::typeZeroFill; } virtual DefinedAtom::ContentPermissions contentPermissions(const ELFDefinedAtom *atom) const { return atom->permissions(); } virtual int64_t getType(const Elf_Sym *sym) const { return llvm::ELF::STT_NOTYPE; } virtual ~TargetAtomHandler() {} }; template class TargetRelocationHandler { public: virtual ErrorOr applyRelocation(ELFWriter &, llvm::FileOutputBuffer &, const lld::AtomLayout &, const Reference &) const = 0; virtual int64_t relocAddend(const Reference &)const { return 0; } virtual ~TargetRelocationHandler() {} }; /// \brief An interface to override functions that are provided by the /// the default ELF Layout template class TargetHandler : public TargetHandlerBase { public: TargetHandler(ELFLinkingContext &targetInfo) : _context(targetInfo) {} /// If the target overrides ELF header information, this API would /// return true, so that the target can set all fields specific to /// that target virtual bool doesOverrideHeader() = 0; /// Set the ELF Header information virtual void setHeaderInfo(Header *Header) = 0; /// TargetLayout virtual TargetLayout &targetLayout() = 0; /// TargetAtomHandler virtual TargetAtomHandler &targetAtomHandler() = 0; virtual const TargetRelocationHandler &getRelocationHandler() const = 0; /// Create a set of Default target sections that a target might needj virtual void createDefaultSections() = 0; /// \brief Add a section to the current Layout virtual void addSection(Section *section) = 0; /// \brief add new symbol file virtual void addFiles(InputFiles &) = 0; /// \brief Finalize the symbol values virtual void finalizeSymbolValues() = 0; /// \brief allocate Commons, some architectures may move small common /// symbols over to small data, this would also be used virtual void allocateCommons() = 0; protected: const ELFLinkingContext &_context; }; } // end namespace elf } // end namespace lld #endif