<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Hey Rui<div class=""><br class=""></div><div class="">Had no idea that flag existed.  Thanks for pointing it out.  I’ll rebuild with it now.</div><div class=""><br class=""></div><div class="">Cheers,</div><div class="">Pete<br class=""><div><blockquote type="cite" class=""><div class="">On Mar 30, 2016, at 5:17 PM, Rui Ueyama <<a href="mailto:ruiu@google.com" class="">ruiu@google.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Hi Pete,<div class=""><br class=""></div><div class="">This patch is not clean in terms of -Wpessimizing-move. Can you compile with that flag? (I can do this for you, but I expect that you are going to submit more patches like this soon.)</div></div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Wed, Mar 30, 2016 at 5:08 PM, Pete Cooper via llvm-commits <span dir="ltr" class=""><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank" class="">llvm-commits@lists.llvm.org</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: pete<br class="">
Date: Wed Mar 30 19:08:16 2016<br class="">
New Revision: 264974<br class="">
<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=264974&view=rev" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project?rev=264974&view=rev</a><br class="">
Log:<br class="">
Convert a few macho reader/writer helpers to new error handling.  NFC.<br class="">
<br class="">
These methods were responsible for some of the few remaining calls<br class="">
to llvm::errorCodeToError.  Converting them makes us have more Error's<br class="">
in the api and fewer error_code's.<br class="">
<br class="">
Modified:<br class="">
    lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp<br class="">
    lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp<br class="">
