<div dir="ltr">Hi Sanjoy,<div><br></div><div>This looks like a spurious dependence between MC and libObject. I've removed it in r<span style="font-size:12.800000190734863px">269844.</span><div><div><span style="font-size:12.800000190734863px"><br></span></div><div><span style="font-size:12.800000190734863px">Just for good measure I also moved </span><span style="font-size:12.800000190734863px">isNotObjectErrorInvalidFileTyp</span><span style="font-size:12.800000190734863px">e out of the header</span><span style="font-size:12.800000190734863px"> in r269848.</span><br></div><div><span style="font-size:12.800000190734863px"><br></span></div><div><span style="font-size:12.800000190734863px">- Lang.</span></div></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, May 17, 2016 at 1:21 PM, Kevin Enderby via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Sanjoy,<br>
<br>
Don’t know what is going on but I’ll ask Lang (two offices down from mine) and he will likely know what’s up.  We will try to get a fix asap.<br>
<span class="HOEnZb"><font color="#888888"><br>
Kev<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
> On May 17, 2016, at 1:15 PM, Sanjoy Das <<a href="mailto:sanjoy@playingwithpointers.com">sanjoy@playingwithpointers.com</a>> wrote:<br>
><br>
> On linux I get a link error on ToT that dissappears when I<br>
> revert this change:<br>
><br>
> Scanning dependencies of target IRTests<br>
> [ 70%] Building CXX object<br>
> unittests/ADT/CMakeFiles/ADTTests.dir/APFloatTest.cpp.o<br>
> [ 70%] Building CXX object<br>
> unittests/Linker/CMakeFiles/LinkerTests.dir/LinkModulesTest.cpp.o<br>
> [ 70%] Building CXX object<br>
> unittests/Transforms/Utils/CMakeFiles/UtilsTests.dir/ASanStackFrameLayoutTest.cpp.o<br>
> [ 70%] Building CXX object<br>
> unittests/Analysis/CMakeFiles/AnalysisTests.dir/AliasAnalysisTest.cpp.o<br>
> [ 81%] Built target LLVMCodeGen<br>
> [ 81%] Building CXX object<br>
> unittests/Analysis/CMakeFiles/AnalysisTests.dir/BlockFrequencyInfoTest.cpp.o<br>
> [ 81%] Building CXX object<br>
> unittests/IR/CMakeFiles/IRTests.dir/AsmWriterTest.cpp.o<br>
> ../../lib/libLLVMMCDisassembler.a(MCRelocationInfo.cpp.o): In function<br>
> `llvm::object::make_error_code(llvm::object::object_error)':<br>
> /local/sanjoy/llvm.git/include/llvm/Object/Error.h:40: undefined<br>
> reference to `llvm::object::object_category()'<br>
> collect2: error: ld returned 1 exit status<br>
><br>
><br>
> Any idea what's going on?<br>
><br>
> On Tue, May 17, 2016 at 10:10 AM, Kevin Enderby via llvm-commits<br>
> <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br>
>> Author: enderby<br>
>> Date: Tue May 17 12:10:12 2016<br>
>> New Revision: 269784<br>
>><br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=269784&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=269784&view=rev</a><br>
>> Log:<br>
>> Change llvm-objdump, llvm-nm and llvm-size when reporting an object file error<br>
>> when the object is in an archive to use something like libx.a(foo.o) as part of<br>
>> the error message.<br>
>><br>
>> Also changed llvm-objdump and llvm-size to be like llvm-nm and ignore non-object<br>
>> files in archives and not produce any error message.<br>
>><br>
>> To do this Archive::Child::getAsBinary() was changed from ErrorOr<...> to<br>
>> Expected<...> then that was threaded up to its users.<br>
>><br>
>> Converting this interface to Expected<> from ErrorOr<> does involve<br>
>> touching a number of places. To contain the changes for now the use of<br>
>> errorToErrorCode() is still used in one place yet to be fully converted.<br>
>><br>
>> Again there some were bugs in the existing code that did not deal with the<br>
>> old ErrorOr<> return values.  So now with Expected<> since they must be<br>
>> checked and the error handled, I added a TODO and a comments for those.<br>
>><br>
>> Added:<br>
>>    llvm/trunk/test/Object/Inputs/macho-bad-archive1.a   (with props)<br>
>>    llvm/trunk/test/Object/Inputs/macho-bad-archive2.a   (with props)<br>
>> Modified:<br>
>>    llvm/trunk/include/llvm/Object/Archive.h<br>
>>    llvm/trunk/include/llvm/Object/Error.h<br>
>>    llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp<br>
>>    llvm/trunk/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h<br>
>>    llvm/trunk/lib/Object/Archive.cpp<br>
>>    llvm/trunk/test/Object/macho-invalid.test<br>
>>    llvm/trunk/test/Object/nm-archive.test<br>
>>    llvm/trunk/tools/llvm-cxxdump/llvm-cxxdump.cpp<br>
>>    llvm/trunk/tools/llvm-nm/llvm-nm.cpp<br>
>>    llvm/trunk/tools/llvm-objdump/MachODump.cpp<br>
>>    llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp<br>
>>    llvm/trunk/tools/llvm-objdump/llvm-objdump.h<br>
>>    llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp<br>
>>    llvm/trunk/tools/llvm-size/llvm-size.cpp<br>
>>    llvm/trunk/tools/sancov/sancov.cc<br>
>><br>
>> Modified: llvm/trunk/include/llvm/Object/Archive.h<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/Archive.h?rev=269784&r1=269783&r2=269784&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/Archive.h?rev=269784&r1=269783&r2=269784&view=diff</a><br>
>> ==============================================================================<br>
>> --- llvm/trunk/include/llvm/Object/Archive.h (original)<br>
>> +++ llvm/trunk/include/llvm/Object/Archive.h Tue May 17 12:10:12 2016<br>
>> @@ -101,7 +101,7 @@ public:<br>
>><br>
>>     ErrorOr<MemoryBufferRef> getMemoryBufferRef() const;<br>
>><br>
>> -    ErrorOr<std::unique_ptr<Binary>><br>
>> +    Expected<std::unique_ptr<Binary>><br>
>>     getAsBinary(LLVMContext *Context = nullptr) const;<br>
>>   };<br>
>><br>
>><br>
>> Modified: llvm/trunk/include/llvm/Object/Error.h<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/Error.h?rev=269784&r1=269783&r2=269784&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/Error.h?rev=269784&r1=269783&r2=269784&view=diff</a><br>
>> ==============================================================================<br>
>> --- llvm/trunk/include/llvm/Object/Error.h (original)<br>
>> +++ llvm/trunk/include/llvm/Object/Error.h Tue May 17 12:10:12 2016<br>
>> @@ -81,4 +81,34 @@ template <><br>
>> struct is_error_code_enum<llvm::object::object_error> : std::true_type {};<br>
>> }<br>
>><br>
>> +namespace llvm {<br>
>> +namespace object {<br>
>> +<br>
>> +// isNotObjectErrorInvalidFileType() is used when looping through the children<br>
>> +// of an archive after calling getAsBinary() on the child and it returns an<br>
>> +// llvm::Error.  In the cases we want to loop through the children and ignore the<br>
>> +// non-objects in the archive this is used to test the error to see if an<br>
>> +// error() function needs to called on the llvm::Error.<br>
>> +static inline llvm::Error isNotObjectErrorInvalidFileType(llvm::Error Err) {<br>
>> +  if (auto Err2 =<br>
>> +       handleErrors(std::move(Err),<br>
>> +         [](std::unique_ptr<ECError> M) {<br>
>> +           // Try to handle 'M'. If successful, return a success value from<br>
>> +           // the handler.<br>
>> +           if (M->convertToErrorCode() == object_error::invalid_file_type)<br>
>> +             return Error::success();<br>
>> +<br>
>> +           // We failed to handle 'M' - return it from the handler.<br>
>> +           // This value will be passed back from catchErrors and<br>
>> +           // wind up in Err2, where it will be returned from this function.<br>
>> +           return Error(std::move(M));<br>
>> +         }))<br>
>> +    return Err2;<br>
>> +  return Err;<br>
>> +}<br>
>> +<br>
>> +} // end namespace object.<br>
>> +<br>
>> +} // end namespace llvm.<br>
>> +<br>
>> #endif<br>
>><br>
>> Modified: llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp?rev=269784&r1=269783&r2=269784&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp?rev=269784&r1=269783&r2=269784&view=diff</a><br>
>> ==============================================================================<br>
>> --- llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp (original)<br>
>> +++ llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp Tue May 17 12:10:12 2016<br>
>> @@ -329,10 +329,13 @@ RuntimeDyld::SymbolInfo MCJIT::findSymbo<br>
>>       report_fatal_error(EC.message());<br>
>>     if (ChildIt != A->child_end()) {<br>
>>       // FIXME: Support nested archives?<br>
>> -      ErrorOr<std::unique_ptr<object::Binary>> ChildBinOrErr =<br>
>> +      Expected<std::unique_ptr<object::Binary>> ChildBinOrErr =<br>
>>           (*ChildIt)->getAsBinary();<br>
>> -      if (ChildBinOrErr.getError())<br>
>> +      if (!ChildBinOrErr) {<br>
>> +        // TODO: Actually report errors helpfully.<br>
>> +        consumeError(ChildBinOrErr.takeError());<br>
>>         continue;<br>
>> +      }<br>
>>       std::unique_ptr<object::Binary> &ChildBin = ChildBinOrErr.get();<br>
>>       if (ChildBin->isObject()) {<br>
>>         std::unique_ptr<object::ObjectFile> OF(<br>
>><br>
>> Modified: llvm/trunk/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h?rev=269784&r1=269783&r2=269784&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h?rev=269784&r1=269783&r2=269784&view=diff</a><br>
>> ==============================================================================<br>
>> --- llvm/trunk/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h (original)<br>
>> +++ llvm/trunk/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h Tue May 17 12:10:12 2016<br>
>> @@ -263,10 +263,13 @@ private:<br>
>>         report_fatal_error(EC.message());<br>
>>       if (ChildIt != A->child_end()) {<br>
>>         // FIXME: Support nested archives?<br>
>> -        ErrorOr<std::unique_ptr<object::Binary>> ChildBinOrErr =<br>
>> +        Expected<std::unique_ptr<object::Binary>> ChildBinOrErr =<br>
>>             (*ChildIt)->getAsBinary();<br>
>> -        if (ChildBinOrErr.getError())<br>
>> +        if (!ChildBinOrErr) {<br>
>> +          // TODO: Actually report errors helpfully.<br>
>> +          consumeError(ChildBinOrErr.takeError());<br>
>>           continue;<br>
>> +        }<br>
>>         std::unique_ptr<object::Binary> &ChildBin = ChildBinOrErr.get();<br>
>>         if (ChildBin->isObject()) {<br>
>>           std::vector<std::unique_ptr<object::ObjectFile>> ObjSet;<br>
>><br>
>> Modified: llvm/trunk/lib/Object/Archive.cpp<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/Archive.cpp?rev=269784&r1=269783&r2=269784&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/Archive.cpp?rev=269784&r1=269783&r2=269784&view=diff</a><br>
>> ==============================================================================<br>
>> --- llvm/trunk/lib/Object/Archive.cpp (original)<br>
>> +++ llvm/trunk/lib/Object/Archive.cpp Tue May 17 12:10:12 2016<br>
>> @@ -228,6 +228,11 @@ ErrorOr<StringRef> Archive::Child::getNa<br>
>>     if (name.substr(3).rtrim(' ').getAsInteger(10, name_size))<br>
>>       llvm_unreachable("Long name length is not an ingeter");<br>
>>     return Data.substr(sizeof(ArchiveMemberHeader), name_size).rtrim('\0');<br>
>> +  } else {<br>
>> +    // It is not a long name so trim the blanks at the end of the name.<br>
>> +    if (name[name.size() - 1] != '/') {<br>
>> +      return name.rtrim(' ');<br>
>> +    }<br>
>>   }<br>
>>   // It's a simple name.<br>
>>   if (name[name.size() - 1] == '/')<br>
>> @@ -246,16 +251,16 @@ ErrorOr<MemoryBufferRef> Archive::Child:<br>
>>   return MemoryBufferRef(*Buf, Name);<br>
>> }<br>
>><br>
>> -ErrorOr<std::unique_ptr<Binary>><br>
>> +Expected<std::unique_ptr<Binary>><br>
>> Archive::Child::getAsBinary(LLVMContext *Context) const {<br>
>>   ErrorOr<MemoryBufferRef> BuffOrErr = getMemoryBufferRef();<br>
>>   if (std::error_code EC = BuffOrErr.getError())<br>
>> -    return EC;<br>
>> +    return errorCodeToError(EC);<br>
>><br>
>>   auto BinaryOrErr = createBinary(BuffOrErr.get(), Context);<br>
>>   if (BinaryOrErr)<br>
>>     return std::move(*BinaryOrErr);<br>
>> -  return errorToErrorCode(BinaryOrErr.takeError());<br>
>> +  return BinaryOrErr.takeError();<br>
>> }<br>
>><br>
>> ErrorOr<std::unique_ptr<Archive>> Archive::create(MemoryBufferRef Source) {<br>
>><br>
>> Added: llvm/trunk/test/Object/Inputs/macho-bad-archive1.a<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/macho-bad-archive1.a?rev=269784&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/macho-bad-archive1.a?rev=269784&view=auto</a><br>
>> ==============================================================================<br>
>> Binary file - no diff available.<br>
>><br>
>> Propchange: llvm/trunk/test/Object/Inputs/macho-bad-archive1.a<br>
>> ------------------------------------------------------------------------------<br>
>>    svn:mime-type = application/octet-stream<br>
>><br>
>> Added: llvm/trunk/test/Object/Inputs/macho-bad-archive2.a<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/macho-bad-archive2.a?rev=269784&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/macho-bad-archive2.a?rev=269784&view=auto</a><br>
>> ==============================================================================<br>
>> Binary file - no diff available.<br>
>><br>
>> Propchange: llvm/trunk/test/Object/Inputs/macho-bad-archive2.a<br>
>> ------------------------------------------------------------------------------<br>
>>    svn:mime-type = application/octet-stream<br>
>><br>
>> Modified: llvm/trunk/test/Object/macho-invalid.test<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/macho-invalid.test?rev=269784&r1=269783&r2=269784&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/macho-invalid.test?rev=269784&r1=269783&r2=269784&view=diff</a><br>
>> ==============================================================================<br>
>> --- llvm/trunk/test/Object/macho-invalid.test (original)<br>
>> +++ llvm/trunk/test/Object/macho-invalid.test Tue May 17 12:10:12 2016<br>
>> @@ -56,6 +56,10 @@ RUN: llvm-nm -pax %p/Inputs/macho-invali<br>
>> RUN:      | FileCheck -check-prefix NAME-PAST-EOF-nm-pax %s<br>
>> NAME-PAST-EOF-nm-pax: 0000000000000000 64 00 0000 fe000002 bad string index<br>
>><br>
>> +RUN: not llvm-objdump -t %p/Inputs/macho-bad-archive1.a 2>&1 \<br>
>> +RUN:      | FileCheck -check-prefix NAME-PAST-EOF-ARCHIVE %s<br>
>> +NAME-PAST-EOF-ARCHIVE: macho-bad-archive1.a(macho-invalid-symbol-name-past-eof) truncated or malformed object (bad string index: 4261412866 for symbol at index 0)<br>
>> +<br>
>> RUN: llvm-nm %p/Inputs/macho-invalid-section-index-getSectionRawName 2>&1 \<br>
>> RUN:      | FileCheck -check-prefix INVALID-SECTION-IDX-SYMBOL-SEC %s<br>
>> INVALID-SECTION-IDX-SYMBOL-SEC: 0000000100000000 S __mh_execute_header<br>
>> @@ -74,3 +78,6 @@ INVALID-HEADER: The file was not recogni<br>
>><br>
>> RUN: not llvm-objdump -macho -private-headers %p/Inputs/macho64-invalid-incomplete-segment-load-command 2>&1 | FileCheck -check-prefix INCOMPLETE-SEGMENT-LOADC %s<br>
>> INCOMPLETE-SEGMENT-LOADC: truncated or malformed object (load commands extend past the end of the file)<br>
>> +<br>
>> +RUN: not llvm-objdump -macho -private-headers %p/Inputs/macho-bad-archive2.a 2>&1 | FileCheck -check-prefix INCOMPLETE-SEGMENT-LOADC-ARCHIVE %s<br>
>> +INCOMPLETE-SEGMENT-LOADC-ARCHIVE: macho-bad-archive2.a(macho64-invalid-incomplete-segment-load-command) truncated or malformed object (load commands extend past the end of the file)<br>
>><br>
>> Modified: llvm/trunk/test/Object/nm-archive.test<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/nm-archive.test?rev=269784&r1=269783&r2=269784&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/nm-archive.test?rev=269784&r1=269783&r2=269784&view=diff</a><br>
>> ==============================================================================<br>
>> --- llvm/trunk/test/Object/nm-archive.test (original)<br>
>> +++ llvm/trunk/test/Object/nm-archive.test Tue May 17 12:10:12 2016<br>
>> @@ -55,9 +55,10 @@ RUN: llvm-nm %p/Inputs/archive-test.a-em<br>
>><br>
>> This archive has an unaligned member and a unknown format member.<br>
>> GNU AR is able to parse the unaligned member and warns about the member with<br>
>> -the unknown format. We should probably simply warn on both. For now just check<br>
>> -that we don't produce an error.<br>
>> -RUN: llvm-nm %p/Inputs/corrupt-archive.a<br>
>> +the unknown format. We should probably simply warn on both. For now we just<br>
>> +produce an error for the unknown format.<br>
>> +RUN: not llvm-nm %p/Inputs/corrupt-archive.a 2>&1 | FileCheck %s -check-prefix CORRUPT<br>
>> +CORRUPT: corrupt-archive.a(trivial-object-test2.elf-x86-64) Invalid data was encountered while parsing the file<br>
>><br>
>><br>
>> RUN: llvm-nm %p/Inputs/thin.a | FileCheck %s -check-prefix THIN<br>
>><br>
>> Modified: llvm/trunk/tools/llvm-cxxdump/llvm-cxxdump.cpp<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-cxxdump/llvm-cxxdump.cpp?rev=269784&r1=269783&r2=269784&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-cxxdump/llvm-cxxdump.cpp?rev=269784&r1=269783&r2=269784&view=diff</a><br>
>> ==============================================================================<br>
>> --- llvm/trunk/tools/llvm-cxxdump/llvm-cxxdump.cpp (original)<br>
>> +++ llvm/trunk/tools/llvm-cxxdump/llvm-cxxdump.cpp Tue May 17 12:10:12 2016<br>
>> @@ -485,11 +485,17 @@ static void dumpArchive(const Archive *A<br>
>>   for (auto &ErrorOrChild : Arc->children()) {<br>
>>     error(ErrorOrChild.getError());<br>
>>     const Archive::Child &ArcC = *ErrorOrChild;<br>
>> -    ErrorOr<std::unique_ptr<Binary>> ChildOrErr = ArcC.getAsBinary();<br>
>> -    if (std::error_code EC = ChildOrErr.getError()) {<br>
>> +    Expected<std::unique_ptr<Binary>> ChildOrErr = ArcC.getAsBinary();<br>
>> +    if (!ChildOrErr) {<br>
>>       // Ignore non-object files.<br>
>> -      if (EC != object_error::invalid_file_type)<br>
>> -        reportError(Arc->getFileName(), EC.message());<br>
>> +      if (auto E = isNotObjectErrorInvalidFileType(ChildOrErr.takeError())) {<br>
>> +        std::string Buf;<br>
>> +        raw_string_ostream OS(Buf);<br>
>> +        logAllUnhandledErrors(std::move(E), OS, "");<br>
>> +        OS.flush();<br>
>> +        reportError(Arc->getFileName(), Buf);<br>
>> +      }<br>
>> +      ChildOrErr.takeError();<br>
>>       continue;<br>
>>     }<br>
>><br>
>><br>
>> Modified: llvm/trunk/tools/llvm-nm/llvm-nm.cpp<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-nm/llvm-nm.cpp?rev=269784&r1=269783&r2=269784&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-nm/llvm-nm.cpp?rev=269784&r1=269783&r2=269784&view=diff</a><br>
>> ==============================================================================<br>
>> --- llvm/trunk/tools/llvm-nm/llvm-nm.cpp (original)<br>
>> +++ llvm/trunk/tools/llvm-nm/llvm-nm.cpp Tue May 17 12:10:12 2016<br>
>> @@ -190,6 +190,29 @@ static bool error(std::error_code EC, Tw<br>
>>   return false;<br>
>> }<br>
>><br>
>> +// This version of error() prints the archive name and member name, for example:<br>
>> +// "libx.a(foo.o)" after the ToolName before the error message.  It sets<br>
>> +// HadError but returns allowing the code to move on to other archive members.<br>
>> +static void error(llvm::Error E, StringRef FileName, const Archive::Child &C) {<br>
>> +  HadError = true;<br>
>> +  errs() << ToolName << ": " << FileName;<br>
>> +<br>
>> +  ErrorOr<StringRef> NameOrErr = C.getName();<br>
>> +  // TODO: if we have a error getting the name then it would be nice to print<br>
>> +  // the index of which archive member this is and or its offset in the<br>
>> +  // archive instead of "???" as the name.<br>
>> +  if (NameOrErr.getError())<br>
>> +    errs() << "(" << "???" << ")";<br>
>> +  else<br>
>> +    errs() << "(" << NameOrErr.get() << ")";<br>
>> +<br>
>> +  std::string Buf;<br>
>> +  raw_string_ostream OS(Buf);<br>
>> +  logAllUnhandledErrors(std::move(E), OS, "");<br>
>> +  OS.flush();<br>
>> +  errs() << " " << Buf << "\n";<br>
>> +}<br>
>> +<br>
>> namespace {<br>
>> struct NMSymbol {<br>
>>   uint64_t Address;<br>
>> @@ -1066,9 +1089,12 @@ static void dumpSymbolNamesFromFile(std:<br>
>>       if (error(I->getError()))<br>
>>         return;<br>
>>       auto &C = I->get();<br>
>> -      ErrorOr<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary(&Context);<br>
>> -      if (ChildOrErr.getError())<br>
>> +      Expected<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary(&Context);<br>
>> +      if (!ChildOrErr) {<br>
>> +        if (auto E = isNotObjectErrorInvalidFileType(ChildOrErr.takeError()))<br>
>> +          error(std::move(E), Filename, C);<br>
>>         continue;<br>
>> +      }<br>
>>       if (SymbolicFile *O = dyn_cast<SymbolicFile>(&*ChildOrErr.get())) {<br>
>>         if (!checkMachOAndArchFlags(O, Filename))<br>
>>           return;<br>
>> @@ -1124,10 +1150,14 @@ static void dumpSymbolNamesFromFile(std:<br>
>>                 if (error(AI->getError()))<br>
>>                   return;<br>
>>                 auto &C = AI->get();<br>
>> -                ErrorOr<std::unique_ptr<Binary>> ChildOrErr =<br>
>> +                Expected<std::unique_ptr<Binary>> ChildOrErr =<br>
>>                     C.getAsBinary(&Context);<br>
>> -                if (ChildOrErr.getError())<br>
>> +                if (!ChildOrErr) {<br>
>> +                  if (auto E = isNotObjectErrorInvalidFileType(<br>
>> +                                       ChildOrErr.takeError()))<br>
>> +                    error(std::move(E), Filename, C);<br>
>>                   continue;<br>
>> +                }<br>
>>                 if (SymbolicFile *O =<br>
>>                         dyn_cast<SymbolicFile>(&*ChildOrErr.get())) {<br>
>>                   if (PrintFileName) {<br>
>> @@ -1181,10 +1211,14 @@ static void dumpSymbolNamesFromFile(std:<br>
>>               if (error(AI->getError()))<br>
>>                 return;<br>
>>               auto &C = AI->get();<br>
>> -              ErrorOr<std::unique_ptr<Binary>> ChildOrErr =<br>
>> +              Expected<std::unique_ptr<Binary>> ChildOrErr =<br>
>>                   C.getAsBinary(&Context);<br>
>> -              if (ChildOrErr.getError())<br>
>> +              if (!ChildOrErr) {<br>
>> +                if (auto E = isNotObjectErrorInvalidFileType(<br>
>> +                                     ChildOrErr.takeError()))<br>
>> +                  error(std::move(E), Filename, C);<br>
>>                 continue;<br>
>> +              }<br>
>>               if (SymbolicFile *O =<br>
>>                       dyn_cast<SymbolicFile>(&*ChildOrErr.get())) {<br>
>>                 if (PrintFileName)<br>
>> @@ -1233,9 +1267,13 @@ static void dumpSymbolNamesFromFile(std:<br>
>>           if (error(AI->getError()))<br>
>>             return;<br>
>>           auto &C = AI->get();<br>
>> -          ErrorOr<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary(&Context);<br>
>> -          if (ChildOrErr.getError())<br>
>> +          Expected<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary(&Context);<br>
>> +          if (!ChildOrErr) {<br>
>> +            if (auto E = isNotObjectErrorInvalidFileType(<br>
>> +                                 ChildOrErr.takeError()))<br>
>> +              error(std::move(E), Filename, C);<br>
>>             continue;<br>
>> +          }<br>
>>           if (SymbolicFile *O = dyn_cast<SymbolicFile>(&*ChildOrErr.get())) {<br>
>>             if (PrintFileName) {<br>
>>               ArchiveName = A->getFileName();<br>
>><br>
>> Modified: llvm/trunk/tools/llvm-objdump/MachODump.cpp<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/MachODump.cpp?rev=269784&r1=269783&r2=269784&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/MachODump.cpp?rev=269784&r1=269783&r2=269784&view=diff</a><br>
>> ==============================================================================<br>
>> --- llvm/trunk/tools/llvm-objdump/MachODump.cpp (original)<br>
>> +++ llvm/trunk/tools/llvm-objdump/MachODump.cpp Tue May 17 12:10:12 2016<br>
>> @@ -1211,7 +1211,7 @@ static void ProcessMachO(StringRef Filen<br>
>>   // If we are doing some processing here on the Mach-O file print the header<br>
>>   // info.  And don't print it otherwise like in the case of printing the<br>
>>   // UniversalHeaders or ArchiveHeaders.<br>
>> -  if (Disassemble || PrivateHeaders || ExportsTrie || Rebase || Bind ||<br>
>> +  if (Disassemble || PrivateHeaders || ExportsTrie || Rebase || Bind || SymbolTable ||<br>
>>       LazyBind || WeakBind || IndirectSymbols || DataInCode || LinkOptHints ||<br>
>>       DylibsUsed || DylibId || ObjcMetaData || (FilterSections.size() != 0)) {<br>
>>     outs() << Filename;<br>
>> @@ -1244,8 +1244,10 @@ static void ProcessMachO(StringRef Filen<br>
>>     PrintDylibs(MachOOF, false);<br>
>>   if (DylibId)<br>
>>     PrintDylibs(MachOOF, true);<br>
>> -  if (SymbolTable)<br>
>> -    PrintSymbolTable(MachOOF);<br>
>> +  if (SymbolTable) {<br>
>> +    StringRef ArchiveName = ArchiveMemberName == StringRef() ? "" : Filename;<br>
>> +    PrintSymbolTable(MachOOF, ArchiveName);<br>
>> +  }<br>
>>   if (UnwindInfo)<br>
>>     printMachOUnwindInfo(MachOOF);<br>
>>   if (PrivateHeaders) {<br>
>> @@ -1552,9 +1554,12 @@ void llvm::ParseInputMachO(StringRef Fil<br>
>>       if (std::error_code EC = I->getError())<br>
>>         report_error(Filename, EC);<br>
>>       auto &C = I->get();<br>
>> -      ErrorOr<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary();<br>
>> -      if (ChildOrErr.getError())<br>
>> +      Expected<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary();<br>
>> +      if (!ChildOrErr) {<br>
>> +        if (auto E = isNotObjectErrorInvalidFileType(ChildOrErr.takeError()))<br>
>> +          report_error(Filename, C, std::move(E));<br>
>>         continue;<br>
>> +      }<br>
>>       if (MachOObjectFile *O = dyn_cast<MachOObjectFile>(&*ChildOrErr.get())) {<br>
>>         if (!checkMachOAndArchFlags(O, Filename))<br>
>>           return;<br>
>> @@ -1603,9 +1608,12 @@ void llvm::ParseInputMachO(StringRef Fil<br>
>>                 if (std::error_code EC = AI->getError())<br>
>>                   report_error(Filename, EC);<br>
>>                 auto &C = AI->get();<br>
>> -                ErrorOr<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary();<br>
>> -                if (ChildOrErr.getError())<br>
>> +                Expected<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary();<br>
>> +                if (!ChildOrErr) {<br>
>> +                  if (auto E = isNotObjectErrorInvalidFileType(ChildOrErr.takeError()))<br>
>> +                    report_error(Filename, C, std::move(E));<br>
>>                   continue;<br>
>> +                }<br>
>>                 if (MachOObjectFile *O =<br>
>>                         dyn_cast<MachOObjectFile>(&*ChildOrErr.get()))<br>
>>                   ProcessMachO(Filename, O, O->getFileName(), ArchitectureName);<br>
>> @@ -1648,9 +1656,12 @@ void llvm::ParseInputMachO(StringRef Fil<br>
>>               if (std::error_code EC = AI->getError())<br>
>>                 report_error(Filename, EC);<br>
>>               auto &C = AI->get();<br>
>> -              ErrorOr<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary();<br>
>> -              if (ChildOrErr.getError())<br>
>> +              Expected<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary();<br>
>> +              if (!ChildOrErr) {<br>
>> +                if (auto E = isNotObjectErrorInvalidFileType(ChildOrErr.takeError()))<br>
>> +                  report_error(Filename, C, std::move(E));<br>
>>                 continue;<br>
>> +              }<br>
>>               if (MachOObjectFile *O =<br>
>>                       dyn_cast<MachOObjectFile>(&*ChildOrErr.get()))<br>
>>                 ProcessMachO(Filename, O, O->getFileName());<br>
>> @@ -1687,9 +1698,12 @@ void llvm::ParseInputMachO(StringRef Fil<br>
>>           if (std::error_code EC = AI->getError())<br>
>>             report_error(Filename, EC);<br>
>>           auto &C = AI->get();<br>
>> -          ErrorOr<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary();<br>
>> -          if (ChildOrErr.getError())<br>
>> +          Expected<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary();<br>
>> +          if (!ChildOrErr) {<br>
>> +            if (auto E = isNotObjectErrorInvalidFileType(ChildOrErr.takeError()))<br>
>> +              report_error(Filename, C, std::move(E));<br>
>>             continue;<br>
>> +          }<br>
>>           if (MachOObjectFile *O =<br>
>>                   dyn_cast<MachOObjectFile>(&*ChildOrErr.get())) {<br>
>>             if (MachOObjectFile *MachOOF = dyn_cast<MachOObjectFile>(O))<br>
>><br>
>> Modified: llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp?rev=269784&r1=269783&r2=269784&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp?rev=269784&r1=269783&r2=269784&view=diff</a><br>
>> ==============================================================================<br>
>> --- llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp (original)<br>
>> +++ llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp Tue May 17 12:10:12 2016<br>
>> @@ -281,6 +281,36 @@ LLVM_ATTRIBUTE_NORETURN void llvm::repor<br>
>>   exit(1);<br>
>> }<br>
>><br>
>> +LLVM_ATTRIBUTE_NORETURN void llvm::report_error(StringRef ArchiveName,<br>
>> +                                                StringRef FileName,<br>
>> +                                                llvm::Error E) {<br>
>> +  assert(E);<br>
>> +  errs() << ToolName << ": ";<br>
>> +  if (ArchiveName != "")<br>
>> +    errs() << ArchiveName << "(" << FileName << ")";<br>
>> +  else<br>
>> +    errs() << FileName;<br>
>> +  std::string Buf;<br>
>> +  raw_string_ostream OS(Buf);<br>
>> +  logAllUnhandledErrors(std::move(E), OS, "");<br>
>> +  OS.flush();<br>
>> +  errs() << " " << Buf;<br>
>> +  exit(1);<br>
>> +}<br>
>> +<br>
>> +LLVM_ATTRIBUTE_NORETURN void llvm::report_error(StringRef ArchiveName,<br>
>> +                                                const object::Archive::Child &C,<br>
>> +                                                llvm::Error E) {<br>
>> +  ErrorOr<StringRef> NameOrErr = C.getName();<br>
>> +  // TODO: if we have a error getting the name then it would be nice to print<br>
>> +  // the index of which archive member this is and or its offset in the<br>
>> +  // archive instead of "???" as the name.<br>
>> +  if (NameOrErr.getError())<br>
>> +    llvm::report_error(ArchiveName, "???", std::move(E));<br>
>> +  else<br>
>> +    llvm::report_error(ArchiveName, NameOrErr.get(), std::move(E));<br>
>> +}<br>
>> +<br>
>> static const Target *getTarget(const ObjectFile *Obj = nullptr) {<br>
>>   // Figure out the target triple.<br>
>>   llvm::Triple TheTriple("unknown-unknown-unknown");<br>
>> @@ -1346,7 +1376,7 @@ void llvm::PrintSectionContents(const Ob<br>
>>   }<br>
>> }<br>
>><br>
>> -void llvm::PrintSymbolTable(const ObjectFile *o) {<br>
>> +void llvm::PrintSymbolTable(const ObjectFile *o, StringRef ArchiveName) {<br>
>>   outs() << "SYMBOL TABLE:\n";<br>
>><br>
>>   if (const COFFObjectFile *coff = dyn_cast<const COFFObjectFile>(o)) {<br>
>> @@ -1359,7 +1389,7 @@ void llvm::PrintSymbolTable(const Object<br>
>>     uint64_t Address = *AddressOrError;<br>
>>     Expected<SymbolRef::Type> TypeOrError = Symbol.getType();<br>
>>     if (!TypeOrError)<br>
>> -      report_error(o->getFileName(), TypeOrError.takeError());<br>
>> +      report_error(ArchiveName, o->getFileName(), TypeOrError.takeError());<br>
>>     SymbolRef::Type Type = *TypeOrError;<br>
>>     uint32_t Flags = Symbol.getFlags();<br>
>>     Expected<section_iterator> SectionOrErr = Symbol.getSection();<br>
>> @@ -1371,7 +1401,7 @@ void llvm::PrintSymbolTable(const Object<br>
>>     } else {<br>
>>       Expected<StringRef> NameOrErr = Symbol.getName();<br>
>>       if (!NameOrErr)<br>
>> -        report_error(o->getFileName(), NameOrErr.takeError());<br>
>> +        report_error(ArchiveName, o->getFileName(), NameOrErr.takeError());<br>
>>       Name = *NameOrErr;<br>
>>     }<br>
>><br>
>> @@ -1603,12 +1633,16 @@ static void printFirstPrivateFileHeader(<br>
>>     report_fatal_error("Invalid/Unsupported object file format");<br>
>> }<br>
>><br>
>> -static void DumpObject(const ObjectFile *o) {<br>
>> +static void DumpObject(const ObjectFile *o, const Archive *a = nullptr) {<br>
>> +  StringRef ArchiveName = a != nullptr ? a->getFileName() : "";<br>
>>   // Avoid other output when using a raw option.<br>
>>   if (!RawClangAST) {<br>
>>     outs() << '\n';<br>
>> -    outs() << o->getFileName()<br>
>> -           << ":\tfile format " << o->getFileFormatName() << "\n\n";<br>
>> +    if (a)<br>
>> +      outs() << a->getFileName() << "(" << o->getFileName() << ")";<br>
>> +    else<br>
>> +      outs() << o->getFileName();<br>
>> +    outs() << ":\tfile format " << o->getFileFormatName() << "\n\n";<br>
>>   }<br>
>><br>
>>   if (Disassemble)<br>
>> @@ -1620,7 +1654,7 @@ static void DumpObject(const ObjectFile<br>
>>   if (SectionContents)<br>
>>     PrintSectionContents(o);<br>
>>   if (SymbolTable)<br>
>> -    PrintSymbolTable(o);<br>
>> +    PrintSymbolTable(o, ArchiveName);<br>
>>   if (UnwindInfo)<br>
>>     PrintUnwindInfo(o);<br>
>>   if (PrivateHeaders)<br>
>> @@ -1654,12 +1688,14 @@ static void DumpArchive(const Archive *a<br>
>>     if (std::error_code EC = ErrorOrChild.getError())<br>
>>       report_error(a->getFileName(), EC);<br>
>>     const Archive::Child &C = *ErrorOrChild;<br>
>> -    ErrorOr<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary();<br>
>> -    if (std::error_code EC = ChildOrErr.getError())<br>
>> -      if (EC != object_error::invalid_file_type)<br>
>> -        report_error(a->getFileName(), EC);<br>
>> +    Expected<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary();<br>
>> +    if (!ChildOrErr) {<br>
>> +      if (auto E = isNotObjectErrorInvalidFileType(ChildOrErr.takeError()))<br>
>> +        report_error(a->getFileName(), C, std::move(E));<br>
>> +      continue;<br>
>> +    }<br>
>>     if (ObjectFile *o = dyn_cast<ObjectFile>(&*ChildOrErr.get()))<br>
>> -      DumpObject(o);<br>
>> +      DumpObject(o, a);<br>
>>     else<br>
>>       report_error(a->getFileName(), object_error::invalid_file_type);<br>
>>   }<br>
>><br>
>> Modified: llvm/trunk/tools/llvm-objdump/llvm-objdump.h<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/llvm-objdump.h?rev=269784&r1=269783&r2=269784&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/llvm-objdump.h?rev=269784&r1=269783&r2=269784&view=diff</a><br>
>> ==============================================================================<br>
>> --- llvm/trunk/tools/llvm-objdump/llvm-objdump.h (original)<br>
>> +++ llvm/trunk/tools/llvm-objdump/llvm-objdump.h Tue May 17 12:10:12 2016<br>
>> @@ -13,6 +13,7 @@<br>
>> #include "llvm/Support/CommandLine.h"<br>
>> #include "llvm/Support/Compiler.h"<br>
>> #include "llvm/Support/DataTypes.h"<br>
>> +#include "llvm/Object/Archive.h"<br>
>><br>
>> namespace llvm {<br>
>> class StringRef;<br>
>> @@ -21,6 +22,7 @@ namespace object {<br>
>>   class COFFObjectFile;<br>
>>   class MachOObjectFile;<br>
>>   class ObjectFile;<br>
>> +  class Archive;<br>
>>   class RelocationRef;<br>
>> }<br>
>><br>
>> @@ -84,9 +86,15 @@ void printRawClangAST(const object::Obje<br>
>> void PrintRelocations(const object::ObjectFile *o);<br>
>> void PrintSectionHeaders(const object::ObjectFile *o);<br>
>> void PrintSectionContents(const object::ObjectFile *o);<br>
>> -void PrintSymbolTable(const object::ObjectFile *o);<br>
>> +void PrintSymbolTable(const object::ObjectFile *o, StringRef ArchiveName);<br>
>> LLVM_ATTRIBUTE_NORETURN void report_error(StringRef File, std::error_code EC);<br>
>> LLVM_ATTRIBUTE_NORETURN void report_error(StringRef File, llvm::Error E);<br>
>> +LLVM_ATTRIBUTE_NORETURN void report_error(StringRef FileName,<br>
>> +                                          StringRef ArchiveName,<br>
>> +                                          llvm::Error E);<br>
>> +LLVM_ATTRIBUTE_NORETURN void report_error(StringRef ArchiveName,<br>
>> +                                          const object::Archive::Child &C,<br>
>> +                                          llvm::Error E);<br>
>><br>
>> } // end namespace llvm<br>
>><br>
>><br>
>> Modified: llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp?rev=269784&r1=269783&r2=269784&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp?rev=269784&r1=269783&r2=269784&view=diff</a><br>
>> ==============================================================================<br>
>> --- llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp (original)<br>
>> +++ llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp Tue May 17 12:10:12 2016<br>
>> @@ -421,14 +421,17 @@ static void dumpArchive(const Archive *A<br>
>>     if (std::error_code EC = ErrorOrChild.getError())<br>
>>       reportError(Arc->getFileName(), EC.message());<br>
>>     const auto &Child = *ErrorOrChild;<br>
>> -    ErrorOr<std::unique_ptr<Binary>> ChildOrErr = Child.getAsBinary();<br>
>> -    if (std::error_code EC = ChildOrErr.getError()) {<br>
>> -      // Ignore non-object files.<br>
>> -      if (EC != object_error::invalid_file_type)<br>
>> -        reportError(Arc->getFileName(), EC.message());<br>
>> +    Expected<std::unique_ptr<Binary>> ChildOrErr = Child.getAsBinary();<br>
>> +    if (!ChildOrErr) {<br>
>> +      if (auto E = isNotObjectErrorInvalidFileType(ChildOrErr.takeError())) {<br>
>> +        std::string Buf;<br>
>> +        raw_string_ostream OS(Buf);<br>
>> +        logAllUnhandledErrors(ChildOrErr.takeError(), OS, "");<br>
>> +        OS.flush();<br>
>> +        reportError(Arc->getFileName(), Buf);<br>
>> +      }<br>
>>       continue;<br>
>>     }<br>
>> -<br>
>>     if (ObjectFile *Obj = dyn_cast<ObjectFile>(&*ChildOrErr.get()))<br>
>>       dumpObject(Obj);<br>
>>     else<br>
>><br>
>> Modified: llvm/trunk/tools/llvm-size/llvm-size.cpp<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-size/llvm-size.cpp?rev=269784&r1=269783&r2=269784&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-size/llvm-size.cpp?rev=269784&r1=269783&r2=269784&view=diff</a><br>
>> ==============================================================================<br>
>> --- llvm/trunk/tools/llvm-size/llvm-size.cpp (original)<br>
>> +++ llvm/trunk/tools/llvm-size/llvm-size.cpp Tue May 17 12:10:12 2016<br>
>> @@ -99,6 +99,29 @@ static bool error(std::error_code ec) {<br>
>>   return true;<br>
>> }<br>
>><br>
>> +// This version of error() prints the archive name and member name, for example:<br>
>> +// "libx.a(foo.o)" after the ToolName before the error message.  It sets<br>
>> +// HadError but returns allowing the code to move on to other archive members.<br>
>> +static void error(llvm::Error E, StringRef FileName, const Archive::Child &C) {<br>
>> +  HadError = true;<br>
>> +  errs() << ToolName << ": " << FileName;<br>
>> +<br>
>> +  ErrorOr<StringRef> NameOrErr = C.getName();<br>
>> +  // TODO: if we have a error getting the name then it would be nice to print<br>
>> +  // the index of which archive member this is and or its offset in the<br>
>> +  // archive instead of "???" as the name.<br>
>> +  if (NameOrErr.getError())<br>
>> +    errs() << "(" << "???" << ")";<br>
>> +  else<br>
>> +    errs() << "(" << NameOrErr.get() << ")";<br>
>> +<br>
>> +  std::string Buf;<br>
>> +  raw_string_ostream OS(Buf);<br>
>> +  logAllUnhandledErrors(std::move(E), OS, "");<br>
>> +  OS.flush();<br>
>> +  errs() << " " << Buf << "\n";<br>
>> +}<br>
>> +<br>
>> /// Get the length of the string that represents @p num in Radix including the<br>
>> /// leading 0x or 0 for hexadecimal and octal respectively.<br>
>> static size_t getNumLengthAsString(uint64_t num) {<br>
>> @@ -480,9 +503,12 @@ static void printFileSectionSizes(String<br>
>>          i != e; ++i) {<br>
>>       if (error(i->getError()))<br>
>>         exit(1);<br>
>> -      ErrorOr<std::unique_ptr<Binary>> ChildOrErr = i->get().getAsBinary();<br>
>> -      if (error(ChildOrErr.getError()))<br>
>> +      Expected<std::unique_ptr<Binary>> ChildOrErr = i->get().getAsBinary();<br>
>> +      if (!ChildOrErr) {<br>
>> +        if (auto E = isNotObjectErrorInvalidFileType(ChildOrErr.takeError()))<br>
>> +          error(std::move(E), a->getFileName(), i->get());<br>
>>         continue;<br>
>> +      }<br>
>>       if (ObjectFile *o = dyn_cast<ObjectFile>(&*ChildOrErr.get())) {<br>
>>         MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(o);<br>
>>         if (!checkMachOAndArchFlags(o, file))<br>
>> @@ -542,9 +568,13 @@ static void printFileSectionSizes(String<br>
>>                    i != e; ++i) {<br>
>>                 if (error(i->getError()))<br>
>>                   exit(1);<br>
>> -                ErrorOr<std::unique_ptr<Binary>> ChildOrErr = i->get().getAsBinary();<br>
>> -                if (error(ChildOrErr.getError()))<br>
>> +                Expected<std::unique_ptr<Binary>> ChildOrErr =<br>
>> +                                                  i->get().getAsBinary();<br>
>> +                if (!ChildOrErr) {<br>
>> +                  if (auto E = isNotObjectErrorInvalidFileType(ChildOrErr.takeError()))<br>
>> +                    error(std::move(E), a->getFileName(), i->get());<br>
>>                   continue;<br>
>> +                }<br>
>>                 if (ObjectFile *o = dyn_cast<ObjectFile>(&*ChildOrErr.get())) {<br>
>>                   MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(o);<br>
>>                   if (OutputFormat == sysv)<br>
>> @@ -618,9 +648,13 @@ static void printFileSectionSizes(String<br>
>>                  i != e; ++i) {<br>
>>               if (error(i->getError()))<br>
>>                 exit(1);<br>
>> -              ErrorOr<std::unique_ptr<Binary>> ChildOrErr = i->get().getAsBinary();<br>
>> -              if (error(ChildOrErr.getError()))<br>
>> +              Expected<std::unique_ptr<Binary>> ChildOrErr =<br>
>> +                                                i->get().getAsBinary();<br>
>> +              if (!ChildOrErr) {<br>
>> +                if (auto E = isNotObjectErrorInvalidFileType(ChildOrErr.takeError()))<br>
>> +                  error(std::move(E), a->getFileName(), i->get());<br>
>>                 continue;<br>
>> +              }<br>
>>               if (ObjectFile *o = dyn_cast<ObjectFile>(&*ChildOrErr.get())) {<br>
>>                 MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(o);<br>
>>                 if (OutputFormat == sysv)<br>
>> @@ -681,9 +715,12 @@ static void printFileSectionSizes(String<br>
>>              i != e; ++i) {<br>
>>           if (error(i->getError()))<br>
>>             exit(1);<br>
>> -          ErrorOr<std::unique_ptr<Binary>> ChildOrErr = i->get().getAsBinary();<br>
>> -          if (error(ChildOrErr.getError()))<br>
>> +          Expected<std::unique_ptr<Binary>> ChildOrErr = i->get().getAsBinary();<br>
>> +          if (!ChildOrErr) {<br>
>> +            if (auto E = isNotObjectErrorInvalidFileType(ChildOrErr.takeError()))<br>
>> +              error(std::move(E), UA->getFileName(), i->get());<br>
>>             continue;<br>
>> +          }<br>
>>           if (ObjectFile *o = dyn_cast<ObjectFile>(&*ChildOrErr.get())) {<br>
>>             MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(o);<br>
>>             if (OutputFormat == sysv)<br>
>><br>
>> Modified: llvm/trunk/tools/sancov/sancov.cc<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/sancov/sancov.cc?rev=269784&r1=269783&r2=269784&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/sancov/sancov.cc?rev=269784&r1=269783&r2=269784&view=diff</a><br>
>> ==============================================================================<br>
>> --- llvm/trunk/tools/sancov/sancov.cc (original)<br>
>> +++ llvm/trunk/tools/sancov/sancov.cc Tue May 17 12:10:12 2016<br>
>> @@ -414,8 +414,8 @@ visitObjectFiles(const object::Archive &<br>
>>   for (auto &ErrorOrChild : A.children()) {<br>
>>     FailIfError(ErrorOrChild);<br>
>>     const object::Archive::Child &C = *ErrorOrChild;<br>
>> -    ErrorOr<std::unique_ptr<object::Binary>> ChildOrErr = C.getAsBinary();<br>
>> -    FailIfError(ChildOrErr);<br>
>> +    Expected<std::unique_ptr<object::Binary>> ChildOrErr = C.getAsBinary();<br>
>> +    FailIfError(errorToErrorCode(ChildOrErr.takeError()));<br>
>>     if (auto *O = dyn_cast<object::ObjectFile>(&*ChildOrErr.get()))<br>
>>       Fn(*O);<br>
>>     else<br>
>><br>
>><br>
>> _______________________________________________<br>
>> llvm-commits mailing list<br>
>> <a href="mailto:llvm-commits@lists.llvm.org">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>
><br>
><br>
><br>
> --<br>
> Sanjoy Das<br>
> <a href="http://playingwithpointers.com" rel="noreferrer" target="_blank">http://playingwithpointers.com</a><br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">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>
</div></div></blockquote></div><br></div>