add targethandler hooks from Writer and cleanup
llvm-svn: 173904
diff --git a/lld/lib/ReaderWriter/ELF/Writer.cpp b/lld/lib/ReaderWriter/ELF/Writer.cpp
index 6e3bc43..15f167d 100644
--- a/lld/lib/ReaderWriter/ELF/Writer.cpp
+++ b/lld/lib/ReaderWriter/ELF/Writer.cpp
@@ -10,6 +10,7 @@
#include "lld/ReaderWriter/Writer.h"
#include "DefaultLayout.h"
+#include "TargetLayout.h"
#include "ExecutableAtoms.h"
#include "lld/ReaderWriter/ELFTargetInfo.h"
@@ -54,8 +55,9 @@
void createDefaultSections();
const ELFTargetInfo &_targetInfo;
+ TargetHandler<ELFT> &_targetHandler;
- typedef llvm::DenseMap<const Atom*, uint64_t> AtomToAddress;
+ typedef llvm::DenseMap<const Atom *, uint64_t> AtomToAddress;
std::unique_ptr<KindHandler> _referenceKindHandler;
AtomToAddress _atomToAddressMap;
llvm::BumpPtrAllocator _chunkAllocate;
@@ -72,17 +74,17 @@
//===----------------------------------------------------------------------===//
// ExecutableWriter
//===----------------------------------------------------------------------===//
-template<class ELFT>
+template <class ELFT>
ExecutableWriter<ELFT>::ExecutableWriter(const ELFTargetInfo &ti)
- : _targetInfo(ti)
- , _referenceKindHandler(KindHandler::makeHandler(
- ti.getTriple().getArch(), ti.isLittleEndian()))
- , _runtimeFile(ti) {
- _layout = new DefaultLayout<ELFT>(ti);
+ : _targetInfo(ti), _targetHandler(ti.getTargetHandler<ELFT>()),
+ _referenceKindHandler(KindHandler::makeHandler(ti.getTriple().getArch(),
+ ti.isLittleEndian())),
+ _runtimeFile(ti) {
+ _layout = new TargetLayout<ELFT>(_targetInfo);
}
-template<class ELFT>
-void ExecutableWriter<ELFT>::buildChunks(const File &file){
+template <class ELFT>
+void ExecutableWriter<ELFT>::buildChunks(const File &file) {
for (const DefinedAtom *definedAtom : file.defined() ) {
_layout->addAtom(definedAtom);
}
@@ -163,10 +165,12 @@
}
/// \brief Hook in lld to add CRuntime file
-template<class ELFT>
+template <class ELFT>
void ExecutableWriter<ELFT>::addFiles(InputFiles &inputFiles) {
addDefaultAtoms();
inputFiles.prependFile(_runtimeFile);
+ // Give a chance for the target to add atoms
+ _targetHandler.addFiles(inputFiles);
}
/// Finalize the value of all the absolute symbols that we
@@ -260,16 +264,21 @@
if (ec)
return ec;
- _Header->e_ident(ELF::EI_CLASS, _targetInfo.is64Bits() ? ELF::ELFCLASS64
- : ELF::ELFCLASS32);
- _Header->e_ident(ELF::EI_DATA, _targetInfo.isLittleEndian()
- ? ELF::ELFDATA2LSB : ELF::ELFDATA2MSB);
- _Header->e_ident(ELF::EI_VERSION, 1);
- _Header->e_ident(ELF::EI_OSABI, 0);
+ _Header->e_ident(ELF::EI_CLASS, _targetInfo.is64Bits() ? ELF::ELFCLASS64 :
+ ELF::ELFCLASS32);
+ _Header->e_ident(ELF::EI_DATA, _targetInfo.isLittleEndian() ?
+ ELF::ELFDATA2LSB : ELF::ELFDATA2MSB);
_Header->e_type(_targetInfo.getOutputType());
_Header->e_machine(_targetInfo.getOutputMachine());
- _Header->e_version(1);
- _Header->e_entry(0ULL);
+
+ if (!_targetHandler.doesOverrideHeader()) {
+ _Header->e_ident(ELF::EI_VERSION, 1);
+ _Header->e_ident(ELF::EI_OSABI, 0);
+ _Header->e_version(1);
+ } else {
+ // override the contents of the ELF Header
+ _targetHandler.setHeaderInfo(_Header);
+ }
_Header->e_phoff(_programHeader->fileOffset());
_Header->e_shoff(_shdrtab->fileOffset());
_Header->e_phentsize(_programHeader->entsize());
@@ -314,6 +323,9 @@
_shdrtab->setStringSection(_shstrtab);
_symtab->setStringSection(_strtab);
_layout->addSection(_shdrtab);
+
+ // give a chance for the target to add sections
+ _targetHandler.createDefaultSections();
}
} // namespace elf