summaryrefslogtreecommitdiffstats
path: root/llvm/lib/MC
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2017-10-10 16:28:07 +0000
committerLang Hames <lhames@gmail.com>2017-10-10 16:28:07 +0000
commit60fbc7cc38cde63adac7b70391e46141270817ad (patch)
tree75a5fa4eda963e134c27c8b7f277402e74c86ad5 /llvm/lib/MC
parent37af00e7d0febf397472c40c3b0df5e6ded7688c (diff)
downloadbcm5719-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.cpp5
-rw-r--r--llvm/lib/MC/MCELFStreamer.cpp9
-rw-r--r--llvm/lib/MC/MCObjectStreamer.cpp5
-rw-r--r--llvm/lib/MC/MachObjectWriter.cpp5
-rw-r--r--llvm/lib/MC/WasmObjectWriter.cpp7
-rw-r--r--llvm/lib/MC/WinCOFFObjectWriter.cpp4
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);
}
OpenPOWER on IntegriCloud