]> granicus.if.org Git - llvm/commitdiff
Have writeCOFFWriter return Expected<unique_ptr>.
authorEric Beckmann <ecbeckmann@google.com>
Mon, 19 Jun 2017 18:49:05 +0000 (18:49 +0000)
committerEric Beckmann <ecbeckmann@google.com>
Mon, 19 Jun 2017 18:49:05 +0000 (18:49 +0000)
Summary: Have writeCOFFWriter return Expected<unique_ptr> 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
lib/Object/WindowsResource.cpp
tools/llvm-cvtres/llvm-cvtres.cpp

index 21fe37dd1e0a50de52919ecdd496e4112f5a3bed..844256478cf15853cc69419245c09c4a99367687 100644 (file)
@@ -179,9 +179,9 @@ private:
   std::vector<std::vector<UTF16>> StringTable;
 };
 
-Error writeWindowsResourceCOFF(std::unique_ptr<MemoryBuffer> &OutputBuffer,
-                               llvm::COFF::MachineTypes MachineType,
-                               const WindowsResourceParser &Parser);
+Expected<std::unique_ptr<MemoryBuffer>>
+writeWindowsResourceCOFF(llvm::COFF::MachineTypes MachineType,
+                         const WindowsResourceParser &Parser);
 
 } // namespace object
 } // namespace llvm
index af836057ca38c0a4fc38034c2ed90a6d3a23d8c2..9acc774647e3844824930e1d462f4a0e8c63688e 100644 (file)
@@ -307,10 +307,9 @@ uint32_t WindowsResourceParser::TreeNode::getTreeSize() const {
 
 class WindowsResourceCOFFWriter {
 public:
-  WindowsResourceCOFFWriter(std::unique_ptr<MemoryBuffer> &OutputBuffer,
-                            COFF::MachineTypes MachineType,
+  WindowsResourceCOFFWriter(COFF::MachineTypes MachineType,
                             const WindowsResourceParser &Parser, Error &E);
-  Error write();
+  std::unique_ptr<MemoryBuffer> write();
 
 private:
   void performFileLayout();
@@ -326,7 +325,7 @@ private:
   void writeDirectoryTree();
   void writeDirectoryStringTable();
   void writeFirstSectionRelocations();
-  std::unique_ptr<MemoryBuffer> &OutputBuffer;
+  std::unique_ptr<MemoryBuffer> OutputBuffer;
   char *BufferStart;
   uint64_t CurrentOffset = 0;
   COFF::MachineTypes MachineType;
@@ -346,11 +345,10 @@ private:
 };
 
 WindowsResourceCOFFWriter::WindowsResourceCOFFWriter(
-    std::unique_ptr<MemoryBuffer> &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<MemoryBuffer> WindowsResourceCOFFWriter::write() {
   BufferStart = const_cast<char *>(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<MemoryBuffer> &OutputBuffer,
-                               COFF::MachineTypes MachineType,
-                               const WindowsResourceParser &Parser) {
+Expected<std::unique_ptr<MemoryBuffer>>
+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();
 }
 
index ba8594e7766fd3832fa512cebf8840106324e6e4..85293bb5a0b8737a91370a099e2266b799b99196 100644 (file)
@@ -89,6 +89,12 @@ void error(Error EC) {
                   [&](const ErrorInfoBase &EI) { reportError(EI.message()); });
 }
 
+template <typename T> T error(Expected<T> 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<ResourceEntryRef> 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<MemoryBuffer> OutputBuffer;
-  error(llvm::object::writeWindowsResourceCOFF(OutputBuffer, MachineType,
-                                               Parser));
+  std::unique_ptr<MemoryBuffer> OutputBuffer =
+      error(llvm::object::writeWindowsResourceCOFF(MachineType, Parser));
   auto FileOrErr =
       FileOutputBuffer::create(OutputFile, OutputBuffer->getBufferSize());
   if (!FileOrErr)