<div dir="ltr">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><div class="gmail_quote"><div dir="ltr">On Wed, Sep 13, 2017 at 4:08 PM Adrian Prantl via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: adrian<br>
Date: Wed Sep 13 16:07:24 2017<br>
New Revision: 313211<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=313211&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=313211&view=rev</a><br>
Log:<br>
Factor out duplicate code from llvm-dwarfdump (NFC)<br>
<br>
Modified:<br>
llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp<br>
<br>
Modified: llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp<br>
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">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp?rev=313211&r1=313210&r2=313211&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp (original)<br>
+++ llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp Wed Sep 13 16:07:24 2017<br>
@@ -85,7 +85,7 @@ static void error(StringRef Filename, st<br>
exit(1);<br>
}<br>
<br>
-static DIDumpOptions GetDumpOpts() {<br>
+static DIDumpOptions getDumpOpts() {<br>
DIDumpOptions DumpOpts;<br>
DumpOpts.DumpType = DumpType;<br>
DumpOpts.SummarizeTypes = SummarizeTypes;<br>
@@ -93,7 +93,7 @@ static DIDumpOptions GetDumpOpts() {<br>
return DumpOpts;<br>
}<br>
<br>
-static void DumpObjectFile(ObjectFile &Obj, Twine Filename) {<br>
+static bool dumpObjectFile(ObjectFile &Obj, Twine Filename) {<br>
std::unique_ptr<DWARFContext> DICtx = DWARFContext::create(Obj);<br>
logAllUnhandledErrors(DICtx->loadRegisterInfo(Obj), errs(),<br>
Filename.str() + ": ");<br>
@@ -102,32 +102,11 @@ static void DumpObjectFile(ObjectFile &O<br>
outs() << Filename << ":\tfile format " << Obj.getFileFormatName() << '\n';<br>
<br>
// Dump the complete DWARF structure.<br>
- DICtx->dump(outs(), GetDumpOpts());<br>
+ DICtx->dump(outs(), getDumpOpts());<br>
+ return true;<br>
}<br>
<br>
-static void DumpInput(StringRef Filename) {<br>
- ErrorOr<std::unique_ptr<MemoryBuffer>> BuffOrErr =<br>
- MemoryBuffer::getFileOrSTDIN(Filename);<br>
- error(Filename, BuffOrErr.getError());<br>
- std::unique_ptr<MemoryBuffer> Buff = std::move(BuffOrErr.get());<br>
-<br>
- Expected<std::unique_ptr<Binary>> BinOrErr =<br>
- object::createBinary(Buff->getMemBufferRef());<br>
- if (!BinOrErr)<br>
- error(Filename, errorToErrorCode(BinOrErr.takeError()));<br>
-<br>
- if (auto *Obj = dyn_cast<ObjectFile>(BinOrErr->get()))<br>
- DumpObjectFile(*Obj, Filename);<br>
- else if (auto *Fat = dyn_cast<MachOUniversalBinary>(BinOrErr->get()))<br>
- for (auto &ObjForArch : Fat->objects()) {<br>
- auto MachOOrErr = ObjForArch.getAsObjectFile();<br>
- error(Filename, errorToErrorCode(MachOOrErr.takeError()));<br>
- DumpObjectFile(**MachOOrErr,<br>
- Filename + " (" + ObjForArch.getArchFlagName() + ")");<br>
- }<br>
-}<br>
-<br>
-static bool VerifyObjectFile(ObjectFile &Obj, Twine Filename) {<br>
+static bool verifyObjectFile(ObjectFile &Obj, Twine Filename) {<br>
std::unique_ptr<DIContext> DICtx = DWARFContext::create(Obj);<br>
<br>
// Verify the DWARF and exit with non-zero exit status if verification<br>
@@ -135,7 +114,7 @@ static bool VerifyObjectFile(ObjectFile<br>
raw_ostream &stream = Quiet ? nulls() : outs();<br>
stream << "Verifying " << Filename.str() << ":\tfile format "<br>
<< Obj.getFileFormatName() << "\n";<br>
- bool Result = DICtx->verify(stream, DumpType, GetDumpOpts());<br>
+ bool Result = DICtx->verify(stream, DumpType, getDumpOpts());<br>
if (Result)<br>
stream << "No errors.\n";<br>
else<br>
@@ -143,30 +122,36 @@ static bool VerifyObjectFile(ObjectFile<br>
return Result;<br>
}<br>
<br>
-static bool VerifyInput(StringRef Filename) {<br>
- ErrorOr<std::unique_ptr<MemoryBuffer>> BuffOrErr =<br>
- MemoryBuffer::getFileOrSTDIN(Filename);<br>
- error(Filename, BuffOrErr.getError());<br>
- std::unique_ptr<MemoryBuffer> Buff = std::move(BuffOrErr.get());<br>
-<br>
+static bool handleBuffer(StringRef Filename, MemoryBuffer &Buffer,<br>
+ std::function<bool(ObjectFile &, Twine)> HandleObj) {<br>
Expected<std::unique_ptr<Binary>> BinOrErr =<br>
- object::createBinary(Buff->getMemBufferRef());<br>
+ object::createBinary(Buffer.getMemBufferRef());<br>
if (!BinOrErr)<br>
error(Filename, errorToErrorCode(BinOrErr.takeError()));<br>
<br>
bool Result = true;<br>
if (auto *Obj = dyn_cast<ObjectFile>(BinOrErr->get()))<br>
- Result = VerifyObjectFile(*Obj, Filename);<br>
+ Result = HandleObj(*Obj, Filename);<br>
else if (auto *Fat = dyn_cast<MachOUniversalBinary>(BinOrErr->get()))<br>
for (auto &ObjForArch : Fat->objects()) {<br>
auto MachOOrErr = ObjForArch.getAsObjectFile();<br>
error(Filename, errorToErrorCode(MachOOrErr.takeError()));<br>
- if (!VerifyObjectFile(**MachOOrErr, Filename + " (" + ObjForArch.getArchFlagName() + ")"))<br>
+ if (!HandleObj(**MachOOrErr,<br>
+ Filename + " (" + ObjForArch.getArchFlagName() + ")"))<br>
Result = false;<br>
}<br>
return Result;<br>
}<br>
<br>
+static bool handleFile(StringRef Filename,<br>
+ std::function<bool(ObjectFile &, Twine)> HandleObj) {<br>
+ ErrorOr<std::unique_ptr<MemoryBuffer>> BuffOrErr =<br>
+ MemoryBuffer::getFileOrSTDIN(Filename);<br>
+ error(Filename, BuffOrErr.getError());<br>
+ std::unique_ptr<MemoryBuffer> Buffer = std::move(BuffOrErr.get());<br>
+ return handleBuffer(Filename, *Buffer, HandleObj);<br>
+}<br>
+<br>
/// If the input path is a .dSYM bundle (as created by the dsymutil tool),<br>
/// replace it with individual entries for each of the object files inside the<br>
/// bundle otherwise return the input path.<br>
@@ -251,10 +236,14 @@ int main(int argc, char **argv) {<br>
<br>
if (Verify) {<br>
// If we encountered errors during verify, exit with a non-zero exit status.<br>
- if (!std::all_of(Objects.begin(), Objects.end(), VerifyInput))<br>
+ if (!std::all_of(Objects.begin(), Objects.end(), [](std::string Object) {<br>
+ return handleFile(Object, verifyObjectFile);<br>
+ }))<br>
exit(1);<br>
} else {<br>
- std::for_each(Objects.begin(), Objects.end(), DumpInput);<br>
+ std::for_each(Objects.begin(), Objects.end(), [](std::string Object) {<br>
+ handleFile(Object, dumpObjectFile);<br>
+ });<br>
}<br>
<br>
return EXIT_SUCCESS;<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div></div>