[llvm] r269784 - Change llvm-objdump, llvm-nm and llvm-size when reporting an object file error

Sanjoy Das via llvm-commits llvm-commits at lists.llvm.org
Tue May 17 16:23:23 PDT 2016


Verified that this is fixed now, thanks!

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



-- 
Sanjoy Das
http://playingwithpointers.com


More information about the llvm-commits mailing list