llvm-project/lld/lib/ReaderWriter/ELF/TargetHandler.h
Shankar Easwaran a96f3a3da4 [lld][InputGraph] Change the Resolver to use inputGraph
Changes :-

a) Functionality in InputGraph to insert Input elements at any position
b) Functionality in the Resolver to use nextFile
c) Move the functionality of assigning file ordinals to InputGraph
d) Changes all inputs to MemoryBuffers
e) Remove LinkerInput, InputFiles, ReaderArchive

llvm-svn: 192081
2013-10-07 02:47:09 +00:00

127 lines
3.7 KiB
C++

//===- 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/LLVM.h"
#include "lld/Core/LinkingContext.h"
#include "lld/ReaderWriter/ELFLinkingContext.h"
#include "llvm/ADT/Hashing.h"
#include "llvm/Support/FileOutputBuffer.h"
#include <memory>
#include <vector>
namespace lld {
namespace elf {
template <class ELFT> class ELFDefinedAtom;
template <class ELFT> class ELFReference;
class ELFWriter;
template <class ELFT> class ELFHeader;
template <class ELFT> class Section;
template <class ELFT> 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 ELFT> class TargetAtomHandler {
public:
typedef llvm::object::Elf_Shdr_Impl<ELFT> Elf_Shdr;
typedef llvm::object::Elf_Sym_Impl<ELFT> Elf_Sym;
virtual DefinedAtom::ContentType
contentType(const ELFDefinedAtom<ELFT> *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<ELFT> *atom) const {
return atom->permissions();
}
virtual int64_t getType(const Elf_Sym *sym) const {
return llvm::ELF::STT_NOTYPE;
}
virtual ~TargetAtomHandler() {}
};
template <class ELFT> class TargetRelocationHandler {
public:
virtual ErrorOr<void>
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 ELFT> 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 doesOverrideELFHeader() = 0;
/// Set the ELF Header information
virtual void setELFHeader(ELFHeader<ELFT> *elfHeader) = 0;
/// TargetLayout
virtual TargetLayout<ELFT> &targetLayout() = 0;
/// TargetAtomHandler
virtual TargetAtomHandler<ELFT> &targetAtomHandler() = 0;
virtual const TargetRelocationHandler<ELFT> &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<ELFT> *section) = 0;
/// \brief add new symbol file
virtual bool createImplicitFiles(std::vector<std::unique_ptr<File> > &) = 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