<br class="">
Modified: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp?rev=264974&r1=264973&r2=264974&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp?rev=264974&r1=264973&r2=264974&view=diff</a><br class="">
==============================================================================<br class="">
--- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp (original)<br class="">
+++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp Wed Mar 30 19:08:16 2016<br class="">
@@ -53,7 +53,7 @@ namespace mach_o {<br class="">
 namespace normalized {<br class="">
<br class="">
 // Utility to call a lambda expression on each load command.<br class="">
-static std::error_code forEachLoadCommand(<br class="">
+static llvm::Error forEachLoadCommand(<br class="">
     StringRef lcRange, unsigned lcCount, bool isBig, bool is64,<br class="">
     std::function<bool(uint32_t cmd, uint32_t size, const char *lc)> func) {<br class="">
   const char* p = lcRange.begin();<br class="">
@@ -67,15 +67,15 @@ static std::error_code forEachLoadComman<br class="">
       slc = &lcCopy;<br class="">
     }<br class="">
     if ( (p + slc->cmdsize) > lcRange.end() )<br class="">
-      return make_error_code(llvm::errc::executable_format_error);<br class="">
+      return llvm::make_error<GenericError>("Load command exceeds range");<br class="">
<br class="">
     if (func(slc->cmd, slc->cmdsize, p))<br class="">
-      return std::error_code();<br class="">
+      return llvm::Error();<br class="">
<br class="">
     p += slc->cmdsize;<br class="">
   }<br class="">
<br class="">
-  return std::error_code();<br class="">
+  return llvm::Error();<br class="">
 }<br class="">
<br class="">
 static std::error_code appendRelocations(Relocations &relocs, StringRef buffer,<br class="">
@@ -257,9 +257,9 @@ readBinary(std::unique_ptr<MemoryBuffer><br class="">
   // Pre-scan load commands looking for indirect symbol table.<br class="">
   uint32_t indirectSymbolTableOffset = 0;<br class="">
   uint32_t indirectSymbolTableCount = 0;<br class="">
-  std::error_code ec = forEachLoadCommand(lcRange, lcCount, isBig, is64,<br class="">
-                                          [&](uint32_t cmd, uint32_t size,<br class="">
-                                              const char *lc) -> bool {<br class="">
+  auto ec = forEachLoadCommand(lcRange, lcCount, isBig, is64,<br class="">
+                               [&](uint32_t cmd, uint32_t size,<br class="">
+                                   const char *lc) -> bool {<br class="">
     if (cmd == LC_DYSYMTAB) {<br class="">
       const dysymtab_command *d = reinterpret_cast<const dysymtab_command*>(lc);<br class="">
       indirectSymbolTableOffset = read32(&d->indirectsymoff, isBig);<br class="">
@@ -269,7 +269,7 @@ readBinary(std::unique_ptr<MemoryBuffer><br class="">
     return false;<br class="">
   });<br class="">
   if (ec)<br class="">
-    return llvm::errorCodeToError(ec);<br class="">
+    return std::move(ec);<br class="">
<br class="">
   // Walk load commands looking for segments/sections and the symbol table.<br class="">
   const data_in_code_entry *dataInCode = nullptr;<br class="">
@@ -485,7 +485,7 @@ readBinary(std::unique_ptr<MemoryBuffer><br class="">
     return false;<br class="">
   });<br class="">
   if (ec)<br class="">
-    return llvm::errorCodeToError(ec);<br class="">
+    return std::move(ec);<br class="">
<br class="">
   if (dataInCode) {<br class="">
     // Convert on-disk data_in_code_entry array to DataInCode vector.<br class="">
<br class="">
Modified: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp?rev=264974&r1=264973&r2=264974&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp?rev=264974&r1=264973&r2=264974&view=diff</a><br class="">
==============================================================================<br class="">
--- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp (original)<br class="">
+++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp Wed Mar 30 19:08:16 2016<br class="">
@@ -139,7 +139,7 @@ private:<br class="">
   uint32_t    loadCommandsSize(uint32_t &count);<br class="">
   void        buildFileOffsets();<br class="">
   void        writeMachHeader();<br class="">
-  std::error_code writeLoadCommands();<br class="">
+  llvm::Error writeLoadCommands();<br class="">
   void        writeSectionContent();<br class="">
   void        writeRelocations();<br class="">
   void        writeSymbolTable();<br class="">
@@ -179,8 +179,8 @@ private:<br class="">
   };<br class="">
<br class="">
   template <typename T><br class="">
-  std::error_code writeSingleSegmentLoadCommand(uint8_t *&lc);<br class="">
-  template <typename T> std::error_code writeSegmentLoadCommands(uint8_t *&lc);<br class="">
+  llvm::Error writeSingleSegmentLoadCommand(uint8_t *&lc);<br class="">
+  template <typename T> llvm::Error writeSegmentLoadCommands(uint8_t *&lc);<br class="">
<br class="">
   uint32_t pointerAlign(uint32_t value);<br class="">
   static StringRef dyldPath();<br class="">
@@ -628,7 +628,7 @@ uint32_t MachOFileLayout::indirectSymbol<br class="">
 }<br class="">
<br class="">
 template <typename T><br class="">
-std::error_code MachOFileLayout::writeSingleSegmentLoadCommand(uint8_t *&lc) {<br class="">
+llvm::Error MachOFileLayout::writeSingleSegmentLoadCommand(uint8_t *&lc) {<br class="">
   typename T::command* seg = reinterpret_cast<typename T::command*>(lc);<br class="">
   seg->cmd = T::LC;<br class="">
   seg->cmdsize = sizeof(typename T::command)<br class="">
@@ -668,11 +668,11 @@ std::error_code MachOFileLayout::writeSi<br class="">
     ++sout;<br class="">
   }<br class="">
   lc = next;<br class="">
-  return std::error_code();<br class="">
+  return llvm::Error();<br class="">
 }<br class="">
<br class="">
 template <typename T><br class="">
-std::error_code MachOFileLayout::writeSegmentLoadCommands(uint8_t *&lc) {<br class="">
+llvm::Error MachOFileLayout::writeSegmentLoadCommands(uint8_t *&lc) {<br class="">
   uint32_t indirectSymRunningIndex = 0;<br class="">
   for (const Segment &seg : _file.segments) {<br class="">
     // Link edit has no sections and a custom range of address, so handle it<br class="">
@@ -738,7 +738,7 @@ std::error_code MachOFileLayout::writeSe<br class="">
     }<br class="">
     lc = reinterpret_cast<uint8_t*>(next);<br class="">
   }<br class="">
-  return std::error_code();<br class="">
+  return llvm::Error();<br class="">
 }<br class="">
<br class="">
 static void writeVersionMinLoadCommand(const NormalizedFile &_file,<br class="">
@@ -773,15 +773,17 @@ static void writeVersionMinLoadCommand(c<br class="">
   lc += sizeof(version_min_command);<br class="">
 }<br class="">
<br class="">
-std::error_code MachOFileLayout::writeLoadCommands() {<br class="">
-  std::error_code ec;<br class="">
+llvm::Error MachOFileLayout::writeLoadCommands() {<br class="">
   uint8_t *lc = &_buffer[_startOfLoadCommands];<br class="">
   if (_file.fileType == llvm::MachO::MH_OBJECT) {<br class="">
     // Object files have one unnamed segment which holds all sections.<br class="">
-    if (_is64)<br class="">
-      ec = writeSingleSegmentLoadCommand<MachO64Trait>(lc);<br class="">
-    else<br class="">
-      ec = writeSingleSegmentLoadCommand<MachO32Trait>(lc);<br class="">
+    if (_is64) {<br class="">
+     if (auto ec = writeSingleSegmentLoadCommand<MachO64Trait>(lc))<br class="">
+       return std::move(ec);<br class="">
+    } else {<br class="">
+      if (auto ec = writeSingleSegmentLoadCommand<MachO32Trait>(lc))<br class="">
+        return std::move(ec);<br class="">
+    }<br class="">
     // Add LC_SYMTAB with symbol table info<br class="">
     symtab_command* st = reinterpret_cast<symtab_command*>(lc);<br class="">
     st->cmd     = LC_SYMTAB;<br class="">
@@ -824,10 +826,13 @@ std::error_code MachOFileLayout::writeLo<br class="">
     }<br class="">
   } else {<br class="">
     // Final linked images have sections under segments.<br class="">
-    if (_is64)<br class="">
-      ec = writeSegmentLoadCommands<MachO64Trait>(lc);<br class="">
-    else<br class="">
-      ec = writeSegmentLoadCommands<MachO32Trait>(lc);<br class="">
+    if (_is64) {<br class="">
+      if (auto ec = writeSegmentLoadCommands<MachO64Trait>(lc))<br class="">
+        return std::move(ec);<br class="">
+    } else {<br class="">
+      if (auto ec = writeSegmentLoadCommands<MachO32Trait>(lc))<br class="">
+        return std::move(ec);<br class="">
+    }<br class="">
<br class="">
     // Add LC_ID_DYLIB command for dynamic libraries.<br class="">
     if (_file.fileType == llvm::MachO::MH_DYLIB) {<br class="">
@@ -1012,7 +1017,7 @@ std::error_code MachOFileLayout::writeLo<br class="">
       lc += sizeof(linkedit_data_command);<br class="">
     }<br class="">
   }<br class="">
-  return ec;<br class="">
+  return llvm::Error();<br class="">
 }<br class="">
<br class="">
 void MachOFileLayout::writeSectionContent() {<br class="">
@@ -1475,9 +1480,8 @@ llvm::Error MachOFileLayout::writeBinary<br class="">
   // Write content.<br class="">
   _buffer = fob->getBufferStart();<br class="">
   writeMachHeader();<br class="">
-  std::error_code ec = writeLoadCommands();<br class="">
-  if (ec)<br class="">
-    return llvm::errorCodeToError(ec);<br class="">
+  if (auto ec = writeLoadCommands())<br class="">
+    return std::move(ec);<br class="">
   writeSectionContent();<br class="">
   writeLinkEditContent();<br class="">
   fob->commit();<br class="">
<br class="">
<br class="">
_______________________________________________<br class="">
llvm-commits mailing list<br class="">
<a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a><br class="">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br class="">
</blockquote></div><br class=""></div>
</div></blockquote></div><br class=""></div></body></html>