<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Sep 18, 2017, at 3:07 PM, David Blaikie <<a href="mailto:dblaikie@gmail.com" class="">dblaikie@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Range-for is probably more legible/terse than std::for_each these days (back when we didn't have C++11 features, there was some more merit in std::for_each, especially if you had a named functor around anyway)<br class=""></div></div></blockquote><div><br class=""></div><div>Good point. I think this instance might pre-date C++11 support. I'll update it to a loop.</div><div><br class=""></div><div>-- adrian</div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class="gmail_quote"><div dir="ltr" class="">On Wed, Sep 13, 2017 at 4:08 PM Adrian Prantl via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank" class="">llvm-commits@lists.llvm.org</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: adrian<br class="">
Date: Wed Sep 13 16:07:24 2017<br class="">
New Revision: 313211<br class="">
<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=313211&view=rev" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project?rev=313211&view=rev</a><br class="">
Log:<br class="">
Factor out duplicate code from llvm-dwarfdump (NFC)<br class="">
<br class="">
Modified:<br class="">
    llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp<br class="">
<br class="">
Modified: llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp?rev=313211&r1=313210&r2=313211&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp?rev=313211&r1=313210&r2=313211&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp (original)<br class="">
+++ llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp Wed Sep 13 16:07:24 2017<br class="">
@@ -85,7 +85,7 @@ static void error(StringRef Filename, st<br class="">
   exit(1);<br class="">
 }<br class="">
<br class="">
-static DIDumpOptions GetDumpOpts() {<br class="">
+static DIDumpOptions getDumpOpts() {<br class="">
   DIDumpOptions DumpOpts;<br class="">
   DumpOpts.DumpType = DumpType;<br class="">
   DumpOpts.SummarizeTypes = SummarizeTypes;<br class="">
@@ -93,7 +93,7 @@ static DIDumpOptions GetDumpOpts() {<br class="">
   return DumpOpts;<br class="">
 }<br class="">
<br class="">
-static void DumpObjectFile(ObjectFile &Obj, Twine Filename) {<br class="">
+static bool dumpObjectFile(ObjectFile &Obj, Twine Filename) {<br class="">
   std::unique_ptr<DWARFContext> DICtx = DWARFContext::create(Obj);<br class="">
   logAllUnhandledErrors(DICtx->loadRegisterInfo(Obj), errs(),<br class="">
                         Filename.str() + ": ");<br class="">
@@ -102,32 +102,11 @@ static void DumpObjectFile(ObjectFile &O<br class="">
     outs() << Filename << ":\tfile format " << Obj.getFileFormatName() << '\n';<br class="">
<br class="">
   // Dump the complete DWARF structure.<br class="">
-  DICtx->dump(outs(), GetDumpOpts());<br class="">
+  DICtx->dump(outs(), getDumpOpts());<br class="">
+  return true;<br class="">
 }<br class="">
<br class="">
-static void DumpInput(StringRef Filename) {<br class="">
-  ErrorOr<std::unique_ptr<MemoryBuffer>> BuffOrErr =<br class="">
-      MemoryBuffer::getFileOrSTDIN(Filename);<br class="">
-  error(Filename, BuffOrErr.getError());<br class="">
-  std::unique_ptr<MemoryBuffer> Buff = std::move(BuffOrErr.get());<br class="">
-<br class="">
-  Expected<std::unique_ptr<Binary>> BinOrErr =<br class="">
-      object::createBinary(Buff->getMemBufferRef());<br class="">
-  if (!BinOrErr)<br class="">
-    error(Filename, errorToErrorCode(BinOrErr.takeError()));<br class="">
-<br class="">
-  if (auto *Obj = dyn_cast<ObjectFile>(BinOrErr->get()))<br class="">
-    DumpObjectFile(*Obj, Filename);<br class="">
-  else if (auto *Fat = dyn_cast<MachOUniversalBinary>(BinOrErr->get()))<br class="">
-    for (auto &ObjForArch : Fat->objects()) {<br class="">
-      auto MachOOrErr = ObjForArch.getAsObjectFile();<br class="">
-      error(Filename, errorToErrorCode(MachOOrErr.takeError()));<br class="">
-      DumpObjectFile(**MachOOrErr,<br class="">
-                     Filename + " (" + ObjForArch.getArchFlagName() + ")");<br class="">
-    }<br class="">
-}<br class="">
-<br class="">
-static bool VerifyObjectFile(ObjectFile &Obj, Twine Filename) {<br class="">
+static bool verifyObjectFile(ObjectFile &Obj, Twine Filename) {<br class="">
   std::unique_ptr<DIContext> DICtx = DWARFContext::create(Obj);<br class="">
<br class="">
   // Verify the DWARF and exit with non-zero exit status if verification<br class="">
@@ -135,7 +114,7 @@ static bool VerifyObjectFile(ObjectFile<br class="">
   raw_ostream &stream = Quiet ? nulls() : outs();<br class="">
   stream << "Verifying " << Filename.str() << ":\tfile format "<br class="">
   << Obj.getFileFormatName() << "\n";<br class="">
-  bool Result = DICtx->verify(stream, DumpType, GetDumpOpts());<br class="">
+  bool Result = DICtx->verify(stream, DumpType, getDumpOpts());<br class="">
   if (Result)<br class="">
     stream << "No errors.\n";<br class="">
   else<br class="">
@@ -143,30 +122,36 @@ static bool VerifyObjectFile(ObjectFile<br class="">
   return Result;<br class="">
 }<br class="">
<br class="">
-static bool VerifyInput(StringRef Filename) {<br class="">
-  ErrorOr<std::unique_ptr<MemoryBuffer>> BuffOrErr =<br class="">
-  MemoryBuffer::getFileOrSTDIN(Filename);<br class="">
-  error(Filename, BuffOrErr.getError());<br class="">
-  std::unique_ptr<MemoryBuffer> Buff = std::move(BuffOrErr.get());<br class="">
-<br class="">
+static bool handleBuffer(StringRef Filename, MemoryBuffer &Buffer,<br class="">
+                         std::function<bool(ObjectFile &, Twine)> HandleObj) {<br class="">
   Expected<std::unique_ptr<Binary>> BinOrErr =<br class="">
-  object::createBinary(Buff->getMemBufferRef());<br class="">
+      object::createBinary(Buffer.getMemBufferRef());<br class="">
   if (!BinOrErr)<br class="">
     error(Filename, errorToErrorCode(BinOrErr.takeError()));<br class="">
<br class="">
   bool Result = true;<br class="">
   if (auto *Obj = dyn_cast<ObjectFile>(BinOrErr->get()))<br class="">
-    Result = VerifyObjectFile(*Obj, Filename);<br class="">
+    Result = HandleObj(*Obj, Filename);<br class="">
   else if (auto *Fat = dyn_cast<MachOUniversalBinary>(BinOrErr->get()))<br class="">
     for (auto &ObjForArch : Fat->objects()) {<br class="">
       auto MachOOrErr = ObjForArch.getAsObjectFile();<br class="">
       error(Filename, errorToErrorCode(MachOOrErr.takeError()));<br class="">
-      if (!VerifyObjectFile(**MachOOrErr, Filename + " (" + ObjForArch.getArchFlagName() + ")"))<br class="">
+      if (!HandleObj(**MachOOrErr,<br class="">
+                     Filename + " (" + ObjForArch.getArchFlagName() + ")"))<br class="">
         Result = false;<br class="">
     }<br class="">
   return Result;<br class="">
 }<br class="">
<br class="">
+static bool handleFile(StringRef Filename,<br class="">
+                       std::function<bool(ObjectFile &, Twine)> HandleObj) {<br class="">
+  ErrorOr<std::unique_ptr<MemoryBuffer>> BuffOrErr =<br class="">
+  MemoryBuffer::getFileOrSTDIN(Filename);<br class="">
+  error(Filename, BuffOrErr.getError());<br class="">
+  std::unique_ptr<MemoryBuffer> Buffer = std::move(BuffOrErr.get());<br class="">
+  return handleBuffer(Filename, *Buffer, HandleObj);<br class="">
+}<br class="">
+<br class="">
 /// If the input path is a .dSYM bundle (as created by the dsymutil tool),<br class="">
 /// replace it with individual entries for each of the object files inside the<br class="">
 /// bundle otherwise return the input path.<br class="">
@@ -251,10 +236,14 @@ int main(int argc, char **argv) {<br class="">
<br class="">
   if (Verify) {<br class="">
     // If we encountered errors during verify, exit with a non-zero exit status.<br class="">
-    if (!std::all_of(Objects.begin(), Objects.end(), VerifyInput))<br class="">
+    if (!std::all_of(Objects.begin(), Objects.end(), [](std::string Object) {<br class="">
+          return handleFile(Object, verifyObjectFile);<br class="">
+        }))<br class="">
       exit(1);<br class="">
   } else {<br class="">
-    std::for_each(Objects.begin(), Objects.end(), DumpInput);<br class="">
+    std::for_each(Objects.begin(), Objects.end(), [](std::string Object) {<br class="">
+      handleFile(Object, dumpObjectFile);<br class="">
+    });<br class="">
   }<br class="">
<br class="">
   return EXIT_SUCCESS;<br class="">
<br class="">
<br class="">
_______________________________________________<br class="">
llvm-commits mailing list<br class="">
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank" 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></div>
</div></blockquote></div><br class=""></body></html>