From b741c53806a5fc20d77e512f6f787305b5beb383 Mon Sep 17 00:00:00 2001 From: Eric Beckmann Date: Mon, 19 Jun 2017 18:49:05 +0000 Subject: [PATCH] Have writeCOFFWriter return Expected. Summary: Have writeCOFFWriter return Expected instead of requiring being passed an uninitialized unique_ptr. Reviewers: zturner, ruiu Subscribers: hiraditya, llvm-commits Differential Revision: https://reviews.llvm.org/D34307 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@305730 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/WindowsResource.h | 6 +++--- lib/Object/WindowsResource.cpp | 30 +++++++++++++-------------- tools/llvm-cvtres/llvm-cvtres.cpp | 16 +++++++------- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/include/llvm/Object/WindowsResource.h b/include/llvm/Object/WindowsResource.h index 21fe37dd1e0..844256478cf 100644 --- a/include/llvm/Object/WindowsResource.h +++ b/include/llvm/Object/WindowsResource.h @@ -179,9 +179,9 @@ private: std::vector> StringTable; }; -Error writeWindowsResourceCOFF(std::unique_ptr &OutputBuffer, - llvm::COFF::MachineTypes MachineType, - const WindowsResourceParser &Parser); +Expected> +writeWindowsResourceCOFF(llvm::COFF::MachineTypes MachineType, + const WindowsResourceParser &Parser); } // namespace object } // namespace llvm diff --git a/lib/Object/WindowsResource.cpp b/lib/Object/WindowsResource.cpp index af836057ca3..9acc774647e 100644 --- a/lib/Object/WindowsResource.cpp +++ b/lib/Object/WindowsResource.cpp @@ -307,10 +307,9 @@ uint32_t WindowsResourceParser::TreeNode::getTreeSize() const { class WindowsResourceCOFFWriter { public: - WindowsResourceCOFFWriter(std::unique_ptr &OutputBuffer, - COFF::MachineTypes MachineType, + WindowsResourceCOFFWriter(COFF::MachineTypes MachineType, const WindowsResourceParser &Parser, Error &E); - Error write(); + std::unique_ptr write(); private: void performFileLayout(); @@ -326,7 +325,7 @@ private: void writeDirectoryTree(); void writeDirectoryStringTable(); void writeFirstSectionRelocations(); - std::unique_ptr &OutputBuffer; + std::unique_ptr OutputBuffer; char *BufferStart; uint64_t CurrentOffset = 0; COFF::MachineTypes MachineType; @@ -346,11 +345,10 @@ private: }; WindowsResourceCOFFWriter::WindowsResourceCOFFWriter( - std::unique_ptr &OutputBuffer, COFF::MachineTypes MachineType, - const WindowsResourceParser &Parser, Error &E) - : OutputBuffer(OutputBuffer), MachineType(MachineType), - Resources(Parser.getTree()), Data(Parser.getData()), - StringTable(Parser.getStringTable()) { + COFF::MachineTypes MachineType, const WindowsResourceParser &Parser, + Error &E) + : MachineType(MachineType), Resources(Parser.getTree()), + Data(Parser.getData()), StringTable(Parser.getStringTable()) { performFileLayout(); OutputBuffer = MemoryBuffer::getNewMemBuffer(FileSize); @@ -417,7 +415,7 @@ static std::time_t getTime() { return Now; } -Error WindowsResourceCOFFWriter::write() { +std::unique_ptr WindowsResourceCOFFWriter::write() { BufferStart = const_cast(OutputBuffer->getBufferStart()); writeCOFFHeader(); @@ -428,7 +426,7 @@ Error WindowsResourceCOFFWriter::write() { writeSymbolTable(); writeStringTable(); - return Error::success(); + return std::move(OutputBuffer); } void WindowsResourceCOFFWriter::writeCOFFHeader() { @@ -716,13 +714,13 @@ void WindowsResourceCOFFWriter::writeFirstSectionRelocations() { } } -Error writeWindowsResourceCOFF(std::unique_ptr &OutputBuffer, - COFF::MachineTypes MachineType, - const WindowsResourceParser &Parser) { +Expected> +writeWindowsResourceCOFF(COFF::MachineTypes MachineType, + const WindowsResourceParser &Parser) { Error E = Error::success(); - WindowsResourceCOFFWriter Writer(OutputBuffer, MachineType, Parser, E); + WindowsResourceCOFFWriter Writer(MachineType, Parser, E); if (E) - return E; + return std::move(E); return Writer.write(); } diff --git a/tools/llvm-cvtres/llvm-cvtres.cpp b/tools/llvm-cvtres/llvm-cvtres.cpp index ba8594e7766..85293bb5a0b 100644 --- a/tools/llvm-cvtres/llvm-cvtres.cpp +++ b/tools/llvm-cvtres/llvm-cvtres.cpp @@ -89,6 +89,12 @@ void error(Error EC) { [&](const ErrorInfoBase &EI) { reportError(EI.message()); }); } +template T error(Expected EC) { + if (!EC) + error(EC.takeError()); + return std::move(EC.get()); +} + int main(int argc_, const char *argv_[]) { sys::PrintStackTraceOnErrorSignal(argv_[0]); PrettyStackTraceProgram X(argc_, argv_); @@ -175,10 +181,7 @@ int main(int argc_, const char *argv_[]) { if (Verbose) { int EntryNumber = 0; - Expected EntryOrErr = RF->getHeadEntry(); - if (!EntryOrErr) - error(EntryOrErr.takeError()); - ResourceEntryRef Entry = EntryOrErr.get(); + ResourceEntryRef Entry = error(RF->getHeadEntry()); bool End = false; while (!End) { error(Entry.moveNext(End)); @@ -194,9 +197,8 @@ int main(int argc_, const char *argv_[]) { Parser.printTree(outs()); } - std::unique_ptr OutputBuffer; - error(llvm::object::writeWindowsResourceCOFF(OutputBuffer, MachineType, - Parser)); + std::unique_ptr OutputBuffer = + error(llvm::object::writeWindowsResourceCOFF(MachineType, Parser)); auto FileOrErr = FileOutputBuffer::create(OutputFile, OutputBuffer->getBufferSize()); if (!FileOrErr) -- 2.40.0