diff options
author | Lang Hames <lhames@gmail.com> | 2017-10-10 16:28:07 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2017-10-10 16:28:07 +0000 |
commit | 60fbc7cc38cde63adac7b70391e46141270817ad (patch) | |
tree | 75a5fa4eda963e134c27c8b7f277402e74c86ad5 /llvm/lib/MC | |
parent | 37af00e7d0febf397472c40c3b0df5e6ded7688c (diff) | |
download | bcm5719-llvm-60fbc7cc38cde63adac7b70391e46141270817ad.tar.gz bcm5719-llvm-60fbc7cc38cde63adac7b70391e46141270817ad.zip |
[MC] Thread unique_ptr<MCObjectWriter> through the create.*ObjectWriter
functions.
This makes the ownership of the resulting MCObjectWriter clear, and allows us
to remove one instance of MCObjectStreamer's bizarre "holding ownership via
someone else's reference" trick.
llvm-svn: 315327
Diffstat (limited to 'llvm/lib/MC')
-rw-r--r-- | llvm/lib/MC/ELFObjectWriter.cpp | 5 | ||||
-rw-r--r-- | llvm/lib/MC/MCELFStreamer.cpp | 9 | ||||
-rw-r--r-- | llvm/lib/MC/MCObjectStreamer.cpp | 5 | ||||
-rw-r--r-- | llvm/lib/MC/MachObjectWriter.cpp | 5 | ||||
-rw-r--r-- | llvm/lib/MC/WasmObjectWriter.cpp | 7 | ||||
-rw-r--r-- | llvm/lib/MC/WinCOFFObjectWriter.cpp | 4 |
6 files changed, 20 insertions, 15 deletions
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp index 795c21f08b9..e11eaaa3060 100644 --- a/llvm/lib/MC/ELFObjectWriter.cpp +++ b/llvm/lib/MC/ELFObjectWriter.cpp @@ -1387,8 +1387,9 @@ bool ELFObjectWriter::isSymbolRefDifferenceFullyResolvedImpl( InSet, IsPCRel); } -MCObjectWriter * +std::unique_ptr<MCObjectWriter> llvm::createELFObjectWriter(std::unique_ptr<MCELFObjectTargetWriter> MOTW, raw_pwrite_stream &OS, bool IsLittleEndian) { - return new ELFObjectWriter(std::move(MOTW), OS, IsLittleEndian); + return llvm::make_unique<ELFObjectWriter>(std::move(MOTW), OS, + IsLittleEndian); } diff --git a/llvm/lib/MC/MCELFStreamer.cpp b/llvm/lib/MC/MCELFStreamer.cpp index 50c1f6e79f8..76976cab466 100644 --- a/llvm/lib/MC/MCELFStreamer.cpp +++ b/llvm/lib/MC/MCELFStreamer.cpp @@ -62,12 +62,13 @@ void MCELFStreamer::mergeFragment(MCDataFragment *DF, if (RequiredBundlePadding > 0) { SmallString<256> Code; raw_svector_ostream VecOS(Code); - MCObjectWriter *OW = Assembler.getBackend().createObjectWriter(VecOS); + { + auto OW = Assembler.getBackend().createObjectWriter(VecOS); - EF->setBundlePadding(static_cast<uint8_t>(RequiredBundlePadding)); + EF->setBundlePadding(static_cast<uint8_t>(RequiredBundlePadding)); - Assembler.writeFragmentPadding(*EF, FSize, OW); - delete OW; + Assembler.writeFragmentPadding(*EF, FSize, OW.get()); + } DF->getContents().append(Code.begin(), Code.end()); } diff --git a/llvm/lib/MC/MCObjectStreamer.cpp b/llvm/lib/MC/MCObjectStreamer.cpp index 65e5b839cae..46d57265d85 100644 --- a/llvm/lib/MC/MCObjectStreamer.cpp +++ b/llvm/lib/MC/MCObjectStreamer.cpp @@ -28,15 +28,14 @@ using namespace llvm; MCObjectStreamer::MCObjectStreamer(MCContext &Context, MCAsmBackend &TAB, raw_pwrite_stream &OS, MCCodeEmitter *Emitter_) - : MCStreamer(Context), + : MCStreamer(Context), ObjectWriter(TAB.createObjectWriter(OS)), Assembler(llvm::make_unique<MCAssembler>(Context, TAB, *Emitter_, - *TAB.createObjectWriter(OS))), + *ObjectWriter)), EmitEHFrame(true), EmitDebugFrame(false) {} MCObjectStreamer::~MCObjectStreamer() { delete &Assembler->getBackend(); delete &Assembler->getEmitter(); - delete &Assembler->getWriter(); } void MCObjectStreamer::flushPendingLabels(MCFragment *F, uint64_t FOffset) { diff --git a/llvm/lib/MC/MachObjectWriter.cpp b/llvm/lib/MC/MachObjectWriter.cpp index c2196a77e18..7dbb84e166f 100644 --- a/llvm/lib/MC/MachObjectWriter.cpp +++ b/llvm/lib/MC/MachObjectWriter.cpp @@ -994,8 +994,9 @@ void MachObjectWriter::writeObject(MCAssembler &Asm, } } -MCObjectWriter * +std::unique_ptr<MCObjectWriter> llvm::createMachObjectWriter(std::unique_ptr<MCMachObjectTargetWriter> MOTW, raw_pwrite_stream &OS, bool IsLittleEndian) { - return new MachObjectWriter(std::move(MOTW), OS, IsLittleEndian); + return llvm::make_unique<MachObjectWriter>(std::move(MOTW), OS, + IsLittleEndian); } diff --git a/llvm/lib/MC/WasmObjectWriter.cpp b/llvm/lib/MC/WasmObjectWriter.cpp index 02d8bfbe1de..55e7c93c87e 100644 --- a/llvm/lib/MC/WasmObjectWriter.cpp +++ b/llvm/lib/MC/WasmObjectWriter.cpp @@ -1317,8 +1317,11 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm, // TODO: Translate debug sections to the output. } -MCObjectWriter * +std::unique_ptr<MCObjectWriter> llvm::createWasmObjectWriter(std::unique_ptr<MCWasmObjectTargetWriter> MOTW, raw_pwrite_stream &OS) { - return new WasmObjectWriter(std::move(MOTW), OS); + // FIXME: Can't use make_unique<WasmObjectWriter>(...) as WasmObjectWriter's + // destructor is private. Is that necessary? + return std::unique_ptr<MCObjectWriter>( + new WasmObjectWriter(std::move(MOTW), OS)); } diff --git a/llvm/lib/MC/WinCOFFObjectWriter.cpp b/llvm/lib/MC/WinCOFFObjectWriter.cpp index 64f7317cf49..9f1db46939c 100644 --- a/llvm/lib/MC/WinCOFFObjectWriter.cpp +++ b/llvm/lib/MC/WinCOFFObjectWriter.cpp @@ -1085,7 +1085,7 @@ void MCWinCOFFObjectTargetWriter::anchor() {} //------------------------------------------------------------------------------ // WinCOFFObjectWriter factory function -MCObjectWriter *llvm::createWinCOFFObjectWriter( +std::unique_ptr<MCObjectWriter> llvm::createWinCOFFObjectWriter( std::unique_ptr<MCWinCOFFObjectTargetWriter> MOTW, raw_pwrite_stream &OS) { - return new WinCOFFObjectWriter(std::move(MOTW), OS); + return llvm::make_unique<WinCOFFObjectWriter>(std::move(MOTW), OS); } |