summaryrefslogtreecommitdiffstats
path: root/lld/lib/ReaderWriter/ELF/Writer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lld/lib/ReaderWriter/ELF/Writer.cpp')
-rw-r--r--lld/lib/ReaderWriter/ELF/Writer.cpp55
1 files changed, 28 insertions, 27 deletions
diff --git a/lld/lib/ReaderWriter/ELF/Writer.cpp b/lld/lib/ReaderWriter/ELF/Writer.cpp
index 269607e2823..4472c6c983a 100644
--- a/lld/lib/ReaderWriter/ELF/Writer.cpp
+++ b/lld/lib/ReaderWriter/ELF/Writer.cpp
@@ -52,19 +52,20 @@ private:
void createDefaultSections();
+ llvm::BumpPtrAllocator _alloc;
+
const ELFTargetInfo &_targetInfo;
TargetHandler<ELFT> &_targetHandler;
typedef llvm::DenseMap<const Atom *, uint64_t> AtomToAddress;
AtomToAddress _atomToAddressMap;
- llvm::BumpPtrAllocator _chunkAllocate;
TargetLayout<ELFT> *_layout;
- Header<ELFT> *_Header;
- ProgramHeader<ELFT> *_programHeader;
- SymbolTable<ELFT> * _symtab;
- StringTable<ELFT> *_strtab;
- StringTable<ELFT> *_shstrtab;
- SectionHeader<ELFT> *_shdrtab;
+ LLD_UNIQUE_BUMP_PTR(Header<ELFT>) _Header;
+ LLD_UNIQUE_BUMP_PTR(ProgramHeader<ELFT>) _programHeader;
+ LLD_UNIQUE_BUMP_PTR(SymbolTable<ELFT>) _symtab;
+ LLD_UNIQUE_BUMP_PTR(StringTable<ELFT>) _strtab;
+ LLD_UNIQUE_BUMP_PTR(StringTable<ELFT>) _shstrtab;
+ LLD_UNIQUE_BUMP_PTR(SectionHeader<ELFT>) _shdrtab;
CRuntimeFile<ELFT> _runtimeFile;
};
@@ -282,7 +283,7 @@ ExecutableWriter<ELFT>::writeFile(const File &file, StringRef path) {
_Header->e_version(1);
} else {
// override the contents of the ELF Header
- _targetHandler.setHeaderInfo(_Header);
+ _targetHandler.setHeaderInfo(_Header.get());
}
_Header->e_phoff(_programHeader->fileOffset());
_Header->e_shoff(_shdrtab->fileOffset());
@@ -309,25 +310,25 @@ ExecutableWriter<ELFT>::writeFile(const File &file, StringRef path) {
template<class ELFT>
void ExecutableWriter<ELFT>::createDefaultSections() {
- _Header = new Header<ELFT>(_targetInfo);
- _programHeader = new ProgramHeader<ELFT>(_targetInfo);
- _layout->setHeader(_Header);
- _layout->setProgramHeader(_programHeader);
-
- _symtab = new SymbolTable<
- ELFT>(_targetInfo, ".symtab", DefaultLayout<ELFT>::ORDER_SYMBOL_TABLE);
- _strtab = new StringTable<
- ELFT>(_targetInfo, ".strtab", DefaultLayout<ELFT>::ORDER_STRING_TABLE);
- _shstrtab = new StringTable<ELFT>(
- _targetInfo, ".shstrtab", DefaultLayout<ELFT>::ORDER_SECTION_STRINGS);
- _shdrtab = new SectionHeader<
- ELFT>(_targetInfo, DefaultLayout<ELFT>::ORDER_SECTION_HEADERS);
- _layout->addSection(_symtab);
- _layout->addSection(_strtab);
- _layout->addSection(_shstrtab);
- _shdrtab->setStringSection(_shstrtab);
- _symtab->setStringSection(_strtab);
- _layout->addSection(_shdrtab);
+ _Header.reset(new (_alloc) Header<ELFT>(_targetInfo));
+ _programHeader.reset(new (_alloc) ProgramHeader<ELFT>(_targetInfo));
+ _layout->setHeader(_Header.get());
+ _layout->setProgramHeader(_programHeader.get());
+
+ _symtab.reset(new (_alloc) SymbolTable<ELFT>(
+ _targetInfo, ".symtab", DefaultLayout<ELFT>::ORDER_SYMBOL_TABLE));
+ _strtab.reset(new (_alloc) StringTable<ELFT>(
+ _targetInfo, ".strtab", DefaultLayout<ELFT>::ORDER_STRING_TABLE));
+ _shstrtab.reset(new (_alloc) StringTable<ELFT>(
+ _targetInfo, ".shstrtab", DefaultLayout<ELFT>::ORDER_SECTION_STRINGS));
+ _shdrtab.reset(new (_alloc) SectionHeader<ELFT>(
+ _targetInfo, DefaultLayout<ELFT>::ORDER_SECTION_HEADERS));
+ _layout->addSection(_symtab.get());
+ _layout->addSection(_strtab.get());
+ _layout->addSection(_shstrtab.get());
+ _shdrtab->setStringSection(_shstrtab.get());
+ _symtab->setStringSection(_strtab.get());
+ _layout->addSection(_shdrtab.get());
// give a chance for the target to add sections
_targetHandler.createDefaultSections();
OpenPOWER on IntegriCloud